https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ADShaftConnectedPump1PhaseUserObject.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
12#include "MooseVariableScalar.h"
13#include "THMIndicesVACE.h"
14#include "Function.h"
15#include "metaphysicl/parallel_numberarray.h"
16#include "metaphysicl/parallel_dualnumber.h"
17#include "metaphysicl/parallel_semidynamicsparsenumberarray.h"
18#include "libmesh/parallel_algebra.h"
19
21
24{
27
28 params.addParam<BoundaryName>("inlet", "Pump inlet");
29 params.addParam<BoundaryName>("outlet", "Pump outlet");
30 params.addRequiredParam<Point>("di_out", "Direction of connected outlet");
31 params.addRequiredParam<Real>("gravity_magnitude", "Gravity constant, [m/s^2]");
32 params.addRequiredParam<Real>("omega_rated", "Rated pump speed [rad/s]");
33 params.addRequiredParam<Real>("volumetric_rated", "Rated pump volumetric flow rate [m^3/s]");
34 params.addRequiredParam<Real>("head_rated", "Rated pump head [m]");
35 params.addRequiredParam<Real>("torque_rated", "Rated pump torque [N-m]");
36 params.addRequiredParam<Real>("density_rated", "Rated pump fluid density [kg/m^3]");
37 params.addRequiredParam<Real>("speed_cr_fr", "Pump speed threshold for friction [-]");
38 params.addRequiredParam<Real>("tau_fr_const", "Pump friction constant [N-m]");
39 params.addRequiredParam<std::vector<Real>>("tau_fr_coeff", "Friction coefficients [N-m]");
40 params.addRequiredParam<Real>("speed_cr_I", "Pump speed threshold for inertia [-]");
41 params.addRequiredParam<Real>("inertia_const", "Pump inertia constant [kg-m^2]");
42 params.addRequiredParam<std::vector<Real>>("inertia_coeff", "Pump inertia coefficients [kg-m^2]");
43 params.addRequiredParam<FunctionName>("head", "Function to compute data for pump head [-]");
44 params.addRequiredParam<FunctionName>("torque_hydraulic",
45 "Function to compute data for pump torque [-]");
46 params.addRequiredParam<std::string>("pump_name", "Name of the instance of this pump component");
47 params.addParam<Real>(
48 "transition_width",
49 1e-3,
50 "Transition width for sign of the frictional torque at 0 speed over rated speed ratio.");
51 params.addRequiredCoupledVar("omega", "Shaft rotational speed [rad/s]");
52
54 "Computes and caches flux and residual vectors for a 1-phase pump. Also computes pump torque "
55 "and head which is passed to the connected shaft");
56
57 return params;
58}
59
61 const InputParameters & params)
64
65 _di_out(getParam<Point>("di_out")),
66 _g(getParam<Real>("gravity_magnitude")),
67 _omega_rated(getParam<Real>("omega_rated")),
68 _volumetric_rated(getParam<Real>("volumetric_rated")),
69 _head_rated(getParam<Real>("head_rated")),
70 _torque_rated(getParam<Real>("torque_rated")),
71 _density_rated(getParam<Real>("density_rated")),
72 _speed_cr_fr(getParam<Real>("speed_cr_fr")),
73 _tau_fr_const(getParam<Real>("tau_fr_const")),
74 _tau_fr_coeff(getParam<std::vector<Real>>("tau_fr_coeff")),
75 _speed_cr_I(getParam<Real>("speed_cr_I")),
76 _inertia_const(getParam<Real>("inertia_const")),
77 _inertia_coeff(getParam<std::vector<Real>>("inertia_coeff")),
78 _head(getFunction("head")),
79 _torque_hydraulic(getFunction("torque_hydraulic")),
80 _pump_name(getParam<std::string>("pump_name")),
81 _omega(adCoupledScalarValue("omega")),
82 _transition_width(getParam<Real>("transition_width")),
83 _transition_friction(0, _transition_width)
84{
85}
86
87void
95
96void
106
107void
118
119void
121{
123
124 using std::abs, std::atan2;
125
126 // inlet c=0 established in component
127 if (c == 0)
128 {
129 ADReal alpha = _omega[0] / _omega_rated;
130
131 ADReal Q_in = (_rhouA[0] / _rhoA[0]) * _A[0];
132
133 ADReal nu = Q_in / _volumetric_rated;
134
135 // Head and torque
136 ADReal x_p = atan2(alpha, nu);
137 const auto wt = _torque_hydraulic.value(x_p, ADPoint());
138 const auto wh = _head.value(x_p, ADPoint());
139
140 const ADReal y = alpha * alpha + nu * nu;
141
142 const auto zt = wt * _torque_rated;
143
144 // Real homologous_torque = -(alpha * alpha + nu * nu) * wt * _torque_rated;
145 const ADReal homologous_torque = -y * zt;
146 _hydraulic_torque = homologous_torque * ((_rhoA[0] / _A[0]) / _density_rated);
147
148 const auto zh = wh * _head_rated;
149
150 // _pump_head = (alpha * alpha + nu * nu) * wh * _head_rated;
151 _pump_head = y * zh;
152
153 // MoI
154 if (alpha < _speed_cr_I)
155 {
157 }
158 else
159 {
160 _moment_of_inertia += _inertia_coeff[0] + _inertia_coeff[1] * abs(alpha) +
161 _inertia_coeff[2] * alpha * alpha +
162 _inertia_coeff[3] * abs(alpha * alpha * alpha);
163 }
164
165 // friction torque
166 ADReal sign;
167 if (alpha > _transition_friction.rightEnd())
168 sign = -1;
169 else if (alpha < _transition_friction.leftEnd())
170 sign = 1;
171 else
172 sign = _transition_friction.value(alpha, 1, -1);
173
174 if (alpha < _speed_cr_fr)
175 {
177 }
178 else
179 {
181 sign * (_tau_fr_coeff[0] + _tau_fr_coeff[1] * abs(alpha) +
182 _tau_fr_coeff[2] * alpha * alpha + _tau_fr_coeff[3] * abs(alpha * alpha * alpha));
183 }
184
185 // compute momentum and energy source terms
186 // a negative torque value results in a positive S_energy
187 const ADReal S_energy = -_hydraulic_torque * _omega[0];
188
189 // a positive head value results in a positive S_momentum
190 const ADRealVectorValue S_momentum = (_rhoA[0] / _A[0]) * _g * _pump_head * _A_ref * _di_out;
191
193
197
199 }
200}
201
202ADReal
207
208ADReal
213
214ADReal
219
220void
234
235void
237{
240
241 const auto & scpuo = static_cast<const ADShaftConnectedPump1PhaseUserObject &>(uo);
243 _friction_torque += scpuo._friction_torque;
244 _pump_head += scpuo._pump_head;
245}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("ThermalHydraulicsApp", ADShaftConnectedPump1PhaseUserObject)
const std::vector< double > y
unsigned int getBoundaryIDIndex()
Gets the index of the currently executing boundary within the vector of boundary IDs given to this Si...
const unsigned int _n_connections
Number of connected flow channels.
Interface class for user objects that are connected to a shaft.
virtual void setOmegaDofs(const MooseVariableScalar *omega_var)
virtual void setupJunctionData(std::vector< dof_id_type > &scalar_dofs)
Stores data associated with a junction component.
virtual void setConnectionData(const std::vector< std::vector< dof_id_type > > &flow_channel_dofs)
Stores data computed by a volume-junction-like object associated with the conection.
virtual void setupConnections(unsigned int n_connections, unsigned int n_flow_eq)
Computes and caches flux and residual vectors for a 1-phase pump.
ADReal getHydraulicTorque() const
Hydraulic torque computed in the 1-phase shaft-connected pump.
const ADWeightedTransition _transition_friction
Transition for the sign of the frictional torque when speed is 0.
ADReal getFrictionTorque() const
Friction torque computed in the 1-phase shaft-connected pump.
const std::vector< Real > & _inertia_coeff
Pump inertia coefficients.
virtual void threadJoin(const UserObject &uo) override
const Real & _volumetric_rated
Rated pump volumetric flow rate.
ADReal getPumpHead() const
Pump head computed in the 1-phase shaft-connected pump.
const Function & _head
Function to compute data for pump head.
const Real & _speed_cr_fr
Pump speed threshold for friction.
const Real & _speed_cr_I
Pump speed threshold for inertia.
virtual void computeFluxesAndResiduals(const unsigned int &c) override
Computes and stores the fluxes, the scalar residuals, and their Jacobians.
ADShaftConnectedPump1PhaseUserObject(const InputParameters &params)
const Function & _torque_hydraulic
Function to compute data for pump torque.
const std::vector< Real > & _tau_fr_coeff
Pump friction coefficients.
const ADReal & leftEnd() const
Returns the coordinate of the left end of the transition.
const ADReal & rightEnd() const
Returns the coordinate of the right end of the transition.
Computes and caches flux and residual vectors for a 1-phase volume junction.
virtual void computeFluxesAndResiduals(const unsigned int &c) override
Computes and stores the fluxes, the scalar residuals, and their Jacobians.
const ADVariableValue & _rhouA
rho*u*A of the connected flow channels
const ADVariableValue & _rhoA
rho*A of the connected flow channels
const ADVariableValue & _A
Cross-sectional area of connected flow channels.
std::vector< std::vector< dof_id_type > > _flow_channel_dofs
Degrees of freedom for flow channel variables, for each connection.
virtual void storeConnectionData()
Stores data (connection index, face shape functions, DoFs associated with flow channel variables) rel...
std::vector< dof_id_type > _scalar_dofs
Degrees of freedom for scalar variables.
unsigned int _n_flux_eq
Number of flow channel flux components.
std::vector< ADReal > _residual
Cached scalar residual vector.
virtual ADReal value(const ADReal &x, const ADReal &f1, const ADReal &f2) const override
Computes the transition value.
virtual Real value(Real t, const Point &p) const
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
const MooseVariableScalar * getScalarVar(const std::string &var_name, unsigned int comp) const
virtual void initialSetup()
virtual void initialize()=0
virtual void threadJoin(const UserObject &uo)=0
const Parallel::Communicator & comm() const