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;
82 const Real Si_in =
_S_soln(node_in_i);
83 const Real Sj_in =
_S_soln(node_in_j);
84 const Real Si_out =
_S_soln(node_out_i);
85 const Real Sj_out =
_S_soln(node_out_j);
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.");
110 const Real ReL = 320.0 * std::pow(10.0, pitch / pin_diameter - 1.0);
111 const Real ReT = 10000.0 * std::pow(10.0, 0.7 * (pitch / pin_diameter - 1.0));
122 std::acos(wire_lead_length /
123 std::sqrt(Utility::pow<2>(wire_lead_length) +
124 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
127 const Real Ar1 =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
130 const Real A1prime = (std::sqrt(3.0) / 4.0) * Utility::pow<2>(pitch) -
135 Real CmL_constant = 0.0;
136 Real CmT_constant = 0.0;
141 CmL_constant = 0.055;
146 CmL_constant = 0.077;
149 const Real CmT = CmT_constant * std::pow((pitch - pin_diameter) / pin_diameter, -0.5);
150 const Real CmL = CmL_constant * std::pow((pitch - pin_diameter) / pin_diameter, -0.5);
156 else if (bulk_Re > ReT)
164 const Real psi = std::log(bulk_Re / ReL) / std::log(ReT / ReL);
165 const Real gamma = 2.0 / 3.0;
166 Cm = CmL + (CmT - CmL) * std::pow(psi, gamma);
170 beta = Cm * std::sqrt(Ar1 / A1prime) * 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;
200 const Real Si_in =
_S_soln(node_in_i);
201 const Real Sj_in =
_S_soln(node_in_j);
202 const Real Si_out =
_S_soln(node_out_i);
203 const Real Sj_out =
_S_soln(node_out_j);
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.");
228 const Real ReL = 320.0 * std::pow(10.0, pitch / pin_diameter - 1.0);
229 const Real ReT = 10000.0 * std::pow(10.0, 0.7 * (pitch / pin_diameter - 1.0));
236 std::acos(wire_lead_length /
237 std::sqrt(Utility::pow<2>(wire_lead_length) +
238 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
245 const Real w = pin_diameter + dpgap;
247 const Real Ar2 =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 4.0;
250 pitch * (w - pin_diameter / 2.0) -
libMesh::pi * Utility::pow<2>(pin_diameter) / 8.0;
254 Real CsL_constant = 0.0;
255 Real CsT_constant = 0.0;
265 CsL_constant = 0.413;
268 const Real CsL = CsL_constant * std::pow(wire_lead_length / pin_diameter, 0.3);
269 const Real CsT = CsT_constant * std::pow(wire_lead_length / pin_diameter, 0.3);
275 else if (bulk_Re > ReT)
283 const Real psi = std::log(bulk_Re / ReL) / std::log(ReT / ReL);
284 const Real gamma = 2.0 / 3.0;
285 Cs = CsL + (CsT - CsL) * std::pow(psi, gamma);
289 beta = Cs * std::sqrt(Ar2 / A2prime) * std::tan(theta);
registerMooseObject("SubChannelApp", SCMMixingChengTodreas)
void mooseError(Args &&... args) const
const SubChannel1PhaseProblem & _scm_problem
Reference to the subchannel problem.
const SubChannelMesh & _subchannel_mesh
Reference to the subchannel mesh.
Class that calculates turbulent mixing and sweep-flow coefficients based on the Cheng & Todreas corre...
SolutionHandle _w_perim_soln
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 computeSweepFlowMixingParameter(const unsigned int i_gap, const unsigned int iz) const override
Computes the wire-wrap sweep-flow coefficient for peripheral gaps.
SolutionHandle _mdot_soln
const TriSubChannelMesh *const _tri_sch_mesh
Pointer to the tri lattice mesh.
bool _is_tri_lattice
Keep track of the lattice type.
static InputParameters validParams()
SCMMixingChengTodreas(const InputParameters ¶meters)
Base class for turbulent mixing closures used in SCM.
static InputParameters validParams()
Real getBulkReynoldsNumber() const
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
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.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
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.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies.
const Real & getWireDiameter() const
Return wire diameter.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
const Real & getWireLeadLength() const
Return the wire lead length.
const unsigned int & getNumOfRings() const
Return the number of fuel-pin rings, counting the center pin as the first ring.