https://mooseframework.inl.gov
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 
11 #include "VolumeJunction1Phase.h"
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 
53  params.addClassDescription(
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 
87 void
89 {
91 
94 }
95 
96 void
98 {
101 
102  _hydraulic_torque = 0;
103  _friction_torque = 0;
104  _pump_head = 0;
105 }
106 
107 void
109 {
113 
114  const unsigned int c = getBoundaryIDIndex();
115 
117 }
118 
119 void
121 {
123 
124  using std::abs, std::atan2;
125 
126  // inlet c=0 established in component
127  if (c == 0)
128  {
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  {
161  _inertia_coeff[2] * alpha * alpha +
162  _inertia_coeff[3] * abs(alpha * alpha * alpha);
163  }
164 
165  // friction torque
166  ADReal sign;
168  sign = -1;
169  else if (alpha < _transition_friction.leftEnd())
170  sign = 1;
171  else
173 
174  if (alpha < _speed_cr_fr)
175  {
177  }
178  else
179  {
181  sign * (_tau_fr_coeff[0] + _tau_fr_coeff[1] * abs(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 
202 ADReal
204 {
205  return _hydraulic_torque;
206 }
207 
208 ADReal
210 {
211  return _friction_torque;
212 }
213 
214 ADReal
216 {
217  return _pump_head;
218 }
219 
220 void
222 {
225 
229 
232  comm().sum(_pump_head);
233 }
234 
235 void
237 {
240 
241  const auto & scpuo = static_cast<const ADShaftConnectedPump1PhaseUserObject &>(uo);
242  _hydraulic_torque += scpuo._hydraulic_torque;
243  _friction_torque += scpuo._friction_torque;
244  _pump_head += scpuo._pump_head;
245 }
const ADVariableValue & _rhoA
rho*A of the connected flow channels
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
const Function & _torque_hydraulic
Function to compute data for pump torque.
std::vector< std::vector< dof_id_type > > _flow_channel_dofs
Degrees of freedom for flow channel variables, for each connection.
virtual void computeFluxesAndResiduals(const unsigned int &c) override
Computes and stores the fluxes, the scalar residuals, and their Jacobians.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int getBoundaryIDIndex()
Gets the index of the currently executing boundary within the vector of boundary IDs given to this Si...
const Real & _speed_cr_fr
Pump speed threshold for friction.
const Parallel::Communicator & comm() const
virtual void computeFluxesAndResiduals(const unsigned int &c) override
Computes and stores the fluxes, the scalar residuals, and their Jacobians.
const ADWeightedTransition _transition_friction
Transition for the sign of the frictional torque when speed is 0.
unsigned int _n_flux_eq
Number of flow channel flux components.
const std::vector< double > y
Computes and caches flux and residual vectors for a 1-phase pump.
const unsigned int _n_connections
Number of connected flow channels.
const ADReal & leftEnd() const
Returns the coordinate of the left end of the transition.
DualNumber< Real, DNDerivativeType, true > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
const Real & _volumetric_rated
Rated pump volumetric flow rate.
std::vector< ADReal > _residual
Cached scalar residual vector.
virtual void setOmegaDofs(const MooseVariableScalar *omega_var)
const std::vector< Real > & _tau_fr_coeff
Pump friction coefficients.
virtual void threadJoin(const UserObject &uo) override
const ADReal & rightEnd() const
Returns the coordinate of the right end of the transition.
const Real & _tau_fr_const
Pump friction constant.
virtual void storeConnectionData()
Stores data (connection index, face shape functions, DoFs associated with flow channel variables) rel...
T sign(T x)
const MooseVariableScalar * getScalarVar(const std::string &var_name, unsigned int comp) const
virtual ADReal value(const ADReal &x, const ADReal &f1, const ADReal &f2) const override
Computes the transition value.
virtual void setupJunctionData(std::vector< dof_id_type > &scalar_dofs)
Stores data associated with a junction component.
const Real & _inertia_const
Pump inertia constant.
Computes and caches flux and residual vectors for a 1-phase volume junction.
registerMooseObject("ThermalHydraulicsApp", ADShaftConnectedPump1PhaseUserObject)
ADReal getFrictionTorque() const
Friction torque computed in the 1-phase shaft-connected pump.
ADReal getPumpHead() const
Pump head computed in the 1-phase shaft-connected pump.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
std::vector< dof_id_type > _scalar_dofs
Degrees of freedom for scalar variables.
Interface class for user objects that are connected to a shaft.
const ADVariableValue & _A
Cross-sectional area of connected flow channels.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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.
const std::vector< Real > & _inertia_coeff
Pump inertia coefficients.
static const std::string alpha
Definition: NS.h:134
ADReal getHydraulicTorque() const
Hydraulic torque computed in the 1-phase shaft-connected pump.
virtual void threadJoin(const UserObject &uo) override
void addClassDescription(const std::string &doc_string)
virtual void setupConnections(unsigned int n_connections, unsigned int n_flow_eq)
virtual Real value(Real t, const Point &p) const
const ADVariableValue & _rhouA
rho*u*A of the connected flow channels
ADShaftConnectedPump1PhaseUserObject(const InputParameters &params)
const Real & _speed_cr_I
Pump speed threshold for inertia.
const Function & _head
Function to compute data for pump head.