18 params.
addClassDescription(
"Class that models the turbulent mixing coefficient for wire-wrapped " 19 "triangular assemblies using the Cheng Todreas correlations.");
25 _is_tri_lattice(dynamic_cast<const
TriSubChannelMesh *>(&_subchannel_mesh) != nullptr),
27 _S_soln(_subproblem.getVariable(0,
"S")),
28 _mdot_soln(_subproblem.getVariable(0,
"mdot")),
29 _w_perim_soln(_subproblem.getVariable(0,
"w_perim")),
30 _mu_soln(_subproblem.getVariable(0,
"mu"))
33 mooseError(
"This correlation applies only for triangular assemblies");
36 mooseError(
"This correlation applies only for wire-wrapped assemblies");
40 const Real pitch_to_diameter =
pitch / pin_diameter;
43 const unsigned int num_pins = 1 + 3 * Nr * (Nr - 1);
47 if (pitch_to_diameter < 1.067 || pitch_to_diameter > 1.35)
48 flagSolutionWarning(
"Pitch-over-pin diameter ratio (P/D) outside the Cheng-Todreas " 49 "wire-wrapped mixing correlation data range.");
50 if (wire_lead_to_diameter < 4.0 || wire_lead_to_diameter > 52.0)
51 flagSolutionWarning(
"Wire lead length-over-pin diameter ratio (H/D) outside the " 52 "Cheng-Todreas wire-wrapped mixing correlation data range.");
53 if (num_pins < 7 || num_pins > 217)
54 flagSolutionWarning(
"Number of pins outside the Cheng-Todreas wire-wrapped mixing " 55 "correlation data range.");
71 const unsigned int i_ch = chans.first;
72 const unsigned int j_ch = chans.second;
87 const Real S_total = Si_in + Sj_in + Si_out + Sj_out;
88 const Real Si = 0.5 * (Si_in + Si_out);
89 const Real Sj = 0.5 * (Sj_in + Sj_out);
95 (1.0 / S_total) * (
_mu_soln(node_out_i) * Si_out +
_mu_soln(node_in_i) * Si_in +
98 const Real avg_hD = 4.0 * (Si + Sj) / (w_perim_i + w_perim_j);
100 const Real avg_massflux =
104 const Real Re = avg_massflux * avg_hD / avg_mu;
105 if (Re < 400.0 || Re > 1.0e6)
106 flagSolutionWarning(
"Reynolds number (Re) outside the Cheng-Todreas wire-wrapped mixing " 107 "correlation data range.");
121 std::acos(wire_lead_length /
122 std::sqrt(Utility::pow<2>(wire_lead_length) +
123 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
126 const Real Ar1 =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
129 const Real A1prime = (std::sqrt(3.0) / 4.0) * Utility::pow<2>(
pitch) -
133 const Real A1 = A1prime -
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
137 Real CmL_constant = 0.0;
138 Real CmT_constant = 0.0;
143 CmL_constant = 0.055;
148 CmL_constant = 0.077;
151 const Real CmT = CmT_constant *
std::pow((
pitch - pin_diameter) / pin_diameter, -0.5);
152 const Real CmL = CmL_constant *
std::pow((
pitch - pin_diameter) / pin_diameter, -0.5);
164 const Real psi = (std::log(
Re) - std::log(ReL)) / (std::log(ReT) - std::log(ReL));
165 const Real gamma = 2.0 / 3.0;
166 Cm = CmL + (CmT - CmL) *
std::pow(psi, gamma);
170 beta = Cm * std::sqrt(Ar1 /
A1) * std::tan(theta);
177 const unsigned int iz)
const 189 const unsigned int i_ch = chans.first;
190 const unsigned int j_ch = chans.second;
205 const Real S_total = Si_in + Sj_in + Si_out + Sj_out;
206 const Real Si = 0.5 * (Si_in + Si_out);
207 const Real Sj = 0.5 * (Sj_in + Sj_out);
213 (1.0 / S_total) * (
_mu_soln(node_out_i) * Si_out +
_mu_soln(node_in_i) * Si_in +
216 const Real avg_hD = 4.0 * (Si + Sj) / (w_perim_i + w_perim_j);
218 const Real avg_massflux =
222 const Real Re = avg_massflux * avg_hD / avg_mu;
223 if (Re < 400.0 || Re > 1.0e6)
224 flagSolutionWarning(
"Reynolds number (Re) outside the Cheng-Todreas wire-wrapped mixing " 225 "correlation data range.");
235 std::acos(wire_lead_length /
236 std::sqrt(Utility::pow<2>(wire_lead_length) +
237 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
244 const Real w = pin_diameter + dpgap;
246 const Real Ar2 =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 4.0;
249 pitch * (w - pin_diameter / 2.0) -
libMesh::pi * Utility::pow<2>(pin_diameter) / 8.0;
251 const Real A2 = A2prime -
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
255 Real CsL_constant = 0.0;
256 Real CsT_constant = 0.0;
266 CsL_constant = 0.413;
269 const Real CsL = CsL_constant *
std::pow(wire_lead_length / pin_diameter, 0.3);
270 const Real CsT = CsT_constant *
std::pow(wire_lead_length / pin_diameter, 0.3);
282 const Real psi = (std::log(
Re) - std::log(ReL)) / (std::log(ReT) - std::log(ReL));
283 const Real gamma = 2.0 / 3.0;
284 Cs = CsL + (CsT - CsL) *
std::pow(psi, gamma);
288 beta = Cs * std::sqrt(Ar2 /
A2) * std::tan(theta);
const Real & getWireDiameter() const
Return wire diameter.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
Base class for turbulent mixing closures used in SCM.
const unsigned int & getNumOfRings() const
Return the number of rings.
const TriSubChannelMesh *const _tri_sch_mesh
Pointer to the tri lattice mesh.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
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(...
static const std::string pitch
Class that calculates turbulent mixing and sweep-flow coefficients based on the Cheng & Todreas corre...
bool _is_tri_lattice
Keep track of the lattice type.
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.
static InputParameters validParams()
Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies...
SCMMixingChengTodreas(const InputParameters ¶meters)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static InputParameters validParams()
const SubChannelMesh & _subchannel_mesh
Reference to the subchannel mesh.
void mooseError(Args &&... args) const
registerMooseObject("SubChannelApp", SCMMixingChengTodreas)
Real computeSweepFlowMixingParameter(const unsigned int i_gap, const unsigned int iz) const override
Computes the wire-wrap sweep-flow coefficient for peripheral gaps.
const Real & getWireLeadLength() const
Return the wire lead length.
MooseUnits pow(const MooseUnits &, int)
SolutionHandle _mdot_soln
SolutionHandle _w_perim_soln
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.