18 params.
addClassDescription(
"Class that computes the axial friction factor using the updated " 19 "Cheng Todreas correlations.");
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)
34 ": wire-wrapped bundle friction requires both wire diameter and wire lead length. " 35 "Set both to zero for a bare pin bundle.");
41 const auto p_over_d =
pitch / pin_diameter;
44 const unsigned int num_pins = 1 + 3 * Nr * (Nr - 1);
49 if (p_over_d < 1.0 || p_over_d > 1.42)
50 flagSolutionWarning(
"Pitch-over-pin diameter ratio (P/D) outside the updated " 51 "Cheng-Todreas friction correlation data range.");
52 if (
_has_wire_wrap && (wire_lead_to_diameter < 4.0 || wire_lead_to_diameter > 52.0))
53 flagSolutionWarning(
"Wire lead length-over-pin diameter ratio (H/D) outside the updated " 54 "Cheng-Todreas friction correlation data range.");
55 if (num_pins < 7 || num_pins > 271)
56 flagSolutionWarning(
"Number of pins outside the updated Cheng-Todreas friction correlation " 74 const auto Re = friction_args.
Re;
75 const auto i_ch = friction_args.
i_ch;
76 const auto S = friction_args.
S;
77 const auto w_perim = friction_args.
w_perim;
78 const auto Dh_i = 4.0 *
S / w_perim;
80 Real aT, b1T, b2T, cT;
85 const auto p_over_d =
pitch / pin_diameter;
90 const auto w_over_d = (pin_diameter + gap) / pin_diameter;
92 if (Re < 50.0 || Re > 1.0e6)
93 flagSolutionWarning(
"Reynolds number (Re) outside the updated Cheng-Todreas friction " 94 "correlation data range.");
96 const auto ReL =
std::pow(10, (p_over_d - 1)) * 320.0;
97 const auto ReT =
std::pow(10, 0.7 * (p_over_d - 1)) * 1.0E+4;
98 const auto psi = std::log(
Re / ReL) / std::log(ReT / ReL);
124 cL = aL + b1L * (p_over_d - 1) + b2L * Utility::pow<2>((p_over_d - 1));
126 cT = aT + b1T * (p_over_d - 1) + b2T * Utility::pow<2>((p_over_d - 1));
149 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
151 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
174 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
176 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
185 std::acos(wire_lead_length /
186 std::sqrt(Utility::pow<2>(wire_lead_length) +
187 Utility::pow<2>(
libMesh::pi * (pin_diameter + wire_diameter))));
188 const auto wd_t = (19.56 - 98.71 * (wire_diameter / pin_diameter) +
189 303.47 * Utility::pow<2>((wire_diameter / pin_diameter))) *
190 std::pow((wire_lead_length / pin_diameter), -0.541);
191 const auto wd_l = 1.4 * wd_t;
192 const auto ws_t = -11.0 * std::log(wire_lead_length / pin_diameter) + 19.0;
193 const auto ws_l = ws_t;
202 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
204 a_p =
S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
206 cT *= (pw_p / w_perim);
207 cT += wd_t * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) *
208 std::pow((Dh_i / wire_diameter), 0.18);
210 cL *= (pw_p / w_perim);
211 cL += wd_l * (3.0 * ar / a_p) * (Dh_i / wire_lead_length) * (Dh_i / wire_diameter);
216 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 4.0;
218 a_p =
S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
220 cT *=
std::pow((1 + ws_t * (ar / a_p) * Utility::pow<2>(std::tan(theta))), 1.41);
222 cL *= (1 + ws_l * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
227 ar =
libMesh::pi * (pin_diameter + wire_diameter) * wire_diameter / 6.0;
229 a_p =
S +
libMesh::pi * Utility::pow<2>(wire_diameter) / 24.0 / std::cos(theta);
231 cT *=
std::pow((1 + ws_t * (ar / a_p) * Utility::pow<2>(std::tan(theta))), 1.41);
233 cL *= (1 + ws_l * (ar / a_p) * Utility::pow<2>(std::tan(theta)));
237 const Real bL = -1.0;
238 const Real bT = -0.18;
264 const auto Re = friction_args.
Re;
265 const auto i_ch = friction_args.
i_ch;
268 Real aT, b1T, b2T, cT;
274 const auto w = (pin_diameter / 2.0) + (
pitch / 2.0) + side_gap;
275 const auto p_over_d =
pitch / pin_diameter;
276 const auto w_over_d = w / pin_diameter;
277 const auto ReL =
std::pow(10, (p_over_d - 1)) * 320.0;
278 const auto ReT =
std::pow(10, 0.7 * (p_over_d - 1)) * 1.0E+4;
279 const auto psi = std::log(
Re / ReL) / std::log(ReT / ReL);
306 cL = aL + b1L * (p_over_d - 1) + b2L * Utility::pow<2>((p_over_d - 1));
308 cT = aT + b1T * (p_over_d - 1) + b2T * Utility::pow<2>((p_over_d - 1));
331 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
333 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
356 cL = aL + b1L * (w_over_d - 1) + b2L * Utility::pow<2>((w_over_d - 1));
358 cT = aT + b1T * (w_over_d - 1) + b2T * Utility::pow<2>((w_over_d - 1));
361 const Real bL = -1.0;
362 const Real bT = -0.18;
static InputParameters validParams()
Base class for friction closures used in SCM.
SCMFrictionUpdatedChengTodreas(const InputParameters ¶meters)
const Real & getWireDiameter() const
Return wire diameter.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
const TriSubChannelMesh *const _tri_sch_mesh
Pointer to the tri lattice mesh.
const bool _has_wire_wrap
Whether the triangular assembly has wire-wrap geometry.
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.
Class that calculates the friction factor based on the updated Cheng & Todreas correlations (Cheng et...
const Real & getSideGap() const
Returns the side gap, not to be confused with the gap between pins, this refers to the gap next to th...
Creates the mesh of subchannels in a quadrilateral lattice.
structure with the needed information to compute the friction factor at a specific subchannel cell ...
bool _is_tri_lattice
Keep track of the lattice type.
const unsigned int & getNumOfRings() const
Return the number of fuel-pin rings, counting the center pin as the first ring.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
const std::string & name() const
Real computeQuadLatticeFrictionFactor(const FrictionStruct &friction_info) const
static const std::string S
static const std::string pitch
const QuadSubChannelMesh *const _quad_sch_mesh
Pointer to the quad lattice mesh.
Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies...
virtual Real computeFrictionFactor(const FrictionStruct &friction_info) const override
Computes the friction factor for the local conditions.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real computeTriLatticeFrictionFactor(const FrictionStruct &friction_info) const
const SubChannelMesh & _subchannel_mesh
Reference to the subchannel mesh.
void mooseError(Args &&... args) const
registerMooseObject("SubChannelApp", SCMFrictionUpdatedChengTodreas)
static InputParameters validParams()
const Real & getWireLeadLength() const
Return the wire lead length.
MooseUnits pow(const MooseUnits &, int)
static const std::string cL