Steady-state mixing model Validation

The PSBT 5x5 benchmark is an international benchmark developed by the Organisation for Economic Co-operation and Development (OECD), the Nuclear Regulatory Commission (NRC), and the Nuclear Power Engineering Center (NUPEC) Rubin et al. (2012). In this work we utilize the steady-state mixing test, detailed in volume III of the PSBT benchmark Rubin et al. (2012). The purpose of this test is to validate the mixing models of the participating codes. The participating codes predict the fluid temperature distribution at the exit of the heated section of a pin bundle assembly and compare it with the experimental values provided by the benchmark. Here we will present as an example case 01-5237, as well as the average error for all the cases run Kyriakopoulos et al. (2022). The pin bundle geometry description is presented in Table below.

PSBT pin bundle specifications
ItemValue
Rods array
Number of heated pins
Heated pin outer diameter (mm)
Pitch (mm)
Axial heated length (mm)
Flow channel inner width (mm)
Axial power shapeUniform
Number of mixing vaned (MV) spacers
Number of non mixing vaned (NMV) spacers
Number of simple spacers (SS)
MV spacer location (mm)
NMV spacer location (mm)
Simple spacer location (mm)

The pin bundle has a radial power profile in which the right side of the assembly is under-heated. The radial power profile is shown in Figure 1. The pins on the left side transfer 100% of available pin power to the fluid, while the pins on the right transfer 25%. This causes an uneven temperature distribution at the exit of the assembly.

Figure 1: Radial pin power profile

Note that the turbulent mixing parameter used for all the cases was: , which differs significantly from the default value of . The reason behind the need to adjust to a much higher value, has to do with the geometry of the PSBT facility. Note that there is a preferential mixing direction of the experimental results in the diagonal direction (towards one corner of the assembly), exhibited in Figure 2, while the code results for both values of are symmetric as expected. The experimental results exhibit a non symmetric distribution that we cannot capture with a constant value of beta. There is a temperature gradient towards the corner due to an additional mixing effect, which may reduce the exit temperature differences between the two regions (hot/cold, left/right) and finally increase the optimum in comparison with the case of no temperature gradient in each region.

Figure 2: Exit temperature distribution for case 01-5237

The reason for the additional mixing effect is thought to be the special mixing vanes that the NUPEC facility incorporates in its design. Specifically, the temperature gradient appearing in the experimental data was attributed to the thermal mixing in the diagonal direction of the test bundle, which may be caused by the alignment of mixing vanes mounted in the spacer grids Hwang et al. (2012). This is the physical reason behind the need to use an increased value of .

This illustrates the fact that modeling parameters like should ideally be calibrated for specific geometries and in no way can they be applied generally without proper justification. Nevertheless our results show that, provided we choose the optimum parameters adjusted for the specific geometries, we can accurately predict the exit temperatures. Figure Figure 3 presents the cumulative mean absolute error in the exit temperature in comparison with other subchannel codes Rubin et al. (2012). We note that for the temperature mixing test, our code performs adequately in comparison to the other codes. Our mean absolute error is calculated to be which places us in 5th place out of the nine codes.

Figure 3: Mean absolute error in predicted exit temperature

Input file for case: 01-5237

# M. Avramova et al., 2012,
# OECD/NRC Benchmark Based on NUPEC PWR
# Sub-channel and Bundle Tests (PSBT). Volume III: Departure from Nucleate Boiling
# Case:01-5237
T_in = 502.35
# [1e+6 kg/m^2-hour] turns into kg/m^2-sec
mass_flux_in = ${fparse 1e+6 * 16.95 / 3600.}
P_out = 14.72e6 # Pa
[QuadSubChannelMesh]
  [sub_channel]
    type = SCMQuadSubChannelMeshGenerator
    nx = 6
    ny = 6
    n_cells = 20
    pitch = 0.0126
    pin_diameter = 0.00950
    gap = 0.00095
    heated_length = 3.658
    spacer_z = '0.0 0.229 0.457 0.686 0.914 1.143 1.372 1.600 1.829 2.057 2.286 2.515 2.743 2.972 3.200 3.429'
    spacer_k = '0.7 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4'
  []

  [fuel_pins]
    type = SCMQuadPinMeshGenerator
    input = sub_channel
    nx = 6
    ny = 6
    n_cells = 20
    pitch = 0.0126
    heated_length = 3.658
  []
[]

[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
  [mdot]
    block = sub_channel
  []
  [SumWij]
    block = sub_channel
  []
  [P]
    block = sub_channel
  []
  [DP]
    block = sub_channel
  []
  [h]
    block = sub_channel
  []
  [T]
    block = sub_channel
  []
  [Tpin]
    block = fuel_pins
  []
  [rho]
    block = sub_channel
  []
  [mu]
    block = sub_channel
  []
  [S]
    block = sub_channel
  []
  [w_perim]
    block = sub_channel
  []
  [q_prime]
    block = fuel_pins
  []
[]

[FluidProperties<<<{"href": "../../../syntax/FluidProperties/index.html"}>>>]
  [water]
    type = Water97FluidProperties<<<{"description": "Fluid properties for water and steam (H2O) using IAPWS-IF97", "href": "../../../source/fluidproperties/Water97FluidProperties.html"}>>>
  []
[]

[SubChannel]
  type = QuadSubChannel1PhaseProblem
  fp = water
  n_blocks = 1
  beta = 0.08
  CT = 2.6
  compute_density = true
  compute_viscosity = true
  compute_power = true
  P_out = ${P_out}
  implicit = true
  segregated = false
  staggered_pressure = false
  monolithic_thermal = false
  verbose_subchannel = true
  interpolation_scheme = exponential
  deformation = true # this flag allows the re-calculation of subchannel geometric parameters based on the dpin value
[]

[ICs<<<{"href": "../../../syntax/ICs/index.html"}>>>]
  [S_IC]
    type = SCMQuadFlowAreaIC<<<{"description": "Computes subchannel flow area in the square lattice subchannel arrangement", "href": "../../../source/ics/SCMQuadFlowAreaIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = S
  []

  [w_perim_IC]
    type = SCMQuadWettedPerimIC<<<{"description": "Computes wetted perimeter of subchannels in a square lattice arrangement", "href": "../../../source/ics/SCMQuadWettedPerimIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = w_perim
  []

  [q_prime_IC]
    type = SCMQuadPowerIC<<<{"description": "Computes axial heat rate (W/m) that goes into the subchannel cells or is assigned to the fuel pins, in a square lattice arrangement", "href": "../../../source/ics/SCMQuadPowerIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = q_prime
    power<<<{"description": "The postprocessor or Real to use for the total power of the subassembly [W]"}>>> = 3.23e6 # W
    filename<<<{"description": "name of radial power profile .txt file (should be a single column) [UnitLess]."}>>> = "power_profile.txt"
  []

  [T_ic]
    type = ConstantIC<<<{"description": "Sets a constant field value.", "href": "../../../source/ics/ConstantIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = T
    value<<<{"description": "The value to be set in IC"}>>> = ${T_in}
  []

  [Dpin_ic]
    type = ConstantIC<<<{"description": "Sets a constant field value.", "href": "../../../source/ics/ConstantIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = Dpin
    value<<<{"description": "The value to be set in IC"}>>> = 0.00950
  []

  [P_ic]
    type = ConstantIC<<<{"description": "Sets a constant field value.", "href": "../../../source/ics/ConstantIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = P
    value<<<{"description": "The value to be set in IC"}>>> = 0.0
  []

  [DP_ic]
    type = ConstantIC<<<{"description": "Sets a constant field value.", "href": "../../../source/ics/ConstantIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = DP
    value<<<{"description": "The value to be set in IC"}>>> = 0.0
  []

  [Viscosity_ic]
    type = ViscosityIC<<<{"description": "Computes viscosity from specified pressure and temperature", "href": "../../../source/ics/ViscosityIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = mu
    p<<<{"description": "Pressure [Pa]"}>>> = ${P_out}
    T<<<{"description": "Temperature [K]"}>>> = T
    fp<<<{"description": "Fluid properties user object name"}>>> = water
  []

  [rho_ic]
    type = RhoFromPressureTemperatureIC<<<{"description": "Computes the density from pressure and temperature.", "href": "../../../source/ics/RhoFromPressureTemperatureIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = rho
    p<<<{"description": "The pressure [Pa]"}>>> = ${P_out}
    T<<<{"description": "The temperature [K]"}>>> = T
    fp<<<{"description": "The name of fluid properties user object."}>>> = water
  []

  [h_ic]
    type = SpecificEnthalpyFromPressureTemperatureIC<<<{"description": "Computes the specific enthalpy from pressure and temperature.", "href": "../../../source/ics/SpecificEnthalpyFromPressureTemperatureIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = h
    p<<<{"description": "The pressure [Pa]"}>>> = ${P_out}
    T<<<{"description": "The temperature [K]"}>>> = T
    fp<<<{"description": "The name of fluid properties user object."}>>> = water
  []

  [mdot_ic]
    type = ConstantIC<<<{"description": "Sets a constant field value.", "href": "../../../source/ics/ConstantIC.html"}>>>
    variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = mdot
    value<<<{"description": "The value to be set in IC"}>>> = 0.0
  []
[]

[AuxKernels<<<{"href": "../../../syntax/AuxKernels/index.html"}>>>]
  [T_in_bc]
    type = ConstantAux<<<{"description": "Creates a constant field in the domain.", "href": "../../../source/auxkernels/ConstantAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = T
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inlet
    value<<<{"description": "Some constant value that can be read from the input file"}>>> = ${T_in}
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
  []
  [mdot_in_bc]
    type = SCMMassFlowRateAux<<<{"description": "Computes mass flow rate from specified mass flux and subchannel cross-sectional area. Can read either PostprocessorValue or Real", "href": "../../../source/auxkernels/SCMMassFlowRateAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = mdot
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inlet
    area<<<{"description": "Cross sectional area [m^2]"}>>> = S
    mass_flux<<<{"description": "The postprocessor or Real to use for the value of mass_flux"}>>> = ${mass_flux_in}
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
  []
[]

[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
  [Temp_Out_MATRIX]
    type = QuadSubChannelNormalSliceValues<<<{"description": "Prints out a user selected value at a user selected axial height in a matrix format to be used for post-processing", "href": "../../../source/outputs/QuadSubChannelNormalSliceValues.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = final
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = "Temp_Out.txt"
    height<<<{"description": "Axial location of normal slice [m]"}>>> = 3.658
  []
  [mdot_Out_MATRIX]
    type = QuadSubChannelNormalSliceValues<<<{"description": "Prints out a user selected value at a user selected axial height in a matrix format to be used for post-processing", "href": "../../../source/outputs/QuadSubChannelNormalSliceValues.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = mdot
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = final
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = "mdot_Out.txt"
    height<<<{"description": "Axial location of normal slice [m]"}>>> = 3.658
  []
  [mdot_In_MATRIX]
    type = QuadSubChannelNormalSliceValues<<<{"description": "Prints out a user selected value at a user selected axial height in a matrix format to be used for post-processing", "href": "../../../source/outputs/QuadSubChannelNormalSliceValues.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = mdot
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = final
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = "mdot_In.txt"
    height<<<{"description": "Axial location of normal slice [m]"}>>> = 0.0
  []
[]

[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
  [total_pressure_drop]
    type = SubChannelDelta<<<{"description": "Calculates an absolute overall inlet-mass-flow-rate weighted difference, of a chosen variable, for the whole subchannel assembly, from inlet to outlet", "href": "../../../source/postprocessors/SubChannelDelta.html"}>>>
    variable<<<{"description": "Variable you want the delta of"}>>> = P
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
  []
  [T1]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 0
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [T2]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 7
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [T3]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 14
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [T4]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 21
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [T5]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 28
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [T6]
    type = SubChannelPointValue<<<{"description": "Prints out a user selected value of a specified subchannel at a user selected axial height", "href": "../../../source/postprocessors/SubChannelPointValue.html"}>>>
    variable<<<{"description": "Variable you want the value of"}>>> = T
    index<<<{"description": "Index of subchannel"}>>> = 35
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "timestep_end"
    height<<<{"description": "Axial location of point [m]"}>>> = 3.658
  []
  [PinTemp]
    type = SCMPinSurfaceTemperature<<<{"description": "Returns the surface temperature of a specific fuel pin at a user defined height. Applies a linear reconstruction for the temperature.", "href": "../../../source/postprocessors/SCMPinSurfaceTemperature.html"}>>>
    index<<<{"description": "Index of fuel pin"}>>> = 10
    height<<<{"description": "Axial location on fuel pin [m]"}>>> = 3.658
  []
[]

[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
  type = Steady
[]
(modules/subchannel/validation/psbt/psbt_ss/psbt.i)

References

  1. Dae-Hyun Hwang, Seong-Jin Kim, Kyong-Won Seo, and Hyuk Kwon. Accuracy and uncertainty analysis of psbt benchmark exercises using a subchannel code matra. Science and Technology of Nuclear Installations, 2012.[BibTeX]
  2. Vasileios Kyriakopoulos, Mauricio E Tano, and Jean C Ragusa. Development of a single-phase, transient, subchannel code, within the moose multi-physics computational framework. Energies, 15(11):3948, 2022.[BibTeX]
  3. A. Rubin, A. Schoedel, M. Avramova, H. Utsuno, S. Bajorek, and A. Velazquez-Lozada. OECD/NRC Benchmark Based on NUPEC PWR Sub-channel and Bundle Tests (PSBT). Volume I: Experimental Database and Final Problem Specifications. OECD, NUCLEAR ENERGY AGENCY, 2012.[BibTeX]
  4. A. Rubin, A. Schoedel, M. Avramova, H. Utsuno, S. Bajorek, and A. Velazquez-Lozada. OECD/NRC Benchmark Based on NUPEC PWR Sub-channel and Bundle Tests (PSBT). Volume III: Departure from Nucleate Boiling. OECD, NUCLEAR ENERGY AGENCY, 2012.[BibTeX]