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)