浏览过一遍OpenMC的User Guide之后,对OpenMC的使用有了大致的初步了解。
和其他蒙卡程序类似,OpenMC也是需要定义几何,材料,源和tally以及其他信息。OpenMC用不同的xml文件来存放不同的信息。
OpenMC有一个鲜明的特性:Python API,OpenMC相关的所有内容都有Python API,这样我们可以直接通过python脚步来写相应的信息,然后直接使用导出函数转化成xml文件。这个API的存在对比较小规模的问题,或者几何不是非常复杂的问题是比较方便的。另外,数据后处理部分,OpenMC也有接口,画图和数据处理都很容易。
本文将通过一个非常简单的小例子来进行一次完整的OpenMC准备和计算流程。
准备核数据
OpenMC计算时,会从openmc.Materials
或者materials.xml
中寻找材料数据库的位置,可以通过这两个方式定义材料库的位置。
不过如果我们只使用固定的材料库的话,每次都要特别制定材料数据库就太麻烦了。可以通过把材料数据库的路径添加到系统变量OPENMC_CROSS_SECTIONS
中去。
获取数据库
这里介绍了获取不同数据库的方法。这里我为了简便,使用最简单的NNDC的数据库。根据文档,我需要使用openmc-get-nndc-data这个脚本。
因为这个数据库完全是为OpenMC计算任务而存在,所以我把这个数据库放在$HOME/opt/OpenMC/NNDC
下。
1 2 3 4
| cd $HOME/opt/OpenMC mkdir NNDC cd NNDC openmc-get-nndc-data
|
添加路径
然后把这个OPENMC_CROSS_SECTIONS
的路径设为这个并添加到$HOME/.bashrc
中去。
问题描述
为了简单,这里打算使用一个半径为10里面的球,这个球材质为密度为1.0的水,球外侧区域不考虑。
中子源就设为在原点的各项同性的1MeV的点源。
Python API文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import openmc
materials = openmc.Materials() water = openmc.Material() water.add_element('H', 0.667, 'ao') water.add_element('O', 0.334, percent_type='ao') water.set_density('g/cm3', 1.0) materials.append(water) materials.export_to_xml()
sphere = openmc.Sphere(r=10.0) sphere.boundary_type = 'vacuum' inside_sphere = -sphere outside_sphere = +sphere
universe = openmc.Universe() moderator = openmc.Cell(fill=water, region=inside_sphere) universe.add_cell(moderator) geometry = openmc.Geometry(universe) geometry.export_to_xml(path='geometry.xml')
settings = openmc.Settings() settings.run_mode = 'fixed source' settings.particles = 10000 settings.batches = 10
settings.output = {'tallies':True, 'summary':True}
source = openmc.Source() source.space = openmc.stats.Point(xyz=(0., 0., 0.)) source.angle = openmc.stats.Isotropic() source.energy = openmc.stats.Discrete([10.0e6], [1.0]) settings.source = source settings.export_to_xml(path='settings.xml')
cell_filter = openmc.CellFilter([moderator]) tally1 = openmc.Tally() tally1.scores = ['flux'] tally1.filters.append(cell_filter) tallies = openmc.Tallies() tallies.append(tally1) tallies.export_to_xml()
plot1 = openmc.Plot() plot1.basis = 'xz' plot1.origin = (0, 0, 0) plot1.width = (20, 20) plot1.pixels = (400, 400) plot1.color_by = 'material' plots=openmc.Plots() plots.append(plot1) plots.export_to_xml()
openmc.run() openmc.plot_geometry(output=True, openmc_exec='openmc', cwd='.')
|
生成的几何图像
上面的脚本会生成一个叫做plot_10000.ppm,用convert命令转化为png格式。
1
| convert plot_10000.ppm plot_10000.png
|
可以看到生成的几何图像的样子: