25 _is_tri_lattice(dynamic_cast<const
TriSubChannelMesh *>(&_subchannel_mesh) != nullptr),
28 _has_wire_wrap(_is_tri_lattice && _tri_sch_mesh->getWireDiameter() != 0.0 &&
29 _tri_sch_mesh->getWireLeadLength() != 0.0)
33 mooseError(
"Wire-wrapped bundle friction requires both wire diameter and wire lead length. "
34 "Set both to zero for a bare pin bundle.");
40 const auto p_over_d = pitch / pin_diameter;
43 const unsigned int num_pins = 1 + 3 * Nr * (Nr - 1);
48 if (p_over_d < 1.0 || p_over_d > 1.42)
49 flagSolutionWarning(
"Pitch-over-pin diameter ratio (P/D) outside the updated "
50 "Cheng-Todreas friction correlation data range.");
51 if (
_has_wire_wrap && (wire_lead_to_diameter < 8.0 || wire_lead_to_diameter > 52.0))
52 flagSolutionWarning(
"Wire lead length-over-pin diameter ratio (H/D) outside the updated "
53 "Cheng-Todreas friction correlation data range.");
54 if (num_pins < 7 || num_pins > 271)
55 flagSolutionWarning(
"Number of pins outside the updated Cheng-Todreas friction correlation "
73 const auto Re = friction_args.
Re;
74 const auto i_ch = friction_args.
i_ch;
75 const auto S = friction_args.
S;
76 const auto w_perim = friction_args.
w_perim;
77 const auto Dh_i = 4.0 * S / w_perim;
78 Real aL, b1L, b2L, cL;
79 Real aT, b1T, b2T, cT;
84 const auto p_over_d = pitch / pin_diameter;
89 const auto w_over_d = (pin_diameter + gap) / pin_diameter;
91 if (Re < 50.0 || Re > 1.0e6)
92 flagSolutionWarning(
"Reynolds number (Re) outside the updated Cheng-Todreas friction "
93 "correlation data range.");
95 const auto ReL = std::pow(10, (p_over_d - 1)) * 320.0;
96 const auto ReT = std::pow(10, 0.7 * (p_over_d - 1)) * 1.0E+4;
97 const auto psi = std::log(
Re / ReL) / std::log(ReT / ReL);
123 cL = aL + b1L * (p_over_d - 1) + b2L * Utility::pow<2>((p_over_d - 1));
125 cT = aT + b1T * (p_over_d - 1) + b2T * Utility::pow<2>((p_over_d - 1));
148 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
150 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
173 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
175 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
184 std::acos(wire_lead_length /
185 std::sqrt(Utility::pow<2>(wire_lead_length) +
186 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
187 const auto wd_t = (19.56 - 98.71 * (wire_diameter / pin_diameter) +
188 303.47 * Utility::pow<2>((wire_diameter / pin_diameter))) *
189 std::pow((wire_lead_length / pin_diameter), -0.541);
190 const auto wd_l = 1.4 * wd_t;
191 const auto ws_t = -11.0 * std::log(wire_lead_length / pin_diameter) + 19.0;
192 const auto ws_l = ws_t;
199 const Real pw_p =
libMesh::pi * pin_diameter / 2.0;
201 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
203 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
205 cT *= (pw_p / w_perim);
206 cT += wd_t * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) *
207 std::pow((Dh_i / wire_diameter), 0.18);
209 cL *= (pw_p / w_perim);
210 cL += wd_l * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) * (Dh_i / wire_diameter);
215 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 4.0;
217 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
219 const Real turbulent_wire_correction =
220 1 + ws_t * (ar / a_p) * Utility::pow<2>(std::tan(theta));
221 if (!std::isfinite(turbulent_wire_correction) || turbulent_wire_correction < 0.0)
222 mooseError(
"The exponentiated term in the Cheng-Todreas turbulent wire correction must be "
223 "non-negative and finite for an edge subchannel. Computed ",
224 turbulent_wire_correction,
226 cT *= std::pow(turbulent_wire_correction, 1.41);
228 cL *= (1 + ws_l * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
233 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
235 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 24.0 / std::cos(theta);
237 const Real turbulent_wire_correction =
238 1 + ws_t * (ar / a_p) * Utility::pow<2>(std::tan(theta));
239 if (!std::isfinite(turbulent_wire_correction) || turbulent_wire_correction < 0.0)
240 mooseError(
"The exponentiated term in the Cheng-Todreas turbulent wire correction must be "
241 "non-negative and finite for a corner subchannel. Computed ",
242 turbulent_wire_correction,
244 cT *= std::pow(turbulent_wire_correction, 1.41);
246 cL *= (1 + ws_l * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
250 const Real bL = -1.0;
251 const Real bT = -0.18;
252 auto fL = cL * std::pow(
Re, bL);
253 auto fT = cT * std::pow(
Re, bT);
268 return fL * std::pow((1 - psi), 1.0 / 3.0) * (1 - std::pow(psi, 7)) +
269 fT * std::pow(psi, 1.0 / 3.0);
277 const auto Re = friction_args.
Re;
278 const auto i_ch = friction_args.
i_ch;
280 Real aL, b1L, b2L, cL;
281 Real aT, b1T, b2T, cT;
287 const auto w = (pin_diameter / 2.0) + (pitch / 2.0) + side_gap;
288 const auto p_over_d = pitch / pin_diameter;
289 const auto w_over_d = w / pin_diameter;
290 const auto ReL = std::pow(10, (p_over_d - 1)) * 320.0;
291 const auto ReT = std::pow(10, 0.7 * (p_over_d - 1)) * 1.0E+4;
292 const auto psi = std::log(
Re / ReL) / std::log(ReT / ReL);
319 cL = aL + b1L * (p_over_d - 1) + b2L * Utility::pow<2>((p_over_d - 1));
321 cT = aT + b1T * (p_over_d - 1) + b2T * Utility::pow<2>((p_over_d - 1));
344 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
346 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
369 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
371 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
374 const Real bL = -1.0;
375 const Real bT = -0.18;
376 auto fL = cL * std::pow(
Re, bL);
377 auto fT = cT * std::pow(
Re, bT);
392 return fL * std::pow((1 - psi), 1.0 / 3.0) * (1 - std::pow(psi, 7)) +
393 fT * std::pow(psi, 1.0 / 3.0);