Line data Source code
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 :
10 : #include "ShaftConnectedPump1Phase.h"
11 : #include "FlowModelSinglePhase.h"
12 : #include "Numerics.h"
13 : #include "Shaft.h"
14 : #include "MooseVariableScalar.h"
15 : #include "Assembly.h"
16 : #include "ScalarKernel.h"
17 :
18 : registerMooseObject("ThermalHydraulicsApp", ShaftConnectedPump1Phase);
19 :
20 : InputParameters
21 90 : ShaftConnectedPump1Phase::validParams()
22 : {
23 90 : InputParameters params = VolumeJunction1Phase::validParams();
24 90 : params += ShaftConnectable::validParams();
25 90 : params.makeParamRequired<Real>("A_ref");
26 180 : params.addRequiredParam<BoundaryName>("inlet", "Pump inlet");
27 180 : params.addRequiredParam<BoundaryName>("outlet", "Pump outlet");
28 90 : params.set<std::vector<BoundaryName>>("connections") = {};
29 90 : params.suppressParameter<std::vector<BoundaryName>>("connections");
30 180 : params.addRequiredParam<Real>("omega_rated", "Rated pump speed [rad/s]");
31 180 : params.addRequiredParam<Real>("volumetric_rated", "Rated pump volumetric flow rate [m^3/s]");
32 180 : params.addRequiredParam<Real>("head_rated", "Rated pump head [m]");
33 180 : params.addRequiredParam<Real>("torque_rated", "Rated pump torque [N-m]");
34 180 : params.addRequiredParam<Real>("density_rated", "Rated pump fluid density [kg/m^3]");
35 180 : params.addRequiredParam<Real>("speed_cr_fr", "Pump speed threshold for friction [-]");
36 180 : params.addRequiredParam<Real>("tau_fr_const", "Pump friction constant [N-m]");
37 180 : params.addRequiredParam<std::vector<Real>>("tau_fr_coeff", "Pump friction coefficients [N-m]");
38 180 : params.addRequiredParam<Real>("speed_cr_I", "Pump speed threshold for inertia [-]");
39 180 : params.addRequiredParam<Real>("inertia_const", "Pump inertia constant [kg-m^2]");
40 180 : params.addRequiredParam<std::vector<Real>>("inertia_coeff", "Pump inertia coefficients [kg-m^2]");
41 180 : params.addRequiredParam<FunctionName>("head", "Function to compute data for pump head [-]");
42 180 : params.addRequiredParam<FunctionName>("torque_hydraulic",
43 : "Function to compute data for pump torque [-]");
44 180 : params.addParam<Real>(
45 : "transition_width",
46 180 : 1e-3,
47 : "Transition width for sign of the frictional torque at 0 speed over rated speed ratio.");
48 :
49 90 : params.addClassDescription("1-phase pump that must be connected to a Shaft component. Pump speed "
50 : "is controlled by the connected shaft; Hydraulic torque and head are "
51 : "computed by user input functions of inlet flow rate and shaft speed");
52 :
53 90 : return params;
54 0 : }
55 :
56 45 : ShaftConnectedPump1Phase::ShaftConnectedPump1Phase(const InputParameters & parameters)
57 : : VolumeJunction1Phase(parameters),
58 : ShaftConnectable(this),
59 45 : _inlet(getParam<BoundaryName>("inlet")),
60 90 : _outlet(getParam<BoundaryName>("outlet")),
61 90 : _omega_rated(getParam<Real>("omega_rated")),
62 90 : _volumetric_rated(getParam<Real>("volumetric_rated")),
63 90 : _head_rated(getParam<Real>("head_rated")),
64 90 : _torque_rated(getParam<Real>("torque_rated")),
65 90 : _density_rated(getParam<Real>("density_rated")),
66 90 : _speed_cr_fr(getParam<Real>("speed_cr_fr")),
67 90 : _tau_fr_const(getParam<Real>("tau_fr_const")),
68 90 : _tau_fr_coeff(getParam<std::vector<Real>>("tau_fr_coeff")),
69 90 : _speed_cr_I(getParam<Real>("speed_cr_I")),
70 90 : _inertia_const(getParam<Real>("inertia_const")),
71 90 : _inertia_coeff(getParam<std::vector<Real>>("inertia_coeff")),
72 90 : _head(getParam<FunctionName>("head")),
73 90 : _torque_hydraulic(getParam<FunctionName>("torque_hydraulic")),
74 45 : _head_var_name(junctionVariableName("head")),
75 45 : _hydraulic_torque_var_name(junctionVariableName("hydraulic_torque")),
76 45 : _friction_torque_var_name(junctionVariableName("friction_torque")),
77 45 : _moi_var_name(junctionVariableName("moment_of_inertia")),
78 135 : _transition_width(getParam<Real>("transition_width"))
79 : {
80 : // this determines connection ordering
81 45 : addConnection(_inlet);
82 45 : addConnection(_outlet);
83 :
84 45 : checkSizeEqualsValue<Real>("tau_fr_coeff", 4);
85 45 : checkSizeEqualsValue<Real>("inertia_coeff", 4);
86 45 : }
87 :
88 : void
89 40 : ShaftConnectedPump1Phase::check() const
90 : {
91 40 : VolumeJunction1Phase::check();
92 40 : checkShaftConnection(this);
93 40 : }
94 :
95 : void
96 43 : ShaftConnectedPump1Phase::buildVolumeJunctionUserObject()
97 : {
98 43 : const Component & c = getComponentByName<Component>(_shaft_name);
99 43 : const Shaft & scc = dynamic_cast<const Shaft &>(c);
100 43 : const VariableName omega_var_name = scc.getOmegaVariableName();
101 :
102 43 : ExecFlagEnum execute_on(MooseUtils::getDefaultExecFlagEnum());
103 172 : execute_on = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
104 :
105 : {
106 43 : const std::string class_name = "ADShaftConnectedPump1PhaseUserObject";
107 43 : InputParameters params = _factory.getValidParams(class_name);
108 43 : params.set<bool>("use_scalar_variables") = false;
109 43 : params.set<subdomain_id_type>("junction_subdomain_id") = _junction_subdomain_id;
110 43 : params.set<std::vector<BoundaryName>>("boundary") = _boundary_names;
111 86 : params.set<std::vector<Real>>("normals") = _normals;
112 43 : params.set<std::vector<processor_id_type>>("processor_ids") = getConnectedProcessorIDs();
113 43 : params.set<std::vector<UserObjectName>>("numerical_flux_names") = _numerical_flux_names;
114 43 : params.set<Real>("volume") = _volume;
115 129 : params.set<std::vector<VariableName>>("A") = {FlowModel::AREA};
116 129 : params.set<std::vector<VariableName>>("rhoA") = {FlowModelSinglePhase::RHOA};
117 129 : params.set<std::vector<VariableName>>("rhouA") = {FlowModelSinglePhase::RHOUA};
118 129 : params.set<std::vector<VariableName>>("rhoEA") = {FlowModelSinglePhase::RHOEA};
119 129 : params.set<std::vector<VariableName>>("rhoV") = {_rhoV_var_name};
120 129 : params.set<std::vector<VariableName>>("rhouV") = {_rhouV_var_name};
121 129 : params.set<std::vector<VariableName>>("rhovV") = {_rhovV_var_name};
122 129 : params.set<std::vector<VariableName>>("rhowV") = {_rhowV_var_name};
123 129 : params.set<std::vector<VariableName>>("rhoEV") = {_rhoEV_var_name};
124 : // the direction of the outlet channel
125 43 : params.set<Point>("di_out") = _directions[1].unit();
126 43 : params.set<Real>("gravity_magnitude") = THM::gravity_const;
127 43 : params.set<Real>("omega_rated") = _omega_rated;
128 43 : params.set<Real>("volumetric_rated") = _volumetric_rated;
129 43 : params.set<Real>("head_rated") = _head_rated;
130 43 : params.set<Real>("torque_rated") = _torque_rated;
131 43 : params.set<Real>("density_rated") = _density_rated;
132 43 : params.set<Real>("speed_cr_fr") = _speed_cr_fr;
133 43 : params.set<Real>("tau_fr_const") = _tau_fr_const;
134 43 : params.set<std::vector<Real>>("tau_fr_coeff") = _tau_fr_coeff;
135 43 : params.set<Real>("speed_cr_I") = _speed_cr_I;
136 43 : params.set<Real>("inertia_const") = _inertia_const;
137 43 : params.set<Real>("transition_width") = _transition_width;
138 43 : params.set<std::vector<Real>>("inertia_coeff") = _inertia_coeff;
139 43 : params.set<FunctionName>("head") = _head;
140 86 : params.set<FunctionName>("torque_hydraulic") = _torque_hydraulic;
141 129 : params.set<std::vector<VariableName>>("omega") = {omega_var_name};
142 86 : params.set<Real>("A_ref") = getParam<Real>("A_ref");
143 86 : params.set<Real>("K") = getParam<Real>("K");
144 43 : params.set<UserObjectName>("fp") = _fp_name;
145 43 : params.set<std::string>("pump_name") = cname();
146 86 : params.set<bool>("apply_velocity_scaling") = getParam<bool>("apply_velocity_scaling");
147 43 : params.set<ExecFlagEnum>("execute_on") = execute_on;
148 43 : getTHMProblem().addUserObject(class_name, getShaftConnectedUserObjectName(), params);
149 43 : connectObject(params, _junction_uo_name, "K");
150 43 : }
151 86 : }
152 :
153 : void
154 43 : ShaftConnectedPump1Phase::addVariables()
155 : {
156 43 : VolumeJunction1Phase::addVariables();
157 :
158 43 : addJunctionVariable(false, _head_var_name);
159 43 : addJunctionVariable(false, _hydraulic_torque_var_name);
160 43 : addJunctionVariable(false, _friction_torque_var_name);
161 43 : addJunctionVariable(false, _moment_of_inertia_var_name);
162 :
163 43 : if (!_app.isRestarting())
164 : {
165 43 : addJunctionIC(_head_var_name, 0);
166 43 : addJunctionIC(_hydraulic_torque_var_name, 0);
167 43 : addJunctionIC(_friction_torque_var_name, 0);
168 43 : addJunctionIC(_moment_of_inertia_var_name, _inertia_const);
169 : }
170 43 : }
171 :
172 : void
173 43 : ShaftConnectedPump1Phase::addMooseObjects()
174 : {
175 43 : VolumeJunction1Phase::addMooseObjects();
176 :
177 : const std::vector<std::pair<std::string, VariableName>> quantities = {
178 43 : {"pump_head", _head_var_name},
179 43 : {"hydraulic_torque", _hydraulic_torque_var_name},
180 43 : {"friction_torque", _friction_torque_var_name},
181 215 : {"moment_of_inertia", _moment_of_inertia_var_name}};
182 215 : for (const auto & quantity_and_name : quantities)
183 : {
184 172 : const std::string class_name = "ShaftConnectedPump1PhaseAux";
185 172 : InputParameters params = _factory.getValidParams(class_name);
186 344 : params.set<AuxVariableName>("variable") = quantity_and_name.second;
187 172 : params.set<MooseEnum>("quantity") = quantity_and_name.first;
188 344 : params.set<UserObjectName>("pump_uo") = getShaftConnectedUserObjectName();
189 344 : const std::string obj_name = genName(name(), quantity_and_name.first + "_aux");
190 172 : params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
191 172 : getTHMProblem().addAuxKernel(class_name, obj_name, params);
192 172 : }
193 86 : }
|