0%

OpenMC第一个例子

浏览过一遍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
# input.py
import openmc

# materials
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()

# geometry - surfaces
sphere = openmc.Sphere(r=10.0)
sphere.boundary_type = 'vacuum'
inside_sphere = -sphere
outside_sphere = +sphere
# geometry cells
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')

# run mode
settings = openmc.Settings()
settings.run_mode = 'fixed source'
settings.particles = 10000
settings.batches = 10
# output
settings.output = {'tallies':True, 'summary':True}
# source distribution
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')

# tallies
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()

# plot
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()

# run
openmc.run()
openmc.plot_geometry(output=True, openmc_exec='openmc', cwd='.')

生成的几何图像

上面的脚本会生成一个叫做plot_10000.ppm,用convert命令转化为png格式。

1
convert plot_10000.ppm plot_10000.png

可以看到生成的几何图像的样子:
图像