Step 6

We build upon for the previous step, by adding the upper/bottom plenum and the riser. The inlet boundary has moved from the top of the cavity to the bottom of the riser and the outlet changed from the bottom of the bottom reflector to the right side of the bottom plenum.

In contrast to Step 5, the coolant now turns three times on its way from the inlet to the outlet boundary. The fluid flow path starts from the inlet, goes up into the riser, then across the upper plenum and cavity. Next, the flow goes down through the pebble-bed followed by the bottom reflector and bottom plenum. Finally, the flow will go through the outlet.

The porosities of the upper plenum, bottom plenum and riser are , and , respectively.

Updating and Adding Parameters

We adjust top_core to account for the addition of the bottom plenum, add the hydraulic diameter of the riser, riser_Dh, add a Darcy coefficient for the plenums, c_drag, and reduce the thermal_mass_scaling to to accelerate convergence to steady-state. The new set of parameters is given by:

outlet_pressure = 5.84e+6
T_inlet = 533.25
inlet_density = 5.291
pebble_diameter = 0.06
thermal_mass_scaling = 0.1

mass_flow_rate = 64.3
riser_inner_radius = 1.701
riser_outer_radius = 1.871
flow_area = '${fparse pi * (riser_outer_radius * riser_outer_radius - riser_inner_radius * riser_inner_radius)}'
flow_vel = '${fparse mass_flow_rate / flow_area / inlet_density}'

# scales the heat source to integrate to 200 MW
power_fn_scaling = 0.9792628

# drag coefficient in open flow spaces, set to allow convergence
# The convention for friction factors changed
c_drag_old = 10

# moves the heat source around axially to have the peak in the right spot
offset = -1.45819

# the y-coordinate of the top of the core
top_core = 10.9515

# hydraulic diameters (excluding bed where it's pebble diameter)
bottom_reflector_Dh = 0.1
riser_Dh = 0.17
(htgr/generic-pbr-tutorial/step6.i)

The Darcy coefficient in the plenums is usually determined from an experiment or CFD simulations of the plenum regions. These are not available and therefore we set the Darcy coefficient to a number that is large enough to ensure smooth convergence but small enough to not change the solution much.

Geometry

The geometry is changed in [Mesh/cartesian_mesh]. Note, the addition of the plenum and riser blocks.

[Mesh]
  [cartesian_mesh]
    type = CartesianMeshGenerator
    dim = 2

    dx = '0.20 0.20 0.20 0.20 0.20 0.20
          0.010 0.055
          0.13
          0.102 0.102 0.102
          0.17
          0.120'

    ix = '1 1 1 1 1 1
          1 1
          1
          1 1 1
          2
          1
          '

    dy = '0.100 0.100
          0.967
          0.1709 0.1709 0.1709 0.1709 0.1709
          0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465
          0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465 0.4465
          0.458 0.712'

    iy = '1 2
          2
          2 2 1 1 1
          4 1 1 1 1 1 1 1 1 1
          1 1 1 1 1 1 1 1 1 4
          4 2'

    subdomain_id = '4 4 4 4 4 4 4 4 4 4 4 4 4 4
                    4 4 4 4 4 4 4 4 4 4 4 4 4 4
                    6 6 6 6 6 6 6 6 6 4 4 4 7 4
                    3 3 3 3 3 3 4 4 4 4 4 4 7 4
                    3 3 3 3 3 3 4 4 4 4 4 4 7 4
                    3 3 3 3 3 3 4 4 4 4 4 4 7 4
                    3 3 3 3 3 3 4 4 4 4 4 4 7 4
                    3 3 3 3 3 3 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    1 1 1 1 1 1 4 4 4 4 4 4 7 4
                    2 2 2 2 2 2 5 5 5 5 5 5 7 4
                    4 4 4 4 4 4 4 4 4 4 4 4 4 4'
  []
[]
(htgr/generic-pbr-tutorial/step6.i)

The geometry is depicted in Figure 1.

Figure 1: Mesh for Step 6.

The change in geometry requires updating the T_solid variable definition and the block parameter in the NavierStokesFV action.

Materials

We added ADGenericFunctorMaterial in the riser, upper_plenum, and bottom_plenum blocks defining rho_s, cp_s, and kappa_s:

  [graphite_rho_and_cp_riser]
    type = ADGenericFunctorMaterial
    prop_names = 'rho_s  cp_s kappa_s'
    prop_values = '1780.0 1697 ${fparse 0.68 * 26}'
    block = 'riser'
  []

  [graphite_rho_and_cp_plenums]
    type = ADGenericFunctorMaterial
    prop_names = 'rho_s  cp_s kappa_s'
    prop_values = '1780.0 1697 ${fparse 0.8 * 26}'
    block = 'upper_plenum bottom_plenum'
  []
(htgr/generic-pbr-tutorial/step6.i)

The difference to the already existing definition of kappa_s is the different value of .

The drag coefficients in the cavity, upper_plenum and bottom_plenum is set using the c_drag parameter that is used in ADGenericVectorFunctorMaterial objects:

  [drag_cavity]
    type = ADGenericVectorFunctorMaterial
    prop_names = 'Darcy_coefficient Forchheimer_coefficient'
    prop_values = 'c_drag c_drag c_drag 0 0 0'
    block = 'cavity'
  []

  [drag_upper_plenum]
    type = ADGenericVectorFunctorMaterial
    prop_names = 'Darcy_coefficient Forchheimer_coefficient'
    prop_values = 'c_drag c_drag c_drag 0 0 0'
    block = 'upper_plenum'
  []

  [drag_bottom_plenum]
    type = ADGenericVectorFunctorMaterial
    prop_names = 'Darcy_coefficient Forchheimer_coefficient'
    prop_values = 'c_drag c_drag c_drag 0 0 0'
    block = 'bottom_plenum'
  []
(htgr/generic-pbr-tutorial/step6.i)

The drag coefficient in the bottom_reflector and riser is modeled as pressure drop in pipes:

[FunctorMaterials]
  [drag_bottom_reflector_riser]
    type = FunctorChurchillDragCoefficients
    block = 'bottom_reflector riser'
    multipliers = '1e4 1 1e4'
  []
[]
(htgr/generic-pbr-tutorial/step6.i)

The porosity_material is updated to include the porosity in the riser, upper_plenum, and bottom_plenum:

[FunctorMaterials]
  [porosity_material]
    type = ADPiecewiseByBlockFunctorMaterial
    prop_name = porosity
    subdomain_to_prop_value = 'pebble_bed       0.39
                               cavity           1
                               bottom_reflector 0.3
                               side_reflector   0
                               riser            0.32
                               upper_plenum     0.2
                               bottom_plenum    0.2'
  []
[]
(htgr/generic-pbr-tutorial/step6.i)

The characteristic length in the riser is set here:

[FunctorMaterials]
  [characteristic_length]
    type = PiecewiseByBlockFunctorMaterial
    prop_name = characteristic_length
    subdomain_to_prop_value = 'pebble_bed       ${pebble_diameter}
                               bottom_reflector ${bottom_reflector_Dh}
                               riser            ${riser_Dh}'
  []
[]
(htgr/generic-pbr-tutorial/step6.i)

Execution

To run step 6, you simply run:

./pronghorn-opt -i step6.i

Results

In Figure 2, the fluid temperature and flow field are shown. The main difference of Step 6 to the previous steps is that the flow turns multiple times before reaching the outlet. In Figure 3, the solid temperature along with the outline of the fluid domain are shown.

Figure 2: Fluid temperature and flow field for Step 6.

Figure 3: Solid temperature for Step 6.