Pebble - Triso heat conduction for Equilibrium Core

Contact: Dr. Mustafa Jaradat, [email protected]

Sponsor: Dr. Steve Bajorek (NRC)

Model summarized, documented, and uploaded by Dr. Mustafa Jaradat and Dr. Samuel Walker

The neutronics and thermal hydraulics simulation provide us with the power distribution and the fluid and solid phase temperature on the macroscale. They do not resolve the individual pebbles, and therefore cannot directly inform us on local effects such as temperature gradients within a pebble. These are important to lead fuel performance studies, to verify that the pebbled-fuel remains within design limitations in terms of temperature and burnup.

We use a multiscale approach to resolve the pebble conditions within the reactor. Using the PebbleDepletion action with ConstantStreamLineEquilibrium allows us to track the depletion and fuel performance of the cycling pebbles.

This pebble-triso model is run for each time step in the depletion action so that the heat and decay heat from the pebbles can be accurately predicted. For more information on the specifics of the 1-D heat conduction equation that is implemented please see the Mark 1 pebble model and the corresponding Mark 1 triso model.

Problem Parameters

Similar to the other inputs files, we identify key problem parameters such as the geometric values for the pebbles and triso kernels as well as the initial power density and temperature.

Mesh

Next we define the Mesh block which defines both the pebble_mesh and the triso_mesh at different scales and their corresponding surfaces in a RSPHERICAL coordinate system.

[Mesh]

  block_id = '1     2     3      4      5      6    7   8'
  block_name = 'pcore pfuel pshell kernel buffer ipyc sic opyc'
  dim = 1

  [pebble_mesh]
    type = CartesianMeshGenerator
    dim = 1
    dx = '1.38e-02 4.20e-03 2.00e-03'
    ix = '3        6       3'
    subdomain_id = '1        2       3'
  []
  [triso_mesh]
    type = CartesianMeshGenerator
    dim = 1
    dx = '2.125e-04 1.00e-04 4.00e-05 3.50e-05 4.00e-05'
    ix = '4         3         3         3         3'
    subdomain_id = '4         5         6         7         8'
  []
  [mesh_combine]
    type = CombinerGenerator
    inputs = 'pebble_mesh triso_mesh'
  []
  [pebble_surface]
    type = SideSetsAroundSubdomainGenerator
    block = '3'
    fixed_normal = 1
    normal = ' 1 0 0 '
    input = mesh_combine
    new_boundary = pebble_surface
  []
  [triso_surface]
    type = SideSetsAroundSubdomainGenerator
    block = '8'
    fixed_normal = 1
    normal = ' 1 0 0 '
    input = pebble_surface
    new_boundary = triso_surface
  []
  coord_type = 'RSPHERICAL'
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Variables

Next we identify the Variables that will be solved in this sub-application - the pebble and triso temperatures.

[Variables]
  [T_pebble]
    block = 'pcore pfuel pshell'
    initial_condition = ${initial_temperature}
  []
  [T_triso]
    block = 'kernel buffer ipyc sic opyc'
    initial_condition = ${initial_temperature}
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Kernels

The Kernels block sets up the various Kernels which will operate on the variables and define the equations that will be solved.

Here we include the ADHeatConduction, and CoupledForce to model the 1-D heat conduction and heat source from the power density calculated from the Griffin neutronics solve which will be identified later in the Postprocessors block.

[Kernels]
  # Pebble.
  [pebble_diffusion]
    type = ADHeatConduction
    variable = T_pebble
    thermal_conductivity = 'k_s'
    block = 'pcore pfuel pshell'
  []
  [pebble_fuel_heat_source]
    type = CoupledForce
    block = 'pfuel'
    v = pebble_power_density
    variable = T_pebble
  []
  # TRISO.
  [triso_diffusion]
    type = ADHeatConduction
    variable = T_triso
    thermal_conductivity = 'k_s'
    block = 'kernel buffer ipyc sic opyc'
  []
  [kernel_heat_source]
    type = CoupledForce
    block = 'kernel'
    v = kernel_power_density
    variable = T_triso
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Auxiliary Variables

Next the AuxVariables block lists variables that are not solved for explicitly, but can be used in other kernels or in multiphysics transfers. Here the pebble_power_density is one such variable that gets transferred from Griffin in the Postprocessors block.

[AuxVariables]
  [dummy_pden]
    order = CONSTANT
    family = MONOMIAL
    initial_condition = 1.0 # used for scaling the
  []
  [pebble_power_density]
    order = CONSTANT
    family = MONOMIAL
  []
  [pfuel_power_density]
    order = CONSTANT
    family = MONOMIAL
    block = 'pfuel'
  []
  [kernel_power_density]
    order = CONSTANT
    family = MONOMIAL
    block = 'kernel'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Auxiliary Kernels

Similarly we can have Auxiliary Kernels which operate on the Auxiliary Variables. In this case, we have some ScaleAux and ParsedAux which operate on the variables pebble_power_density, pfuel_power_density, and kernel_power_density respectively to do simple calculations based upon the geometry of the pebbles and triso kernels.

[AuxKernels]
  [pebble_power_density]
    type = ParsedAux
    variable = pebble_power_density
    expression = 'dummy_pden * pebble_power_density_pp'
    coupled_variables = 'dummy_pden'
    functor_names = 'pebble_power_density_pp'
  []
  [pfuel_power_density]
    type = ParsedAux
    block = 'pfuel'
    variable = pfuel_power_density
    expression = 'pebble_power_density * ${fparse pebble_volume / pebble_fueled_volume}'
    coupled_variables = 'pebble_power_density'
  []
  [kernel_power_density]
    type = ParsedAux
    block = 'kernel'
    variable = kernel_power_density
    expression = 'pebble_power_density * ${fparse pebble_volume / triso_number / kernel_volume}'
    coupled_variables = 'pebble_power_density'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Materials

The Materials block set up specific materials for specific areas of the model. In this case we set up the pebble_fuel, pebble_graphite_core, and pebble_graphite_shell with the temperature from T_pebble for the pebbles. Additionally, the Triso materials are also set here with kernel, buffer, ipyc, sic, and opyc, all set with T_triso for the temperature.

[Materials]
  [pebble_fuel]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_pebble
    solid = pebble_fuel
    block = 'pfuel'
  []
  [pebble_graphite_core]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_pebble
    solid = gcore
    block = 'pcore'
  []
  [pebble_graphite_shel]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_pebble
    solid = gmatrix
    block = 'pshell'
  []

  # TRISO.
  [kernel]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_triso
    solid = kernel
    block = 'kernel'
  []
  [buffer]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_triso
    solid = buffer
    block = 'buffer'
  []
  [ipyc]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_triso
    solid = ipyc
    block = 'ipyc'
  []
  [sic]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_triso
    solid = sic
    block = 'sic'
  []
  [opyc]
    type = PronghornSteadyStateSolidMaterial
    T_solid = T_triso
    solid = opyc
    block = 'opyc'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

User Objects

The User Objects can be used to specify various objects that are used within the MOOSE framework. In this case we are specifying FunctionSolidProperties for the Triso particles defining the thermal conductivity, density, and heat capacity of each material layer. Then Mixture objects are defined that use CompositeSolidProperties to form the discrete triso particles using the various material layers, adn the pebble_fuel using the triso and gmatrix (graphite matrix) materials with their associated solid thermodynamic properties.

[UserObjects]
  [kernel]
    type = FunctionSolidProperties
    k_s = '1/(0.035 + 2.25e-4*t) + 8.30e-11*t^3'
    rho_s = 10500.0
    cp_s = 320.0
  []
  [buffer]
    type = FunctionSolidProperties
    k_s = 0.7
    rho_s = 1050.0
    cp_s = 1760.0
  []
  [ipyc]
    type = FunctionSolidProperties
    k_s = 4.0
    rho_s = 1900.0
    cp_s = 1760.0
  []
  [sic]
    type = FunctionSolidProperties
    k_s = 16.0
    rho_s = 3180.0
    cp_s = 1242.0
  []
  [opyc]
    type = FunctionSolidProperties
    k_s = 4.0
    rho_s = 1900.0
    cp_s = 1760.0
  []
  [gmatrix]
    type = FunctionSolidProperties
    k_s = 32.4
    rho_s = 1740.0
    cp_s = 1760.0
  []
  [gcore]
    type = FunctionSolidProperties
    k_s = 30.0
    rho_s = 1410.0
    cp_s = 1760.0
  []

  # Mixtures.
  [triso]
    type = CompositeSolidProperties
    materials = '  kernel     buffer        ipyc        sic        opyc    '
    fractions = '0.122819817 0.267788699 0.170012025 0.18412303 0.255256428' # volume fractions.
    k_mixing = 'series'
  []
  [pebble_fuel]
    type = CompositeSolidProperties
    materials = 'triso gmatrix'
    fractions = '0.220003 0.779997' # volume fractions.
    k_mixing = 'chiew'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Boundary Conditions

The Boundary Conditions block specifies boundary conditions when solving the equations involving the Variables and Kernels which must be constrained. Here a PostprocessorDirichletBC is defined for the pebble_surface boundary and is set to the postprocessor which reads in the T_surface variable value. Similarly the T_triso variable is constrained by a Dirichlet boundary condition read in by the pebble_fuel_average_temp postprocessor at the triso_surface boundary.

[BCs]
  [pebble_surface_temp]
    type = PostprocessorDirichletBC
    variable = T_pebble
    postprocessor = T_surface
    boundary = 'pebble_surface'
  []
  [triso_surface_temp]
    type = PostprocessorDirichletBC
    variable = T_triso
    postprocessor = pebble_fuel_average_temp
    boundary = 'triso_surface'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Executioner

The Executioner block defines how the non-linear system will be solved. Here the solve is set to steady-state and the non-linear relative and absolute tolerances are set.

[Executioner]
  type = Steady
  petsc_options_iname = '-pc_type -pc_hypre_type'
  petsc_options_value = 'hypre boomeramg'
  line_search = 'l2'

  # Automatic scaling.
  automatic_scaling = true

  # Linear/nonlinear iterations.
  nl_rel_tol = 1e-40
  nl_abs_tol = 1e-5
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Postprocessors

Nearing the end of the model, the Postprocessors block allows for specific calculations on specific variables or auxiliary variables in the model or from other applications to be calculated and then used in the solution of this sub-application.

Here ElementIntegralVariablePostprocessor is used to sum up certain fields over the entire problem domain including the power densities of the pebbles in the core, and shell, as well as the triso power densities.

Next there are some Receivers which act similar to transfers where they read in variables from Griffin for the pebble_power_density and the T_surface. There are also postprocessors used for the Triso-Pebble communication including pebble_fuel_average_temp and for this sub-app heat conduction model back to the Griffin-Depletion model via T_mod and T_fuel.

[Postprocessors]
  [pebble_int_power]
    type = ElementIntegralVariablePostprocessor
    variable = pebble_power_density
    block = 'pcore pfuel pshell'
    execute_on = 'TIMESTEP_END'
  []
  [pfuel_int_power]
    type = ElementIntegralVariablePostprocessor
    variable = pfuel_power_density
    block = 'pfuel'
    execute_on = 'TIMESTEP_END'
  []
  [triso_int_power]
    type = ElementIntegralVariablePostprocessor
    variable = kernel_power_density
    block = 'kernel'
    execute_on = 'TIMESTEP_END'
  []
  [triso_total_power]
    type = ParsedPostprocessor
    expression = 'triso_int_power * ${triso_number}'
    pp_names = 'triso_int_power'
    execute_on = 'TIMESTEP_END'
  []

  # FROM Griffin
  [pebble_power_density_pp]
    type = Receiver
    default = ${initial_power_density}
  []
  [T_surface]
    type = Receiver
    default = ${initial_temperature}
  []

  # Pebble TRISO comunication.
  [pebble_fuel_average_temp]
    type = ElementAverageValue
    variable = T_pebble
    block = 'pfuel'
    execute_on = 'INITIAL LINEAR TIMESTEP_END'
  []

  # TO Griffin.
  [T_mod]
    type = ElementAverageValue
    variable = T_pebble
    block = 'pcore pfuel pshell'
    execute_on = 'INITIAL TIMESTEP_END'
  []
  [T_fuel]
    type = ElementAverageValue
    variable = T_triso
    block = 'kernel'
    execute_on = 'INITIAL TIMESTEP_END'
  []
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)

Outputs

Lastly, the outputs block is specified, and here we don't want to output results since we will just feed the information from this heat conduction sub-app to Griffin.

[Outputs]
  exodus = false
  csv = false
  print_linear_converged_reason = false
  print_linear_residuals = false
  print_nonlinear_converged_reason = false
  console = false # turn this to true or comment it out to turn on console output
[]
(pbfhr/gFHR/steady/gFHR_pebble_triso_ss.i)