23 params.
addClassDescription(
"Base class for path-integrated incompressible momentum kernels.");
26 "Fluid temperature in each segment of this component. Takes a "
27 "list of scalar variable names");
31 "Whether an explicit (previous value calculation) or implicit (current value) is used");
32 params.
addRequiredParam<MooseFunctorName>(
"reference_pressure",
"system reference pressure [Pa]");
33 params.
addRequiredParam<UserObjectName>(
"fp",
"The name of the user object for fluid properties");
34 params.
addParam<std::vector<MooseFunctorName>>(
36 std::vector<MooseFunctorName>({}),
37 "Component flow areas per segment. Takes a vector of functors.");
38 params.
addParam<std::vector<MooseFunctorName>>(
40 std::vector<MooseFunctorName>({}),
41 "Component flow perimeters per segment. Takes a vector of functors.");
42 params.
addParam<std::vector<MooseFunctorName>>(
44 std::vector<MooseFunctorName>({}),
45 "Component flow lengths per segment. Takes a vector of functors.");
46 params.
addParam<std::vector<MooseFunctorName>>(
48 std::vector<MooseFunctorName>({}),
49 "Component flow angles per segment with respect to horizontal (-pi/2 downward to pi/2 "
50 "upward). Takes a vector of functors.");
51 params.
addParam<std::vector<MooseFunctorName>>(
53 std::vector<MooseFunctorName>({}),
54 "Forms loss coefficients per segment. Takes a vector of functors.");
55 params.
addParam<std::vector<MooseFunctorName>>(
57 std::vector<MooseFunctorName>({}),
58 "Pump pressure gains per segment [Pa]. Takes a vector of functors.");
59 params.
addParam<std::vector<MooseFunctorName>>(
61 std::vector<MooseFunctorName>({}),
62 "Component wall roughnesses per segment [m]. Takes a vector of functors.");
76 _is_implicit(this->template getParam<bool>(
"is_implicit")),
77 _Pref(this->template getFunctor<
GenericReal<is_ad>>(
"reference_pressure")),
79 _n_segments(this->template getParam<
std::vector<MooseFunctorName>>(
"areas").size()),
80 _areas(this->template getParam<
std::vector<MooseFunctorName>>(
"areas").size()),
81 _perimeters(this->template getParam<
std::vector<MooseFunctorName>>(
"perimeters").size()),
82 _lengths(this->template getParam<
std::vector<MooseFunctorName>>(
"lengths").size()),
83 _alphas(this->template getParam<
std::vector<MooseFunctorName>>(
"alphas").size()),
84 _forms_losses(this->template getParam<
std::vector<MooseFunctorName>>(
"forms_losses").size()),
85 _dPps(this->template getParam<
std::vector<MooseFunctorName>>(
"pump_pressures").size()),
86 _roughnesses(this->template getParam<
std::vector<MooseFunctorName>>(
"roughnesses").size()),
87 _gravity(this->template getFunctor<
GenericReal<is_ad>>(
"g"))
89 const auto & area_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"areas");
90 const auto & perimeter_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"perimeters");
91 const auto & length_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"lengths");
92 const auto & alpha_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"alphas");
93 const auto & forms_loss_names =
94 MooseBase::getParam<std::vector<MooseFunctorName>>(
"forms_losses");
95 const auto & dPp_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"pump_pressures");
96 const auto & roughness_names = MooseBase::getParam<std::vector<MooseFunctorName>>(
"roughnesses");
103 "Must provide consistent number of segments for each parameter! Including temperatures!");
108 _areas[j] = &(this->
template getFunctor<GenericReal<is_ad>>(area_names[j]));
109 _perimeters[j] = &(this->
template getFunctor<GenericReal<is_ad>>(perimeter_names[j]));
110 _lengths[j] = &(this->
template getFunctor<GenericReal<is_ad>>(length_names[j]));
111 _alphas[j] = &(this->
template getFunctor<GenericReal<is_ad>>(alpha_names[j]));
112 _forms_losses[j] = &(this->
template getFunctor<GenericReal<is_ad>>(forms_loss_names[j]));
113 _dPps[j] = &(this->
template getFunctor<GenericReal<is_ad>>(dPp_names[j]));
114 _roughnesses[j] = &(this->
template getFunctor<GenericReal<is_ad>>(roughness_names[j]));
127 const auto Tave = ((*(_T[0]))[i] + (*(_T[_n_temps - 1]))[i]) / 2;
128 const auto mu = _fp.mu_from_p_T(_Pref(qp, state), Tave);
129 const auto rhog = _fp.rho_from_p_T(_Pref(qp, state), Tave);
134 for (
const auto j : make_range(_n_segments))
135 L_over_A_sum += (*(_lengths[j]))(qp, state) / (*(_areas[j]))(qp, state);
136 const auto inv_L_over_A_sum = 1.0 / L_over_A_sum;
138 for (
const auto j : make_range(_n_segments))
141 const auto Dh = 4.0 * (*(_areas[j]))(qp, state) / (*(_perimeters[j]))(qp, state);
142 const auto G = massFlowRate() / (*(_areas[j]))(qp, state);
143 const auto fd = computeFrictionFactor(
mu, G, Dh, j);
145 momentum_residual += fd * (*(_lengths[j]))(qp, state) / Dh * G * abs(G) / 2.0 / rhog;
147 momentum_residual += (*(_forms_losses[j]))(qp, state) * G * abs(G) / 2.0 / rhog;
150 auto rhol = _fp.rho_from_p_T(_Pref(qp, state), (*(_T[j]))[i]);
152 rhol * _gravity(qp, state) * (*(_lengths[j]))(qp, state) * sin((*(_alphas[j]))(qp, state));
154 momentum_residual -= (*(_dPps[j]))(qp, state);
157 momentum_residual += pressureDrop();
159 return momentum_residual * inv_L_over_A_sum;
166 if constexpr (!is_ad)
168 Real momentum_jacob = 0;
173 const auto Tave = ((*(_T[0]))[i] + (*(_T[_n_temps - 1]))[i]) / 2;
174 const auto mu = _fp.mu_from_p_T(_Pref(qp, state), Tave);
175 const auto rhog = _fp.rho_from_p_T(_Pref(qp, state), Tave);
177 Real L_over_A_sum = 0;
178 for (
const auto j : make_range(_n_segments))
179 L_over_A_sum += (*(_lengths[j]))(qp, state) / (*(_areas[j]))(qp, state);
180 const auto inv_L_over_A_sum = 1.0 / L_over_A_sum;
182 for (
const auto j : make_range(_n_segments))
185 const auto Dh = 4.0 * (*(_areas[j]))(qp, state) / (*(_perimeters[j]))(qp, state);
186 const auto G = massFlowRate() / (*(_areas[j]))(qp, state);
187 const auto fd = computeFrictionFactor(
mu, G, Dh, j);
190 fd * (*(_lengths[j]))(qp, state) / Dh * G / rhog / (*(_areas[j]))(qp, state);
192 momentum_jacob += (*(_forms_losses[j]))(qp, state) * G / rhog / (*(_areas[j]))(qp, state);
195 return momentum_jacob * inv_L_over_A_sum;
199 mooseError(
"computeQpJacobian() should not be called in AD mode");