23 "Class that models the turbulent mixing coefficient using the Kim and Chung correlations.");
29 _is_tri_lattice(dynamic_cast<const
TriSubChannelMesh *>(&_subchannel_mesh) != nullptr),
30 _sch_mesh(_subchannel_mesh),
31 _S_soln(_subproblem.getVariable(0,
"S")),
32 _mdot_soln(_subproblem.getVariable(0,
"mdot")),
33 _w_perim_soln(_subproblem.getVariable(0,
"w_perim")),
34 _mu_soln(_subproblem.getVariable(0,
"mu")),
35 _P_soln(_subproblem.getVariable(0,
"P")),
36 _T_soln(_subproblem.getVariable(0,
"T"))
41 if (tri_mesh.getWireDiameter() != 0.0 || tri_mesh.getWireLeadLength() != 0.0)
42 mooseError(
"SCMMixingKimAndChung applies only to bare-pin assemblies and cannot be used " 43 "with wire-wrapped triangular bundles.");
62 const unsigned int iz,
71 const unsigned int i_ch = chans.first;
72 const unsigned int j_ch = chans.second;
84 const Real Si = 0.5 * (Si_in + Si_out);
85 const Real Sj = 0.5 * (Sj_in + Sj_out);
86 const Real S_total = Si_in + Sj_in + Si_out + Sj_out;
95 const Real avg_massflux =
104 const Real avg_mu = 0.5 * (mu_i + mu_j);
106 const Real avg_hD = 4.0 * (Si + Sj) / (w_perim_i + w_perim_j);
107 const Real hD_i = 4.0 * Si / w_perim_i;
108 const Real hD_j = 4.0 * Sj / w_perim_j;
110 const Real Re_i = massflux_i * hD_i / mu_i;
111 const Real Re_j = massflux_j * hD_j / mu_j;
112 const Real Re = avg_massflux * avg_hD / avg_mu;
114 constexpr
Real gamma = 20.0;
115 constexpr
Real a = 0.18;
116 constexpr
Real b = 0.2;
118 const auto friction_args_i =
FrictionStruct(i_ch, Re_i, Si, w_perim_i);
119 const auto friction_args_j =
FrictionStruct(j_ch, Re_j, Sj, w_perim_j);
123 const Real f = 0.5 * (fi + fj);
127 (1.0 / S_total) * (
fp->k_from_p_T(
_P_soln(node_out_i) + P_out,
_T_soln(node_out_i)) * Si_out +
133 const Real avg_cp = (1.0 / S_total) *
134 (
fp->cp_from_p_T(
_P_soln(node_out_i) + P_out,
_T_soln(node_out_i)) * Si_out +
136 fp->cp_from_p_T(
_P_soln(node_out_j) + P_out,
_T_soln(node_out_j)) * Sj_out +
139 const Real Pr = avg_mu * avg_cp / avg_k;
140 const Real Pr_t = Pr * (
Re / gamma) * std::sqrt(
f / 8.0);
145 flagSolutionWarning(
"Prandtl number (Pr) outside the low-Prandtl-number liquid-metal range " 146 "expected by the Kim-Chung turbulent mixing closure.");
149 const Real lamda = gap / L_x;
152 const Real z_FP_over_D =
153 (2.0 * L_x / pin_diameter) *
154 (1.0 + (-0.5 * std::log(lamda) + 0.5 * std::log(4.0) - 0.25) * lamda * lamda);
157 1.0 / (0.822 * (gap / pin_diameter) + 0.144);
159 const Real freq_factor = 2.0 / Utility::pow<2>(gamma) * std::sqrt(
a / 8.0) * (avg_hD / gap);
161 const Real rod_mixing = (1.0 / Pr_t) * lamda;
162 const Real axial_mixing = a_x * z_FP_over_D * Str;
174 return freq_factor * (rod_mixing + axial_mixing) *
std::pow(
Re, -
b / 2.0);
179 const unsigned int iz)
const 184 constexpr
Real sf = 2.0 / 3.0;
190 const unsigned int iz)
const 195 constexpr
Real sf = 1.0;
Class that calculates the turbulent mixing coefficient based on the Kim and Chung (2001) correllation...
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
SubChannel1PhaseProblem::FrictionStruct FrictionStruct
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
Base class for turbulent mixing closures used in SCM.
Real computeTriLatticeMixingParameter(const unsigned int i_gap, const unsigned int iz) const
const SinglePhaseFluidProperties * getSinglePhaseFluidProperties() const
Get fluid properties object.
int delta(unsigned int i, unsigned int j)
Delta function, which returns zero if $i j$ and unity if $i=j$.
registerMooseObject("SubChannelApp", SCMMixingKimAndChung)
Real computeQuadLatticeMixingParameter(const unsigned int i_gap, const unsigned int iz) const
Real computeLatticeMixingParameter(const unsigned int i_gap, const unsigned int iz, const Real delta, const Real sf) const
Common implementation for both tri and quad lattices.
bool _is_tri_lattice
Keep track of the lattice type.
const SubChannelMesh & _sch_mesh
Pointer to the base subchannel mesh.
const SubChannel1PhaseProblem & _scm_problem
Reference to the subchannel problem.
virtual Real computeFrictionFactor(const FrictionStruct &friction_info) const =0
Computes the friction factor for the local conditions.
virtual Real computeMixingParameter(const unsigned int i_gap, const unsigned int iz) const override
Computes the turbulent mixing coefficient for the local conditions around gap(i_gap) and axial level(...
Real f(Real x)
Test function for Brents method.
static const std::string pitch
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const SCMFrictionClosureBase * getFrictionClosure() const
static InputParameters validParams()
Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies...
static InputParameters validParams()
virtual Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const =0
Return gap width for a given gap index.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SolutionHandle _mdot_soln
const SubChannelMesh & _subchannel_mesh
Reference to the subchannel mesh.
void mooseError(Args &&... args) const
const PostprocessorValue & getOutletPressure() const
Get outlet pressure.
SCMMixingKimAndChung(const InputParameters ¶meters)
SolutionHandle _w_perim_soln
MooseUnits pow(const MooseUnits &, int)
virtual const std::pair< unsigned int, unsigned int > & getGapChannels(unsigned int i_gap) const =0
Return a pair of subchannel indices for a given gap index.