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
Links
Griffin Open Xe-100 null transient
Griffin Open Xe-100 IQS transient