Griffin Open Xe-100 Steady-State

Input Description

Griffin uses a block-structured input syntax. Each block begins with square brackets that contain the type of input and ends with empty square brackets. Each block may contain sub-blocks. The blocks in the input file are described in the order as they appear. Before the first block entries, users can define variables and specify their values, which are subsequently used in the input model. For example:

fuel_blocks = ' 1 2 3 4 5 ...' # Fuel block identities (IDs).
ref_blocks = ' 63 64 65 ...' # Reflector block IDs.
total_power = 200.0e+6 # Total reactor power (W).
initial_temperature = 900.0 # Initial reactor core temperature (K).

Comments are denoted by the # symbol.

Each number in the block ID fields corresponds to a matching subdomain of the mesh declared in the Mesh block. These IDs are used to declare initial conditions and material properties, and calculate average temperatures for the specified mesh elements.

# ==============================================================================
# Model description
# ------------------------------------------------------------------------------
# Idaho Falls, INL, April 21, 2021 12:05 PM
# Author(s): Dr. Paolo Balestra & Dr. Ryan Stewart
# ==============================================================================
# - xe100: reference plant design based on 200MW XE100 Open Source Plant.
# - ss1: Steady state simulation sub app level 1.
# ==============================================================================
# - The Model has been built based on [1].
# ------------------------------------------------------------------------------
# [1] R. Stewart, P. Balestra, D. Reger, and E. Merzari.
#     Generation of localized reactor point kinetics parameters using coupled
#     neutronic and thermal fluid models for pebble-bed reactor transient analysis.
#     Annals of Nuclear Energy, 174:109143, 2022.
#     URL: https://www.sciencedirect.com/science/article/pii/S0306454922001785#s0065
#     doi: https://doi.org/10.1016/j.anucene.2022.109143.
# ==============================================================================

# ==============================================================================
# MODEL PARAMETERS
# ==============================================================================

# Block subdivision ------------------------------------------------------------
fuel_blocks  = '  1   2   3   4   5
                  6   7   8   9   10
                  11  12  13  14  15
                  16  17  18  19  20
                  21  22  23  24  25
                  26  27  28  29  30
                  31  32  33  34  35
                  36  37  38  39  40
                  41  42  43  44  45
                  46  47  48  49  50
                  51  52  53  54  55
                  56  57  58  59  60
                  61 '

ref_blocks   = '  63  64  65
                  66  67  68  69  70
                  71  72  73  74  75
                  76  77  78  79  80
                  81  82  83  84  85
                  86  87  88  89  90
                  91  92  93  94  95
                  96  97  98  99  100
                  101 102 103 104 105
                  106 107 108 109 110
                  111 112 113 114 115
                  116 117 118 119 120
                  121 122 123 124 125
                  126 127 128 129 130
                  131 132 133 134 135
                  136 137 138 139 140
                  141 142 143 144 145
                  146 147 148 149 150
                  151 152 153 154 155
                  156 157 158 159 160
                  161 162 163 164 165
                  166
                  '

cavity_blocks = ' 62 '

# Power & Temperature ----------------------------------------------------------
total_power = 200.0e+6 # Total reactor Power (W)
initial_temperature = 900.0 # (K)

# ==============================================================================
# GLOBAL PARAMETERS
# ==============================================================================

[GlobalParams]
  library_file = 'xs/xe100_sp_sph_cavity.xml'
  library_name = htgr_exp
  is_meter = true
[]

# ==============================================================================
# GEOMETRY AND MESH
# ==============================================================================

[Mesh]

  coord_type = 'RZ'
  rz_coord_axis = 'Y'

  [cartesian_mesh]
    type = CartesianMeshGenerator
    dim = 2

    # Total Height: 893 cm
    # Total Radius: 240 cm
    dx = '   0.36 0.21 0.21 0.21 0.21 0.25 0.25 0.25 0.25 '
    ix = '   2    2    2    2    2    2    2    2    2   '

    dy = ' 0.25 0.25 0.135 0.135 0.135 0.135 0.36 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.55 0.25 0.25'
    iy = ' 2    2    2     2     2     2     2    2      2      2     2      2       2      2      2      2      2      2      2    2    2'

    # The core is reverse: 1,2,3,4,5 are the bottom most layer of fuel
    # First region is the lower reflector
    # Second region is the cone, where fuel is discharged
    # Third region is the fuel region
    # Fourth region is the upper reflector
    subdomain_id = '
                    157 158 159 160 161    63  64  65  66
                    162 163 164 165 166    67  68  69  70

                    61   71  71  71  71    71  72  73  74
                    61   61  75  75  75    75  76  77  78
                    61   61  61  79  79    79  80  81  82
                    61   61  61  61  83    83  84  85  86

                    1    2    3   4   5    87  88  89  90
                    6    7    8   9  10    91  92  93  94
                    11  12   13  14  15    95  96  97  98
                    16  17   18  19  20    99 100 101 102
                    21  22   23  24  25   103 104 105 106
                    26  27   28  29  30   107 108 109 110
                    31  32   33  34  35   111 112 113 114
                    36  37   38  39  40   115 116 117 118
                    41  42   43  44  45   119 120 121 122
                    46  47   48  49  50   123 124 125 126
                    51  52   53  54  55   127 128 129 130
                    56  57   58  59  60   131 132 133 134
                    62  62   62  62  62   135 136 137 138

                    147 148 149 150 151   139 140 141 142
                    152 153 154 155 156   143 144 145 146
                    '
  []

  [cartesian_mesh_ids]
    type = ExtraElementIDCopyGenerator
    input = cartesian_mesh
    source_extra_element_id = 'subdomain_id'
    target_extra_element_ids = 'material_id'
  []
[]

# ==============================================================================
# AUXVARIABLES
# ==============================================================================

[AuxVariables]
  [Tfuel]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${fuel_blocks}'
  []
  [Tmod]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${fuel_blocks}'
  []
  [Tref]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${ref_blocks}'
  []
[]

# ==============================================================================
# MATERIALS
# ==============================================================================

[Materials]
  [fuel_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = 'Tfuel Tmod'
    grid_variables = 'Tfuel Tmod'
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${fuel_blocks}'
  []
  [ref_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = 'Tref'
    grid_variables = 'Tref'
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${ref_blocks}'
  []
  [cavity_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = ''
    grid_variables = ''
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${cavity_blocks}'
  []
[]

# ==============================================================================
# USER OBJECTS
# ==============================================================================

[PowerDensity]
  power = ${total_power}
  power_density_variable = inst_power_density
  integrated_power_postprocessor = total_power
  family = MONOMIAL
  order = CONSTANT
[]

# User objects to write data to a binary file for the transient runs
[UserObjects]
  [ss1_gfnk_transport_sol]
    type = TransportSolutionVectorFile
    transport_system = diff
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_inst_power_density]
    type = SolutionVectorFile
    var = inst_power_density
    writing = true
    execute_on = 'FINAL'
  []
  [ss0_gfnk_Tfuel]
    type = SolutionVectorFile
    var = Tfuel
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g0]
    type = SolutionVectorFile
    var = sflux_g0
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g1]
    type = SolutionVectorFile
    var = sflux_g1
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g2]
    type = SolutionVectorFile
    var = sflux_g2
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g3]
    type = SolutionVectorFile
    var = sflux_g3
    writing = true
    execute_on = 'FINAL'
  []
[]

# ==============================================================================
# EXECUTION PARAMETERS
# ==============================================================================

[TransportSystems]
  particle = neutron
  equation_type = eigenvalue

  G = 4

  ReflectingBoundary = 'left'
  VacuumBoundary = 'right top bottom'

  [diff]
    scheme = CFEM-Diffusion
    n_delay_groups = 6
    assemble_scattering_jacobian = true
    assemble_fission_jacobian = true
    family = LAGRANGE
    order = FIRST
  []
[]

[Executioner]
  type = Eigenvalue

  solve_type = 'PJFNKMO'
  petsc_options_iname = '-pc_type -pc_hypre_type -ksp_gmres_restart'
  petsc_options_value = 'hypre boomeramg 50'
  line_search = none

  # Linear/nonlinear iterations.
  l_max_its = 50
  l_tol = 1e-3

  nl_max_its = 50
  nl_rel_tol = 1e-7
  nl_abs_tol = 1e-8

  # Power iterations.
  free_power_iterations = 4

  [Quadrature]
    order = FOURTH
  []
[]

# ==============================================================================
# POSTPROCESSORS AND OUTPUTS
# ==============================================================================

[Postprocessors]
  [avg_fuel_temp]
    type = ElementAverageValue
    variable = Tfuel
    block = '${fuel_blocks}'
  []
  [avg_mod_temp]
    type = ElementAverageValue
    variable = Tmod
    block = '${fuel_blocks}'
  []
  [avg_ref_temp]
    type = ElementAverageValue
    variable = Tref
    block = '${ref_blocks}'
  []
[]

[Outputs]
  file_base = ss
  print_linear_residuals = false
  print_linear_converged_reason = false
  print_nonlinear_converged_reason = false
  csv = true
[]
(htgr/open-xe100/xe100_ss.i)

Global Parameters

This block contains global parameters. In this case, the cross sections from Serpent in ISOXML format as a library_file, htgr_exp as a libary_name, and is_meter = true, which specifies that the unit of length for the mesh is meters.

[GlobalParams]
  library_file = 'xs/xe100_sp_sph_cavity.xml'
  library_name = htgr_exp
  is_meter = true
[]
(htgr/open-xe100/xe100_ss.i)

Mesh

This block defines the mesh. The mesh is a 2D representation of the reactor core. It includes the lower reflector, the cone from which fuel is discharged, the fuel region, and the upper reflector.

coord_type specifies the coordinate system for the mesh. rz_coord_axis specifies the rotation axis for axisymmetric coordinates.

The specified mesh generator has the user defined name cartesian_mesh of type CartesianMeshGenerator which takes the following parameters:

dim, the number of dimensions.
dx, the number of intervals in the X direction.
dy, the number of intervals in the Y direction.
ix, the number of grids in all intervals in the X direction.
iy, the number of grids in all intervals in the Y direction.
subdomain_id, identification numbers for defined mesh elements in the X-Y plane.

The subdomain_id field is formatted to roughly represent the mesh visually; white space is used to distinguish the different components of the core. By assigning an identification number to the mesh elements, material properties and superhomogenized cross sections can be set by identification number.

The next sub-block is named cartesian_mesh_ids and is of type ExtraElementIDCopyGenerator. This creates a copy of subdomain_id named materials_id which is used by Griffin's CoupledFeedbackMatIDNeutronicsMaterial object for assigning material properties to the mesh elements.

[Mesh]

  coord_type = 'RZ'
  rz_coord_axis = 'Y'

  [cartesian_mesh]
    type = CartesianMeshGenerator
    dim = 2

    # Total Height: 893 cm
    # Total Radius: 240 cm
    dx = '   0.36 0.21 0.21 0.21 0.21 0.25 0.25 0.25 0.25 '
    ix = '   2    2    2    2    2    2    2    2    2   '

    dy = ' 0.25 0.25 0.135 0.135 0.135 0.135 0.36 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.7791 0.55 0.25 0.25'
    iy = ' 2    2    2     2     2     2     2    2      2      2     2      2       2      2      2      2      2      2      2    2    2'

    # The core is reverse: 1,2,3,4,5 are the bottom most layer of fuel
    # First region is the lower reflector
    # Second region is the cone, where fuel is discharged
    # Third region is the fuel region
    # Fourth region is the upper reflector
    subdomain_id = '
                    157 158 159 160 161    63  64  65  66
                    162 163 164 165 166    67  68  69  70

                    61   71  71  71  71    71  72  73  74
                    61   61  75  75  75    75  76  77  78
                    61   61  61  79  79    79  80  81  82
                    61   61  61  61  83    83  84  85  86

                    1    2    3   4   5    87  88  89  90
                    6    7    8   9  10    91  92  93  94
                    11  12   13  14  15    95  96  97  98
                    16  17   18  19  20    99 100 101 102
                    21  22   23  24  25   103 104 105 106
                    26  27   28  29  30   107 108 109 110
                    31  32   33  34  35   111 112 113 114
                    36  37   38  39  40   115 116 117 118
                    41  42   43  44  45   119 120 121 122
                    46  47   48  49  50   123 124 125 126
                    51  52   53  54  55   127 128 129 130
                    56  57   58  59  60   131 132 133 134
                    62  62   62  62  62   135 136 137 138

                    147 148 149 150 151   139 140 141 142
                    152 153 154 155 156   143 144 145 146
                    '
  []

  [cartesian_mesh_ids]
    type = ExtraElementIDCopyGenerator
    input = cartesian_mesh
    source_extra_element_id = 'subdomain_id'
    target_extra_element_ids = 'material_id'
  []
[]
(htgr/open-xe100/xe100_ss.i)

AuxVariables

Auxiliary variables are used to set an initial fuel, moderator, and reflector temperature. Each auxiliary variable is given a user-defined name (Tfuel, Tmod, Tref) and has the following parameters:

family, the type of the finite element shape function to use for this variable.
order, the order of the finite element shape function to use for this variable.
initial_condition, a constant initial condition for this variable.
block, the list of blocks (IDs or names) that this variable will be applied to.

[AuxVariables]
  [Tfuel]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${fuel_blocks}'
  []
  [Tmod]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${fuel_blocks}'
  []
  [Tref]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${initial_temperature}
    block = '${ref_blocks}'
  []
[]
(htgr/open-xe100/xe100_ss.i)

Materials

Sub-blocks for eachgroup cross section region/material (fuel, reflector, cavity) are declared here. Each is of type CoupledFeedbackMatIDNeutronicsMaterial which uses coupled variables to interpolate tabulated cross sections provided in the ISOXML file. The sub-blocks have the following additional parameters:

grid_names, the grids in the ISOXML file to interpolate on.
grid_variables, the Griffin variables to associate with the interpolation.
plus, to indicate if absorption, fission, and kappa fission are evaluated.
isotopes, the isotopes that compose the material.
densities, the densities of the isotopes in the material.
block, the list of blocks that this material will be applied to.

The pseudo option for isotopes indicates that the ISOXML file cross sections are for a "pseudo" material that is an aggregate. The density parameter is set to 1.0 because of this averaging.

[Materials]
  [fuel_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = 'Tfuel Tmod'
    grid_variables = 'Tfuel Tmod'
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${fuel_blocks}'
  []
  [ref_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = 'Tref'
    grid_variables = 'Tref'
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${ref_blocks}'
  []
  [cavity_blocks]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    grid_names = ''
    grid_variables = ''
    plus = true
    isotopes = 'pseudo'
    densities = '1.0'
    block = '${cavity_blocks}'
  []
[]
(htgr/open-xe100/xe100_ss.i)

PowerDensity

A user object block named PowerDensity is defined that automatically creates a power density auxiliary variable such that its integral over the entire fueled domain is equal to the user-specified power. This object takes the following parameters:

power, the user supplied power, and in this case, the total_power variable is equal to 200.0e+6 (W).
power_density_variable, the name for the power density variable.
integrated_power_postprocessor, the name for the integrated power postprocessor.
family, the type of the finite element shape function to use for this variable.
order, the order of the finite element shape function to use for this variable.

[PowerDensity]
  power = ${total_power}
  power_density_variable = inst_power_density
  integrated_power_postprocessor = total_power
  family = MONOMIAL
  order = CONSTANT
[]
(htgr/open-xe100/xe100_ss.i)

UserObjects

User objects are defined to write data to a binary file. These binary files are read by the null transient and IQS transient runs for their initial conditions.

[UserObjects]
  [ss1_gfnk_transport_sol]
    type = TransportSolutionVectorFile
    transport_system = diff
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_inst_power_density]
    type = SolutionVectorFile
    var = inst_power_density
    writing = true
    execute_on = 'FINAL'
  []
  [ss0_gfnk_Tfuel]
    type = SolutionVectorFile
    var = Tfuel
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g0]
    type = SolutionVectorFile
    var = sflux_g0
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g1]
    type = SolutionVectorFile
    var = sflux_g1
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g2]
    type = SolutionVectorFile
    var = sflux_g2
    writing = true
    execute_on = 'FINAL'
  []
  [ss1_gfnk_sflux_g3]
    type = SolutionVectorFile
    var = sflux_g3
    writing = true
    execute_on = 'FINAL'
  []
[]
(htgr/open-xe100/xe100_ss.i)

TransportSystems

The TransportSystems block is a Griffin object that provides the variables and kernels for the diffusion equation, automating the implementation of the basic conservation equations necessary for this model. Details about the neutron transport equations can be found in the Griffin theory manual. This block has the following parameters:

particle, the particle type this transport system is for.
equation_type, the type of transport equation.
G, the number of energy groups.
ReflectingBoundary, the reflecting boundary of the model (axisymmetric center).
VacuumBoundary, the vacuum boundaries of the model (remaining edges).

There is a sub-block with the user defined name diff, for diffusion. This is the discretization scheme sub-block and it has the following parameters:

scheme, the discretization scheme. In this case, a continuous finite element scheme.
n_delay_groups, the number of delayed neutron groups.
assemble_scattering_jacobian, tells Griffin to include the scattering term when assembling the Jacobian.
assemble_fission_jacobian, tells Griffin to include the fission term when assembling the Jacobian.
family, the type of the finite element shape function to use for the transport system variables.
order, the order of the finite element shape function to use for the transport system variables.

[TransportSystems]
  particle = neutron
  equation_type = eigenvalue

  G = 4

  ReflectingBoundary = 'left'
  VacuumBoundary = 'right top bottom'

  [diff]
    scheme = CFEM-Diffusion
    n_delay_groups = 6
    assemble_scattering_jacobian = true
    assemble_fission_jacobian = true
    family = LAGRANGE
    order = FIRST
  []
[]
(htgr/open-xe100/xe100_ss.i)

Executioner

The Executioner block sets up the problem type and numerical methods used to solve the neutronics. The Eigenvalue executioner type drives the calculation for this steady-state eigenvalue problem. This block has the following parameters:

solve_type, the solve type for the system.
petsc_options_iname, names of PETSc name/value pairs.
petsc_options_value, values of PETSc name/value pairs.
line_search, specifies the PETSc line search type.
l_max_its, specifies the maximum number of linear iterations.
l_tol, the linear relative tolerance.
nl_max_its, specifies the maximum number of non-linear iterations.
nl_rel_tol, the nonlinear relative tolerance.
nl_abs_tol, the nonlinear absolute tolerance.
free_power_iterations, the number of free power iterations to perform. This is significant for determining the fundamental mode.

Details about the Quadrature sub-block can be read in the MOOSE syntax documentation.

[Executioner]
  type = Eigenvalue

  solve_type = 'PJFNKMO'
  petsc_options_iname = '-pc_type -pc_hypre_type -ksp_gmres_restart'
  petsc_options_value = 'hypre boomeramg 50'
  line_search = none

  # Linear/nonlinear iterations.
  l_max_its = 50
  l_tol = 1e-3

  nl_max_its = 50
  nl_rel_tol = 1e-7
  nl_abs_tol = 1e-8

  # Power iterations.
  free_power_iterations = 4

  [Quadrature]
    order = FOURTH
  []
[]
(htgr/open-xe100/xe100_ss.i)

Postprocessors

The PostProcessors block allows the user to set up calculations of reactor parameters. This is useful for determining if the model is correctly implemented. The average temperature of the fuel elements, moderator elements, and reflector elements are calculated.

[Postprocessors]
  [avg_fuel_temp]
    type = ElementAverageValue
    variable = Tfuel
    block = '${fuel_blocks}'
  []
  [avg_mod_temp]
    type = ElementAverageValue
    variable = Tmod
    block = '${fuel_blocks}'
  []
  [avg_ref_temp]
    type = ElementAverageValue
    variable = Tref
    block = '${ref_blocks}'
  []
[]
(htgr/open-xe100/xe100_ss.i)

Outputs

Output in various formats are requested or suppressed in this block. Notably, the csv file that can be used for regression testing is requested.

[Outputs]
  file_base = ss
  print_linear_residuals = false
  print_linear_converged_reason = false
  print_nonlinear_converged_reason = false
  csv = true
[]
(htgr/open-xe100/xe100_ss.i)

Running the Simulation

Griffin can be run on Linux, Unix, MacOS, and Windows in Windows Subsystem for Linux (WSL). Griffin can be run from the shell prompt as shown below:



griffin-opt -i xe100_ss.i


Griffin Open Xe-100 index

Griffin Open Xe-100 null transient

Griffin Open Xe-100 IQS transient

Griffin Open Xe-100 PKE transient

Griffin Open Xe-100 results

Griffin Open Xe-100 model