High Temperature Engineering Test Reactor (HTTR) Steady State Multiphysics Model Description

Contact: Javier Ortensi javier.ortensi.at.inl.gov

Model link: HTTR Steady State Multiphysics

Introduced below is the steady-state multiphysics HTTR model, which includes neutronics, homogenized full core heat transfer, heterogeneous single pin heat transfer, and thermal-hydraulics channel simulations.

Neutronics

The neutronics calculation utilizes the NEAMS code Griffin, DeHart et al. (2020). The calculations rely on a two-step approach in which cross sections are generated for a multitude of core conditions that form a grid covering the conditions present in the steady state configuration. A 10-energy-group macroscopic cross sections tabulation is created based on the average moderator and fuel temperatures and assume time-independent temperature profiles. A continuous finite element diffusion transport solver is used, Labouré et al. (2022).

Mesh

The 'Mesh' block loads a coarse mesh. The mesh loads 'material_id' and 'equivalence-id' with the 'exodus_extra_element_integers' parameter to match group cross sections and equivalence factors to mesh regions.

[Mesh]
  [fmg]
    type = FileMeshGenerator
    file = '../mesh/full_core/full_core_HTTR.e'
    exodus_extra_element_integers = 'material_id equivalence_id'
  []
  # Restart relies on the ExodusII_IO functionality, which only works with ReplicatedMesh.
  parallel_type = replicated
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Figure 1: Radial cut of the 3D homogenized coarse mesh loaded in neutronics_eigenvalue.i.

Transport System

The 'TransportSystem' block defines the neutronics eigenvalue problem to be solved using 10 energy groups and a continuous finite element diffusion scheme.

[TransportSystems]
  particle = neutron
  equation_type = eigenvalue
  G = 10
  VacuumBoundary = '1 2 3'

  [diff]
    scheme = CFEM-Diffusion
    n_delay_groups = 6
    assemble_scattering_jacobian = true
    assemble_fission_jacobian = true
    assemble_delay_jacobian = true
  []
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Cross sections

We define group cross sections in the 'Materials' block. The macroscopic group cross section library file was specified in the GlobalParams block. It is tabulated with respect to fuel & moderator temperatures.

[Materials]
  [fuel_sph]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    block = '${fuel_blocks}'
    plus = true
  []
  [nonfuel_sph]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    block = '${sph_nonfuel_blocks}'
  []
  [nonsph]
    type = CoupledFeedbackMatIDNeutronicsMaterial
    block = '${axial_reflector_blocks} ${radial_reflector_blocks}'
  []
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Equivalence

The 'Equivalence' block specifies the equivalence-corrected (SPH) group cross section library, tabulated w.r.t fuel and moderator temperature, which is used to correct the macroscopic cross-sections. The equivalence factors were computed on the full core geometry to ensure perfect preservation of reaction rates at tabulated conditions.

[Equivalence]
  type = SPH
  transport_system = diff
  compute_factors = false
  equivalence_library = '../cross_sections/HTTR_5x5${extension}_equiv_corrected.xml'
  library_name = 'HTTR_5x5_equiv${extension}'

  equivalence_grid_names = 'Tfuel Tmod'
  equivalence_grid_variables = 'Tfuel Tmod'
  sph_block = '${fuel_blocks} ${sph_nonfuel_blocks}'
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Poison Tracking

The 'PoisonTracking' block specifies the microscopic cross sections library to use with respect to fuel and moderator temperatures. It is used to track the concentration of Xe-135 in the fuel regions.

[PoisonTracking]
  decay_chains = 'XE135'
  micro_library_file = '../cross_sections/HTTR_5x5${extension}_profiled_VR_kappa_adjusted.xml'
  micro_library_name = 'HTTR_5x5${extension}'
  grid_names = 'Tfuel Tmod'
  grid_variables = 'Tfuel Tmod'
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Heat Transfer

Heat transfer simulations utilize the NEAMS code BISON, Williamson et al. (2021), as well as the heat conduction module in MOOSE. The model includes a macroscale 3-D full core homogenized heat transfer and 2-D axisymmetric pin-scale fuel rod heat transfer. The macroscale 3-D full core homogenized heat transfer model simulates the thermal behavior of the homogenized blocks.

commentnote

Some kernels in this input are actually extracted from Griffin. Therefore either Griffin or a combined application such as Sabertooth must be used. Slight modifications can also be made to use BISON-only kernels.

The local heat flux in the homogenized calculation is not directly relied upon to couple to the distributed thermal-hydraulics channel simulations and 2-D axisymmetric pin-scale fuel rod heat transfer. Instead, two volumetric heat transfer terms are applied at the homogenized full-core level:

(1) ,

where is the homogenized gap conductance (in W/K/m) and is the block-averaged temperature of the outer surface of graphite sleeve (i.e., inner surface of the fuel cooling channels). Heat removal by convection is modeled by adding the following source to the homogenized fuel and CR columns, Labouré et al. (2022):

(2) ,

where is the homogenized heat transfer coefficient of the outer wall and is the block-averaged fluid temperature, Labouré et al. (2022).

Equation 1 relies on the thermal-hydraulics calculation to simulate heat removal by convection in the cooling channels; Equation 2 uses data from the pin-scale model to simulate heat transfer throughout the gaps between the graphite sleeve and graphite blocks by conduction and radiation, Labouré et al. (2022) and Laboure et al. (2019).

The homogenized full core heat transfer and heterogeneous single pin heat transfer solves will now be discussed.

Heat Transfer - Homogenized Full Core

The homogenized full core model simulates the homogenized heat conduction of the core, solved by the heat conduction module.

Mesh

The 'Mesh' block loads a homogenized mesh from an Exodus file.

[Mesh]
  [fmg]
    type = FileMeshGenerator
    file = '../mesh/full_core/thermal_mesh_in.e'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Figure 2: Radial cut of the 3D homogenized coarse mesh loaded in full_core_ht_steady.i. The reactor pressure vessel exchanges heat with the core via radiation and conduction.

Boundary Conditions (BCs)

The 'BCs' block imposes a boundary conditions that are all applied to the temperature variable.

'RPV_in_BC' imposes a forced convective boundary condition on the inner side of the RPV.

[BCs]
  [RPV_in_BC]
    # FIXME: this BC adds energy to the RPV that is not removed from the fluid! (but only ~40kW for 9MW so about 0.6K error on the inlet fluid temperature)
    type = ConvectiveFluxFunction # (Robin BC)
    variable = Tsolid
    boundary = '200' # inner RPV
    coefficient = 30.7 # calculated value for 9MW forced convection # old value: 1e2 W/K/m^2 - arbitrary value
    T_infinity = T_init
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

'RPV_out_BC' imposes a natural convective boundary condition on the outer side of the RPV.

[BCs]
  [RPV_out_BC]
    # k \nabla T = h (T- T_inf) at RPV outer boundary
    type = ConvectiveFluxFunction # (Robin BC)
    variable = Tsolid
    boundary = '100' # outer RPV
    coefficient = 2.58 # calculated value for natural convection following NRC report method
    T_infinity = T_outside # matches Figure 13 value concrete shield
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

'radiative_BC' imposes a radiative boundary condition on the outer side of the RPV.

[BCs]
  [radiative_BC]
    # radiation from RPV to bio shield
    type = InfiniteCylinderRadiativeBC
    boundary = '100' # outer RPV
    variable = Tsolid
    boundary_radius = ${rpv_outer_radius}
    boundary_emissivity = ${rpv_emissivity}
    cylinder_radius = ${vcs_radius}
    cylinder_emissivity = ${vcs_emissivity} # matching NRC value, 0.79 for inner RPV
    Tinfinity = T_outside # matches Figure 13 value concrete shield
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Kernels

The 'heat_conduction' block defines the heat conduction in the reactor pressure vessel.

[Kernels]
  [heat_conduction]
    type = HeatConduction
    variable = Tsolid
    block = '${rpv_blocks}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

The 'aniso_heat_conduction' block defines the anisotropic heat conduction inside the core. The anisotropy accounts for holes in the radial direction, within fuel and CR blocks.

[Kernels]
  [aniso_heat_conduction]
    type = AnisoHeatConduction
    variable = Tsolid
    thermal_conductivity = aniso_thermal_conductivity
    block = '${full_fuel_blocks} ${full_cr_blocks} ${full_pr_blocks}' # all blocks but RPV
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

The time derivative of the energy equation is added using 'HeatConductionTimeDerivative'.

[Kernels]
  [heat_ie]
    type = HeatConductionTimeDerivative
    variable = Tsolid
    block = '${rpv_blocks}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Kernels]
  [aniso_heat_ie]
    type = HeatConductionTimeDerivative
    variable = Tsolid
    block = '${full_fuel_blocks} ${full_cr_blocks} ${full_pr_blocks}' # all blocks but RPV
    specific_heat = aniso_specific_heat
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

A term that accounts for radiative and conductive heat transfers through the gap between the fuel pins and the graphite blocks is added.

[Kernels]
  [heat_loss_conductance_active_fuel]
    type = Removal
    variable = Tsolid
    block = '${fuel_blocks_31pin} ${fuel_blocks_33pin}'
    sigr = gap_conductance_mat
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Kernels]
  [heat_gain_conductance_active_fuel]
    type = MatCoupledForce
    variable = Tsolid
    v = inner_Twall
    block = '${fuel_blocks_31pin} ${fuel_blocks_33pin}'
    material_properties = gap_conductance_mat
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

A term that accounts for the heat extracted by fluid convection in the fuel and CR cooling channels is represented with those two kernels:

[Kernels]
  [heat_loss_convection_outer]
    type = Removal
    variable = Tsolid
    block = '${full_fuel_blocks} ${full_cr_blocks}'
    sigr = Hw_outer_homo_mat
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Kernels]
  [heat_gain_convection_outer]
    type = MatCoupledForce
    variable = Tsolid
    v = Tfluid
    block = '${full_fuel_blocks} ${full_cr_blocks}'
    material_properties = Hw_outer_homo_mat
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Thermal Contact

The 'ThermalContact' block is used to model radiation and conduction between the permanent reflectors and the reactor pressure vessel. The gap is filled with cooled helium gas. The two boundaries involved are '200' (boundary id) on the reactor pressure vessel and '1' (boundary id) on the permanent reflectors.

[ThermalContact]
  [RPV_gap]
    type = GapHeatTransfer
    gap_geometry_type = 'CYLINDER'
    emissivity_primary = 0.8
    emissivity_secondary = 0.8 # varies from 0.6 to 1.0 in RPV paper, 0.79 in NRC paper
    variable = Tsolid # graphite -> rpv gap
    primary = '200'
    secondary = '1'
    gap_conductivity = 0.2091 # for He at 453K, 2.8 MPa
    quadrature = true
    #paired_boundary = '1'
    cylinder_axis_point_1 = '0 0 0'
    cylinder_axis_point_2 = '5.22 0 0'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Materials

The material solid thermal properties are defined using 'HeatConductionMaterial' and 'AnisoHeatConductionMaterial'; this includes thermal conductivity and specific heat.

[Materials]
  [graphite_moderator]
    type = AnisoHeatConductionMaterial
    block = '${full_fuel_blocks} ${full_cr_blocks} ${full_pr_blocks}' # all blocks but RPV
    temperature = Tsolid
    base_name = 'aniso'
    reference_temperature = 0.0
    thermal_conductivity_temperature_coefficient_function = IG110_k
    thermal_conductivity = '1    0    0
                            0 0.54    0
                            0    0 0.54' # isotropic for testing only, otherwise one in the x-direction
    specific_heat = IG110_cp
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [ss304_rpv]
    type = HeatConductionMaterial
    block = '${rpv_blocks}'
    thermal_conductivity_temperature_function = ssteel_304_k
    specific_heat = 500 # J/kg/K
    temp = Tsolid
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

The thermal conductivity is defined as a function of temperature defined in the 'Functions' block. It is divided by the temperature to get the desired behavior with AnisoHeatConductionMaterial.

[Functions]
  [IG110_k]
    # thermal conductivity divided by the temperature (dirty trick to make AnisoHeatConductionMaterial define a temperature-independent anistropic thermal conductivity)
    type = ParsedFunction
    symbol_values = '6.632e+01 -4.994e-02 1.712e-05' # [W/m/K]
    symbol_names = 'a0        a1         a2       '
    expression = '((a0 + a1 * t + a2 * t * t) - 1) / t'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Additionally the densities of the various regions are defined in the 'Materials' block.

[Materials]
  [graphite_density_fuel33]
    type = Density
    block = '${fuel_blocks_33pin}'
    density = '${fparse 1770 * vol_frac_fuel33}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [graphite_density_fuel31]
    type = Density
    block = '${fuel_blocks_31pin}'
    density = '${fparse 1770 * vol_frac_fuel31}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [graphite_density_rr_fuel33]
    type = Density
    block = '${rr_fuel_blocks_33pin}'
    density = '${fparse 1760 * vol_frac_fuel33}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [graphite_density_rr_fuel31]
    type = Density
    block = '${rr_fuel_blocks_31pin}'
    density = '${fparse 1760 * vol_frac_fuel31}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [graphite_density_cr]
    type = Density
    block = '${full_cr_blocks}'
    density = '${fparse 1770 * vol_frac_cr}'
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [graphite_density_rest]
    type = Density
    block = '${full_pr_blocks}'
    density = '${fparse 1760}' # In reality, the actual PR blocks are made of PGX graphite of density 1.732 g/cc but here we assume IG110 graphite for now.
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Materials]
  [ss304_density]
    type = Density
    block = '${rpv_blocks}'
    density = 800 #1/10th of the typical value (8000) for ss304 in kg/m^3 to accelerate steady-state solution
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Heat Transfer - Single Pin Heterogeneous

Mesh

The 'Mesh' block loads a mesh to simulate the 5 fuel pins within the fuel column.

[Mesh]
  [fmg]
    type = FileMeshGenerator
    file = '../mesh/fuel_element/HTTR_fuel_pin_2D_refined_m_5pins_axialref.e'
  []
  uniform_refine = 0 # do not modify if using ThermalContact
  coord_type = RZ
  rz_coord_axis = X
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Figure 3: The 2D heterogeneous mesh in RZ geometry loaded in fuel_elem_steady.i. Shown is one of the five fuel pins from the mesh; composed of a fuel block, in grey, a graphite sleeve, in red, and a graphite moderator block, in green. Areas 1, 2, and 3 contain the thermal contact boundaries and will be described in greater detail in the next section.

Thermal Contact

The ThermalContact block solves for the heat conduction and radiation in the gap between the graphite sleeve and the top of the fuel compact, the gap between the side of graphite sleeve and side of the fuel compact, and the gap between the side of the graphite sleeve and the side of the moderator block.

[ThermalContact]
  [gap_top]
    type = GapHeatTransfer
    gap_geometry_type = 'PLATE'
    emissivity_primary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    emissivity_secondary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    # coarser side should be primary
    # (in theory using quadrature = true should make it independent but other errors appear and not exactly conservative)
    primary = Sleeve_top
    secondary = Fuel_top
    gap_conductivity = 0.2735 # He at 668K, 2.8 MPa - Original: 1e-5 W/m/K, Shi PhD: 0.35 (but no gap on the inside)
    variable = temp
    quadrature = true
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Figure 4: A close up of the fuel pin mesh, Area 1, showing the gap between the 'Sleeve_top' (the section of the graphite sleeve to the right, in red) and the 'Fuel_top' (the section of the fuel pin to the left, in grey), where heat transfer takes place; the boundaries are shown as faint pink lines.

[ThermalContact]
  [gap_side]
    type = GapHeatTransfer
    gap_geometry_type = 'CYLINDER'
    emissivity_primary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    emissivity_secondary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    primary = Sleeve_side
    secondary = Fuel_side
    gap_conductivity = 0.2735 # He at 668K, 2.8 MPa - Original: 1e-5 W/m/K, Shi PhD: 0.35 (but no gap on the inside)
    variable = temp
    quadrature = true
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Figure 5: A close up of the fuel pin mesh, Area 2, showing the 'Sleeve_side' (the section of the graphite sleeve at the top, in red) and the 'Fuel_side' (the section of the fuel pin at the bottom, in grey), which contains a very slight gap in which heat transfer takes place. The boundaries are shown as faint blue and yellow lines.

[ThermalContact]
  [cooling_channel]
    type = GapHeatTransfer
    gap_geometry_type = 'CYLINDER'
    emissivity_primary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    emissivity_secondary = 0.8 # MHTGR: 0.85, Shi PhD: 0.8
    primary = Inner_outer_ring
    secondary = Relap7_Tw
    gap_conductivity = 0.2309 # He at 523K, 2.8MPa
    variable = temp
    quadrature = true
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Figure 6: A close up of the fuel pin mesh, Area 3, showing the gap between the 'Inner_outer_ring' (the outer wall of the graphite sleeve, in red) and the 'Relap7_Tw' (the inner wall of the graphite block, in green) where heat transfer takes place. The boundaries are shown as faint teal and black lines.

Boundary Conditions (BCs)

We impose a zero heat flux using a Neumann boundary condition on the bottom of the graphite sleeve.

[BCs]
  [Neumann]
    type = NeumannBC
    variable = temp
    value = 0.0
    boundary = 'Neumann Sleeve_bot'
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

A pseudo-Dirichlet boundary is also defined; it weakly imposes 'T = Tmod' on the outer most radial wall of the graphite block.

[BCs]
  [outside_bc]
    type = CoupledConvectiveHeatFluxBC
    variable = temp
    boundary = 'Outer_outer_ring'
    T_infinity = Tmod
    htc = 1e5
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

The convective heat transfer with the helium channel is modeled using 'CoupledConvectiveHeatFluxBC'.

The 'convective_inner' block specifies a heat transfer coefficient for the inner radius of the cooling channel in W/K/.

[BCs]
  [convective_inner]
    type = CoupledConvectiveHeatFluxBC
    boundary = 'Relap7_Tw'
    variable = temp
    T_infinity = Tfluid
    htc = Hw_inner
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

The 'convective_outer' block specifies a heat transfer coefficient for the outer radius of the cooling channel in W/K/.

[BCs]
  [convective_outer]
    type = CoupledConvectiveHeatFluxBC
    boundary = 'Inner_outer_ring'
    variable = temp
    T_infinity = Tfluid
    htc = Hw_outer
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Kernels

The 'Kernels' block defines a steady-state heat conduction equation. A source term is defined using the 'CoupledForce' kernel to model how much power is deposited in the fuel compact.

[Kernels]
  [heat]
    type = HeatConduction
    variable = temp
  []
  # [heat_ie] # omit to speed up steady state convergence
  #   type = HeatConductionTimeDerivative
  #   variable = temp
  # []
  [heat_source]
    type = CoupledForce
    variable = temp
    block = '${fuel_blocks}'
    v = scaled_power_density
  []
[]
(htgr/httr/steady_state_and_null_transient/fuel_elem_steady.i)

Thermal-Hydraulics

The thermal-hydraulics calculations in the coolant channels use the NEAMS code RELAP-7, Berry et al. (2014).

One cooling flow channel is simulated for each of the 30 fuel columns. Another flow channel simulation is performed for each of the 16 control rod channels. The cooling flow simulation is represented below in Figure 1, Labouré et al. (2022); the cold helium flows downwards from the top of the reactor core through the control rod channels and the fuel rod channels to cool the fuel pins.

Fuel cooling channels have a specified mass flow rate applied that is different from the mass flow rate applied to the CR cooling channels. To simplify the coolant flow path of the HTTR, the flow in inter-column gaps is neglected and the bypass flow is set to a fixed value.

Figure 1: Left: Radial cross-section of the Serpent model. Right: description of the RELAP-7 models for fuel and CR channels, at the example locations shown in the core view, from Labouré et al. (2022).

Thermal-Hydraulics - Control Rods

Components

The 'CR_cooling_channel' block describes the flow channels' position, orientation, and length to create 300 elements of equal length while providing the area of the pipe, hydraulic diameter, and wall friction.

[Components]
  [CR_cooling_channel]
    type = FlowChannel1Phase
    fp = helium
    # Geometry
    position = '5.22 0 0'
    orientation = '-1.0 0 0'
    A = '${fparse 0.25 * pi * D_ext * D_ext}' # Area of the pipe m^2
    D_h = ${D_ext} # Hydraulic diameter A = Dout
    f = 0 # Wall friction

    length = 5.22 # m
    n_elems = 300
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_CR_steady.i)

The 'inlet' block defines the cooling channel inlet and imposes the temperature of the fluid and the mass flow rate, which are both constants.

[Components]
  [inlet]
    type = InletMassFlowRateTemperature1Phase
    input = 'CR_cooling_channel:in'
    m_dot = ${mdot}
    T = ${Tinlet} # K
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_CR_steady.i)

The 'outlet' block defines the cooling channel outlet and imposes the value of the pressure as a constant, as an outlet boundary condition.

[Components]
  [outlet]
    type = Outlet1Phase
    input = 'CR_cooling_channel:out'
    p = ${pressure}
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_CR_steady.i)

The 'ht_ext' block defines a convective boundary condition using the 'HeatTransferFromExternalAppTemperature1Phase'. This heat structure is attached to the flow channel by specifying the 'flow_channel' parameter.

[Components]
  [ht_ext]
    type = HeatTransferFromExternalAppTemperature1Phase
    flow_channel = CR_cooling_channel
    P_hf = '${fparse pi * D_ext}' # Heat flux perimeter m
    initial_T_wall = 500
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_CR_steady.i)

Fluid Properties

In the 'FluidProperties' block, we use the Spline Based Table Lookup fluid properties for Helium.

commentnote

Helium SBTL properties are available as a submodule of RELAP-7. If your access level does not provide them, please contact the MOOSE team for access. They should be open-sourced shortly.

[FluidProperties]
  [helium]
    type = HeliumSBTLFluidProperties
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_CR_steady.i)

Thermal-Hydraulics - Fuel Pins

Components

The Components block sets up the geometry for the cooling channels, heat transfers for the flow channels, and boundary conditions to couple to the graphite moderator blocks and fuel pins. The pipe is broken up into three sections to account for the upper and lower reflectors (which contain no fuel). The interior and exterior wall temperatures and heated perimeter are specified to model the heat transfer throughout the cooling channel.

The 'pipe_top', 'pipe1', and 'pipe_bottom' blocks define a 'FlowChannel1Phase' type as well as the position, orientation, and length of this section of the pipe. It specifies the area and hydraulic diameter as constants; 'pipe1' uses a different hydraulic diameter than 'pipe_top' and 'pipe_bottom' to account for the fuel pin inside the cooling channel. 60 'pipe_top' elements, 180 'pipe1' elements, and 60 'pipe_bottom' elements are requested.

[Components]
  [pipe_top]
    type = FlowChannel1Phase
    fp = helium
    # Geometry
    position = '5.22 0 0'
    orientation = '-1.0 0 0'
    A = '${fparse 0.25 * pi * D_ext * D_ext}' # Area of the pipe m^2
    D_h = ${D_ext} # Hydraulic diameter A = Dout
    f = 0 # Wall friction

    length = 1.16 # m
    n_elems = 60
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)
[Components]
  [pipe1]
    type = FlowChannel1Phase
    fp = helium
    # Geometry
    position = '4.06 0 0'
    orientation = '-1.0 0 0'
    A = '${fparse 0.25 * pi * (D_ext * D_ext - D_int * D_int)}' # Area of the pipe m^2
    D_h = '${fparse D_ext - D_int}' # Hydraulic diameter A = Dout-Din
    f = 0 # Wall friction

    length = 2.9 # m
    n_elems = 180
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)
[Components]
  [pipe_bottom]
    type = FlowChannel1Phase
    fp = helium
    # Geometry
    position = '1.16 0 0'
    orientation = '-1.0 0 0'
    A = '${fparse 0.25 * pi * D_ext * D_ext}' # Area of the pipe m^2
    D_h = ${D_ext} # Hydraulic diameter A = Dout
    f = 0 # Wall friction

    length = 1.16
    n_elems = 60
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

The 'inlet' block defines the cooling channel inlet as an 'InletMassFlowRateTemperature1Phase' type. It imposes the temperature of the inlet and the mass flow rate, which are both constants.

[Components]
  [inlet]
    type = InletMassFlowRateTemperature1Phase
    input = 'pipe_top:in'
    m_dot = ${mdot}
    T = ${Tinlet} # K
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

The 'junction1' block defines the junction connecting 'pipe_top' to 'pipe1'.

[Components]
  [junction1]
    type = JunctionOneToOne1Phase
    connections = 'pipe_top:out pipe1:in'
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

The 'junction2' block defines the junction connecting 'pipe1' to 'pipe_bottom'.

[Components]
  [junction2]
    type = JunctionOneToOne1Phase
    connections = 'pipe1:out pipe_bottom:in'
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

The 'outlet' block imposes the pressure of helium as it exits the cooling channel as a constant.

[Components]
  [outlet]
    type = Outlet1Phase
    input = 'pipe_bottom:out'
    p = ${pressure}
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

The 'ht_int' block defines the BC on the interior radius of the cooling channel. It specifies a heat flux perimeter as a constant and has an initial wall temperature of 600K.

The 'ht_ext_top' block defines the BC on the exterior radius, the 'ht_ext' block defines the BC on the interior radius, and the 'ht_ext_bottom' block defines the BC on the exterior radius of the cooling channel. Each block specifies in a heat flux perimeter as a constant and has an initial wall temperature of 500K.

[Components]
  [ht_int]
    type = HeatTransferFromExternalAppTemperature1Phase
    flow_channel = pipe1
    P_hf = '${fparse pi * D_int}' # Heat flux perimeter m
    initial_T_wall = 600
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)
[Components]
  [ht_ext_top]
    type = HeatTransferFromExternalAppTemperature1Phase
    flow_channel = pipe_top
    P_hf = '${fparse pi * D_ext}' # Heat flux perimeter m
    initial_T_wall = 500
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)
[Components]
  [ht_ext]
    type = HeatTransferFromExternalAppTemperature1Phase
    flow_channel = pipe1
    P_hf = '${fparse pi * D_ext}' # Heat flux perimeter m
    initial_T_wall = 500
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)
[Components]
  [ht_ext_bottom]
    type = HeatTransferFromExternalAppTemperature1Phase
    flow_channel = pipe_bottom
    P_hf = '${fparse pi * D_ext}' # Heat flux perimeter m
    initial_T_wall = 500
  []
[]
(htgr/httr/steady_state_and_null_transient/thermal_hydraulics_fuel_pins_steady.i)

Coupled Multiphysics Model

The HTTR model released is a multiphysics model that combines 3-D full core super homogenization-corrected neutronics, macroscale 3-D full core homogenized heat transfer, 2-D axisymmetric pin-scale fuel rod heat transfer, and distributed 1-D thermal-hydraulics channels Laboure et al. (2019), shown below in Figure 2. The HTTR model released utilizes the MOOSE framework's MultiApps and Transfers systems to couple the individual physics models.

Figure 2: Workflow of the steady-state coupling, from Labouré et al. (2022).

Coupling Neutronics and Heat Conduction

The homogeneous full core heat conduction solve is a child application of the neutronics application. This is selected because the neutronics solve is solved for steady state directly as an eigenvalue problem, while some of the downstream simulations are relaxation to steady-state transients.

[MultiApps]
  [moose_modules]
    type = FullSolveMultiApp
    positions = '0 0 0'
    input_files = full_core_ht_steady.i
    execute_on = 'timestep_end'
    keep_solution_during_restore = true # to restart from the latest solve of the multiapp (for pseudo-transient)
  []
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

The neutronics data (local power) is sent to the homogenized heat conduction model, which then sends fuel temperature data back to the neutronics model.

[Transfers]
  [pdens_to_modules]
    type = MultiAppProjectionTransfer
    to_multi_app = moose_modules
    source_variable = power_density
    variable = power_density
    execute_on = 'timestep_end'
  []
  [tmod_from_modules]
    type = MultiAppProjectionTransfer
    from_multi_app = moose_modules
    source_variable = Tmod
    variable = Tmod
    execute_on = 'timestep_end'
  []
  [tfuel_from_modules]
    type = MultiAppProjectionTransfer
    from_multi_app = moose_modules
    source_variable = Tfuel
    variable = Tfuel
    execute_on = 'timestep_end'
  []
[]
(htgr/httr/steady_state_and_null_transient/neutronics_eigenvalue.i)

Coupling Homogenized Heat Conduction and Heterogenous Heat Conduction

Figure 4: Relationship between various sub-models, from Laboure et al. (2019).

Distributed heterogeneous single pin heat transfer simulations and distributed thermal-hydraulics cooling channel calculations are created using MultiApps.

[MultiApps]
  [bison]
    type = TransientMultiApp
    positions_file = '../mesh/centers_relap_33pins.txt
                      ../mesh/centers_relap_31pins.txt'
    input_files = 'fuel_elem_steady.i'
    cli_args = 'npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33
                npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31'
    execute_on = 'timestep_begin'
    output_in_position = true
  []
  [relap]
    type = TransientMultiApp
    positions_file = '../mesh/centers_relap_33pins.txt
                      ../mesh/centers_relap_31pins.txt
                      ../mesh/centers_relap_CR.txt'
    # the first 12 positions are fuel with 33 pins, the next 18 are fuel with 31 pins, the last 16 are CR
    input_files = 'thermal_hydraulics_fuel_pins_steady.i
                   thermal_hydraulics_fuel_pins_steady.i
                   thermal_hydraulics_CR_steady.i'
    cli_args = 'npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33 npins=33
                npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31 npins=31
                npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2  npins=2'
    execute_on = 'timestep_end'
    max_procs_per_app = 1
    sub_cycling = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

The homogenized heat transfer model sends gap conductance information to the single pin heterogeneous heat transfer model and sleeve temperature data to both thermal-hydraulics models.

Power density, moderator temperature, fluid temperature, and temperatures of the inner and outer radius of fuel and cooling rod channel walls are all sent to the Bison Heat Transfer application.

[Transfers]
  [pdens_to_bison]
    type = MultiAppUserObjectTransfer
    to_multi_app = bison
    user_object = average_power_UO
    variable = power_density
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tmod_to_bison]
    type = MultiAppUserObjectTransfer
    to_multi_app = bison
    user_object = average_Tsolid_UO
    variable = Tmod
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tfluid_to_bison]
    type = MultiAppInterpolationTransfer
    to_multi_app = bison
    source_variable = Tfluid
    variable = Tfluid
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [htc_inner_to_bison]
    type = MultiAppInterpolationTransfer
    to_multi_app = bison
    source_variable = Hw_inner
    variable = Hw_inner
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [htc_outer_to_bison]
    type = MultiAppInterpolationTransfer
    to_multi_app = bison
    source_variable = Hw_outer
    variable = Hw_outer
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Average fuel temperature, graphite sleeve temperature, inner radius temperature of the fuel and cooling rod channel walls, gap conductance heat source, total heat flux, and total power are then sent back from the Bison Heat Transfer application after further calculations have been made.

[Transfers]
  [tfuel_from_bison]
    type = MultiAppUserObjectTransfer
    from_multi_app = bison
    user_object = average_Tfuel_UO
    variable = Tfuel
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tsleeve_from_bison]
    type = MultiAppUserObjectTransfer
    from_multi_app = bison
    user_object = average_Tsleeve_UO
    variable = Tsleeve
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [twall_from_bison]
    type = MultiAppUserObjectTransfer
    from_multi_app = bison
    user_object = inner_wall_temp_UO
    variable = inner_Twall
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [heat_source_from_bison]
    type = MultiAppUserObjectTransfer
    from_multi_app = bison
    user_object = gap_conductance_UO
    variable = gap_conductance
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [total_power_from_bison]
    type = MultiAppPostprocessorTransfer
    from_multi_app = bison
    from_postprocessor = 'fuel_block_total_power'
    to_postprocessor = 'bison_total_power'
    reduction_type = sum
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [bison_heat_flux]
    type = MultiAppPostprocessorTransfer
    from_multi_app = bison
    from_postprocessor = 'bdy_heat_flux_tot'
    to_postprocessor = 'bison_total_bdy_heat_flux'
    reduction_type = sum
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Inner wall temperatures and outer wall temperatures of the fuel cooling channels are sent to the RELAP7 Thermal-Hydraulics application.

[Transfers]
  [inner_twall_to_relap]
    type = MultiAppInterpolationTransfer
    to_multi_app = relap
    source_variable = inner_Twall
    variable = T_wall:1
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tmod_to_relap]
    type = MultiAppUserObjectTransfer
    to_multi_app = relap
    user_object = average_Tsolid_UO
    variable = T_wall:2
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tmod_to_relap_topbottom]
    type = MultiAppUserObjectTransfer
    to_multi_app = relap
    user_object = average_Tsolid_UO
    variable = T_wall
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Fluid temperature, homogenized outer wall heat transfer coefficient, outlet temperature, and enthalpy difference are then sent back from the RELAP7 Thermal-Hydraulics application. The heat transfer coefficients and fluid temperatures can be used to compute the heat flux to verify conservation. The temperatures fields are also gathered to the parent application for output of the fluid temperature on the core scale.

[Transfers]
  [tfluid_from_relap]
    type = MultiAppUserObjectTransfer
    from_multi_app = relap
    variable = Tfluid
    user_object = avg_Tfluid_UO
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [hw_inner_from_relap]
    type = MultiAppUserObjectTransfer
    from_multi_app = relap
    variable = Hw_inner
    user_object = avg_Hw_inner_UO
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [hw_outer_from_relap]
    type = MultiAppUserObjectTransfer
    from_multi_app = relap
    variable = Hw_outer
    user_object = avg_Hw_outer_UO
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [hw_outer_homo_from_relap]
    type = MultiAppUserObjectTransfer
    from_multi_app = relap
    variable = Hw_outer_homo
    user_object = avg_Hw_outer_homo_UO
    nearest_sub_app = true
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [tout_from_relap]
    type = MultiAppPostprocessorTransfer
    from_multi_app = relap
    from_postprocessor = Tout_weighted
    to_postprocessor = Tfluid_out
    reduction_type = sum
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)
[Transfers]
  [deltaH_from_relap]
    type = MultiAppPostprocessorTransfer
    from_multi_app = relap
    from_postprocessor = delta_H
    to_postprocessor = delta_H
    reduction_type = sum
  []
[]
(htgr/httr/steady_state_and_null_transient/full_core_ht_steady.i)

Files

Cross section Files:

The cross sections are located in httr/cross_sections.

Multigroup cross-section library with Xe-135 contribution removed - HTTR_5x5_9MW_profiled_VR_kappa_adjusted.xml

SPH factor library - HTTR_5x5_9MW_equiv_corrected.xml

Mesh Files:

Mesh files are located under httr/mesh.

Griffin full-core mesh - full_core_HTTR.e

Full-core heat transfer mesh - thermal_mesh_in.e

BISON 5-pin mesh - HTTR_fuel_pin_2D_refined_m_5pins_axialref.e

Input Files:

Input files are located in httr/steady_state_and_null_transient.

Steady-State Model

Griffin model - neutronics_eigenvalue.i

Full-core heat transfer model - full_core_ht_steady.i

BISON 5-pin model - fuel_elem_steady.i

RELAP-7 Control Rod Assembly thermal-hydraulics model - thermal_hydraulics_CR_steady.i

RELAP-7 Fuel Assembly thermal-hydraulics model - thermal_hydraulics_fuel_pins_steady.i

Running the simulation

To apply for access to Sabertooth and access to INL High Performance Computing, please visit NCRC. These inputs can be run on your local machine or on a computing cluster, depending on your level of access to the simulation software and the computing power available to you.

Idaho National Laboratory HPC

Run the Griffin parent application input with Sabertooth. With at least level 1 access to Sabertooth, the sabertooth module can be loaded and from the sabertooth-opt executable can be used. The neutronics_eigenvalue.i input is the input for the steady state calculation. The null transient is considered on this page.


module load use.moose moose-apps sabertooth

mpirun -n 6 sabertooth-opt -i neutronics_eigenvalue.i

Local Device

In all cases (steady-state and null-transient - which should be executed in this order), run the Griffin input with Sabertooth.

For instance, if you have level 2 access to the binaries, you can download sabertooth through miniconda and use them (once downloaded) as follows:


conda activate sabertooth

mpirun -n 6 sabertooth-opt -i neutronics_eigenvalue.i

If using or modifying this model, please cite:

1. Vincent Labouré, Javier Ortensi, Nicolas Martin, Paolo Balestra, Derek Gaston, Yinbin Miao, Gerhard Strydom, "Improved multiphysics model of the High Temperature Engineering Test Reactor for the simulation of loss-of-forced-cooling experiments", Annals of Nuclear Energy, Volume 189, 2023, 109838, ISSN 0306-4549, https://doi.org/10.1016/j.anucene.2023.109838. (https://www.sciencedirect.com/science/article/pii/S0306454923001573)

2. Vincent M Laboure, Matilda A Lindell, Javier Ortensi, Gerhard Strydom and Paolo Balestra, "FY22 Status Report on the ART-GCR CMVB and CNWG International Collaborations." INL/RPT-22-68891-Rev000 Web. doi:10.2172/1893099.

Documentation written by Kylee Swanson.

References

  1. R. A. Berry, J. W. Peterson, H. Zhang, R. C. Martineau, H. Zhao, L. Zou, and D. Andrš. RELAP-7 Theory Manual. Technical Report INL/EXT-14-31366, Idaho National Laboratory, 2014.[BibTeX]
  2. Mark DeHart, Fredrick N. Gleicher, Vincent Laboure, Javier Ortensi, Zachary Prince, Sebastian Schunert, and Yaqi Wang. Griffin user manual. Technical Report INL/EXT-19-54247, Idaho National Laboratory, 2020.[BibTeX]
  3. Vincent Laboure, Javier Ortensi, Yaqi Wang, Sebastian Schunert, Frederick Gleicher, Mark Dehart, and R. Martineau. Multiphysics Steady-State Simulation of the High Temperature Test Reactor with MAMMOTH, BISON and RELAP-7. Technical Report, Idaho National Laboratory, 2019.[BibTeX]
  4. Vincent M. Labouré, Matilda Anna Elisabeth Åberg Lindell, Javier Ortensi, Gerhard Strydom, and Paolo Balestra. FY22 Status Report on the ART-GCR CMVB and CNWG International Collaborations. Technical Report, Idaho National Laboratory, 2022. doi:10.2172/1893099.[BibTeX]
  5. Richard L. Williamson, Jason D. Hales, Stephen R. Novascone, Giovanni Pastore, Kyle A. Gamble, Benjamin W. Spencer, Wen Jiang, Stephanie A. Pitts, Albert Casagranda, Daniel Schwen, Adam X. Zabriskie, Aysenur Toptan, Russell Gardner, Christoper Matthews, Wenfeng Liu, and Hailong Chen. Bison: a flexible code for advanced simulation of the performance of multiple nuclear fuel forms. Nuclear Technology, 207(7):1–27, 2021. URL: https://doi.org/10.1080/00295450.2020.1836940, doi:10.1080/00295450.2020.1836940.[BibTeX]