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 "ShaftConnectedCompressor1Phase.h"
11 : #include "FlowModelSinglePhase.h"
12 : #include "Numerics.h"
13 : #include "Shaft.h"
14 : #include "ADShaftConnectedCompressor1PhaseUserObject.h"
15 : #include "MooseVariableScalar.h"
16 : #include "Assembly.h"
17 : #include "ScalarKernel.h"
18 : #include "ADVolumeJunction1PhaseUserObject.h"
19 :
20 : registerMooseObject("ThermalHydraulicsApp", ShaftConnectedCompressor1Phase);
21 :
22 : InputParameters
23 220 : ShaftConnectedCompressor1Phase::validParams()
24 : {
25 220 : InputParameters params = VolumeJunction1Phase::validParams();
26 220 : params += ShaftConnectable::validParams();
27 220 : params.makeParamRequired<Real>("A_ref");
28 440 : params.addRequiredParam<BoundaryName>("inlet", "Compressor inlet");
29 440 : params.addRequiredParam<BoundaryName>("outlet", "Compressor outlet");
30 220 : params.set<std::vector<BoundaryName>>("connections") = {};
31 220 : params.suppressParameter<std::vector<BoundaryName>>("connections");
32 440 : params.addParam<bool>("treat_as_turbine", false, "Treat the compressor as a turbine?");
33 440 : params.addRequiredParam<Real>("omega_rated", "Rated compressor speed [rad/s]");
34 440 : params.addRequiredParam<Real>("mdot_rated", "Rated compressor mass flow rate [kg/s]");
35 440 : params.addRequiredParam<Real>("rho0_rated", "Rated compressor stagnation fluid density [kg/m^3]");
36 440 : params.addRequiredParam<Real>("c0_rated", "Rated compressor stagnation sound speed [m/s]");
37 440 : params.addRequiredParam<Real>("speed_cr_fr", "Compressor speed threshold for friction [-]");
38 440 : params.addRequiredParam<Real>("tau_fr_const", "Compressor friction constant [N-m]");
39 440 : params.addRequiredParam<std::vector<Real>>("tau_fr_coeff",
40 : "Compressor friction coefficients [N-m]");
41 440 : params.addRequiredParam<Real>("speed_cr_I", "Compressor speed threshold for inertia [-]");
42 440 : params.addRequiredParam<Real>("inertia_const", "Compressor inertia constant [kg-m^2]");
43 440 : params.addRequiredParam<std::vector<Real>>("inertia_coeff",
44 : "Compressor inertia coefficients [kg-m^2]");
45 440 : params.addRequiredParam<std::vector<Real>>(
46 : "speeds",
47 : "Relative corrected speeds. Order of speeds needs correspond to the "
48 : "orders of `Rp_functions` and `eff_functions` [-]");
49 440 : params.addRequiredParam<std::vector<FunctionName>>(
50 : "Rp_functions",
51 : "Functions of pressure ratio versus relative corrected flow. Each function is for a "
52 : "different, constant relative corrected speed. The order of function names should correspond "
53 : "to the order of speeds in the `speeds` parameter [-]");
54 440 : params.addRequiredParam<std::vector<FunctionName>>(
55 : "eff_functions",
56 : "Functions of adiabatic efficiency versus relative corrected flow. Each function is for a "
57 : "different, constant relative corrected speed. The order of function names should correspond "
58 : "to the order of speeds in the `speeds` parameter [-]");
59 440 : params.addParam<Real>("min_pressure_ratio", 0.0, "Minimum pressure ratio");
60 440 : params.addParam<Real>("max_pressure_ratio", 50.0, "Maximum pressure ratio");
61 :
62 220 : params.addClassDescription(
63 : "1-phase compressor that must be connected to a Shaft component. Compressor speed "
64 : "is controlled by the connected shaft; Isentropic/Dissipation torque and delta_p are "
65 : "computed by user input functions of inlet flow rate and shaft speed");
66 :
67 220 : return params;
68 0 : }
69 :
70 110 : ShaftConnectedCompressor1Phase::ShaftConnectedCompressor1Phase(const InputParameters & parameters)
71 : : VolumeJunction1Phase(parameters),
72 : ShaftConnectable(this),
73 110 : _inlet(getParam<BoundaryName>("inlet")),
74 220 : _outlet(getParam<BoundaryName>("outlet")),
75 220 : _omega_rated(getParam<Real>("omega_rated")),
76 220 : _mdot_rated(getParam<Real>("mdot_rated")),
77 220 : _rho0_rated(getParam<Real>("rho0_rated")),
78 220 : _c0_rated(getParam<Real>("c0_rated")),
79 220 : _speed_cr_fr(getParam<Real>("speed_cr_fr")),
80 220 : _tau_fr_const(getParam<Real>("tau_fr_const")),
81 220 : _tau_fr_coeff(getParam<std::vector<Real>>("tau_fr_coeff")),
82 220 : _speed_cr_I(getParam<Real>("speed_cr_I")),
83 220 : _inertia_const(getParam<Real>("inertia_const")),
84 220 : _inertia_coeff(getParam<std::vector<Real>>("inertia_coeff")),
85 220 : _speeds(getParam<std::vector<Real>>("speeds")),
86 220 : _Rp_functions(getParam<std::vector<FunctionName>>("Rp_functions")),
87 220 : _eff_functions(getParam<std::vector<FunctionName>>("eff_functions")),
88 110 : _delta_p_var_name(junctionVariableName("delta_p")),
89 110 : _isentropic_torque_var_name(junctionVariableName("isentropic_torque")),
90 110 : _dissipation_torque_var_name(junctionVariableName("dissipation_torque")),
91 110 : _friction_torque_var_name(junctionVariableName("friction_torque")),
92 220 : _moi_var_name(junctionVariableName("moment_of_inertia"))
93 : {
94 : // this determines connection ordering
95 110 : addConnection(_inlet);
96 110 : addConnection(_outlet);
97 :
98 110 : checkSizeEqualsValue<Real>("tau_fr_coeff", 4);
99 110 : checkSizeEqualsValue<Real>("inertia_coeff", 4);
100 110 : }
101 :
102 : void
103 105 : ShaftConnectedCompressor1Phase::check() const
104 : {
105 105 : VolumeJunction1Phase::check();
106 105 : checkShaftConnection(this);
107 105 : }
108 :
109 : void
110 108 : ShaftConnectedCompressor1Phase::buildVolumeJunctionUserObject()
111 : {
112 108 : const Component & c = getComponentByName<Component>(_shaft_name);
113 108 : const Shaft & scc = dynamic_cast<const Shaft &>(c);
114 108 : const VariableName omega_var_name = scc.getOmegaVariableName();
115 :
116 108 : ExecFlagEnum execute_on(MooseUtils::getDefaultExecFlagEnum());
117 432 : execute_on = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
118 :
119 : {
120 108 : const std::string class_name = "ADShaftConnectedCompressor1PhaseUserObject";
121 108 : InputParameters params = _factory.getValidParams(class_name);
122 108 : params.set<bool>("use_scalar_variables") = false;
123 108 : params.set<subdomain_id_type>("junction_subdomain_id") = _junction_subdomain_id;
124 108 : params.set<std::vector<BoundaryName>>("boundary") = _boundary_names;
125 216 : params.set<std::vector<Real>>("normals") = _normals;
126 108 : params.set<std::vector<processor_id_type>>("processor_ids") = getConnectedProcessorIDs();
127 108 : params.set<std::vector<UserObjectName>>("numerical_flux_names") = _numerical_flux_names;
128 108 : params.set<Real>("volume") = _volume;
129 324 : params.set<std::vector<VariableName>>("A") = {FlowModel::AREA};
130 324 : params.set<std::vector<VariableName>>("rhoA") = {FlowModelSinglePhase::RHOA};
131 324 : params.set<std::vector<VariableName>>("rhouA") = {FlowModelSinglePhase::RHOUA};
132 324 : params.set<std::vector<VariableName>>("rhoEA") = {FlowModelSinglePhase::RHOEA};
133 324 : params.set<std::vector<VariableName>>("rhoV") = {_rhoV_var_name};
134 324 : params.set<std::vector<VariableName>>("rhouV") = {_rhouV_var_name};
135 324 : params.set<std::vector<VariableName>>("rhovV") = {_rhovV_var_name};
136 324 : params.set<std::vector<VariableName>>("rhowV") = {_rhowV_var_name};
137 324 : params.set<std::vector<VariableName>>("rhoEV") = {_rhoEV_var_name};
138 : // the direction of the outlet channel
139 108 : params.set<Point>("di_out") = _directions[1].unit();
140 108 : params.set<Real>("omega_rated") = _omega_rated;
141 216 : params.set<bool>("treat_as_turbine") = getParam<bool>("treat_as_turbine");
142 108 : params.set<Real>("mdot_rated") = _mdot_rated;
143 108 : params.set<Real>("rho0_rated") = _rho0_rated;
144 108 : params.set<Real>("c0_rated") = _c0_rated;
145 108 : params.set<Real>("speed_cr_fr") = _speed_cr_fr;
146 108 : params.set<Real>("tau_fr_const") = _tau_fr_const;
147 108 : params.set<std::vector<Real>>("tau_fr_coeff") = _tau_fr_coeff;
148 108 : params.set<Real>("speed_cr_I") = _speed_cr_I;
149 108 : params.set<Real>("inertia_const") = _inertia_const;
150 108 : params.set<std::vector<Real>>("inertia_coeff") = _inertia_coeff;
151 108 : params.set<std::vector<Real>>("speeds") = _speeds;
152 108 : params.set<std::vector<FunctionName>>("Rp_functions") = _Rp_functions;
153 108 : params.set<std::vector<FunctionName>>("eff_functions") = _eff_functions;
154 216 : params.set<Real>("min_pressure_ratio") = getParam<Real>("min_pressure_ratio");
155 216 : params.set<Real>("max_pressure_ratio") = getParam<Real>("max_pressure_ratio");
156 324 : params.set<std::vector<VariableName>>("omega") = {omega_var_name};
157 216 : params.set<Real>("A_ref") = getParam<Real>("A_ref");
158 216 : params.set<Real>("K") = getParam<Real>("K");
159 108 : params.set<UserObjectName>("fp") = _fp_name;
160 108 : params.set<std::string>("compressor_name") = cname();
161 216 : params.set<bool>("apply_velocity_scaling") = getParam<bool>("apply_velocity_scaling");
162 108 : params.set<ExecFlagEnum>("execute_on") = execute_on;
163 108 : getTHMProblem().addUserObject(class_name, getShaftConnectedUserObjectName(), params);
164 108 : connectObject(params, _junction_uo_name, "K");
165 108 : }
166 216 : }
167 :
168 : void
169 108 : ShaftConnectedCompressor1Phase::addVariables()
170 : {
171 108 : VolumeJunction1Phase::addVariables();
172 :
173 108 : addJunctionVariable(false, _delta_p_var_name);
174 108 : addJunctionVariable(false, _isentropic_torque_var_name);
175 108 : addJunctionVariable(false, _dissipation_torque_var_name);
176 108 : addJunctionVariable(false, _friction_torque_var_name);
177 108 : addJunctionVariable(false, _moment_of_inertia_var_name);
178 :
179 108 : if (!_app.isRestarting())
180 : {
181 108 : addJunctionIC(_delta_p_var_name, 0);
182 108 : addJunctionIC(_isentropic_torque_var_name, 0);
183 108 : addJunctionIC(_dissipation_torque_var_name, 0);
184 108 : addJunctionIC(_friction_torque_var_name, 0);
185 108 : addJunctionIC(_moment_of_inertia_var_name, _inertia_const);
186 : }
187 108 : }
188 :
189 : void
190 108 : ShaftConnectedCompressor1Phase::addMooseObjects()
191 : {
192 108 : VolumeJunction1Phase::addMooseObjects();
193 :
194 : const std::vector<std::pair<std::string, VariableName>> quantities_aux = {
195 108 : {"delta_p", _delta_p_var_name},
196 108 : {"isentropic_torque", _isentropic_torque_var_name},
197 108 : {"dissipation_torque", _dissipation_torque_var_name},
198 108 : {"friction_torque", _friction_torque_var_name},
199 648 : {"moment_of_inertia", _moment_of_inertia_var_name}};
200 648 : for (const auto & quantity_and_name : quantities_aux)
201 : {
202 540 : const std::string class_name = "ShaftConnectedCompressor1PhaseAux";
203 540 : InputParameters params = _factory.getValidParams(class_name);
204 1080 : params.set<AuxVariableName>("variable") = quantity_and_name.second;
205 540 : params.set<MooseEnum>("quantity") = quantity_and_name.first;
206 1080 : params.set<UserObjectName>("compressor_uo") = getShaftConnectedUserObjectName();
207 1080 : const std::string obj_name = genName(name(), quantity_and_name.first + "_aux");
208 540 : params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
209 540 : getTHMProblem().addAuxKernel(class_name, obj_name, params);
210 540 : }
211 :
212 : const std::vector<std::string> quantities_pp = {
213 540 : "pressure_ratio", "efficiency", "rel_corrected_flow", "rel_corrected_speed"};
214 540 : for (const auto & quantity : quantities_pp)
215 : {
216 432 : const std::string class_name = "ShaftConnectedCompressor1PhasePostprocessor";
217 432 : InputParameters params = _factory.getValidParams(class_name);
218 432 : params.set<MooseEnum>("quantity") = quantity;
219 864 : params.set<UserObjectName>("compressor_uo") = getShaftConnectedUserObjectName();
220 1728 : params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
221 432 : getTHMProblem().addPostprocessor(class_name, Component::genName(name(), quantity), params);
222 432 : }
223 864 : }
|