35. 核热耦合迭代计算 (仅限企业版本)

RMC支持进行核热耦合计算,耦合功能使用Python脚本进行迭代流程控制,使用 网格 功能进行温度场和密度场数据的获取与映射。

非企业版本用户如果需要进行核热耦合计算,可以参考 网格 功能的相关内容,自行完成迭代耦合控制脚本的编写和数据传递。

该功能涉及到的输入卡在临界输入卡中,如果需要进行带燃耗的耦合计算,则一般采用单步燃耗计算模式, 进而影响到燃耗输入卡。

35.1. 核热耦合迭代计算模块输入卡

不论临界耦合还是燃耗耦合,耦合迭代过程的必需输入卡都在“CRITICALITY”内:

CRITICALITY
<CRITICALITY的其他选项卡>
Couple MaxIteration = 2 VARY_CYCLE = 200 300 400 VARY_INACTIVE_CYCLE=150 10 10 HDF5_SOURCE=1

其中,

  • Couple为核热耦合迭代计算输入卡的关键词;

  • MaxIteration为每次耦合迭代的最大迭代次数,比如如果有4个燃耗步,则每个燃耗步的耦合迭代都有上限5次;

  • VARY_CYCLE为中子历史增长方法的输入卡,如果没有这个输入卡,则每次耦合迭代的源迭代次数不变; 如果有这个输入卡,则要求输入卡的数字的数量等于MaxIteration+1。

  • HDF5_SOURCE卡为指定在耦合迭代过程中,从上一个迭代步中输出的收敛源文件 inp.Source.h5 文件中读取 收敛的裂变源,并作为初始源开始输运计算,以加速源收敛过程。用户需要在输入卡内的 输出控制 模块中输入 fissionsource 1 以控制在计算结束后,输出收敛的裂变源作为下一个迭代步的初始源。

    注解

    在耦合过程中,程序会自动将上一个迭代步输出的 inp.source.h5 文件复制到 workspace目录下,并重 命名为 convergent_source.h5 ,该文件是RMC读取收敛源H5文件的默认文件。

  • VARY_INACTIVE_CYCLE卡指定在耦合迭代过程中,设置每个迭代步的非活跃代数目。通过搭配 HDF5_SOURCE 卡, 起到耦合迭代过程中源收敛加速的效果。

    注解

    该选项必须与 HDF5_SOURCE 选项卡配合使用,如用户未定义,则程序会发出警告并默认设置 HDF5_SOURCE=1

重要

COUPLE卡,即耦合迭代控制选项只能为RMC-Python识别,直接使用RMC运行时会报错

Mesh输入卡中,文件名和数据集在耦合迭代过程中比较固定,具体为:

Mesh
MeshInfo 1 type=1 filename=CTF.h5 datasetname=pin_fueltemps  //fuel temp
MeshInfo 2 type=1 filename=CTF.h5 datasetname=channel_liquid_temps  //moderator temp
MeshInfo 3 type=1 filename=CTF.h5 datasetname=liquid_density  //moderator density

相应的燃料栅元需要使用“tmp=-1”,慢化剂栅元需要使用“tmp=-2 dens=-3”选项,以使用Mesh中的数据。

在进行带燃耗的核热耦合计算时,还需要添加单步燃耗选项和开启输入卡输出选项:

单步燃耗选项为:

BURNUP
<BURNUP的其他选项卡>
SUCCESSION singlestep = 1 CUMULATIVETIME = 37.91706013572237 CUMULATIVEBURNUP = 0.995

其中,

  • singlestep为单步燃耗开关,默认为0(关闭单步燃耗,一次性计算完成全部燃耗步),核热耦合中需要置为1(开启单步燃耗);
  • CUMULATIVETIME为单步燃耗接续过程的积累燃耗时间,单位为天。一般不需要用户输入,为RMC接续计算自动生成下一步输入文件时给出;
  • CUMULATIVEBURNUP为单步燃耗接续过程的积累燃耗深度,单位为MWd/kg。一般不需要用户输入,为RMC接续计算自动生成下一步输入文件时给出;

开启输入卡输出选项为 输出控制 中的

PRINT
Inpfile <flag>

将<flag>置为1即可。同时,为了保证在开启预估校正的情况下的功率输出结果的正确性,需要在输出控制中关闭校正步的输出,即:

PRINT
BurnupCorrector 0

35.2. RMC-CTF耦合迭代计算

RMC可以开展与CTF的耦合迭代计算,CTF 是由美国北卡大学开发的子通道热工水力分析程序。在耦合迭代计算过程中,RMC计算出目标对象的三维功率分布,经耦合 程序处理作为CTF的输入,CTF计算出温度场和密度场,同样经耦合程序处理作为RMC的输入,如此循环迭代,直到收敛。

35.2.1. RMC/CTF核热耦合迭代计算所需要的耦合接口程序

RMC/CTF的耦合系统,除了这两个物理和热工程序外,还包括两个耦合接口程序,分别是 rmc2ctfctf2rmc :

"rmc2ctf"

物理到热工接口程序,将RMC输运计算输出的功率分布文件转换为CTF的功率输入文件。

"ctf2rmc"

热工到物理接口程序,将CTF计算得到的燃料棒温度、慢化剂温度和慢化剂密度根据指定的映射关系进行处理,得到RMC输运计算所需的网格文件。

35.2.2. RMC/CTF核热耦合迭代计算所需要的耦合接口文件

在与CTF的核热耦合过程中,为自动生成RMC和CTF可以读取的数据格式,需要为第三方脚本提供补充信息输入卡,共计四个,具体如下:

"CoreBound.inp"

堆芯耦合迭代的边界, 三行分别为x、y、z轴的边界(小值在前),单位为厘米。
-139.776 139.7760
-139.776 139.7760
0.0 365.76

"CoreMap.inp"

堆芯组件的排布。第一行为堆芯的组件分布的矩阵阶数,上面例子中为“13x13”。从第2行开始为组件分布的矩阵,上例中即为13x13的矩阵, 其中0的位置为没有组件的位置,其他位置需要从1开始进行组件编号。在这个矩阵之后,最后一行为单组件的棒重复几何的矩阵阶数,下例中 为17x17的标准组件。
13 13
0   0   0    0    0    1    2    3    0    0    0    0    0
0   0   0    4    5    6    7    8    9    10   0    0    0
0   0   11   12   13   14   15   16   17   18   19   0    0
0   20  21   22   23   24   25   26   27   28   29   30   0
0   31  32   33   34   35   36   37   38   39   40   41   0
42  43  44   45   46   47   48   49   50   51   52   53   54
55  56  57   58   59   60   61   62   63   64   65   66   67
68  69  70   71   72   73   74   75   76   77   78   79   80
0   81  82   83   84   85   86   87   88   89   90   91   0
0   92  93   94   95   96   97   98   99   100  101  102  0
0   0   103  104  105  106  107  108  109  110  111  0    0
0   0   0    112  113  114  115  116  117  118  0    0    0
0   0   0    0    0    119  120  121  0    0    0    0    0
17 17

"TotalPower.inp"

算例总功率,单位为MW。
3411.0

"GuideTube.inp"

各组件中的导管位置, 该文件的行数即为每个组件中的导管数量,每行的两个数字分别为各个导管的位置坐标。在标准17x17组件中,25个导管的位置就是下例中的数值。
3 6
3 9
3 12
4 4
4 14
6 3
6 6
6 9
6 12
6 15
9 3
9 6
9 9
9 12
9 15
12 3
12 6
12 9
12 12
12 15
14 4
14 14
15 6
15 9
15 12

35.2.3. RMC/CTF核热耦合迭代计算的计算准备

开展RMC/CTF耦合迭代计算,除了需要RMC的输入卡以及上述四个接口文件外,还需要CTF的输入卡,CTF预处理器的输入卡以及各个程序的可执行程序,一般来说,建议 在一个空文件夹中进行,将python代码文件夹RMC复制到这个文件夹中,并将其中的“runner.py”拷贝出来,另外需要创建workspace文件夹,将RMC、CTF(包括预 处理器和可执行程序)以及rmc2ctf、ctf2rmc复制进workspace文件夹,将输入卡inp以及各种其他输入卡放入workspace文件夹,并设置好数据库路径环境变量 “RMC_DATA_PATH”。

最终的文件夹结构如下:

# 环境变量“RMC_DATA_PATH”指向数据库索引文件xsdir等的路径。
simulations
|-- RMC                    # RMC的Python代码包文件夹
|-- runner.py              # 从RMC文件夹中复制出来的文件
|-- workspace              # 计算文件夹
       |-- inp             # RMC输入卡
       |-- CoreBound.inp   # ctf2rmc输入卡
       |-- CoreMap.inp     # ctf2rmc输入卡
       |-- GuideTube.inp   # rmc2ctf输入卡
       |-- TotalPower.inp  # rmc2ctf输入卡
       |-- geo.inp         # CTF输入卡(本手册不提供说明)
       |-- assem.inp       # CTF输入卡(本手册不提供说明)
       |-- control.inp     # CTF输入卡(本手册不提供说明)
       |-- RMC             # RMC可执行程序
       |-- cobratf         # CTF可执行程序
       |-- cobratf_preproc # CTF预处理器
       |-- rmc2ctf         # 生成CTF的power.inp的接口程序
       |-- ctf2rmc         # 生成RMC的数据h5文件CTF.h5

35.3. RMC-SUBCHAN耦合迭代计算

除了与CTF程序进行耦合,RMC还可以与子通道程序 SUBCHAN 进行耦合。子通道程序SUBCHAN是由清华大学工程物理系俞冀阳老师开发的全堆芯三维子通道热工水力程序, 可用于压水堆、沸水堆、超临界水堆等的稳态和瞬态热工水力计算。和RMC/CTF耦合系统类似,RMC/SUBCHAN耦合系统也是采用松耦合迭代策略。耦合计算过程中, RMC计算出功率分布,SUBCHAN计算温度场和密度场,然后由耦合程序进行数据交换,如此循环迭代,直到收敛。

35.3.1. RMC/SUBCHAN核热耦合迭代计算所需要的其他输入卡

与RMC/CTF耦合系统不同,RMC/SUBCHAN采用了全新的耦合接口模块,其不再作为独立的程序存在,而是内嵌于RMC的Python模块中作为接口函数。用户不再需要单独编译接口程序,只需要 在工作目录下同时编译好RMC和SUBCHAN的可执行程序即可。同时,RMC/SUBCHAN耦合迭代计算所需要的其他输入卡也与RMC/CTF耦合系统不同。相比RMC/CTF耦合系统使用的 四个接口文件,新的耦合系统只需要一个接口文件:

  • coupling.yaml: 耦合接口文件,用于指定RMC和SUBCHAN之间的耦合迭代的参数,包括耦合迭代策略,目标对象总功率,目标对象几何参数等。参数的详细介绍如下:

"scheme"

耦合迭代策略,可选值为 "pin""global_pin" 两种,默认值为 "pin""pin" 表示根据真实的堆芯几何进行子通道建模,"global_pin" 表示将堆芯几何简化为一个大的立方体,燃耗进行子通道的建模。相比 "pin" 方案,"global_pin" 方案的建模难度更低,因为其将真实堆芯几何简化为一个立方体, 其燃料棒束和子通道的映射关系非常简单。但 "global_pin" 方案的建模精度相比 "pin" 方案要低,由于其会高估堆芯边缘处的流道面积,同时在非堆芯区域的子通道 建模也会引入物理上并不存在的搅混效应,因此会引入额外的误差。该方案的提出,是由于 SUBCHAN 的精细建模难度较大,但随着预处理器SUBCHAN-PREPROC的开发,子通道的建模 问题已经不再是耦合问题的阻碍,因此 "global_pin" 方案的使用场景已经不多,一般不建议使用该方案。

"core_power"

目标堆芯总功率,单位为MW。

"core_bound"

目标堆芯的几何边界,由x, y, z三个方向的边界组成,单位为cm。

core_bound:
  x: [ -161.25, 161.25 ]
  y: [ -161.25, 161.25 ]
  z: [ 11.951, 377.711 ]

"mesh_scope"

目标堆芯的网格范围,由x, y, z三个方向的网格范围组成。

mesh_scope:
  x: 51
  y: 51
  z: 49

注解

在耦合迭代的过程中,程序会从RMC计数文件 "MeshTally*.h5" 中读取网格范围,因此用户不需要手动指定 "mesh_scope" ,程序会自动读取。

警告

网格范围的设置需要与RMC输入文件中的网格范围保持一致,否则会导致网格文件读取错误。

"core_map"

目标堆芯的组件排布,由一个二维矩阵组成,矩阵的行数和列数分别为x, y方向的组件数目,矩阵中的每个元素为组件的编号,编号从1开始,0表示该位置没有组件。

core_map:
  - [1, 2, 3]
  - [4, 5, 6]
  - [7, 8, 9]

警告

用户必须指定 "core_map" ,否则耦合迭代计算无法进行。

"assembly_map"

目标堆芯内组件的燃料棒和导向管的排布,由一个二维矩阵组成,矩阵的行数和列数分别为x, y方向的燃料棒(导向管)数目,矩阵中的每个元素为燃料棒(导向管) 的编号,1表示该位置为燃料棒,0表示该位置为导向管。

assembly_map:
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]

注解

如果用户不指定 "assembly_map" ,则默认组件类型采用标准西屋17x17压水堆组件。

注解

耦合接口文件的示例文件参考 coupling.yaml

警告

当前RMC/SUBCHAN的耦合系统尚不支持组件内存在多种燃料棒类型的情况,这并不是耦合系统的原因,而是目前的SUBCHAN-PREPROC预处理器尚 不支持生成组件内含有多种燃料棒的子通道输入文件,如果用户可以自主制作组件内包含多种燃料棒的子通道输入文件,则耦合系统不会存在问题。

35.3.2. SUBCHAN预处理器SUBCHAN-PREPROC输入文件

对于RMC/SUBCHAN的耦合系统,用户需要在工作目录准备好RMC的输入文件 "inp" 、SUBCHAN的输入文件 "SUBCHAN.IN" 以及上述提及的耦合 接口文件 "coupling.yaml" 。然而,子通道程序的建模难度要远大于物理程序,其燃料棒与通道、通道与通道之间的连接关系极其复杂。一般来说,一个堆芯规模的 子通道输入文件可以达到十几万行,因此手动编写子通道输入文件是不现实的。为了解决这个问题,我们开发了子通道预处理器SUBCHAN-PREPROC。该预处理器可以作为独立 编译的程序,也可以作为RMC/SUBCHAN耦合系统的接口函数,其主要功能是读取预处理文件 "preproc.yaml" 文件,解析其中信息并自动生成子通道输入文件 "SUBCHAN.IN" 。 有关SUBCHAN的输入文件详细内容,可以参考 SUBCHAN 的用户手册。

对于SUBCHAN-PREPROC而言,其核心任务是根据一些基本的描述参数,自动生成子通道输入文件。这些基本的描述参数包括:

"core_map"

和耦合接口文件中的 "core_map" 一致,用于描述堆芯的组件排布。

"assembly_pitch"

组件中心距,单位为m。

"axial_mesh_gries"

轴向网格划分,由每个网格的轴向坐标组成,单位为m。

"asssembly_map"

组件内燃料棒和导向管排布,与耦合接口文件中的 "assembly_map" 一致。

"pin_pitch"

燃料棒中心距,单位为m。

"fuel_rod"

用于指定燃料棒参数,包括 "outer_diameter", "inner_diameter", "fuel_density", "clad_thickness" 等参数。

"guide_tube"

用于指定导向管参数,包括 "outer_diameter", "inner_diameter" 等参数。

"spacer_grids"

用于指定定位格架参数,包括定位格架数目 "number" 、位置 "position" 和搅混因子等参数。

"inlet_enthalpy"

入口焓,支持温度或焓两种输入。

"inlet_mass_flux"

入口质量流量,单位为kg/s。

除了以上必要的输入参数以外,SUBCHAN-PREPROC还包括大量的控制参数,这些参数的具体含义可以参考 SUBCHAN 的用户手册。

重要

在实际的反应堆堆芯稳态热工水力计算来说,用户实际上只需要堆芯的几何参数和必要的控制参数,如入口质量流量、入口焓值等,对于一些模型的输入,可以直接采用默认值。

注解

SUBCHAN-PREPROC的输入文件的示例文件见 preproc.yaml

35.3.3. RMC/SUBCHAN核热耦合迭代计算的计算准备

和RMC/CTF耦合迭代计算类似,RMC/SUBCHAN耦合迭代计算同样需要类似的计算准备。建议在一个空文件夹中进行,将python代码文件夹RMC复制到这个文件夹中, 并将其中的“runner.py”拷贝出来,另外需要创建workspace文件夹,将RMC、SUBCHAN可执行程序复制进workspace文件夹。不同的是,RMC/SUBCHAN耦合系统 不再需要编译单独的耦合接口程序,其耦合接口文件以接口函数的形式内嵌于RMC的Python模块中。因此,用户只需要再准备好RMC的输入卡、SUBCHAN的输入卡以及耦合 系统输入卡即可

注解

如果用户需要使用SUBCHAN-PREPROC预处理器,则需要准备好预处理器的输入文件 "preproc.yaml",并需要准备SUBCHAN的输入卡。预处理器会自动生成 "SUBCHAN.IN" 文件。

最终的文件夹结构如下:

# 环境变量“RMC_DATA_PATH”指向数据库索引文件xsdir等的路径。
simulations
|-- RMC                    # RMC的Python代码包文件夹
|-- runner.py              # 从RMC文件夹中复制出来的文件
|-- workspace              # 计算文件夹
       |-- inp             # RMC输入卡
       |-- coupling.yaml   # 耦合接口文件
       |-- preproc.yaml    # SUBCHAN-PREPROC预处理器输入文件
       |-- RMC             # RMC可执行程序
       |-- subchan         # SUBCHAN可执行程序

35.4. 核热耦合迭代计算运行方式

使用基于RMC的核热耦合计算系统,都需要使用计算运行命令“python3 runner.py”开展计算,通过后面加上“–help”可以得到帮助信息

$ python3 runner.py --help
usage: runner.py [-h] [--platform PLATFORM] [--mpi MPI_NUM] [--omp OMP_NUM]
                 [--assem ASSEM_NUM] [--continue-inp CONTINUE_INP]
                 [--continue]
                 inp

positional arguments:
  inp                   the path to the input file

optional arguments:
  -h, --help            show this help message and exit
  --platform PLATFORM   platform on which to run the job (default: Linux)
  --mpi MPI_NUM         the number of MPI processes to use ()
  --omp OMP_NUM         the number of OpenMP threads to use in each process
  --assem ASSEM_NUM     the number of assemblies in the model, default not to
                        calculate CTF
  --subchannel SUBCHANNLE_TYPE the type of the subchannel code, default "ctf"
  --continue-inp CONTINUE_INP
                        the name of the input file for continuous calculation
  --continue            whether this calculation is a continuous one or not
  --ccd                 whether to diagnose the convergence of the coupling
                        calculation (optional)

具体示例如下:

python3 runner.py --platform tianhe --mpi=240 --omp=12 --assem=121 workspace/inp

其中,

  • platform为计算平台,需要根据不同平台上的并行计算任务提交命令进行设置,可选值见下表。

注解

如有RMC-Python部分的源代码,且用户需要在其他平台上运行,可以自行添加平台支持,具体方法见 添加新的计算平台

表35.1 RMC-Python支持的计算平台
计算平台 关键词
Linux linux
天河二号 tianhe2
天河三号 tianhe3
银河系统 yinhe
天河三号高性能4 tianhe3_hpc4
天河三号高性能5 tianhe3_hpc5
北京超算 bscc
曙光超算 shuguang
山河超算 shanhe
  • mpi为RMC计算使用的MPI进程数量;
  • omp为RMC计算使用的OpenMP线程数量;
  • assem为模型组件数目,亦即CTF计算使用的MPI进程数量;
  • subchannel为子通道程序的类型,可选值为 "ctf""subchan" ,默认值为 "ctf"

耦合迭代过程支持接续计算,命令为:

python3 runner.py --platform tianhe --mpi=240 --omp=12 --assem=121 workspace/inp \
  --continue --continue-inp path/to/inp.cycle.2.burnup24.couple3

其中,

  • continue表示启动接续计算
  • continue-inp指向接续上一步的输入卡,实际上主要是提供上一步的cycle和burnup编号。 示例中下一步计算为cycle 1的burnup 25的第一次耦合迭代。目前暂不支持couple层级的接续计算,因此couple后面的数值应当与MaxIteration相等。
  • ccd为是否开启耦合计算的收敛性诊断,如果开启,程序会在每个迭代步计算完成后开启收敛性诊断,从而计算出功率分布、温度和密度参数的二范数和无穷范数, 并将结果输出到文件 coupling_convergence.h5 中。

35.5. 添加新的计算平台

在有RMC-Python源代码的情况下,用户可以自行添加新的计算平台支持。添加新的计算平台需要在 RMC/controller/hpc.py 文件中添加新的平台支持,即在 platforms 字典中添加新的平台信息,举例如下:

platforms = { "shanhe": Linux(name="shanhe", proc_per_node=56) }

其中,Linux是一个类,其构造函数接受两个参数,分别为平台的名称和每个节点的MPI进程数。在添加新的平台支持后,用户可以在运行命令中使用新的平台关键词。

到目前为止,RMC-Python支持的计算平台有:

Linux:适用于个人电脑、服务器等Linux系统,并行计算任务提交命令为 mpirun -np <mpi> <executable>。此外,山河超算同样使用Linux平台。
TianHeSeries:适用于天河二号、天河三号、天河三号高性能4、天河三号高性能5以及银河超算等超级计算机,计算任务提交命令为 yhrun -n <mpi> <executable>
BSCC:适用于北京超算,计算任务提交命令为 srun -n <mpi> <executable>