GPBR200 Multiphysics Coupling

Contact: Zachary M. Prince, [email protected]

Model link: GPBR200 Coupled Model

Here the input for the fully coupled GPBR200 model is presented. This combines the physics presented in the neutronics model, thermal hydraulics model, and pebble thermomechanics model.

MultiApp Structure

Figure 1 shows the MultiApp structure employed for the multiphysics, along with the transfers of coupled fields (Gaston et al., 2015). The neutronics-depletion input serves as the main application, transferring power density to the thermal hydraulics and pebble heat conduction applications. The solid temperature is received from the TH application to evaluate cross sections in the reflector regions and transferred to the pebble applications for the pebble surface boundary condition. Finally, the fuel and moderator temperatures are received from the pebble applications for cross-section evaluation in the pebble bed.

Figure 1: MultiApp structure of GPBR200 equilibrium core from Prince et al. (2024).

The order of operations for a given fixed-point iteration is:

  1. Pebble heat conduction solves

  2. Streamline depletion solve

  3. Neutronics eigenvalue solve

  4. Thermal hydraulics solve

Input Modifications

This section focuses on the key differences in the coupled inputs from the stand-alone physics inputs previously presented.

Pebble Heat Conduction Input

There are no meaningful modifications to the pebble heat conduction input, the only adjustment is in the Outputs to reduce the amount of screen output.

 @@ -1,3 +1,3 @@
 [Outputs]
-  csv = true
+  console = false
 []
(- htgr/gpbr200/pebble_thermomechanics/gpbr200_ss_bsht_pebble_triso.i)
(+ htgr/gpbr200/coupling/gpbr200_ss_bsht_pebble_triso.i)

Thermal Hydraulics Input

The only modification to the thermal hydraulics input is the removal of the power density auxiliary kernel and the supporting volume postprocessor.

 @@ -1,86 +1,76 @@
 [AuxKernels]
-  [power_density]
-    type = ParsedAux
-    variable = power_density
-    expression = '${total_power} / volume'
-    functor_names = 'volume'
-    execute_on = 'INITIAL'
-  []
   [vel_x]
     type = InterstitialFunctorAux
     variable = vel_x
     superficial_variable = superficial_vel_x
     phase = fluid
     porosity = porosity
   []
   [vel_y]
     type = InterstitialFunctorAux
     variable = vel_y
     superficial_variable = superficial_vel_y
     phase = fluid
     porosity = porosity
   []
 []
 
 [Postprocessors]
   # General checks.
   [pp00_inlet_mfr]
     type = VolumetricFlowRate
     vel_x = 'superficial_vel_x'
     vel_y = 'superficial_vel_y'
     advected_quantity = rho
     boundary = inlet
     rhie_chow_user_object = pins_rhie_chow_interpolator
     execute_on = 'INITIAL TIMESTEP_END'
   []
   [pp01_outlet_mfr]
     type = VolumetricFlowRate
     vel_x = 'superficial_vel_x'
     vel_y = 'superficial_vel_y'
     advected_quantity = rho
     boundary = outlet
     rhie_chow_user_object = pins_rhie_chow_interpolator
     execute_on = 'INITIAL TIMESTEP_END'
   []
   [pp02_inlet_pressure]
     type = SideAverageValue
     variable = pressure
     boundary = 'inlet'
     execute_on = 'INITIAL TIMESTEP_END'
   []
   [pp03_total_power]
     type = ElementIntegralVariablePostprocessor
     variable = power_density
     block = '${heated_blocks}'
     execute_on = 'INITIAL TIMESTEP_END'
   []
   [pp04_T_oulet]
     type = SideAverageValue # Fix it with weighted thing
     variable = T_fluid
     boundary = 'outlet'
   []
   [pp05_rpv_temp]
     type = ElementAverageValue
     variable = T_solid
     block = '${rpv_blocks}'
   []
   [pp06_rpv_temp_max]
     type = ElementExtremeValue
     variable = T_solid
     block = '${rpv_blocks}'
   []
-
-  [volume]
-    type = VolumePostprocessor
-    block = '${heated_blocks}'
-    force_preaux = true
-    execute_on = 'INITIAL'
-    outputs = none
-  []
 []
 
 [Outputs]
   exodus = true
   csv = true
   execute_on = 'FINAL'
+
+  # Reduce console output
+  print_linear_residuals = false
+  print_linear_converged_reason = false
+  print_nonlinear_converged_reason = false
 []
(- htgr/gpbr200/core_thermal_hydraulics/gpbr200_ss_phth_reactor.i)
(+ htgr/gpbr200/coupling/gpbr200_ss_phth_reactor.i)

Neutronics-Depletion Input

The majority of the input modifications are in the neutronics input, which serves as the main application; defining the MultiApps and Transfers.

First, the thermal hydraulics application is defined, with transfers for the power density to the sub-application and solid temperature from the application. In order to speed up steady-state convergence of the pseudo-transient simulation, keep_solution_during_restore = true is specified.

[MultiApps]
  [pronghorn_th]
    type = FullSolveMultiApp
    input_files = gpbr200_ss_phth_reactor.i
    keep_solution_during_restore = true
    execute_on = 'TIMESTEP_END'
  []
[]

[Transfers]
  [to_pronghorn_total_power_density]
    type = MultiAppCopyTransfer
    to_multi_app = pronghorn_th
    source_variable = total_power_density
    variable = power_density
  []

  [from_pronghorn_Tsolid]
    type = MultiAppCopyTransfer
    from_multi_app = pronghorn_th
    source_variable = T_solid
    variable = T_solid
  []
[]
(htgr/gpbr200/coupling/gpbr200_ss_gfnk_reactor.i)

Next, the pebble heat conduction MultiApp is defined. A Positions object is defined to specify the location of the applications. For this model an application is defined for each cell in the pebble bed region. This position object is repeated for each pebble burnup group, since each group has a unique power density. The result is a total of applications. For consistency in the TRISO geometry and pebble composition, the kernel radius and filling factor are transferred at application creation via cli_args. The solid temperature is transferred to the postprocessor of the sub-applications, based on their position. The power density is similarly transferred, except the partial_power_density is an array variable where each component corresponds to a burnup group. Finally, the fuel and moderator temperature are transferred from the sub-applications, again based on their position and burnup group index.

[Positions]
  [element]
    type = ElementCentroidPositions
    block = ${fuel_blocks}
  []
[]

[MultiApps]
  [pebble_conduction]
    type = FullSolveMultiApp
    input_files = gpbr200_ss_bsht_pebble_triso.i
    no_restore = true
    positions_objects = 'element element element element element
                         element element element element element
                         element element element'
    cli_args = 'kernel_radius=${kernel_radius};filling_factor=${filling_factor}'
    execute_on = TIMESTEP_BEGIN
  []
[]

[Transfers]
  [to_pebble_conduction_Tsolid]
    type = MultiAppVariableValueSamplePostprocessorTransfer
    to_multi_app = pebble_conduction
    postprocessor = pebble_surface_temp
    source_variable = T_solid
  []

  [to_pebble_conduction_power_density]
    type = MultiAppVariableValueSamplePostprocessorTransfer
    to_multi_app = pebble_conduction
    postprocessor = porous_media_power_density
    source_variable = partial_power_density
    map_array_variable_components_to_child_apps = true
  []

  [from_pebble_conduction_Tfuel]
    type = MultiAppVariableValueSamplePostprocessorTransfer
    from_multi_app = pebble_conduction
    postprocessor = fuel_average_temp
    source_variable = triso_temperature
    map_array_variable_components_to_child_apps = true
  []

  [from_pebble_conduction_Tmod]
    type = MultiAppVariableValueSamplePostprocessorTransfer
    from_multi_app = pebble_conduction
    postprocessor = moderator_average_temp
    source_variable = graphite_temperature
    map_array_variable_components_to_child_apps = true
  []
[]
(htgr/gpbr200/coupling/gpbr200_ss_gfnk_reactor.i)

For easier visualization, several auxiliary variables are defined representing the max power density, fuel temperature, and moderator temperature across burnup groups.

[AuxVariables]
  [Tfuel_max]
    family = MONOMIAL
    order = CONSTANT
    block = '${fuel_blocks}'
  []

  [Tmod_max]
    family = MONOMIAL
    order = CONSTANT
    block = '${fuel_blocks}'
  []

  [ppd_max]
    family = MONOMIAL
    order = CONSTANT
    block = '${fuel_blocks}'
  []
[]

[AuxKernels]
  # Max temperatures and power
  [Tfuel_max_aux]
    type = ArrayVarReductionAux
    variable = Tfuel_max
    array_variable = triso_temperature
    value_type = max
    execute_on = TIMESTEP_END
  []
  [Tmod_max_aux]
    type = ArrayVarReductionAux
    variable = Tmod_max
    array_variable = graphite_temperature
    value_type = max
    execute_on = TIMESTEP_END
  []
  [ppd_max_aux]
    type = ArrayVarReductionAux
    variable = ppd_max
    array_variable = partial_power_density
    value_type = max
    execute_on = TIMESTEP_END
  []
[]
(htgr/gpbr200/coupling/gpbr200_ss_gfnk_reactor.i)

Results

The input must be run with an executable including Griffin, Pronghorn, and Bison, i.e. blue-crab-opt:


mpiexec -n 16 blue_crab-opt -i gpbr200_ss_gfnk_reactor.i

The resulting eigenvalue is approximately 1.00125. Figure 2 shows the resulting power density, fast scalar flux, and thermal flux. Figure 3 shows the resulting fluid velocity, pressure, temperature, and solid temperature. Figure 4 shows the resulting max power density, fuel temperature, and moderator temperature across burnup groups.

Figure 2: GPBR200 neutronics selected field variables

Figure 3: GPBR200 fluids selected field variables

Figure 4: GPBR200 pebble heat conduction selected field variables

The use of 16 processors in the command listing is somewhat arbitrary, Table 1 shows the expected scaling performance.

Table 1: Run times for GPBR200 multiphysics simulation with varying number of processors

ProcessorsRun-time (min)
440
826
167
324

References

  1. Derek R Gaston, Cody J Permann, John W Peterson, Andrew E Slaughter, David Andrš, Yaqi Wang, Michael P Short, Danielle M Perez, Michael R Tonks, Javier Ortensi, and others. Physics-based multiscale coupling for full core nuclear reactor simulation. Annals of Nuclear Energy, 84:45–54, 2015.[BibTeX]
  2. Zachary M. Prince, Paolo Balestra, Javier Ortensi, Sebastian Schunert, Olin Calvin, Joshua T. Hanophy, Kun Mo, and Gerhard Strydom. Sensitivity analysis, surrogate modeling, and optimization of pebble-bed reactors considering normal and accident conditions. Nuclear Engineering and Design, 428:113466, 2024. doi:https://doi.org/10.1016/j.nucengdes.2024.113466.[BibTeX]