42 _is_tri_lattice(dynamic_cast<const
TriSubChannelMesh *>(&_subchannel_mesh) != nullptr),
45 _has_wire_wrap(_is_tri_lattice && _tri_sch_mesh->getWireDiameter() != 0.0 &&
46 _tri_sch_mesh->getWireLeadLength() != 0.0),
47 _friction_model(getParam<
MooseEnum>(
"friction_model"))
51 mooseError(
"Wire-wrapped bundle friction requires both wire diameter and wire lead length. "
52 "Set both to zero for a bare pin bundle.");
56 "The Pacio-Chen-Todreas friction correlation applies only to wire-wrapped "
57 "triangular assemblies.");
63 const auto p_over_d = pitch / pin_diameter;
66 const unsigned int num_pins = 1 + 3 * Nr * (Nr - 1);
73 if (p_over_d < 1.0 || p_over_d > 1.42)
74 flagSolutionWarning(
"Pitch-over-pin diameter ratio (P/D) outside the Upgraded "
75 "Chen-Todreas friction correlation data range.");
76 if (
_has_wire_wrap && (wire_lead_to_diameter < 8.0 || wire_lead_to_diameter > 52.0))
77 flagSolutionWarning(
"Wire lead length-over-pin diameter ratio (H/D) outside the Upgraded "
78 "Chen-Todreas friction correlation data range.");
79 if (num_pins < 7 || num_pins > 217)
80 flagSolutionWarning(
"Number of pins outside the Upgraded Chen-Todreas friction correlation "
85 if (p_over_d < 1.02 || p_over_d > 1.42)
86 flagSolutionWarning(
"Pitch-over-pin diameter ratio (P/D) outside the "
87 "Pacio-Chen-Todreas friction correlation data range.");
88 if (
_has_wire_wrap && (wire_lead_to_diameter < 7.5 || wire_lead_to_diameter > 54.0))
89 flagSolutionWarning(
"Wire lead length-over-pin diameter ratio (H/D) outside the "
90 "Pacio-Chen-Todreas friction correlation data range.");
91 if (num_pins < 19 || num_pins > 217)
92 flagSolutionWarning(
"Number of pins outside the Pacio-Chen-Todreas friction correlation "
110 const auto Re = friction_args.
Re;
113 const Real Re_eff = std::max(
Re, 1.0);
114 const auto i_ch = friction_args.
i_ch;
115 const auto S = friction_args.
S;
116 const auto w_perim = friction_args.
w_perim;
117 const auto Dh_i = 4.0 * S / w_perim;
119 Real k1L, k2L, k3L, CfL;
120 Real k1T, k2T, k3T, CfT;
122 Real CbL1, CbL2, CbT1, CbT2;
126 Real CwT1, CwT2, CwT3, CwT4;
181 const auto p_over_d = pitch / pin_diameter;
182 const auto w_over_d = (pin_diameter + gap) / pin_diameter;
184 const auto ReL = std::pow(10, CbL2 * (p_over_d - 1)) * CbL1;
185 const auto ReT = std::pow(10, CbT2 * (p_over_d - 1)) * CbT1;
187 const auto psi = std::log(Reb / ReL) / std::log(ReT / ReL);
193 if (Reb < 50.0 || Reb > 1.0e6)
194 flagSolutionWarning(
"Bulk Reynolds number (Reb) outside the Upgraded Chen-Todreas friction "
195 "correlation data range.");
197 else if (Reb < 10.0 || Reb > 3.0e5)
198 flagSolutionWarning(
"Bulk Reynolds number (Reb) outside the Pacio-Chen-Todreas friction "
199 "correlation data range.");
225 CfL = k1L + k2L * (p_over_d - 1) + k3L * Utility::pow<2>((p_over_d - 1));
227 CfT = k1T + k2T * (p_over_d - 1) + k3T * Utility::pow<2>((p_over_d - 1));
250 CfL = k1L + k2L * (w_over_d - 1) + k3L * Utility::pow<2>((w_over_d - 1));
252 CfT = k1T + k2T * (w_over_d - 1) + k3T * Utility::pow<2>((w_over_d - 1));
275 CfL = k1L + k2L * (w_over_d - 1) + k3L * Utility::pow<2>((w_over_d - 1));
277 CfT = k1T + k2T * (w_over_d - 1) + k3T * Utility::pow<2>((w_over_d - 1));
286 std::acos(wire_lead_length /
287 std::sqrt(Utility::pow<2>(wire_lead_length) +
288 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
290 const auto WdT = (CwT1 + CwT2 * (wire_diameter / pin_diameter) +
291 CwT3 * Utility::pow<2>((wire_diameter / pin_diameter))) *
292 std::pow((wire_lead_length / pin_diameter), CwT4);
293 const auto WdL = CwL1 * WdT;
295 const auto WsT =
a * std::log10(wire_lead_length / pin_diameter) +
b;
296 const auto WsL = CwL2 * WsT;
303 const Real pw_p =
libMesh::pi * pin_diameter / 2.0;
305 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
307 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
309 CfT *= (pw_p / w_perim);
310 CfT += WdT * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) *
311 std::pow((Dh_i / wire_diameter), 0.18);
313 CfL *= (pw_p / w_perim);
314 CfL += WdL * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) * (Dh_i / wire_diameter);
319 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 4.0;
321 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
323 const Real turbulent_wire_correction =
324 1 + WsT * (ar / a_p) * Utility::pow<2>(std::tan(theta));
325 if (!std::isfinite(turbulent_wire_correction) || turbulent_wire_correction < 0.0)
326 mooseError(
"The exponentiated term in the Chen-Todreas turbulent wire correction must be "
327 "non-negative and finite for an edge subchannel. Computed ",
328 turbulent_wire_correction,
330 CfT *= std::pow(turbulent_wire_correction, 1.41);
332 CfL *= (1 + WsL * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
337 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
339 a_p = S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 24.0 / std::cos(theta);
341 const Real turbulent_wire_correction =
342 1 + WsT * (ar / a_p) * Utility::pow<2>(std::tan(theta));
343 if (!std::isfinite(turbulent_wire_correction) || turbulent_wire_correction < 0.0)
344 mooseError(
"The exponentiated term in the Chen-Todreas turbulent wire correction must be "
345 "non-negative and finite for a corner subchannel. Computed ",
346 turbulent_wire_correction,
348 CfT *= std::pow(turbulent_wire_correction, 1.41);
350 CfL *= (1 + WsL * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
354 const Real mL = -1.0;
355 const Real mT = -0.18;
356 auto fL = CfL * std::pow(Re_eff, mL);
357 auto fT = CfT * std::pow(Re_eff, mT);
375 return fL * std::pow((1 - psi), gamma) * (1 - std::pow(psi, lambda)) +
376 fT * std::pow(psi, gamma);
383 const auto Re = friction_args.
Re;
386 const Real Re_eff = std::max(
Re, 1.0);
387 const auto i_ch = friction_args.
i_ch;
389 Real k1L, k2L, k3L, CfL;
390 Real k1T, k2T, k3T, CfT;
396 const auto w = (pin_diameter / 2.0) + (pitch / 2.0) + side_gap;
397 const auto p_over_d = pitch / pin_diameter;
398 const auto w_over_d = w / pin_diameter;
399 const auto ReL = std::pow(10, (p_over_d - 1)) * 320.0;
400 const auto ReT = std::pow(10, 0.7 * (p_over_d - 1)) * 1.0E+4;
402 const auto psi = std::log(Reb / ReL) / std::log(ReT / ReL);
433 CfL = k1L + k2L * (p_over_d - 1) + k3L * Utility::pow<2>((p_over_d - 1));
435 CfT = k1T + k2T * (p_over_d - 1) + k3T * Utility::pow<2>((p_over_d - 1));
458 CfL = k1L + k2L * (w_over_d - 1) + k3L * Utility::pow<2>((w_over_d - 1));
460 CfT = k1T + k2T * (w_over_d - 1) + k3T * Utility::pow<2>((w_over_d - 1));
483 CfL = k1L + k2L * (w_over_d - 1) + k3L * Utility::pow<2>((w_over_d - 1));
485 CfT = k1T + k2T * (w_over_d - 1) + k3T * Utility::pow<2>((w_over_d - 1));
488 const Real mL = -1.0;
489 const Real mT = -0.18;
490 auto fL = CfL * std::pow(Re_eff, mL);
491 auto fT = CfT * std::pow(Re_eff, mT);
507 return fL * std::pow((1 - psi), gamma) * (1 - std::pow(psi, lambda)) +
508 fT * std::pow(psi, gamma);