Friction model Verification
Test Description
This verification problem is the same used in Robert Salko and Avramova (2015). This case presents a problem where the effects of friction are clearly discernible and quantifiable. Momentum transfer in the single-phase case is driven by a lateral pressure gradient and turbulence. By deactivating turbulence in the test model case, momentum transfer can only be the result of lateral pressure imbalance; which for a model with no form losses (spacer grids), can only be driven by unequal frictional losses. Friction loss depends on the hydraulic diameter, so it makes sense to devise a two-channel problem, with channels that have an unequal flow area. The problem geometry is shown in Figure 1.

Figure 1: Friction model verification problem geometry
Channel-2 has a hydraulic diameter that is twice the size of the Channel-1 hydraulic diameter. The length of the model is set to 10 m to allow the flow to completely redistribute within the solution space. The different frictional pressure drops create a lateral pressure gradient that drives flow from the higher resistance channel to the lower resistance channel. Moving up the channels, velocity grows larger in the low-resistance channel, which increases frictional pressure drop in that channel. Simultaneously, velocity decreases in the high-resistance channel, which decreases frictional pressure drop. This continues until the frictional pressure drop is the same in both channels, at which point crossflow ceases. At this point, the channels are said to be in mechanical equilibrium. An analytical solution can be derived for this point of mechanical equilibrium:
Results
The analytical prediction is compared with the code results in Figure 2. The code results converge to the analytical solution at the mechanical equilibrium.

Figure 2: Relative mass flow distribution in the axial direction
Input file
T_in = 473.15 # K
mass_flux_in = 3500 # kg /sec m2
P_out = 155e+5 # Pa
[QuadSubChannelMesh]
[sub_channel]
type = SCMQuadSubChannelMeshGenerator
nx = 1
ny = 2
n_cells = 100
pitch = 0.0126
pin_diameter = 0.00950
gap = 0.00095
heated_length = 10.0
spacer_z = '0.0'
spacer_k = '0.0'
[]
[]
[Functions<<<{"href": "../../../syntax/Functions/index.html"}>>>]
[S_fn]
type = ParsedFunction<<<{"description": "Function created by parsing a string", "href": "../../../source/functions/MooseParsedFunction.html"}>>>
expression<<<{"description": "The user defined function."}>>> = if(y>0.0,0.002,0.001)
[]
[]
[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.006
CT = 0.0
P_tol = 1e-6
T_tol = 1e-6
implicit = false
compute_density = true
compute_viscosity = true
compute_power = true
P_out = ${P_out}
[]
[ICs<<<{"href": "../../../syntax/ICs/index.html"}>>>]
[S_ic]
type = FunctionIC<<<{"description": "An initial condition that uses a normal function of x, y, z to produce values (and optionally gradients) for a field variable.", "href": "../../../source/ics/FunctionIC.html"}>>>
variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = S
function<<<{"description": "The initial condition function."}>>> = S_fn
[]
[w_perim_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."}>>> = w_perim
value<<<{"description": "The value to be set in IC"}>>> = 0.34188034
[]
[q_prime_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."}>>> = q_prime
value<<<{"description": "The value to be set in IC"}>>> = 0.0
[]
[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}
[]
[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"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[mdot_1]
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"}>>> = mdot
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."}>>> = 'initial timestep_end'
height<<<{"description": "Axial location of point [m]"}>>> = 10.0
[]
[mdot_2]
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"}>>> = mdot
index<<<{"description": "Index of subchannel"}>>> = 1
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."}>>> = 'initial timestep_end'
height<<<{"description": "Axial location of point [m]"}>>> = 10.0
[]
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Steady
[]
################################################################################
# A multiapp that projects data to a detailed mesh
################################################################################
[MultiApps<<<{"href": "../../../syntax/MultiApps/index.html"}>>>]
[viz]
type = FullSolveMultiApp<<<{"description": "Performs a complete simulation during each execution.", "href": "../../../source/multiapps/FullSolveMultiApp.html"}>>>
input_files<<<{"description": "The input file for each App. If this parameter only contains one input file it will be used for all of the Apps. When using 'positions_from_file' it is also admissable to provide one input_file per file."}>>> = "3d.i"
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"
[]
[]
[Transfers<<<{"href": "../../../syntax/Transfers/index.html"}>>>]
[xfer]
type = SCMSolutionTransfer<<<{"description": "Transfers subchannel solution from computational mesh onto visualization mesh", "href": "../../../source/transfers/SCMSolutionTransfer.html"}>>>
to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = viz
variable<<<{"description": "The auxiliary variables to transfer."}>>> = 'mdot SumWij P DP h T rho mu q_prime S'
[]
[]
(modules/subchannel/verification/friction_model_verification/two_channel.i)References
- Chris Gosdin Robert Salko, Marcus Gergar and Maria Avramova.
CTF Void Drift Validation Study.
CASL, 2015.[BibTeX]