Multiphysics Model

Contact: Nicolas Stauff (nstauff.at.anl.gov), Yinbin Miao (ymiao.at.anl.gov)

Model link: HPMR Model

commentnote:Acknowledgement

This HP-MR model was built upon earlier work performed under ARPA-E MEITNER project and reported in the journal paper (Matthews et al., 2021), and some parts of the inputs are coming from these original models.

Mesh File

As a series of powerful reactor-focused mesh generators have been implemented into MOOSE as the Reactor Module (Shemon et al., 2022), the meshing tool used for the HP-MR simulation has been moved from Cubit to MOOSE's intrinsic mesh generator set.

While Sockeye uses its own simple implemented 2D axisymetric heat pipe meshing capabilities, both Griffin and BISON applications adopt meshes generated by MOOSE's intrinsic mesh generators in this HP-MR model. The input file used to generate the Griffin mesh is listed as follows.

################################################################
# This is the MOOSE input file to generate the mesh that can be
# used for the 1/6 core Heat-Pipe Microreactor Multiphysics
# simulations (Griffin neutronics simulation).
# Running this input requires MOOSE Reactor Module Objects
# Users should use
# --mesh-only HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry.e
# command line argument to generate
# exodus file for further Multiphysics simulations.
################################################################
[GlobalParams]
  create_outward_interface_boundaries = false
[]

[Mesh]
  [BatchMeshGeneratorAction]
    # We generate each control drum in 2 steps (concentric circles generation and azimuthal absorber/reflector splitting),
    # this syntax allows us to input the control drum (and reflector) generation in a very compact manner.
    [control_drums_ccg]
      mesh_generator_type = 'HexagonConcentricCircleAdaptiveBoundaryMeshGenerator'
      mesh_name_prefix = 'cd0'
      multi_batch_params_method = 'corresponding'
      # The main different parameters between the control drums are how the meshes are adapted to the reactor core
      # The batch parameters here are used to account for these differences
      batch_vector_input_param_names = 'meshes_to_adapt_to sides_to_adapt'
      batch_vector_input_param_types = 'MGNAME UINT'
      batch_vector_input_param_values = 'Patterned Patterned Patterned;
                                         Patterned Patterned;
                                         Patterned Patterned Patterned;
                                         Patterned Patterned;
                                         Patterned Patterned Patterned;
                                         Patterned Patterned;
                                         Patterned Patterned Patterned;
                                         Patterned Patterned;
                                         Patterned Patterned Patterned;
                                         Patterned Patterned;
                                         Patterned Patterned Patterned;
                                         Patterned Patterned|
                                         2 3 4;2 3;1 2 3;1 2;0 1 2;0 1;
                                         0 1 5;0 5;0 4 5;4 5;3 4 5;3 4'
      # The rest of the control drum parameters are the same for all control drums
      fixed_vector_input_param_names = 'num_sectors_per_side background_block_ids ring_radii ring_intervals ring_block_ids'
      fixed_vector_input_param_types = 'UINT USHORT REAL UINT USHORT'
      fixed_vector_input_param_values = '4 4 4 4 4 4;
                                         504;
                                         12.25 13.25;
                                         2 1;
                                         500 501 502'
      fixed_scalar_input_param_names = 'hexagon_size background_intervals preserve_volumes is_control_drum create_outward_interface_boundaries'
      fixed_scalar_input_param_types = 'REAL UINT BOOL BOOL BOOL'
      fixed_scalar_input_param_values = '13.376 2 true true false'
    []
    [control_drums_split]
      mesh_generator_type = 'AzimuthalBlockSplitGenerator'
      mesh_name_prefix = 'cd'
      multi_batch_params_method = 'corresponding'
      # Based on the locations of the control drums, we need to split the blocks in different ways
      batch_scalar_input_param_names = 'input start_angle'
      batch_scalar_input_param_types = 'MGNAME REAL'
      batch_scalar_input_param_values = 'cd0_0 cd0_1 cd0_2 cd0_3 cd0_4 cd0_5 cd0_6 cd0_7 cd0_8 cd0_9 cd0_10 cd0_11;
                                         15 345 315 285 255 225 195 165 135 105 75 45'
      fixed_vector_input_param_names = 'old_blocks new_block_ids'
      fixed_vector_input_param_types = 'SDNAME USHORT'
      fixed_vector_input_param_values = '502;503'
      fixed_scalar_input_param_names = 'angle_range'
      fixed_scalar_input_param_types = 'REAL'
      fixed_scalar_input_param_values = '90'
    []
    [reflector_blocks]
      mesh_generator_type = 'HexagonConcentricCircleAdaptiveBoundaryMeshGenerator'
      mesh_name_prefix = 'ref'
      multi_batch_params_method = 'corresponding'
      # Similar to the control drums, we need to adapt the reflector meshes to the reactor core based on the locations
      batch_vector_input_param_names = 'sides_to_adapt'
      batch_vector_input_param_types = 'UINT'
      batch_vector_input_param_values = '0;1;2;3;4;5'
      fixed_vector_input_param_names = 'meshes_to_adapt_to num_sectors_per_side background_block_ids'
      fixed_vector_input_param_types = 'MGNAME UINT USHORT'
      fixed_vector_input_param_values = 'Patterned;
                                         4 4 4 4 4 4;
                                         400 401'
      fixed_scalar_input_param_names = 'hexagon_size background_intervals create_outward_interface_boundaries'
      fixed_scalar_input_param_types = 'REAL UINT BOOL'
      fixed_scalar_input_param_values = '13.376 2 false'
    []
  []
  # Moderator pins
  [Mod_hex]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6 # must be six to use hex pattern
    num_sectors_per_side = '2 2 2 2 2 2 '
    background_intervals = 1
    background_block_ids = '10'
    polygon_size = 1.15
    polygon_size_style ='apothem'
    ring_radii = '0.825 0.92'
    ring_intervals = '2 1'
    ring_block_ids = '103 100 101' # 103 is tri mesh
    preserve_volumes = on
    quad_center_elements = false
  []
  # Heat Pipe pins
  [HP_hex]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6 # must be six to use hex pattern
    num_sectors_per_side = '2 2 2 2 2 2 '
    background_intervals = 1
    background_block_ids = '10'
    polygon_size = 1.15
    polygon_size_style ='apothem'
    ring_radii = '0.97 1.07'
    ring_intervals = '2 1'
    ring_block_ids = '203 200 201' # 203 is tri mesh
    preserve_volumes = on
    quad_center_elements = false
  []
  # Fuel pins
  [Fuel_hex]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6 # must be six to use hex pattern
    num_sectors_per_side = '2 2 2 2 2 2 '
    background_intervals = 1
    background_block_ids = '10'
    polygon_size = 1.15
    polygon_size_style ='apothem'
    ring_radii = '1'
    ring_intervals = '2'
    ring_block_ids = '303 301'  # 303 is tri mesh
    preserve_volumes = on
    quad_center_elements = false
  []
  # Assembly mesh with all the three types of pins
  [Patterned]
    type = PatternedHexMeshGenerator
    inputs = 'Fuel_hex HP_hex Mod_hex'
    hexagon_size = 13.376
    background_block_id = 10
    background_intervals = 1
    pattern = '1 0 1 0 1 0 1;
              0 2 0 2 0 2 0 0;
             1 0 1 0 1 0 1 2 1;
            0 2 0 2 0 2 0 0 0 0;
           1 0 1 0 1 0 1 2 1 2 1;
          0 2 0 2 0 2 0 0 0 0 0 0;
         1 0 1 0 1 0 1 2 1 2 1 2 1;
          0 2 0 2 0 2 0 0 0 0 0 0;
           1 0 1 0 1 0 1 2 1 2 1;
            0 2 0 2 0 2 0 0 0 0;
             1 0 1 0 1 0 1 2 1;
              0 2 0 2 0 2 0 0;
               1 0 1 0 1 0 1'
  []
  # Central void region
  [air_center]
    type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
    num_sectors_per_side= '4 4 4 4 4 4'
    meshes_to_adapt_to = 'Patterned Patterned Patterned Patterned Patterned Patterned'
    sides_to_adapt = '0 1 2 3 4 5'
    hexagon_size = 13.376
    background_intervals = 2
    background_block_ids = '600 601'
  []
  # Dummy assembly to help form a regular hexagonal core pattern
  # This will be deleted later
  [dummy]
    type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
    num_sectors_per_side= '4 4 4 4 4 4'
    hexagon_size = 13.376
    background_intervals = 2
    background_block_ids = '700 701'
       # external_boundary_id = 9998
  []
  # Stitching assemblies together to form the core mesh
  [core]
    type = PatternedHexMeshGenerator
    inputs = 'Patterned cd_0 cd_1 cd_2 cd_3 cd_4 cd_5 cd_6 cd_7 cd_8 cd_9 cd_10 cd_11 ref_0 ref_1 ref_2 ref_3 ref_4 ref_5 dummy air_center'
    # Pattern ID  0       1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16    17    18   19       20
    pattern_boundary = none
    generate_core_metadata = true
    pattern = '19 17 12 16 19;
             17 11  0  0  1 16;
           10  0  0  0  0  0  2;
          18 0  0   0  0  0  0 15;
        19  9  0  0  20  0  0  3 19;
          18 0  0   0  0  0  0 15;
            8  0  0  0  0  0  4;
             13  7  0  0  5 14;
               19 13  6 14 19'
    rotate_angle = 60
    assign_control_drum_id = true
  []
  # Delete the dummy assemblies
  [del_dummy]
    type = BlockDeletionGenerator
    block = '700 701'
    input = core
    new_boundary = 10000
  []
  # Add peripheral circular region
  [add_outer_shield]
    type = PeripheralRingMeshGenerator
    input = del_dummy
    peripheral_layer_num = 1
    peripheral_ring_radius = 115.0
    input_mesh_external_boundary = 10000
    peripheral_ring_block_id = 250
    peripheral_ring_block_name = outer_shield
 []
 # trim the full core to 1/6 core
 [del_1]
    type = PlaneDeletionGenerator
    point = '0 0 0'
    normal = '10 17.32 0'
    input = add_outer_shield
    new_boundary = 147
  []
  [del_2]
    type = PlaneDeletionGenerator
    point = '0 0 0'
    normal = '10 -17.32 0'
    input = del_1
    new_boundary = 147
  []
  # extrusion
  [extrude]
     type = AdvancedExtruderGenerator
     input = del_2
     heights = '20 160 20'
     # Use `num_layers = '6 16 6'` for BISON mesh
     num_layers = '1 8 1'
     # biased upper and lower reflector mesh, uncomment for BISON mesh
     # biases = '1.6 1.0 0.625'
     direction = '0 0 1'
     top_boundary = 2000
     bottom_boundary = 3000
  []
  # Define some special reflector blocks
  [reflector_bottom_quad]
    type = ParsedSubdomainMeshGenerator
    input = extrude
    combinatorial_geometry = 'z<=20'
    block_id = 1000
    excluded_subdomains = '103 203 303 250 400 401 500 501 502 503 504 600 601'
  []
  [reflector_bottom_tri]
    type = ParsedSubdomainMeshGenerator
    input = reflector_bottom_quad
    combinatorial_geometry = 'z<=20'
    block_id = 1003
    excluded_subdomains = '1000 250 400 401 500 501 502 503 504 600 601'
  []
  [reflector_top_quad]
    type = ParsedSubdomainMeshGenerator
    input = reflector_bottom_tri
    combinatorial_geometry = 'z>=180'
    block_id = 1000
    excluded_subdomains = '103 203 303 200 201 250 400 401 500 501 502 503 504 600 601'
  []
  [reflector_top_tri]
    type = ParsedSubdomainMeshGenerator
    input = reflector_top_quad
    combinatorial_geometry = 'z>=180'
    block_id = 1003
    excluded_subdomains = '1000 200 201 203 250 400 401 500 501 502 503 504 600 601'
  []
  # Assgin block names
  [rename_blocks]
    type = RenameBlockGenerator
    old_block = '     101       100         103          201        200           203            301       303        400            401         10      503      600         601        504          500                501          502         1000           1003'
    new_block = ' mod_ss moderator_quad moderator_tri hp_ss  heat_pipes_quad heat_pipes_tri fuel_quad fuel_tri reflector_tri reflector_quad monolith B4C air_gap_tri air_gap_quad air_gap_quad reflector_tri  reflector_quad reflector_quad reflector_quad reflector_tri'
    input = reflector_top_tri
  []
  # Assign boundary names
  [rename_boundaries]
    type = RenameBoundaryGenerator
    input = rename_blocks
    old_boundary = ' 10000 2000 3000 147'
    new_boundary = ' side top bottom side_mirror'
  []
  # Scale to m unit for general MOOSE application
  # Note that is_meter needs to be true in Griffin
  [scale]
    type = TransformGenerator
    input = rename_boundaries
    transform = SCALE
    vector_value = '1e-2 1e-2 1e-2'
  []
  # Rotate to the desired orientation for simulation
  [rotate_end]
    type = TransformGenerator
    input = scale
    transform = ROTATE
    vector_value = '0 0 -120'
  []
[]
(microreactors/mrad/mesh/HPMR_OneSixth_Core_meshgenerator_tri.i)

Figure 1: A cartoon showing the step-by-step procedures to generate the HP-MR mesh.

A 1/6 HP-MR core was generated using the input file shown above with steps illustrated in Figure 1. This mesh contains stainless steel envelopes for moderators and heat pipes, while the helium gaps are not meshed. The mesh density in radial direction is high, as multiple small features (fuel rods, moderators, heat pipes and control drums) are involved.

Compared with the mesh used in the legacy model, which was created from Cubit:

  • An outer surface zone surrounding the reflectors was added to provide the appropriate convex boundary for neutronic calculation.

  • The mesh was adjusted to preserve the actual physical volume of each material region.

The same mesh used by Griffin could also be adopted by BISON. However, the relatively coarse Griffin mesh would lead to power balance issues. To be specific, near the external boundaries (i.e., top/bottom/peripheral surfaces) as well as the interfaces between the reactor matrix and heat pipes, the mesh is not fine enough to ensure accurate calculation of heat flux, which is proportional to the temperature gradient. This issue is especially important to the interfaces between the reactor matrix and heat pipe outer surfaces, because they are the major heat sink of the system. Therefore, for the BISON mesh, the boundary layer and biased meshing features available in the Reactor Module are used to create a finer mesh with a focus on these external boundaries and interfaces. Only minor modifications on the mesh generation input file are needed to achieve these features, as indicated in the comments in the Griffin mesh generation input file shown above. The differences between the Griffin and the BISON meshes are illustrated in Figure 2.

Figure 2: The difference between the meshes used by the Griffin model (left) and the BISON model (right).

A more detailed comparison can be found in Table 1, which shows that using a finer mesh for BISON significantly reduced the power imbalance issue.

Table 1: Percentages of power removed from different surfaces of the HPMR showing i the improvements made by using a finer mesh for BISON modeling.

Total Energy RemovedHeat PipesTop/Bottom SurfacesSymmetric BoundaryPeripheral Surface
Coarse Mesh for BISON, standalone BISON with flat power profile93.31%90.04%2.84%0.40%0.02%
Fine Mesh for BISON, standalone BISON with flat power profile98.66%96.05%2.19%0.40%0.03%
Fine Mesh for BISON, steady-state multiphysics simulation99.30%97.50%1.37%0.41%0.03%

The input file used to generate the fine BISON mesh is listed as follows. Note the boundary layers and biasing setup in the input file. Additionally, the heat pipe related blocks are deleted from the BISON mesh and the heat pipe surfaces are defined as boundaries.

#####################################################################
# This is the MOOSE input file to generate the mesh that can be
# used for the 1/6 core Heat-Pipe Microreactor Multiphysics
# simulations (BISON thermal simulation).
# Running this input requires MOOSE Reactor Module Objects
# Users should use
# --mesh-only HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry_fine.e
# command line argument to generate
# exodus file for further Multiphysics simulations.
#####################################################################
[GlobalParams]
  # we use ':=' to override the values already defined in the !include file
  create_outward_interface_boundaries := false
[]

[Mesh]
  [HP_hex]
    # inner background boundary layer, only for BISON mesh
    background_inner_boundary_layer_bias = 1.5
    background_inner_boundary_layer_intervals = 3
    background_inner_boundary_layer_width = 0.03
  []
  [add_outer_shield]
    peripheral_layer_num := 2
    # Peripheral boundary layer, only for BISON mesh
    peripheral_outer_boundary_layer_bias = 0.625
    peripheral_outer_boundary_layer_intervals = 3
    peripheral_outer_boundary_layer_width = 2
  []
  [extrude]
    num_layers := '6 16 6'
    # biased upper and lower reflector mesh, only for BISON mesh
    biases = '1.6 1.0 0.625'
  []
  [split_hp_ss]
    type = SubdomainBoundingBoxGenerator
    input = rotate_end
    block_id = 1201
    block_name = 'hp_ss_up'
    restricted_subdomains = 'hp_ss'
    bottom_left = '-100 -100 1.8'
    top_right = '100 100 3.0'
  []
  [add_exterior_ht_low]
    type = SideSetsBetweenSubdomainsGenerator
    input = split_hp_ss
    paired_block = 'hp_ss'
    primary_block = 'monolith'
    new_boundary = 'heat_pipe_ht_surf_low'
  []
  [add_exterior_ht_up]
    type = SideSetsBetweenSubdomainsGenerator
    input = add_exterior_ht_low
    paired_block = 'hp_ss_up'
    primary_block = 'reflector_quad'
    new_boundary = 'heat_pipe_ht_surf_up'
  []
  [add_exterior_bot]
    type = SideSetsBetweenSubdomainsGenerator
    input = add_exterior_ht_up
    paired_block = 'heat_pipes_quad heat_pipes_tri hp_ss'
    primary_block = 'reflector_quad reflector_tri'
    new_boundary = 'heat_pipe_ht_surf_bot'
  []
  [merge_hp_surf]
    type = RenameBoundaryGenerator
    input = add_exterior_bot
    old_boundary = 'heat_pipe_ht_surf_low heat_pipe_ht_surf_up'
    new_boundary = 'heat_pipe_ht_surf heat_pipe_ht_surf'
  []
  [remove_hp]
    type = BlockDeletionGenerator
    input = merge_hp_surf
    block = 'hp_ss hp_ss_up heat_pipes_quad heat_pipes_tri'
  []

  # remove extra nodesets to limit the size of the mesh
  [clean_up]
    type = BoundaryDeletionGenerator
    input = remove_hp
    boundary_names = '1 3'
  []
[]

# This input defines the mesh generation for the Griffin mesh
!include HPMR_OneSixth_Core_meshgenerator_tri.i
(microreactors/mrad/mesh/HPMR_OneSixth_Core_meshgenerator_tri_fine.i)

Multiphysics Model Setup

Cross-Section Generation Using Serpent Code

The first step is to generate homogenized multi-group cross-sections using Serpent-2. The generated cross-sections are then converted into an XML-format file for compatibility with Griffin.

%----------------------------------------------------------------------------------------------------
% ANL HPMR Serpent (Version 2.1.32) Model Input
% If using or referring to this model, please cite as explained in
% https://mooseframework.inl.gov/virtual_test_bed/citing.html
%Contacts: Ahmed Abdelhameed (aabdelhameed.at.anl.gov), Nicolas Stauff (nstauff.at.anl.gov)
% -----------------------------------------------------------------------------
set title "ANL MicroReactor Core - pf - PF = 40"

pbed 801 33 "TRISO_U900_PF40_R100.inp"

% --- Compact --------------------------------------------------------------------------------------
surf  1 hexyprism 0.0 0.0 13.376      0 200 %fueled core
surf 91 hexyprism 0.0 0.0 130.0       0 200 %fueled core

surf 95l pz  20
surf 95u pz  180
surf 96l pz  18.0
surf 96u pz  182.0

surf  2 cyl 0.0 0.0 1.00   0.0 200
surf  3 cyl 0.0 0.0 0.825  0.0 200
surf 35 cyl 0.0 0.0 0.875  0.0 200
surf 36 cyl 0.0 0.0 0.900  0.0 200
surf 3g cyl 0.0 0.0 0.920  0.0 200
surf 5g cyl 0.0 0.0 1.07   0.0 200
surf  5 cyl 0.0 0.0 1.05   0.0 200
surf 51 cyl 0.0 0.0 0.97   0.0 200
surf 52 cyl 0.0 0.0 0.90   0.0 200
surf 53 cyl 0.0 0.0 0.80   0.0 200

surf inf inf

particle 900
fuel      2.1250e-02
buffer    3.1250e-02
PyC1      3.5250e-02
SiC       3.8750e-02
PyC2      4.2750e-02
matrix_pin

% infinite cells defining material universes
cell 51 802 moderator  -inf
cell 52 33  matrix_pin -inf
cell 53 803    matrix  -inf
cell 55 804       air  -inf
cell 56 805  beryllium -inf
cell 57 806  shell_mod -inf
cell 64 813  shell_hp  -inf
cell 58 820  shell_air_center -inf

% mixed wick and coo_vap and liqu
cell 65 815 hp_vp_liq_wick -inf

% mixed air and ss in moderator
cell 68 816 shell_air_mod -inf

% mixed air and ss in heatpipe
cell 72 817 shell_air_hp   -inf

%  control drums
cell 61 810 beryllium_drum -inf
cell 62 811   B4C_drum -inf
cell 63 812   B4C_central -inf

% fuel
cell 11   3 fill 801        -2  95l -95u % fuel compact
cell 12   3 fill 803         2  95l -95u
cell 125  3 fill 805                 95u
cell 126  3 fill 805                -95l

% Yan simplified model removed caps for the HP and moderator pins extended into the Be reflectors
% moderator
cell 13   2 fill 802    -3      95l -95u % active length
cell 14   2 fill 816     3 -3g  95l -95u
cell 15   2 fill 803     3g     95l -95u
cell 151  2 fill 805       -36  96l -95l % 0.05 cm shell
cell 152  2 fill 805       -36  95u -96u % 0.05 cm shell
cell 151a 2 fill 805   -3g  36  96l -95l % 0.05 cm shell
cell 152a 2 fill 805   -3g  36  95u -96u % 0.05 cm shell
cell 153  2 fill 805        3g  96l -95l % 0.05 cm shell
cell 154  2 fill 805        3g  95u -96u % 0.05 cm shell
cell 155  2 fill 805                 96u
cell 156  2 fill 805                -96l

% heat pipe cell
cell 16i  1 fill 815      -51 95l
cell 16o  1 fill 817   51 -5g 95l
cell 17   1 fill 803       5g 95l -95u
cell 175  1 fill 805       5g 95u
cell 176  1 fill 805         -96l
cell 177  1 fill 805      -5  96l -95l
cell 178  1 fill 805       5g 96l -95l
cell 178a 1 fill 805   -5g 5  96l -95l

% monolith filled cell
% cell 18  8 fill 804     -inf
cell 18  8 fill 820     -inf

% monolith filled cell
cell 19  9 fill 803     -inf

% monolith filled cell
cell 20 10 fill 805           -inf

% monolith filled cell
% cell 21 11 fill 804           -inf
cell 21 11 fill 820           -inf

% --- Assembly lattice

lat 20  2  0.0 0.0 19 19 2.3
% New Assembly Configuration - 2 time less moderator - more fuel
 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
  9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
   9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
    9 9 9 9 9 9 9 9 9 1 3 1 3 1 3 1 9 9 9
     9 9 9 9 9 9 9 9 3 3 2 3 2 3 2 3 9 9 9
      9 9 9 9 9 9 9 1 2 1 3 1 3 1 3 1 9 9 9
       9 9 9 9 9 9 3 3 3 3 2 3 2 3 2 3 9 9 9
        9 9 9 9 9 1 2 1 2 1 3 1 3 1 3 1 9 9 9
         9 9 9 9 3 3 3 3 3 3 2 3 2 3 2 3 9 9 9
          9 9 9 1 2 1 2 1 2 1 3 1 3 1 3 1 9 9 9
           9 9 9 3 3 3 3 3 3 2 3 2 3 2 3 9 9 9 9
            9 9 9 1 2 1 2 1 3 1 3 1 3 1 9 9 9 9 9
             9 9 9 3 3 3 3 2 3 2 3 2 3 9 9 9 9 9 9
              9 9 9 1 2 1 3 1 3 1 3 1 9 9 9 9 9 9 9
               9 9 9 3 3 2 3 2 3 2 3 9 9 9 9 9 9 9 9
                9 9 9 1 3 1 3 1 3 1 9 9 9 9 9 9 9 9 9
                 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
                  9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
                   9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

trans 20 0.0 0.0 0.0 0.0 0.0 30.

lat 80  2  0.0 0.0 1 1 26.752
 10  % Be

lat 90  2  0.0 0.0 1 1 26.752
  8  % air

lat 91  2  0.0 0.0 1 1 26.752
  11  % air o  B4C

lat 50  2  0.0 0.0 13 13 26.752
 90 90 90 90 90 90 90 90 90 90 90 90 90
  90 90 90 90 90 90 90 90 90 90 90 90 90
   90 90 90 90 90 90 90 80 90 80 90 90 90
    90 90 90 90 90 80 90 20 20 90 80 90 90
     90 90 90 90 90 20 20 20 20 20 90 90 90
      90 90 90 80 20 20 20 20 20 20 80 90 90
       90 90 90 90 20 20 91 20 20 90 90 90 90
        90 90 80 20 20 20 20 20 20 80 90 90 90
         90 90 90 20 20 20 20 20 90 90 90 90 90
          90 90 80 90 20 20 90 80 90 90 90 90 90
           90 90 90 80 90 80 90 90 90 90 90 90 90
            90 90 90 90 90 90 90 90 90 90 90 90 90
             90 90 90 90 90 90 90 90 90 90 90 90 90

% -----------DRUMS DEFINITTION---------------------------------------------------------------------------------------

cell 102 0 fill 50 -91 731 732 733 734 735 736 737 738 739 740 741 742
cell 180 0 fill       731 -731
cell 181 0 fill       732 -732
cell 182 0 fill       733 -733
cell 183 0 fill       734 -734
cell 184 0 fill       735 -735
cell 185 0 fill       736 -736
cell 186 0 fill       737 -737
cell 187 0 fill       738 -738
cell 188 0 fill       739 -739
cell 189 0 fill       740 -740
cell 190 0 fill       741 -741
cell 191 0 fill       742 -742

surf 731 cyl 80.2560   0.00 13.2500   0.00 200.00
surf 831 cyl 80.2560   0.00 12.2500   0.00 200.00
surf 771 plane 1.0000   0.00 0.0  88.92
surf 871 plane 1.0000  -0.00 0.0  71.59
cell 801  731 fill 810   -731   -771
cell 802  731 fill 811    831  -731  771
cell 803  731 fill 810   -831   771
surf 732 cyl 40.1280  69.50 13.2500   0.00 200.00
surf 832 cyl 40.1280  69.50 12.2500   0.00 200.00
surf 772 plane 1.0000   1.73 0.0 177.84
surf 872 plane 1.0000   1.73 0.0 143.19
cell 806  732 fill 810   -732   -772
cell 807  732 fill 811    832  -732  772
cell 808  732 fill 810   -832   772
surf 733 cyl -40.1280  69.50 13.2500   0.00 200.00
surf 833 cyl -40.1280  69.50 12.2500   0.00 200.00
surf 773 plane 1.0000  -1.73 0.0 -177.84
surf 873 plane 1.0000  -1.73 0.0 -143.19
cell 811  733 fill 810   -733   773
cell 812  733 fill 811    833  -733  -773
cell 813  733 fill 810   -833   -773
surf 734 cyl -80.2560   0.00 13.2500   0.00 200.00
surf 834 cyl -80.2560   0.00 12.2500   0.00 200.00
surf 774 plane 1.0000  -0.00 0.0 -88.92
surf 874 plane 1.0000   0.00 0.0 -71.59
cell 816  734 fill 810   -734   774
cell 817  734 fill 811    834  -734  -774
cell 818  734 fill 810   -834   -774
surf 735 cyl -40.1280 -69.50 13.2500   0.00 200.00
surf 835 cyl -40.1280 -69.50 12.2500   0.00 200.00
surf 775 plane 1.0000   1.73 0.0 -177.84
surf 875 plane 1.0000   1.73 0.0 -143.19
cell 821  735 fill 810   -735   775
cell 822  735 fill 811    835  -735  -775
cell 823  735 fill 810   -835   -775
surf 736 cyl 40.1280 -69.50 13.2500   0.00 200.00
surf 836 cyl 40.1280 -69.50 12.2500   0.00 200.00
surf 776 plane 1.0000  -1.73 0.0 177.84
surf 876 plane 1.0000  -1.73 0.0 143.19
cell 826  736 fill 810   -736   -776
cell 827  736 fill 811    836  -736  776
cell 828  736 fill 810   -836   776
surf 737 cyl 80.2563  46.34 13.2500   0.00 200.00
surf 837 cyl 80.2563  46.34 12.2500   0.00 200.00
surf 777 plane 1.0000   0.58 0.0 117.01
surf 877 plane 1.0000   0.58 0.0  97.01
cell 831  737 fill 810   -737   -777
cell 832  737 fill 811    837  -737  777
cell 833  737 fill 810   -837   777
surf 738 cyl 0.0000  92.67 13.2500   0.00 200.00
surf 838 cyl 0.0000  92.67 12.2500   0.00 200.00
surf 778 plane 0.0000   1.00 0.0 101.33
surf 878 plane 0.0000   1.00 0.0  84.01
cell 836  738 fill 810   -738   -778
cell 837  738 fill 811    838  -738  778
cell 838  738 fill 810   -838   778
surf 739 cyl -80.2563  46.34 13.2500   0.00 200.00
surf 839 cyl -80.2563  46.34 12.2500   0.00 200.00
surf 779 plane 1.0000  -0.58 0.0 -117.01
surf 879 plane 1.0000  -0.58 0.0 -97.01
cell 841  739 fill 810   -739   779
cell 842  739 fill 811    839  -739  -779
cell 843  739 fill 810   -839   -779
surf 740 cyl -80.2563 -46.34 13.2500   0.00 200.00
surf 840 cyl -80.2563 -46.34 12.2500   0.00 200.00
surf 780 plane 1.0000   0.58 0.0 -117.01
surf 880 plane 1.0000   0.58 0.0 -97.01
cell 846  740 fill 810   -740   780
cell 847  740 fill 811    840  -740  -780
cell 848  740 fill 810   -840   -780
surf 741 cyl -0.0000 -92.67 13.2500   0.00 200.00
surf 841 cyl -0.0000 -92.67 12.2500   0.00 200.00
surf 781 plane 0.0000   1.00 0.0 -101.33
surf 881 plane 1.0000 1219076296694385.50 0.0 -102414528894101376.00
cell 851  741 fill 810   -741   781
cell 852  741 fill 811    841  -741  -781
cell 853  741 fill 810   -841   -781
surf 742 cyl 80.2563 -46.34 13.2500   0.00 200.00
surf 842 cyl 80.2563 -46.34 12.2500   0.00 200.00
surf 782 plane 1.0000  -0.58 0.0 117.01
surf 882 plane 1.0000  -0.58 0.0  97.01
cell 856  742 fill 810   -742   -782
cell 857  742 fill 811    842  -742  782
cell 858  742 fill 810   -842   782

% --------------------------------------------------------------------------------------------------
cell 104 0 outside  91

set ures 1

% --------------------------------------------------------------------------------------------------
% Material data:

% materials

mat air -0.18e-3   rgb 255 255 255   tmp  700
 2004.01c  1

mat shell_mod -7.90   rgb 133 133 133    tmp  700
 6012.01c  1.9010E-03
 14028.01c  9.2693E-03
 14029.01c  4.7251E-04
 14030.01c  3.1166E-04
 15031.01c  4.1322E-04
 16032.01c  2.4710E-04
 16033.01c  1.9511E-06
 16034.01c  1.1056E-05
 16036.01c  3.0016E-08
 24050.01c  7.9116E-03
 24052.01c  1.5257E-01
 24053.01c  1.7300E-02
 24054.01c  4.3063E-03
 25055.01c  1.0280E-02
 26054.01c  3.9029E-02
 26056.01c  6.1213E-01
 26057.01c  1.4144E-02
 26058.01c  1.3343E-03
 28058.01c  7.7516E-02
 28060.01c  2.9859E-02
 28061.01c  1.2981E-03
 28062.01c  4.1389E-03
 28064.01c  1.0544E-03
 42092.01c  2.1259E-03
 42094.01c  1.3299E-03
 42095.01c  2.3030E-03
 42096.01c  2.4191E-03
 42097.01c  1.3903E-03
 42098.01c  3.5249E-03
42100.01c  1.4135E-03

mat shell_hp -7.90   rgb 133 133 133    tmp  700
 6012.01c  1.9010E-03
14028.01c  9.2693E-03
14029.01c  4.7251E-04
14030.01c  3.1166E-04
15031.01c  4.1322E-04
16032.01c  2.4710E-04
16033.01c  1.9511E-06
16034.01c  1.1056E-05
16036.01c  3.0016E-08
24050.01c  7.9116E-03
24052.01c  1.5257E-01
24053.01c  1.7300E-02
24054.01c  4.3063E-03
25055.01c  1.0280E-02
26054.01c  3.9029E-02
26056.01c  6.1213E-01
26057.01c  1.4144E-02
26058.01c  1.3343E-03
28058.01c  7.7516E-02
28060.01c  2.9859E-02
28061.01c  1.2981E-03
28062.01c  4.1389E-03
28064.01c  1.0544E-03
42092.01c  2.1259E-03
42094.01c  1.3299E-03
42095.01c  2.3030E-03
42096.01c  2.4191E-03
42097.01c  1.3903E-03
42098.01c  3.5249E-03
42100.01c  1.4135E-03

mat shell_air_mod 2.290E-02 rgb 133 133 133    tmp  700
   2004.01c   1.983E-05
   6012.01c   4.349E-05
   14028.01c   2.121E-04
   14029.01c   1.081E-05
   14030.01c   7.130E-06
   15031.01c   9.454E-06
   16032.01c   5.653E-06
   16033.01c   4.464E-08
   16034.01c   2.530E-07
   16036.01c   6.867E-10
   24050.01c   1.810E-04
   24052.01c   3.491E-03
   24053.01c   3.958E-04
   24054.01c   9.852E-05
   25055.01c   2.352E-04
   26054.01c   8.929E-04
   26056.01c   1.400E-02
   26057.01c   3.236E-04
   26058.01c   3.053E-05
   28058.01c   1.773E-03
   28060.01c   6.831E-04
   28061.01c   2.970E-05
   28062.01c   9.469E-05
   28064.01c   2.412E-05
   42092.01c   4.864E-05
   42094.01c   3.043E-05
   42095.01c   5.269E-05
   42096.01c   5.535E-05
   42097.01c   3.181E-05
   42098.01c   8.065E-05
   42100.01c   3.234E-05

mat shell_air_hp 6.771E-02 rgb 133 133 133    tmp  700
2004.01c  5.629E-06
6012.01c  1.287E-04
14028.01c  6.276E-04
14029.01c  3.199E-05
14030.01c  2.110E-05
15031.01c  2.798E-05
16032.01c  1.673E-05
16033.01c  1.321E-07
16034.01c  7.486E-07
16036.01c  2.032E-09
24050.01c  5.357E-04
24052.01c  1.033E-02
24053.01c  1.171E-03
24054.01c  2.916E-04
25055.01c  6.960E-04
26054.01c  2.643E-03
26056.01c  4.145E-02
26057.01c  9.576E-04
26058.01c  9.034E-05
28058.01c  5.248E-03
28060.01c  2.022E-03
28061.01c  8.789E-05
28062.01c  2.802E-04
28064.01c  7.139E-05
42092.01c  1.439E-04
42094.01c  9.004E-05
42095.01c  1.559E-04
42096.01c  1.638E-04
42097.01c  9.413E-05
42098.01c  2.387E-04
42100.01c  9.570E-05

mat shell_air_center 8.815E-04 rgb 133 133 133  tmp  700
2004.01c   2.68E-05
6012.01c   1.62E-06
14028.01c   7.92E-06
14029.01c   4.04E-07
14030.01c   2.66E-07
15031.01c   3.53E-07
16032.01c   2.11E-07
16033.01c   1.67E-09
16034.01c   9.45E-09
16036.01c   2.57E-11
24050.01c   6.76E-06
24052.01c   1.30E-04
24053.01c   1.48E-05
24054.01c   3.68E-06
25055.01c   8.79E-06
26054.01c   3.34E-05
26056.01c   5.23E-04
26057.01c   1.21E-05
26058.01c   1.14E-06
28058.01c   6.63E-05
28060.01c   2.55E-05
28061.01c   1.11E-06
28062.01c   3.54E-06
28064.01c   9.01E-07
42092.01c   1.82E-06
42094.01c   1.14E-06
42095.01c   1.97E-06
42096.01c   2.07E-06
42097.01c   1.19E-06
42098.01c   3.01E-06
42100.01c   1.21E-06

mat coo_vap  -1.11e-4 rgb 250 50 250    tmp  700
19039.01c   0.93258
19040.01c   0.00012
19041.01c   0.06730

mat coo_liq  -0.705 rgb 50 250 50    tmp  700
19039.01c   0.93258
19040.01c   0.00012
19041.01c   0.06730

mat wick  -2.753 rgb 250 250 50     tmp  700
 6012.01c  5.589E-04
14028.01c  2.725E-03
14029.01c  1.389E-04
14030.01c  9.163E-05
15031.01c  1.215E-04
16032.01c  7.265E-05
16033.01c  5.736E-07
16034.01c  3.250E-06
16036.01c  8.825E-09
24050.01c  2.326E-03
24052.01c  4.485E-02
24053.01c  5.086E-03
24054.01c  1.266E-03
25055.01c  3.022E-03
26054.01c  1.147E-02
26056.01c  1.800E-01
26057.01c  4.158E-03
26058.01c  3.923E-04
28058.01c  2.279E-02
28060.01c  8.778E-03
28061.01c  3.816E-04
28062.01c  1.217E-03
28064.01c  3.100E-04
42092.01c  6.250E-04
42094.01c  3.910E-04
42095.01c  6.771E-04
42096.01c  7.112E-04
42097.01c  4.087E-04
42098.01c  1.036E-03
42100.01c  4.156E-04
19039.01c  6.584E-01
19040.01c  8.472E-05
19041.01c  4.751E-02

mat hp_vp_liq_wick  8.324E-03  rgb 250 250 50     tmp  700
   6012.01c   3.808E-06
   14028.01c   1.856E-05
   14029.01c   9.463E-07
   14030.01c   6.242E-07
   15031.01c   8.277E-07
   16032.01c   4.949E-07
   16033.01c   3.908E-09
   16034.01c   2.214E-08
   16036.01c   6.012E-11
   24050.01c   1.585E-05
   24052.01c   3.055E-04
   24053.01c   3.465E-05
   24054.01c   8.625E-06
   25055.01c   2.059E-05
   26054.01c   7.814E-05
   26056.01c   1.226E-03
   26057.01c   2.833E-05
   26058.01c   2.673E-06
   28058.01c   1.553E-04
   28060.01c   5.980E-05
   28061.01c   2.600E-06
   28062.01c   8.291E-06
   28064.01c   2.112E-06
   42092.01c   4.258E-06
   42094.01c   2.664E-06
   42095.01c   4.613E-06
   42096.01c   4.845E-06
   42097.01c   2.784E-06
   42098.01c   7.058E-06
   42100.01c   2.831E-06
   19039.01c   5.895E-03
   19040.01c   7.586E-07
   19041.01c   4.254E-04

therm h-yh2 h-yh2.84t
therm y-yh2 y-yh2.84t
mat moderator   -4.0850  moder h-yh2 1001 moder y-yh2 39089  tmp  700.0   rgb 73 64 171
39089.01c  0.357142857
1001.01c   0.642857143

% -- Fuel

div fuel sep 0
mat fuel   -10.7440 burn 1    rgb 255 0 0  tmp  700
  92235.01c    6.8794e-02
  92238.01c    2.7604e-01
  6012.01c    1.3793e-01
  8016.01c    5.1724e-01

% --- Carbon buffer layer:

mat buffer   -1.0400   rgb 0 200 200  moder grph_f 6012    tmp  700
 6012.01c    1.0

% --- Pyrolytic carbon layer:

mat PyC1     -1.8820    rgb 0 200 200  moder grph_f 6012    tmp  700
 6012.01c    1.0

% --- Pyrolytic carbon layer:

mat PyC2     -1.8820  rgb 0 200 200    moder grph_f 6012     tmp  700
 6012.01c    1.0

% --- Silicon carbide layer:

mat SiC     -3.1710  rgb 0 100 0     tmp  700
14028.01c    0.4611
14029.01c    0.0234
14030.01c    0.0154
 6012.01c    0.5

% --- Graphite matrix:
therm grph_f grph.84t
mat matrix_pin   -1.8060  rgb 220 220 220    moder grph_f 6012    tmp  700
 6012.01c  0.9999997
 5010.01c  0.0000003

therm grph_m grph.84t
mat matrix     -1.8060 rgb 200 200 200    moder grph_m 6012    tmp  700
 6012.01c  0.9999997
 5010.01c  0.0000003

therm bemet be-met.84t
mat beryllium  -1.848   rgb 0 255 0 moder bemet 4009  tmp  700
 4009.01c  1.00

mat beryllium_drum  -1.848   rgb 50 220 50 moder bemet 4009  tmp  700
 4009.01c  1.00

%
mat B4C_drum  -2.510  rgb 250 0 0   tmp  700
 5010.01c 0.76
 5011.01c 0.04
 6012.01c 0.2
%
mat B4C_central  -1.25  rgb 150 20 20   tmp  700
 5010.01c 0.76
 5011.01c 0.04
 6012.01c 0.2
% -----------------------------------------------------------------------------

% Calculation parameters:

% -----------------------------------------------------------------------------

% --- Geometry plot:
plot 3 10000 10000   21.0
plot 2 10000 10000    5.0
mesh 3 5000 5000
mesh 2 5000 5000

set mcvol 100000000
set xenon 1

% --- Libraries:
% Add your own libraries here
set acelib "sss_endfb8_serpent_yan.xsdir"  % ACE library for cross-sections
set declib "sss_endfb7.dec" % Decay library
set nfylib "sss_endfb7.nfy" % Neutron fission yield library

% --- Boundary conditions:

set bc 1 1 1

% --- Power density

set power 2e6  % W

% --- Histories:
set pop 100000 500 30

set gcu 801 802 803 805 815 816 817 810 811 820

set nfg  11  8.00000e-08 1.80000e-07 6.25000e-07 1.30000e-06 4.00000e-06
             1.48730e-04 9.11800e-03 1.83000e-01 5.00000e-01 1.35300e+00
% -----------------------------------------------------------------------------
(microreactors/mrad/Serpent_Model/serpent_input.i)

Note on LFS

Large File Storage (LFS) is used for the following file: TRISO_U900_PF40_R100

This file defines the distribution, and radius of the TRISO particles to achieve 40% packing fraction. Make sure to install git lfs, then fetch and pull these files to be able to run the Serpent inputs.

The Monte Carlo Serpent-2 model has been set up to simulate the double heterogeneity of the HP-MR full core explicitly with the most recent ENDF/B-8.0 cross section data sets. This Monte Carlo model is used not only to provide reference solutions to the Griffin neutronics model for multiphysics simulations, but also to generate condensed multigroup cross sections for Griffin.

In particular, multigroup cross sections were generated for each material zone by tallying the average reaction rates and group fluxes within that material region in Serpent-2 criticality calculations. Different sets of cross sections were prepared with fuel and moderator temperatures ( and ) assumed at 600 K, 700 K, 800 K, 1000 K, and 1200 K respectively.

These cross-section sets were then read by the ISOXML utility module in Griffin to create a bi-dimensional cross-section table, which was used in the multiphysics coupled transient simulations.

Griffin Model

Griffin is used to govern the neutronics of the HP-MR as the parent application of the multiphysics simulation.

The DFEM-SN(1,3) neutronics solver with CMFD acceleration in Griffin is used in this model.

################################################################################
## NEAMS Micro-Reactor Application Driver                                     ##
## Heat Pipe Microreactor Steady State                                        ##
## Griffin Main Application input file                                        ##
## DFEM-SN (1, 3) with CMFD acceleration                                      ##
################################################################################

[Mesh]
  [fmg]
    type = FileMeshGenerator
    file = '../mesh/gold/HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry.e'
  []
  [fmg_id]
    type = SubdomainExtraElementIDGenerator
    input = fmg
    subdomains = '200 203 100 103 301 303 10 503 600 601 201 101 400 401 250'
    extra_element_id_names = 'material_id equivalence_id'
    extra_element_ids = '815 815 802 802 801 801 803 811 820 820 817 816 805 805 820;
                         815 815 802 802 801 801 803 811 820 820 817 816 805 805 820'
  []
  [coarse_mesh]
    type = GeneratedMeshGenerator
    dim = 3
    nx = 10
    ny = 10
    nz = 10
    xmin = -0.1
    xmax = 1.1
    ymin = -0.1
    ymax = 1.2
    zmin = -0.0
    zmax = 2.1
  []
  [assign_coarse_id]
    type = CoarseMeshExtraElementIDGenerator
    input = fmg_id
    coarse_mesh = coarse_mesh
    extra_element_id_name = coarse_element_id
  []
  uniform_refine = 0
[]

[Executioner]
  type = SweepUpdate

  richardson_abs_tol = 1e-6 #-8
  richardson_rel_tol = 1e-8
  richardson_value = eigenvalue

  richardson_max_its = 1000
  inner_solve_type = GMRes
  max_inner_its = 20

  fixed_point_max_its = 1
  custom_pp = eigenvalue
  custom_rel_tol = 1e-6
  force_fixed_point_solve = true

  cmfd_acceleration = true
  coarse_element_id = coarse_element_id
  prolongation_type = multiplicative
  max_diffusion_coefficient = 1
[]

[TransportSystems]
  particle = neutron
  equation_type = eigenvalue

  G = 11
  VacuumBoundary = '10000 2000 3000'
  ReflectingBoundary = '147'

  [sn]
    scheme = DFEM-SN
    family = MONOMIAL
    order = first
    AQtype = Gauss-Chebyshev
    NPolar = 1
    NAzmthl = 3
    NA = 2
    sweep_type = asynchronous_parallel_sweeper
    using_array_variable = true
    collapse_scattering = true
    n_delay_groups = 6
  []
[]

[AuxVariables]
  [Tf]
    initial_condition = 873.15
    order = CONSTANT
    family = MONOMIAL
  []
  [Tm]
    initial_condition = 873.15
    order = CONSTANT
    family = MONOMIAL
  []
[]

[GlobalParams]
  library_file = '../isoxml/fullcore_xml_G11_endfb8_ss_tr.xml'
  library_name = fullcore_xml_G11_endfb8_ss_tr
  isotopes = 'pseudo'
  densities = 1.0
  is_meter = true
  plus = true
  dbgmat = false
  grid_names = 'Tfuel Tmod'
  grid_variables = 'Tf Tm'
[]

[Materials]
  [mod]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    block = '200 203 100 103 301 303 10 503 600 601 201 101 400 401 250'
  []
[]

[PowerDensity]
  power = 345.6e3
  power_density_variable = power_density
  integrated_power_postprocessor = integrated_power
[]

[MultiApps]
  [bison]
    type = FullSolveMultiApp
    app_type = BisonApp
    positions = '0 0 0'
    input_files = HPMR_thermo_ss.i
    execute_on = 'timestep_end'
    keep_solution_during_restore = true
  []
[]

[Transfers]
  [to_sub_power_density]
    type = MultiAppGeneralFieldShapeEvaluationTransfer
    to_multi_app = bison
    source_variable = power_density
    variable = power_density
    from_postprocessors_to_be_preserved = integrated_power
    to_postprocessors_to_be_preserved = power

    search_value_conflicts = false
  []
  [from_sub_temp_fuel]
    type = MultiAppGeneralFieldNearestLocationTransfer
    from_multi_app = bison
    variable = Tf
    source_variable = Tfuel
    execute_on = 'initial timestep_end'
    displaced_source_mesh = false
    displaced_target_mesh = false
    use_displaced_mesh = false

    search_value_conflicts = false
  []
  [from_sub_temp_mod]
    type = MultiAppGeneralFieldNearestLocationTransfer
    from_multi_app = bison
    variable = Tm
    source_variable = Tmod
    execute_on = 'initial timestep_end'
    displaced_source_mesh = false
    displaced_target_mesh = false
    use_displaced_mesh = false

    search_value_conflicts = false
  []
[]

[UserObjects]
  [ss]
    type = TransportSolutionVectorFile
    transport_system = sn
    writing = true
    execute_on = final
  []
[]

[Postprocessors]
  [scaled_power_avg]
    type = ElementAverageValue
    block = 'fuel_quad fuel_tri'
    variable = power_density
    execute_on = 'initial timestep_end'
  []
  [fuel_temp_avg]
    type = ElementAverageValue
    variable = Tf
    block = 'fuel_quad fuel_tri'
    execute_on = 'initial timestep_end'
  []
  [fuel_temp_max]
    type = ElementExtremeValue
    value_type = max
    variable = Tf
    block = 'fuel_quad fuel_tri'
    execute_on = 'initial timestep_end'
  []
  [fuel_temp_min]
    type = ElementExtremeValue
    value_type = min
    variable = Tf
    block = 'fuel_quad fuel_tri'
    execute_on = 'initial timestep_end'
  []
  [mod_temp_avg]
    type = ElementAverageValue
    variable = Tm
    block = 'moderator_quad moderator_tri'
    execute_on = 'initial timestep_end'
  []
  [mod_temp_max]
    type = ElementExtremeValue
    value_type = max
    variable = Tm
    block = 'moderator_quad moderator_tri'
    execute_on = 'initial timestep_end'
  []
  [mod_temp_min]
    type = ElementExtremeValue
    value_type = min
    variable = Tm
    block = 'moderator_quad moderator_tri'
    execute_on = 'initial timestep_end'
  []
[]

[Outputs]
  csv = true
  exodus = true
  perf_graph = true
[]
(microreactors/mrad/steady/HPMR_dfem_griffin_ss.i)

BISON Model

BISON is used to simulate thermal physics of the 1/6 HP-MR core as a child application, as it is equipped with a comprehensive set of thermophysical properties of relevant nuclear materials, especially the TRISO-loaded graphite and 316SS.

As the heat pipe behavior is simulated by Sockeye, the heat pipe blocks are removed from the mesh used by BISON. The thermal behavior of the rest of the HP-MR core is dominated by heat conduction. Convective boundary conditions were defined at the top and bottom of the model with an external temperature of 800 K and a heat transfer coefficient (HTC) of 100 W/m2•K.

################################################################################
## NEAMS Micro-Reactor Application Driver                                     ##
## Heat Pipe Microreactor Steady State                                        ##
## BISON Child Application input file                                         ##
## Thermal Only Physics                                                       ##
################################################################################

R_clad_o = 0.0105 # heat pipe outer radius
R_hp_hole = 0.0107 # heat pipe + gap
num_sides = 12 # number of sides of heat pipe as a result of mesh polygonization
alpha = '${fparse 2 * pi / num_sides}'
perimeter_correction = '${fparse 0.5 * alpha / sin(0.5 * alpha)}' # polygonization correction factor for perimeter
area_correction = '${fparse sqrt(alpha / sin(alpha))}' # polygonization correction factor for area
corr_factor = '${fparse R_hp_hole / R_clad_o * area_correction / perimeter_correction}'

[GlobalParams]
  flux_conversion_factor = 1
[]

[Mesh]
  [fmg]
    type = FileMeshGenerator
    file = '../mesh/gold/HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry_fine.e'
  []
[]

[Variables]
  [temp]
    initial_condition = 800
  []
[]

[Kernels]
  # The time derivative kernel has been removed
  # We are obtaining a steady-state solution and it's preferrable not to march in time
  # to steady state as marching is expensive.
  [heat_conduction]
    type = HeatConduction
    variable = temp
  []
  [heat_source_fuel]
    type = CoupledForce
    variable = temp
    block = 'fuel_quad fuel_tri'
    v = power_density
  []
[]

[AuxVariables]
  [power_density]
    block = 'fuel_quad fuel_tri'
    family = L2_LAGRANGE
    order = FIRST
    initial_condition = 3.4e6
  []
  [Tfuel]
    block = 'fuel_quad fuel_tri'
  []
  [Tmod]
    block = 'moderator_quad moderator_tri'
  []
  [fuel_thermal_conductivity]
    block = 'fuel_quad fuel_tri'
    order = CONSTANT
    family = MONOMIAL
  []
  [fuel_specific_heat]
    block = 'fuel_quad fuel_tri'
    order = CONSTANT
    family = MONOMIAL
  []
  [monolith_thermal_conductivity]
    block = 'monolith '
    order = CONSTANT
    family = MONOMIAL
  []
  [monolith_specific_heat]
    block = 'monolith '
    order = CONSTANT
    family = MONOMIAL
  []
  [flux_uo] #auxvariable to hold heat pipe surface flux from UserObject
    block = 'reflector_quad monolith'
  []
  [flux_uo_corr] #auxvariable to hold corrected flux_uo
    block = 'reflector_quad monolith'
  []
  [hp_temp_aux]
    block = 'reflector_quad monolith'
  []
[]

[AuxKernels]
  [assign_tfuel]
    type = NormalizationAux
    variable = Tfuel
    source_variable = temp
    execute_on = 'timestep_end'
  []
  [assign_tmod]
    type = NormalizationAux
    variable = Tmod
    source_variable = temp
    execute_on = 'timestep_end'
  []
  [fuel_thermal_conductivity]
    type = MaterialRealAux
    variable = fuel_thermal_conductivity
    property = thermal_conductivity
    execute_on = timestep_end
  []
  [fuel_specific_heat]
    type = MaterialRealAux
    variable = fuel_specific_heat
    property = specific_heat
    execute_on = timestep_end
  []
  [monolith_thermal_conductivity]
    type = MaterialRealAux
    variable = monolith_thermal_conductivity
    property = thermal_conductivity
    execute_on = timestep_end
  []
  [monolith_specific_heat]
    type = MaterialRealAux
    variable = monolith_specific_heat
    property = specific_heat
    execute_on = timestep_end
  []
  [flux_uo]
    type = SpatialUserObjectAux
    variable = flux_uo
    user_object = flux_uo
  []
  [flux_uo_corr]
    type = NormalizationAux
    variable = flux_uo_corr
    source_variable = flux_uo
    normal_factor = '${fparse corr_factor}'
  []
[]

[BCs]
  [outside_bc]
    type = ConvectiveFluxFunction # (Robin BC)
    variable = temp
    boundary = 'bottom top side'
    coefficient = 1e3 # W/K/m^2
    T_infinity = 800 # K air temperature at the top of the core
  []
  [hp_temp]
    type = CoupledConvectiveHeatFluxBC
    boundary = 'heat_pipe_ht_surf'
    variable = temp
    T_infinity = hp_temp_aux
    htc = 750
  []
[]

[Materials]
  [fuel_matrix_thermal]
    type = GraphiteMatrixThermal
    block = 'fuel_quad fuel_tri'
    graphite_grade = IG_110
    packing_fraction = 0.4
    specific_heat_scale_factor = 1.0
    thermal_conductivity_scale_factor = 1.0
    fast_neutron_fluence = 0 #6.75E+24 # this value is nuetron fluence over 0.1MeV
    temperature = temp
  []
  [monolith_matrix_thermal]
    type = GraphiteMatrixThermal
    block = 'monolith '
    graphite_grade = IG_110
    packing_fraction = 0
    specific_heat_scale_factor = 1.0
    thermal_conductivity_scale_factor = 1.0
    fast_neutron_fluence = 0 #6.75E+24 # this value is nuetron fluence over 0.1MeV
    temperature = temp
  []
  [moderator_thermal]
    type = HeatConductionMaterial
    block = 'moderator_quad moderator_tri'
    temp = temp
    thermal_conductivity = 20 # W/m/K
    specific_heat = 500 # random value
  []
  [airgap_thermal]
    type = HeatConductionMaterial
    block = 'air_gap_tri air_gap_quad outer_shield' # Helium gap
    temp = temp
    thermal_conductivity = 0.15 # W/m/K
    specific_heat = 5197 # random value
  []
  [axial_reflector_thermal]
    type = HeatConductionMaterial
    block = 'reflector_tri reflector_quad'
    temp = temp
    thermal_conductivity = 199 # W/m/K
    specific_heat = 1867 # random value
  []
  [B4C_thermal]
    type = HeatConductionMaterial
    block = 'B4C'
    temp = temp
    thermal_conductivity = 92 # W/m/K
    specific_heat = 960 # random value
  []
  [SS_thermal]
    type = SS316Thermal
    temperature = temp
    block = mod_ss
  []
  [fuel_density]
    type = Density
    block = 'fuel_quad fuel_tri'
    density = 2276.5
  []
  [moderator_density]
    type = Density
    block = 'moderator_quad moderator_tri'
    density = 4.3e3
  []
  [monolith_density]
    type = Density
    block = 'monolith'
    density = 1806
  []
  [airgap_density]
    type = Density
    block = 'air_gap_tri air_gap_quad outer_shield' #helium
    density = 180
  []
  [axial_reflector_density]
    type = Density
    block = 'reflector_tri reflector_quad'
    density = 1848
  []
  [B4C_density]
    type = Density
    block = B4C
    density = 2510
  []
  [SS_density]
    type = Density
    density = 7990
    block = mod_ss
  []
[]

[MultiApps]
  [sockeye]
    type = TransientMultiApp
    app_type = SockeyeApp
    positions_file = 'hp_centers.txt'
    input_files = 'HPMR_sockeye_ss.i'
    execute_on = 'timestep_begin' # execute on timestep begin because hard to have a good initial guess on heat flux
    max_procs_per_app = 1
    output_in_position = true
    sub_cycling = true
  []
[]

[Transfers]
  [from_sockeye_temp]
    type = MultiAppGeneralFieldNearestLocationTransfer
    from_multi_app = sockeye
    source_variable = hp_temp_aux
    variable = hp_temp_aux
    execute_on = 'timestep_begin'
    # Reduces transfers efficiency for now, can be removed once transferred fields are checked
    bbox_factor = 10
  []
  [to_sockeye_flux]
    type = MultiAppGeneralFieldUserObjectTransfer
    variable = master_flux
    to_multi_app = sockeye
    execute_on = 'timestep_begin'
    source_user_object = flux_uo
    # Reduces transfers efficiency for now, can be removed once transferred fields are checked
    bbox_factor = 10
  []
[]

[UserObjects]
  [flux_uo]
    type = NearestPointLayeredSideDiffusiveFluxAverage
    direction = z
    num_layers = 100
    points_file = 'hp_centers.txt'
    variable = temp
    diffusivity = thermal_conductivity
    execute_on = linear
    boundary = 'heat_pipe_ht_surf'
  []
[]

[Executioner]
  type = Transient

  petsc_options_iname = '-pc_type -pc_hypre_type -ksp_gmres_restart '
  petsc_options_value = 'hypre boomeramg 100'

  nl_rel_tol = 1e-6
  nl_abs_tol = 1e-8

  start_time = -5e4 # negative start time so we can start running from t = 0
  end_time = 0
  dtmin = 1
  # Multiple steps are needed to allow iteration between the thermo and heat pipe applications
  num_steps = 5
[]

[Postprocessors]
  [hp_heat_integral]
    type = SideDiffusiveFluxIntegral
    variable = temp
    boundary = 'heat_pipe_ht_surf'
    diffusivity = thermal_conductivity
    execute_on = 'initial timestep_end'
  []
  [hp_end_heat_integral]
    type = SideDiffusiveFluxIntegral
    variable = temp
    boundary = 'heat_pipe_ht_surf_bot'
    diffusivity = thermal_conductivity
    execute_on = 'initial timestep_end'
  []
  [ext_side_integral]
    type = SideDiffusiveFluxIntegral
    variable = temp
    boundary = 'side'
    diffusivity = thermal_conductivity
    execute_on = 'initial timestep_end'
  []
  [mirror_side_integral]
    type = SideDiffusiveFluxIntegral
    variable = temp
    boundary = 'side_mirror'
    diffusivity = thermal_conductivity
    execute_on = 'initial timestep_end'
  []
  [tb_integral]
    type = SideDiffusiveFluxIntegral
    variable = temp
    boundary = 'top bottom'
    diffusivity = thermal_conductivity
    execute_on = 'initial timestep_end'
  []
  [total_sink]
    type = SumPostprocessor
    values = 'hp_heat_integral hp_end_heat_integral ext_side_integral mirror_side_integral tb_integral'
    execute_on = 'initial timestep_end'
  []
  [fuel_temp_avg]
    type = ElementAverageValue
    variable = temp
    block = 'fuel_quad fuel_tri'
  []
  [fuel_temp_max]
    type = ElementExtremeValue
    variable = temp
    block = 'fuel_quad fuel_tri'
  []
  [fuel_temp_min]
    type = ElementExtremeValue
    variable = temp
    block = 'fuel_quad fuel_tri'
    value_type = min
  []
  [mod_temp_avg]
    type = ElementAverageValue
    variable = temp
    block = 'moderator_quad moderator_tri'
  []
  [mod_temp_max]
    type = ElementExtremeValue
    variable = temp
    block = 'moderator_quad moderator_tri'
  []
  [mod_temp_min]
    type = ElementExtremeValue
    variable = temp
    block = 'moderator_quad moderator_tri'
    value_type = min
  []
  [monolith_temp_avg]
    type = ElementAverageValue
    variable = temp
    block = monolith
  []
  [monolith_temp_max]
    type = ElementExtremeValue
    variable = temp
    block = monolith
  []
  [monolith_temp_min]
    type = ElementExtremeValue
    variable = temp
    block = monolith
    value_type = min
  []
  [heatpipe_surface_temp_avg]
    type = SideAverageValue
    variable = temp
    boundary = heat_pipe_ht_surf
  []
  [power]
    type = ElementIntegralVariablePostprocessor
    block = 'fuel_quad fuel_tri'
    variable = power_density
    execute_on = 'initial timestep_end transfer'
  []
  [fuel_cP]
    type = ElementExtremeValue
    value_type = 'max'
    variable = fuel_specific_heat
    block = 'fuel_quad fuel_tri'
    execute_on = 'initial timestep_end'
  []
  [fuel_k]
    type = ElementExtremeValue
    value_type = 'max'
    variable = fuel_thermal_conductivity
    block = 'fuel_quad fuel_tri'
    execute_on = 'initial timestep_end'
  []
  [monolith_cP]
    type = ElementExtremeValue
    value_type = 'max'
    variable = monolith_specific_heat
    block = 'monolith '
    execute_on = 'initial timestep_end'
  []
  [monolith_k]
    type = ElementExtremeValue
    value_type = 'max'
    variable = monolith_thermal_conductivity
    block = 'monolith '
    execute_on = 'initial timestep_end'
  []
[]

[Outputs]
  perf_graph = true
  exodus = true
  color = true
  csv = true
  checkpoint = true
[]
(microreactors/mrad/steady/HPMR_thermo_ss.i)

Sockeye Model

For each heat pipe in the 1/6 HP-MR core, a Sockeye grandchild application is used to calculate its thermal performance.

The effective thermal conductivity model, i.e., a 2D axisymmetric conduction model with a very high thermal conductivity of 2×105 W/m•K is applied to the vapor core. A heat flux boundary condition is applied to the exterior of the casing in the evaporator section, which is provided by the bulk conduction model. A convective boundary condition is applied to the exterior of the envelope in the condenser section, with an external temperature of 800 K and a heat transfer coefficient (HTC) of 106 W/m2•K (the value is intentionally set high to achieve an effective Dirichlet boundary condition).

################################################################################
## NEAMS Micro-Reactor Application Driver                                     ##
## Heat Pipe Microreactor Steady State                                        ##
## Sockeye Grandchild Application input file                                  ##
## Effective Heat Conduction Model with Operation Limits                      ##
################################################################################

# Total heat removed/added to heat pipe
Q_hp = 1800.

# Wick characteristics
R_pore = 15.0e-6
D_h_pore = '${fparse 2.0 * R_pore}'
permeability = 2e-9
porosity = 0.70

# Envelope ("env")
# SS316. Incropera & DeWitt, 3rd ed, Table A.1 @ 900K (627C)
# Density (kg/m3)
rho_env = 8238.
# Thermal conductivity (W/m-K)
k_env = 23.05
# Specific heat capacity (J/kg-K)
cp_env = 589.

# Potassium vapor
# From Appendix C of text book "Heat Pipe Design and Technology"
# Sat. Vapor Potassium at T = 650C (923 K)
# Density (kg/m3)
rho_vapor = 0.193
# Effective "super" conductivity (W/m-K)
#k_vapor = 1.0e5 # Reaches 600 seconds
k_vapor = 1.0e6
# Specific heat capacity (J/kg-K)
cp_vapor = 5320.

# Potassium liquid
# From Appendix C of text book "Heat Pipe Design and Technology"
# Sat. Liquid Potassium at T = 650C (923 K)
# Density (kg/m3)
rho_liquid = 695.4
# Thermal conductivity (W/m-K)
k_liquid = 40.08
# Specific heat capacity (J/kg-K)
# From Table 1.1, no temperature data given
cp_liquid = 810.
# Melting point, Table 3.1, lists 62C, rounding up
# T_melting = 340.

# Wick, homogenize envelope and fluid
# Density (kg/m3)
rho_wick = '${fparse porosity * rho_liquid + (1.0 - porosity) * rho_env}'
# Thermal conductivity (W/m-K)
k_wick = '${fparse porosity * k_liquid + (1.0 - porosity) * k_env}'
# Specific heat capacity (J/kg-K)
# From Table 1.1, no temperature data given
cp_wick = '${fparse porosity * cp_liquid + (1.0 - porosity) * cp_env}'

# Elevations and lengths
# Note: For blackbox model -- manually update "length" input
length_evap = 180.0e-2
length_adia = 30.0e-2
length_cond = 90.0e-2

# Mesh density
# The dimensions are nicely divisible by 3 cm mesh.
nelem_base_evap = 50
nelem_base_adia = 10
nelem_base_cond = 30
mesh_density = 3
nelem_evap = '${fparse mesh_density*nelem_base_evap}'
nelem_adia = '${fparse mesh_density*nelem_base_adia}'
nelem_cond = '${fparse mesh_density*nelem_base_cond}'

# Envelope thickness
t_env = 0.08e-2
# Liquid annulus thickness
t_ann = 0.07e-2
# Wick thickness
t_wick = 0.1e-2

# Radial geometry
# Envelope outer
R_hp_o = 1.05e-2
D_hp_o = '${fparse 2.0 * R_hp_o}'
# Inner Envelope/outer annulus
R_hp_i = '${fparse R_hp_o - t_env}'
D_hp_i = '${fparse 2.0 * R_hp_i}'
# Inner annulus/wick outer
R_wick_o = '${fparse R_hp_i - t_ann}'
D_wick_o = '${fparse 2.0 * R_wick_o}'
# Inner wick/vapor core outer
R_wick_i = '${fparse R_wick_o - t_wick}'
D_wick_i = '${fparse 2.0 * R_wick_i}'

# BCs for condenser
T_ext_cond = 800.
htc_ext_cond = 1.0e6

# Evaporator parameters
S_evap = '${fparse pi * D_hp_o * length_evap}'
q_evap = '${fparse Q_hp / S_evap}'

[GlobalParams]
  scaling_factor_temperature = 1e-2
  fp_2phase = fp_2phase
[]

[FluidProperties]
  [fp_2phase]
    type = PotassiumTwoPhaseFluidProperties
    emit_on_nan = none
  []
[]

[Components]
  [hp]
    type = HeatPipeConduction

    # Common to both HeatPipe2Phase and HeatPipeBlackbox
    position = '0 0 0'
    orientation = '0 0 1'
    length = '${length_evap} ${length_adia} ${length_cond}'
    n_elems = '${nelem_evap} ${nelem_adia} ${nelem_cond}'
    gravity_vector = '0 0 -9.8'
    D_wick_i = ${D_wick_i}
    D_wick_o = ${D_wick_o}
    R_pore = ${R_pore}
    porosity = ${porosity}
    permeability = ${permeability}

    # HeatPipeConduction only
    # Axial dimensions (for heat transfer & analytic limits)
    axial_region_names = 'evap adia cond'
    L_evap = ${length_evap}
    L_adia = ${length_adia}
    L_cond = ${length_cond}
    # Radial dimensions, mesh, and materials for heat transfer problem
    D_clad_o = ${D_hp_o}
    D_clad_i = ${D_hp_i}
    D_h_pore = ${D_h_pore}
    # Mesh
    n_elems_clad = 4
    n_elems_wick = 8
    n_elems_core = 10

    # Thermal properties
    sp_vapor = sp_vapor
    sp_liquid = sp_wick_ann
    sp_wick = sp_wick_ann
    sp_clad = sp_clad
    k_core = ${k_vapor}
    k_eff = ${k_wick}

    fp_2phase = fp_2phase
    evaporator_at_start_end = true
    # Initial temperature of block
    initial_T = ${T_ext_cond}
    T_ref = T_inner_avg

    # To evaluate the constant properties
    T_ref_density = 1000

    make_pressure_corrections = true
  []

  [condenser_boundary]
    type = HSBoundaryAmbientConvection
    boundary = 'hp:cond:outer'
    hs = hp
    T_ambient = ${T_ext_cond}
    htc_ambient = ${htc_ext_cond} #large value to approach an effective DirichletBC
    scale = 1
  []
  [evaporator_boundary]
    type = HSBoundaryExternalAppConvection
    boundary = 'hp:evap:outer'
    hs = hp
    T_ext = virtual_Text
    htc_ext = virtual_htc
  []
[]

[SolidProperties]
  [sp_vapor]
    type = ThermalFunctionSolidProperties
    rho = ${rho_vapor}
    cp = ${cp_vapor}
    k = ${k_vapor}
  []
  [sp_wick_ann]
    type = ThermalFunctionSolidProperties
    rho = ${rho_wick}
    cp = ${cp_wick}
    k = ${k_wick}
  []
  [sp_clad]
    type = ThermalFunctionSolidProperties
    rho = ${rho_env}
    cp = ${cp_env}
    k = ${k_env}
  []
[]

[UserObjects]
  [surf_T]
    type = LayeredSideAverage
    direction = z
    num_layers = 100
    variable = T_solid
    boundary = 'hp:evap:outer'
  []
[]

[AuxKernels]
  [hp_var]
    type = SpatialUserObjectAux
    variable = hp_temp_aux
    user_object = surf_T
  []
  [virtual_Text]
    type = ParsedAux
    variable = virtual_Text
    coupled_variables = 'T_solid master_flux virtual_htc'
    expression = 'master_flux/virtual_htc + T_solid'
  []
[]

[Functions]
  [scale_fcn]
    type = ParsedFunction
    symbol_names = 'catastrophic_pp recoverable_pp operational_pp'
    symbol_values = 'catastrophic_pp recoverable_pp operational_pp'
    expression = 'catastrophic_pp*recoverable_pp*operational_pp'
  []
[]

[AuxVariables]
  [T_wall_var]
    initial_condition = ${T_ext_cond}
  []
  [operational_aux]
    initial_condition = 1
  []
  [master_flux]
    initial_condition = ${q_evap}
  []
  [hp_temp_aux]
    initial_condition = ${T_ext_cond}
  []
  [virtual_Text]
    initial_condition = ${T_ext_cond}
  []
  [virtual_htc]
    initial_condition = 1.0
  []
[]

[Postprocessors]
  [Integral_BC_Total]
    type = SumPostprocessor
    values = 'condenser_boundary_integral evaporator_boundary_integral'
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [ZeroPP]
    type = EmptyPostprocessor
  []
  [Integral_BC_Cond]
    type = DifferencePostprocessor
    value1 = ZeroPP
    value2 = condenser_boundary_integral
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [Integral_BC_RelErr]
    type = RelativeDifferencePostprocessor
    value1 = evaporator_boundary_integral
    value2 = Integral_BC_Cond
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [operational_pp]
    type = ElementAverageValue
    variable = operational_aux
    execute_on = 'initial timestep_begin TIMESTEP_END'
  []
  # set `catastrophic_pp` as if it is recoverable for a solving to steady-state simulation
  # this MUST be changed back to catestrophic in transient simulations
  [catastrophic_pp]
    type = HeatRemovalRateLimitScale
    heat_addition_pps = 'evaporator_boundary_integral'
    limit_condenser_side = false
    recoverable_heat_removal_limit_pps = 'hp_boiling_limit hp_capillary_limit hp_entrainment_limit'
    catastrophic_heat_removal_limit_pps = ''
    T = T_inner_avg
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [recoverable_pp]
    type = HeatRemovalRateLimitScale
    heat_addition_pps = 'evaporator_boundary_integral'
    limit_condenser_side = false
    catastrophic_heat_removal_limit_pps = ''
    recoverable_heat_removal_limit_pps = 'hp_sonic_limit hp_viscous_limit'
    T = T_inner_avg
    execute_on = 'INITIAL linear nonlinear TIMESTEP_END'
  []
  [T_evap_inner]
    type = SideAverageValue
    boundary = hp:evap:inner
    variable = T_solid
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_cond_inner]
    type = SideAverageValue
    boundary = hp:cond:inner
    variable = T_solid
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_evap_outer]
    type = SideAverageValue
    boundary = hp:evap:outer
    variable = T_solid
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_cond_outer]
    type = SideAverageValue
    boundary = hp:cond:outer
    variable = T_solid
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_wall_var_avg]
    type = ElementAverageValue
    variable = T_wall_var
    execute_on = 'Initial timestep_end'
  []
  [T_inner_avg]
    type = SideAverageValue
    variable = T_solid
    boundary = hp:inner
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_inner_max]
    type = NodalExtremeValue
    variable = T_solid
    boundary = hp:inner
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_inner_min]
    type = NodalExtremeValue
    variable = T_solid
    boundary = hp:inner
    execute_on = 'INITIAL TIMESTEP_END'
    value_type = min
  []
  [DT_outer]
    type = DifferencePostprocessor
    value1 = T_evap_outer
    value2 = T_cond_outer
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [DT_inner]
    type = DifferencePostprocessor
    value1 = T_evap_inner
    value2 = T_cond_inner
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [A_int_master_flux]
    type = SideIntegralVariablePostprocessor
    variable = master_flux
    boundary = 'hp:evap:inner'
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [A_int_T_ext]
    type = SideIntegralVariablePostprocessor
    variable = virtual_Text
    boundary = 'hp:evap:inner'
    execute_on = 'INITIAL LINEAR'
  []
  [A_avg_T_aux]
    type = AverageNodalVariableValue
    variable = hp_temp_aux
    boundary = 'hp:evap:inner'
    execute_on = 'INITIAL TIMESTEP_END'
  []
[]

[VectorPostprocessors]
  [env_vpp]
    type = NodalValueSampler
    variable = T_solid
    block = 'hp:clad'
    sort_by = x
    execute_on = 'INITIAL TIMESTEP_END'
  []
[]

[Preconditioning]
  [pc]
    type = SMP
    full = true
  []
[]

[Executioner]
  type = Transient

  solve_type = NEWTON
  petsc_options_iname = '-pc_type'
  petsc_options_value = 'lu'
  scheme = bdf2
  line_search = none

  # ensure nl_abs_tol >> nl_rel_tol
  nl_abs_tol = 1e-6
  nl_rel_tol = 1e-8
  nl_max_its = 100

  l_tol = 1e-3
  l_max_its = 100

  start_time = -5e4 # negative start time so we can start running from t = 0
  end_time = 0
  dtmin = 1
  dt = 5000
[]

[Outputs]
  [console]
    type = Console
    max_rows = 5
    execute_postprocessors_on = 'INITIAL TIMESTEP_END FINAL FAILED'
  []
  [csv]
    type = CSV
    execute_on = 'INITIAL TIMESTEP_END FINAL FAILED'
    execute_vector_postprocessors_on = 'FINAL FAILED'
  []
[]
(microreactors/mrad/steady/HPMR_sockeye_ss.i)

MultiApps Hierarchy

The three MOOSE applications that govern different physics respectively are coupled together leveraging the MOOSE MultiApps system. Each code has its own mesh and corresponding space and time scales. The MOOSE MultiApp system is used to tightly couple the different codes via fixed point iterations as illustrated below in Figure 3.

At the top level, Griffin calculates the power density based on its neutronics results given the fuel and moderator temperatures taken from the BISON child application. The calculated power density is also provided to BISON to update the temperature calculation. On the other hand, for the surface of each heat pipe, BISON calculates the layered average heat flux along the normal direction of the surface and transfers the 1D field values to the respective Sockeye sub-application so that Sockeye can use them as its boundary condition. Meanwhile, BISON takes the heat pipe surface temperature calculated by Sockeye back for its own boundary condition on the heat pipe surface.

Figure 3: MultiApps hierarchy of the HP-MR multiphysics simulations.

Simulation Cases

Three different scenarios are simulated in this HP-MR model. The most fundamental case is the steady state operation of the HP-MR, where the thermal power of the full reactor core is preset as 2.07 MW (i.e., 345.6 kW per 1/6 core). Using the steady state simulation results as the reference case, two different transient scenarios are also simulated: a load following transient and a transient event initiated by the failure of a single heat pipe.

Steady State Operation

For steady state simulation, the Griffin parent application performs an Eigenvalue calculation with a fixed preset integrated power (345.6 kW) to compute as well as the shape of power distribution. In the meantime, the BISON child application works with multiple Sockeye grandchild sub-applications to perform transient thermal calculation using the given power density distribution until a thermal equilibrium is achieved. Once the fixed point iteration between different levels of MultiApps is converged, the steady state operation condition of the HP-MR at the given power level is obtained.

Optionally, the fixed preset integrated power level can be raised to force the HP-MR to operate at an overpower level. This is useful to demonstrate the capabilities of the NEAMS codes to predict some types of power transients that only occurs in the case of overpowered operation, such as the heat pipe cascade failure event to be demonstrated in this model.

Load Following Transient

The load following transient is initiated by introducing a drop in the heat removal capability of the secondary coolant loop that transfer the heat from the condensor regions of the heat pipes to either a heat exchanger or directly to the energy coversion component. During steady state operation, a high heat transfer coefficient (HTC) of 106 W/m2•K is used on the outer surface of the heat pipe condensor region. To initiate the load following transient event, the HTC value is reduced by 99.99% to 102 W/m2•K to mimic a load reduction event. The same transient solving approach is used for BISON and Sockeye applications. However, instead of an Eigenvalue calculation, Griffin here also performs transient calculation. Based on the changes in induced by temperature evolution calculated by BISON/Sockeye, Griffin predicts the corresponding kinetics of neutronics and consequent power distribution.

Transient Initiated by a Single Heat Pipe Failure

Another type of transient to be simulated in this model is more localized. Instead of reducing the condensor region HTC of all heat pipes, the condensor region HTC of a single heat pipe is nearly eliminated (i.e. reduced from 106 W/m2•K to 10-2 W/m2•K) to mimic a single heat pipe failure event, while the other heat pipes are kept unchanged (note that actually there are six heat pipes that are compromised due to the 1/6 symmetric mesh used here in this model). The failed heat pipe is intentionally selected to be in the hottest region of the HP-MR (i.e., in the center region of the center assembly).

Localized Single Heat Pipe Failure

The favored consequence of a single heat pipe failure in an HP-MR is that the extraneous heat that was removed by the failed heat pipe can be removed by the surrounding functioning heat pipes. In that case, the effects of the failed heat pipe are localized and the average core temperature only experiences a very minor increase. As a result, the HP-MR can still operate normally with a minor decrease in power. Ideally, the designed HP-MR power need to be set at an appropriate level that a single heat failure can be localized. Therefore, this is the expected simulation result for the HP-MR operating at the designed power level.

Heat Pipe Cascade Failure

On the other hand, when the HP-MR is operating at an overpower level (e.g., 720 kW in this model), the heat pipes in the hottest region are already operaing at a heat removal rate very close to their operating limits. Therefore, if a single heat pipe fails, its surrounding heat pipes will exceed their operating limits and then fail subsequently. This kind of failure events will then spread to a wider range and lead to heat pipe cascade failure. As a significant fraction of the heat pipes in an HP-MR fail, the average core temperature increases prominently and leads to a major power drop. Consequently, the HP-MR can no longer maintain its normal operation. A reliable HP-MR model should be able to predict such an unfavored transient event. In this model, the HP-MR is also intentionally set to run at an overpower of 720 kW before a single heat pipe failure is introduced to demonstrate such modeling capability.

Guidance of Running Different Simulation Cases

Fist of all, the user needs to run the mesh generation input file to generate the needed EXODUS mesh file that is required by the Griffin simulation. The mesh generation input file only uses objects available in the MOOSE Framework and the Reactor Module, so the input file can be run by any MOOSE applications that are compiled with the Reactor Module, such as Griffin. The example command to generate the mesh EXODUS file is listed as follows:

cd /mrad/mesh
griffin-opt -i HPMR_OneSixth_Core_meshgenerator_tri.i --mesh-only HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry.e

The mesh used by BISON is finer than the Griffin mesh, so some modifications need to be made to file. Also, the heat pipe surface boundaries need to be defined, and the heat pipe blocks themselves need to be removed. Thus, a separate input file is provided for the BISON mesh generation. Users can run the following command to generate the BISON mesh as an EXODUS file:

cd /mrad/mesh
griffin-opt -i HPMR_OneSixth_Core_meshgenerator_tri_fine.i --mesh-only HPMR_OneSixth_Core_meshgenerator_tri_rotate_bdry_fine.e

Then, the steady state simulation can be run. As the output files of the steady state simulation are already required as the initial status of the transient simulations, it is also required to be run before any transient simulations. The multiphysics steady state simulation uses Griffin, BISON and Sockeye objects. Therefore, users should use a super application that covers these three applications, such as DireWolf or BlueCRAB (compiled with Sockeye included). The example command to run the steady state simulation is shown as folllows:

cd /mrad/steady
mpirun -n 40 dire_wolf-opt -i HPMR_dfem_griffin_ss.i

With the EXODUS and checkpoint output file of the steady state simulation, the transient simulatons can be run. Before running any real cases, it is recommended to verify that the steady state obtained is correct. To do this, a null transient (i.e., a time dependent simulation with exactly the same conditions as the steady state simulation). If the steady state is correct, the null transient should yield constant values for all time-dependent quantities. The application needed to run transient simulations should be the same as the one used to obtain the steady state. The example command to run the null transient simulation is shown as folllows:

cd /mrad/transient_null
mpirun -n 40 dire_wolf-opt -i HPMR_dfem_griffin_trN.i

Once the steady state obtained is verified, the real transient cases can be run using the similar approach.

cd /mrad/load_following
mpirun -n 40 dire_wolf-opt -i HPMR_dfem_griffin_tr.i
cd /mrad/heat_pipe_failure
mpirun -n 40 dire_wolf-opt -i HPMR_dfem_griffin_tr.i

Overpower Simulation

The default power values in the input files in this repository are all set at the nominal power (i.e., 345.6 kW for the 1/6 HP-MR core). To run the overpower case to simulate the heat pipe cascade failure, the following values need to be changed to the 720 kW overpower level. The steady state configuration must be re-generated before the overpower transient may be run.

[PowerDensity]
  power = 345.6e3
  power_density_variable = power_density
  integrated_power_postprocessor = integrated_power
[]
(microreactors/mrad/steady/HPMR_dfem_griffin_ss.i)
[PowerDensity]
  power = 345.6e3
  power_density_variable = power_density
  integrated_power_postprocessor = integrated_power
[]
(microreactors/mrad/transient_null/HPMR_dfem_griffin_trN.i)
[PowerDensity]
  power = 345.6e3
  power_density_variable = power_density
  integrated_power_postprocessor = integrated_power
[]
(microreactors/mrad/heat_pipe_failure/HPMR_dfem_griffin_tr.i)

References

  1. Christopher Matthews, Vincent Laboure, Mark DeHart, Joshua Hansel, David Andrs, Yaqi Wang, Javier Ortensi, and Richard C Martineau. Coupled multiphysics simulations of heat pipe microreactors using direwolf. Nuclear Technology, 207(7):1142–1162, 2021.[BibTeX]
  2. E Shemon, Y Miao, S Kumar, K Mo, YS Jung, A Oaks, Guillaume Giudicelli, Logan Harbour, and Roy Stogner. Moose reactor module meshing enhancements to support reactor analysis. Technical Report ANL/NSE-22/65, Argonne National Lab.(ANL), Argonne, IL (United States), 2022.[BibTeX]