0%

使用PyNE制作材料库

在使用DAGMC进行输运计算的时候,其几何文件中,已经通过trelis定义了材料名称和密度,但并没有定义这些材料的具体组成成分。在进行计算之前,需要制作相应的材料数据库,把材料数据写入到h5文件中,再跟几何文件整合起来。这样,DAGMC就知道这个栅元的材料成分了。

针对不同的问题规模,可以采用不同的形式来制作材料库。比如简单的问题,只需要几种不复杂的材料时,我们可以直接在python脚本内编辑材料成分,然后写入材料库。对于涉及材料比较多的问题,可以通过提前准备材料数据库文件(即将各种材料以一定格式提前保存在电脑中,再通过python脚本读取材料文件格式化的制作材料数据库)。或者直接提前准备包含自己会用到的h5材料数据库。

简单数据库制作

对于几何简单,涉及材料较少(少于5个材料)的计算任务,直接在python脚本中调用pyne的材料库写就行了。

定义材料时,我们需要制定材料的以下信息:

  1. 名称:和trelis中group name对应的字符串
  2. 密度:材料密度
  3. 核素组成:材料的具体成分

我们可以用多种方式来定义材料的组成成分,详细说明可以参考官方文档。比如下面三种常用方式:

  1. 通过核素的核子密度比例(atom fraction),可以不归一化
  2. 通过核素的质量份额(mass fraction),可以不归一化
  3. 通过元素的质量份额,然后expand元素

比如下面的文件定义了WaterBoronCarbideSteel三种材料并将材料写入到材料库example_material_lib.h5中。

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
#!/usr/bin/python
#
from pyne.material import Material
from pyne.material_library import MaterialLibrary

print("Welcome!")
mat_lib = MaterialLibrary()

# define a simple water since O-18 not in mcnp xs libs
watervec = {10010:2,80160:1} # simple water
water = Material()
water.density = 1.0
water.from_atom_frac(watervec)

# define b4c
b4c = Material()
b4c.from_atom_frac({'B':4,'C':1})
b4c.density = 2.54
b4c = b4c.expand_elements()

# define steel
steel = Material({'Fe':0.655,'Cr':0.170,'Ni':0.120,'Mo': 0.025,'Mn': 0.02, 'Si':.01},density=7.92)
steel = steel.expand_elements()

# put materials into mat_lib
mat_lib["Water"] = water
mat_lib["BoronCarbide"] = b4c
mat_lib["Steel"] = steel

# write into hdf5 file
mat_lib.write_hdf5("example_material_lib.h5")
#
print("All done!")

此例子中,定义Water时用材料的核素个数比例来定义的材料。在定义BoronCarbide时使用材料的元素比例来定义。在定义Steel时使用的材料的元素质量份额来定义。

格式化数据库制作

对于涉及材料比较多,材料成分比较复杂的模型,直接用python脚本来定义每种材料就会非常麻烦了,而且不利于材料的更新,维护与阅读。

对于原本是使用其他蒙特卡罗软件的人,可能已经为其使用的软件准备了一套材料数据库,要是让他们再为其他软件单独准备一套数据库,工作量又大,又容易出错。这时使用脚本将其他格式的材料转换为pyne的材料定义方式是更好的选择。

因此,格式化数据库制作的过程,就是指将原本以其他媒介(如excel, 文本文件,hdf5文件等)以其他格式(如成分表格,MCNP格式等)存放的材料信息转化为pyne识别的,可以用于DAGMC计算的材料数据库的过程。

万变不离其宗,不论是什么媒介什么格式的方式,都是通过读取材料的名称,密度和材料组成成分进而根据pyne的格式来定义材料数据库。