Pebble heat conduction simulation

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. We sample pebble locations over a coarse mesh using a CentroidMultiApp. There are two kinds of pebbles in the core: graphite pebbles in the outer reflector and fueled pebbles in the active region of the core. In the reflector, each sub-app is a 1D spherical heat conduction simulation.

[MultiApps]
  [graphite_pebble]
    type = CentroidMultiApp
    execute_on = 'TIMESTEP_END'
    input_files = 'ss4_graphite_pebble.i'
    cli_args = 'Outputs/console=false'
    output_in_position = true
    block = '4'
    # Use a lighter application for performance
    # app_type = HeatConductionApp
    # library_path = "/Users/giudgl-mac/projects/moose/modules/heat_conduction/lib"
    max_procs_per_app = 1
  []
[]
(pbfhr/mark1/steady/ss3_coarse_pebble_mesh.i)
commentnote

The app_type may be specified to use a smaller, faster application to run a simulation. For example, a HeatConductionApp is faster to generate than a PronghornApp, itself faster than a BlueCrabApp. Depending on how the computing environment is set up, the library_path may need to be specified to indicate where to load this smaller application.

As is the case with the graphite pebbles, the fuel pebbles are treated using a sub-app; fuel pebbles are modeled with a 1-D multiscale heat conduction model.

[MultiApps]
  [fuel_pebble]
    type = CentroidMultiApp
    execute_on = 'TIMESTEP_END'
    input_files = 'ss4_fuel_pebble.i'
    cli_args = 'Outputs/console=false'
    output_in_position = true
    block = '3'
    # Use a lighter application for performance
    # app_type = PronghornApp
    # library_path = "/Users/giudgl-mac/projects/pronghorn/lib"
    max_procs_per_app = 1
  []
[]
(pbfhr/mark1/steady/ss3_coarse_pebble_mesh.i)

MultiAppVariableValueSamplePostprocessorTransfer and MultiAppVariableValueSampleTransfer allow us to sample the temperature of the solid phase and the power density at these locations and populate a postprocessor / a variable respectively in the sub-app.

[Transfers]
  [fuel_matrix_heat_source]
    type = MultiAppVariableValueSampleTransfer
    to_multi_app = fuel_pebble
    source_variable = power_distribution
    variable = fuel_matrix_heat_source
  []

  [pebble_surface_temp_1]
    type = MultiAppVariableValueSamplePostprocessorTransfer
    to_multi_app = fuel_pebble
    source_variable = temp_solid
    postprocessor = pebble_surface_T
  []
[]
(pbfhr/mark1/steady/ss3_coarse_pebble_mesh.i)

MultiAppPostprocessorInterpolationTransfer can interpolate from postprocessors in each of subapp at their specified location into auxiliary variables in the macroscale simulation. We use that to obtain the distribution throughout the core of the UO2, graphite matrix and outer shell temperatures.

This can help the reactor analyst examine the most challenging regions in terms of fuel performance. They may also leverage the Adaptivity system to automatically refine the mesh, and therefore spawn more pebble simulations, in the regions of interest. Finally, having access to the temperature of each solid phase in the pebble allows for more accurate self-shielding calculations, for group cross section generation.

[Transfers]
  [max_T_UO2]
    type = MultiAppPostprocessorInterpolationTransfer
    from_multi_app = fuel_pebble
    postprocessor = max_T_UO2
    variable = max_T_UO2
  []

  [average_T_UO2]
    type = MultiAppPostprocessorInterpolationTransfer
    from_multi_app = fuel_pebble
    postprocessor = average_T_UO2
    variable = average_T_UO2
  []

  [average_T_matrix]
    type = MultiAppPostprocessorInterpolationTransfer
    from_multi_app = fuel_pebble
    postprocessor = average_T_matrix
    variable = average_T_matrix
  []

  [average_T_graphite]
    type = MultiAppPostprocessorInterpolationTransfer
    from_multi_app = graphite_pebble
    postprocessor = average_T
    variable = average_T_graphite
  []

  [average_T_shell]
    type = MultiAppPostprocessorInterpolationTransfer
    from_multi_app = fuel_pebble
    postprocessor = average_T_shell
    variable = average_T_shell
  []
[]
(pbfhr/mark1/steady/ss3_coarse_pebble_mesh.i)

Reflector pebble heat conduction

Reflector pebbles are modeled as homogeneous graphite spherical pebbles. We represent them with a 1D mesh in spherical coordinates.

[Mesh]
  coord_type = 'RSPHERICAL'
  type = GeneratedMesh
  dim = 1
  xmin = 0.0
  xmax = '${fparse pebble_diameter / 2}'
  nx = 20
[]
(pbfhr/mark1/steady/ss4_graphite_pebble.i)

The heat conduction equation with no source is described with a time derivative kernel and a diffusion kernel, specialized as HeatConduction kernels in the heat conduction module.

[Kernels]
  # inactive = 'time'
  [time]
    type = ADHeatConductionTimeDerivative
    variable = T
    specific_heat = 'cp_s'
    density_name = 'rho_s'
  []
  [diffusion]
    type = ADHeatConduction
    variable = T
    thermal_conductivity = 'k_s'
  []
[]
(pbfhr/mark1/steady/ss4_graphite_pebble.i)

The center of this spherical pebble is naturally a zero flux symmetry boundary condition. The temperature at the outer surface of the pebble is the temperature of the solid phase. This temperature is received from the main-app in a Receiver postprocessor. It is then used by a PostprocessorDirichletBC to set the boundary condition.

[Postprocessors]
  [pebble_surface_T]
    type = Receiver
  []
[]

[BCs]
  [right]
    type = PostprocessorDirichletBC
    variable = T
    postprocessor = pebble_surface_T
    boundary = 'right'
  []
[]
(pbfhr/mark1/steady/ss4_graphite_pebble.i)
commentnote

The pebble conduction simulations are led using a finite element discretization. While the kernels also exist for the finite volume discretization, the finite element discretization will remain for future iterations of the model using Bison.

Fueled pebble heat conduction multiscale simulation

The fueled pebble is modeled using a similar approach, except the sphere is not uniform. Its center is a graphite core, surrounded by a fuel matrix then a graphite shell. We still represent the pebble as a 1D spherical system, with each zone defined as a different subdomain.

[Mesh]
  coord_type = 'RSPHERICAL'
  [mesh]
    type = CartesianMeshGenerator
    dim = 1
    dx = '${rcore} ${fparse rfuel_matrix - rcore} ${fparse pebble_diameter/2 -
                                                    rfuel_matrix} '
    ix = '15 20 10'
    subdomain_id = '0 1 2'
  []

  [left]
    type = SideSetsAroundSubdomainGenerator
    block = 1
    new_boundary = 'fm_left'
    fixed_normal = true
    normal = '-1 0 0'
    input = mesh
  []
  [right]
    type = SideSetsAroundSubdomainGenerator
    block = 1
    new_boundary = 'fm_right'
    fixed_normal = true
    normal = '1 0 0'
    input = left
  []
[]
(pbfhr/mark1/steady/ss4_fuel_pebble.i)

We use a Heat Source Decomposition approach (Novak et al., 2021) to solve the multiscale heat conduction problem with sources. The heat source is decomposed in its mean and fluctuation (of zero average) terms, corresponding to the meso- and micro-scale. This approach is a decomposition of the heat conduction equations.

The mesoscale equation is written in terms of the mesoscale temperature, which is a slowly varying long-wavelength thermal solution of the problem with the average heat source and averaged (mixed) thermal properties.

The conduction equation on the microscale, the TRISO particles here, is similarly written,

In the microscale, we use the actual material properties of the materials involved, since there is no homogenization of the problem involved. The solid phase temperature is then the superposition of the mesoscale and microscale solutions.

where is the local coordinate and i is the index of the particles or microscale media.

In the fuel matrix, there is heat generation from the fission reactions. We solve the mesoscale conduction equation with the mean heat source.

[Kernels]
  [time]
    type = ADHeatConductionTimeDerivative
    variable = T_fuel_matrix
    specific_heat = 'cp_s'
    density_name = 'rho_s'
  []

  [diffusion]
    type = ADHeatConduction
    variable = T_fuel_matrix
    thermal_conductivity = 'k_s'
  []

  [heat_source]
    type = HeatSrc
    variable = T_fuel_matrix
    heat_source = fuel_matrix_heat_source
    scaling_factor = '${fparse 1.0/fuel_matrix_phase_fraction}'
  []
[]
(pbfhr/mark1/steady/ss4_fuel_pebble.i)

Since there is no fuel in the core and the shell, and we do not model non-fission heating, there is no heat source in those subdomains.

[Kernels]
  [time2]
    type = ADHeatConductionTimeDerivative
    variable = T_shell
    specific_heat = 'cp_s'
    density_name = 'rho_s'
  []

  [diffusion2]
    type = ADHeatConduction
    variable = T_shell
    thermal_conductivity = 'k_s'
  []
[]
(pbfhr/mark1/steady/ss4_fuel_pebble.i)

The fuel matrix temperature and the graphite temperatures match on their interfaces. We use an interface kernel to impose the equality conditions on both sides of the fuel matrix.

where is the outer boundary of the microscale domain, which will be detailed further in the next section. is obtained from the TRISO scale calculation.

[InterfaceKernels]
  [diffusion]
    type = HeatDiffusionInterface
    variable = T_fuel_matrix
    neighbor_var = T_shell
    boundary = 'fm_left fm_right'
    k = 'k_s'
    k_neighbor = 'k_s'
  []
[]
(pbfhr/mark1/steady/ss4_fuel_pebble.i)

The material definitions, and the mixing of material properties from different components of a phase, is covered in the macroscale thermal-hydraulics simulation input.

We solve the microscale equation in the fuel matrix with a separate simulation, using the MultiApp system. We pass the heat source to the microscale simulation, and receive the outer surface temperature of the microscale particle. The maximum and average temperatures reached in the microscale simulations are also passed for postprocessing purposes.

[MultiApps]
  [particle]
    type = TransientMultiApp
    execute_on = 'TIMESTEP_BEGIN'
    input_files = 'ss5_fuel_matrix.i'
    cli_args = 'Outputs/console=false'
  []
[]
[Transfers]
  [particle_heat_source]
    type = MultiAppVariableValueSampleTransfer
    to_multi_app = particle
    source_variable = fuel_matrix_heat_source
    variable = fuel_matrix_heat_source
  []

  [particle_surface_temp]
    type = MultiAppPostprocessorTransfer
    from_multi_app = particle
    from_postprocessor = surface_T
    to_postprocessor = particle_surface_T
    reduction_type = average
  []
[]
(pbfhr/mark1/steady/ss4_fuel_pebble.i)

We cover the microscale equation treatment in the fuel matrix microscale simulation.

commentnote

INL has recently developed a continuous tracking algorithm to assess pebble depletion as they move through the core. This capability will complement this model in the near future, as it is expended to study core depletion.

References

  1. A.J. Novak, S. Schunert, R.W. Carlsen, P. Balestra, R.N. Slaybaugh, and R.C. Martineau. Multiscale thermal-hydraulic modeling of the pebble bed fluoride-salt-cooled high-temperature reactor. Annals of Nuclear Energy, 2021. doi:10.1016/j.anucene.2020.107968.[BibTeX]