在蒙卡输运计算中,减方差方法对于屏蔽问题时非常重要的。这篇博客介绍了郑俞等开发的一种on-the-flux全局减方差技术[1]的使用方法。
编译
该方法修改了部分MCNP源代码,添加了一些源文件,需要重新编译。
为了不混淆可执行代码名称,下面我们用mcnp.mpi指代不带GVR的可执行文件,用mcnp_gvr.mpi指代GVR版代码。
使用
使用该方法,主要有以下几步:
- 产生初始权窗
- 使用GVR优化权窗
- 使用优化后的权窗进行计算
下面以例题的形式来展示具体过程。我们用一个非常简单的几何,来针对某一个网格区域产生一个初始的(两群)权窗,然后用GVR优化这个权窗,最后使用优化后的全长进行计算。例题的输入文件如下:
1 | C example for on-the-flux GVR |
产生初始权窗
首先用不带GVR的代码进行一次初始计算,产生一个初始化权窗。这个权窗是否精细准确不重要,只需要格式正确即可。
1 | mcnp.mpi i=input |
这个过程生成的wwout就是我们需要的初始权窗文件,将它重命名为wwinp1
备用:
1 | mv wwout wwinp1 |
使用GVR代码优化权窗
现在,我们使用带GVR的代码对初始权窗进行优化。
- 将输入文件中的产生权窗的部分注释掉,使用
wwp
- 创建一个和权窗使用的网格对应的fmesh,注意网格和能群需要与权窗一致
- 暂时只支持NPS设定history数目,不支持CTME为终止计算条件
- wwp参数支持两种模式:
- 权窗迭代计算模式:wwp第5个参数设置为-0.5,计算时会对权窗进行迭代优化,同时开启长历史控制;
- 长历史控制模式:wwp第5个参数设置为非-0.5的值,如-1,计算将使用wwinp读取的权窗,不会进行权窗迭代。同时开启长历史控制。
改造后的输入文件如下:
1 | C example for on-the-flux GVR |
运行代GVR可执行文件:
1 | mcnp_gvr.mpi i=input wwinp=wwinp1 |
运行结束,将会生成weightwindow
文件。
这里的weightwindow
里面包含的数据,就是我们需要的权窗数据(但不包含权窗头文件)。我们将wwinp1
的权窗头文件和weightwindow
里的权窗数据组合起来,就是优化后的权窗文件了,命名它为wwinp2
。
输出信息
权窗参数复现
在程序进行粒子输运前,会输出权窗信息,如下所示为一个使用np耦合输运的权窗信息:
1 | newtronWWP 5.00000E+00 3.00000E+00 5.00000E+00 1.00000E+00-5.00000E-01 0.00000E+00 |
这6行信息分别是中子、光子的权窗信息,及终止权窗迭代的信息。
权窗迭代现状
使用GVR时,在nps输出信息后面,还会跟上一些参数,表明当前权窗的迭代现状信息,以下列2(n_group=2, p_group=2)群的权窗信息为例:
1 | nps = 4000 1.84 minutes 445410 7185 5461 4803 3003 0 0 |
其中第1行信息的含义为:
- 第一个参数:总网格数目,数据量1。 此处为445410,即网格共445410个网格单元。
- 第二组参数:有计数的网格数目, 数据量n_group。此处为7185 5461.即当nps=4000时,中子计数的第1群有7185个网格单元有计数,第2群有5461个网格有计数。
- 第三组参数:统计误差小于等于0.7的网格数目。此处为4803 3003,即中子计数的第1群有4803个网格统计误差小于0.7,中子计数的第2群有3003个网格统计误差小于0.7。
- 第四组参数:统计误差小于0.1的网格数目。此处为0 0,即中子计数的第1、2群都没有网格计数误差小于0.1。
第二行信息的含义与第一行一样,只是粒子为光子。
第三行信息的含义为:
1 | nertron split 168025 922530 1090555 79979 1.00000E+00 7.57956E+00 1.24783E+08 1.06568E+10 0.00000E+00 |
信息提示
1 | =======///First clean for removing the badflux\\\\\==================== |
出现以下信息,表明权窗已经达到设定的条件,终止迭代。后续计算将使用当前权窗信息。
1 | =======///From Now On weightwindow Is not update anymore\\\\\==================== |
常见错误
Recieved 16 but expected 32
在合并wwinp1
和weightwindow
中信息时,如果表头与内容不匹配,那么可能出现以下错误:
1 | Fatal error in PMPI_Bcast: Other MPI error, error stack: |
出现这个错误的原因,可能是使用mcnp初始生成权窗生成时,运行模式为n, p。此时虽然没有要求生成光子权窗,但GVR会自动生成默认光子权窗(1群,能量上限100MeV,网格与中子网格相同),此时wwout
表头第一行第三个变量为2,第二行第二个变量为1。
但是在迭代优化时,如果没有明确要求迭代光子权窗,GVR不会自动生成迭代的光子权窗,此时生成的weightwindow
只包含中子权窗信息,不会有光子权窗信息。
因此,在将weightwindow
中的内容拷贝进入wwinp2
时,表头信息和内容信息不匹配,表头中说有光子信息,实际内容没有,导致程序错误的想传递没有的信息,出现错误。
解决方法:修改表头使其和内容一致。
其他
本博客仅用于以例题说明该方法的使用,对该方法的原理,实现过程及其中涉及的其他文件的作用不做任何说明。使用方法最终解释权归代码原作者所有。本博客如有错误,敬请指正。
[1] Zheng, Yu, Yuefeng Qiu, Peng Lu, Yixue Chen, Ulrich Fischer, and Songlin Liu. “An Improved On-the-Fly Global Variance Reduction Technique by Automatically Updating Weight Window Values for Monte Carlo Shielding Calculation.” Fusion Engineering and Design 147 (October 1, 2019): 111238. https://doi.org/10.1016/j.fusengdes.2019.06.011.