https://mooseframework.inl.gov
Loading...
Searching...
No Matches
VolumeJunction1Phase.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 "THMMesh.h"
13
15
16const unsigned int VolumeJunction1Phase::N_EQ = 5;
17
20{
22
23 params.addRequiredParam<Real>("volume", "Volume of the junction [m^3]");
24 params.addRequiredParam<Point>("position", "Spatial position of the center of the junction [m]");
25
26 params.addParam<FunctionName>("initial_p", "Initial pressure [Pa]");
27 params.addParam<FunctionName>("initial_T", "Initial temperature [K]");
28 params.addParam<FunctionName>("initial_vel_x", "Initial velocity in x-direction [m/s]");
29 params.addParam<FunctionName>("initial_vel_y", "Initial velocity in y-direction [m/s]");
30 params.addParam<FunctionName>("initial_vel_z", "Initial velocity in z-direction [m/s]");
31
32 params.addParam<Real>("scaling_factor_rhoV", 1.0, "Scaling factor for rho*V [-]");
33 params.addParam<Real>("scaling_factor_rhouV", 1.0, "Scaling factor for rho*u*V [-]");
34 params.addParam<Real>("scaling_factor_rhovV", 1.0, "Scaling factor for rho*v*V [-]");
35 params.addParam<Real>("scaling_factor_rhowV", 1.0, "Scaling factor for rho*w*V [-]");
36 params.addParam<Real>("scaling_factor_rhoEV", 1.0, "Scaling factor for rho*E*V [-]");
37
38 params.addParam<Real>("K", 0., "Form loss factor [-]");
39 params.addParam<Real>("A_ref", "Reference area [m^2]");
40
41 params.addParam<bool>("apply_velocity_scaling",
42 false,
43 "Set to true to apply the scaling to the normal velocity. See "
44 "documentation for more information.");
45
46 params.declareControllable("K");
47 params.addClassDescription("Junction between 1-phase flow channels that has a non-zero volume");
48
49 return params;
50}
51
53 : FlowJunction1Phase(params),
54
55 _volume(getParam<Real>("volume")),
56 _position(getParam<Point>("position")),
57
58 _scaling_factor_rhoV(getParam<Real>("scaling_factor_rhoV")),
59 _scaling_factor_rhouV(getParam<Real>("scaling_factor_rhouV")),
60 _scaling_factor_rhovV(getParam<Real>("scaling_factor_rhovV")),
61 _scaling_factor_rhowV(getParam<Real>("scaling_factor_rhowV")),
62 _scaling_factor_rhoEV(getParam<Real>("scaling_factor_rhoEV")),
63
64 _rhoV_var_name(junctionVariableName("rhoV")),
65 _rhouV_var_name(junctionVariableName("rhouV")),
66 _rhovV_var_name(junctionVariableName("rhovV")),
67 _rhowV_var_name(junctionVariableName("rhowV")),
68 _rhoEV_var_name(junctionVariableName("rhoEV")),
69 _pressure_var_name(junctionVariableName("p")),
70 _temperature_var_name(junctionVariableName("T")),
71 _velocity_var_name(junctionVariableName("vel")),
72
73 _K(getParam<Real>("K")),
74 _A_ref(isParamValid("A_ref") ? getParam<Real>("A_ref") : _zero)
75{
76 // Note: 'A_ref' can be required by child classes
77 if (!params.isParamRequired("A_ref") && params.isParamSetByUser("A_ref") &&
78 !params.isParamSetByUser("K"))
79 logWarning("Parameter 'A_ref' is specified, but 'K' is not specified, so the junction will "
80 "behave as if there were no form loss.");
81}
82
83void
85{
87
88 // Add a NodeElem to the mesh
89 auto * node = addNode(_position);
90 auto * elem = addNodeElement(node->id());
92 elem->subdomain_id() = _junction_subdomain_id;
94
95 // Add coupling between the flow channel end elements and the NodeElem
96 const auto & elem_ids = getConnectedElementIDs();
97 for (unsigned int i = 0; i < elem_ids.size(); i++)
98 getTHMProblem().augmentSparsity(elem_ids[i], elem->id());
99}
100
101void
103{
105
106 bool ics_set =
108 (isParamValid("initial_p") && isParamValid("initial_T") && isParamValid("initial_vel_x") &&
109 isParamValid("initial_vel_y") && isParamValid("initial_vel_z"));
110
111 if (!ics_set && !_app.isRestarting())
112 {
113 // create a list of the missing IC parameters
114 const std::vector<std::string> ic_params{
115 "initial_p", "initial_T", "initial_vel_x", "initial_vel_y", "initial_vel_z"};
116 std::ostringstream oss;
117 for (const auto & ic_param : ic_params)
118 if (!isParamValid(ic_param))
119 oss << " " << ic_param;
120
121 logError("The following initial condition parameters are missing:", oss.str());
122 }
123
124 // https://github.com/idaholab/moose/issues/28670
125 if (getTHMProblem().hasInitialConditionsFromFile() && libMesh::n_threads() > 1 &&
126 _app.n_processors() > 1)
127 mooseDocumentedError("moose",
128 28670,
129 "Using initial conditions from a file for VolumeJunction1Phase is "
130 "currently not tested for parallel threading.");
131}
132
133void
160
161void
163{
165 execute_on = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
166
167 {
168 const std::string class_name = "ADVolumeJunction1PhaseUserObject";
169 InputParameters params = _factory.getValidParams(class_name);
170 params.set<bool>("use_scalar_variables") = false;
171 params.set<subdomain_id_type>("junction_subdomain_id") = _junction_subdomain_id;
172 params.set<std::vector<BoundaryName>>("boundary") = _boundary_names;
173 params.set<std::vector<Real>>("normals") = _normals;
174 params.set<std::vector<processor_id_type>>("processor_ids") = getConnectedProcessorIDs();
175 params.set<std::vector<UserObjectName>>("numerical_flux_names") = _numerical_flux_names;
176 params.set<Real>("volume") = _volume;
177 params.set<std::vector<VariableName>>("A") = {FlowModel::AREA};
178 params.set<std::vector<VariableName>>("rhoA") = {FlowModelSinglePhase::RHOA};
179 params.set<std::vector<VariableName>>("rhouA") = {FlowModelSinglePhase::RHOUA};
180 params.set<std::vector<VariableName>>("rhoEA") = {FlowModelSinglePhase::RHOEA};
181 params.set<std::vector<VariableName>>("rhoV") = {_rhoV_var_name};
182 params.set<std::vector<VariableName>>("rhouV") = {_rhouV_var_name};
183 params.set<std::vector<VariableName>>("rhovV") = {_rhovV_var_name};
184 params.set<std::vector<VariableName>>("rhowV") = {_rhowV_var_name};
185 params.set<std::vector<VariableName>>("rhoEV") = {_rhoEV_var_name};
186 params.set<Real>("K") = _K;
187 params.set<Real>("A_ref") = _A_ref;
188 params.set<UserObjectName>("fp") = _fp_name;
189 params.set<bool>("apply_velocity_scaling") = getParam<bool>("apply_velocity_scaling");
190 params.set<ExecFlagEnum>("execute_on") = execute_on;
191 getTHMProblem().addUserObject(class_name, _junction_uo_name, params);
192 connectObject(params, _junction_uo_name, "K");
193 }
194}
195
196void
198{
200
201 // Add BC to each of the connected flow channels
202 for (std::size_t i = 0; i < _boundary_names.size(); i++)
203 {
204 const std::vector<NonlinearVariableName> var_names = {
206 for (std::size_t j = 0; j < var_names.size(); j++)
207 {
208 const std::string class_name = "ADVolumeJunction1PhaseBC";
209 InputParameters params = _factory.getValidParams(class_name);
210 params.set<std::vector<BoundaryName>>("boundary") = {_boundary_names[i]};
211 params.set<Real>("normal") = _normals[i];
212 params.set<NonlinearVariableName>("variable") = var_names[j];
213 params.set<UserObjectName>("volume_junction_uo") = _junction_uo_name;
214 params.set<unsigned int>("connection_index") = i;
215 params.set<std::vector<VariableName>>("A_elem") = {FlowModel::AREA};
216 params.set<std::vector<VariableName>>("A_linear") = {FlowModel::AREA_LINEAR};
217 params.set<std::vector<VariableName>>("rhoA") = {FlowModelSinglePhase::RHOA};
218 params.set<std::vector<VariableName>>("rhouA") = {FlowModelSinglePhase::RHOUA};
219 params.set<std::vector<VariableName>>("rhoEA") = {FlowModelSinglePhase::RHOEA};
220 params.set<bool>("implicit") = getTHMProblem().getImplicitTimeIntegrationFlag();
222 class_name, genName(name(), i, var_names[j] + ":" + class_name), params);
223 }
224 }
225
226 // Add kernels for the junction
227 std::vector<NonlinearVariableName> var_names(N_EQ);
228 var_names[RHOV_INDEX] = _rhoV_var_name;
229 var_names[RHOUV_INDEX] = _rhouV_var_name;
230 var_names[RHOVV_INDEX] = _rhovV_var_name;
231 var_names[RHOWV_INDEX] = _rhowV_var_name;
232 var_names[RHOEV_INDEX] = _rhoEV_var_name;
233 for (std::size_t i = 0; i < N_EQ; i++)
234 {
235 {
236 const std::string class_name = "ADTimeDerivative";
237 InputParameters params = _factory.getValidParams(class_name);
238 params.set<NonlinearVariableName>("variable") = var_names[i];
239 const std::string obj_name = genName(name(), var_names[i], "td");
240 params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
241 getTHMProblem().addKernel(class_name, obj_name, params);
242 }
243 {
244 const std::string class_name = "ADVolumeJunctionAdvectionKernel";
245 InputParameters params = _factory.getValidParams(class_name);
246 params.set<NonlinearVariableName>("variable") = var_names[i];
247 params.set<UserObjectName>("volume_junction_uo") = _junction_uo_name;
248 params.set<unsigned int>("equation_index") = i;
249 const std::string obj_name = genName(name(), var_names[i], "vja_sk");
250 params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
251 getTHMProblem().addKernel(class_name, obj_name, params);
252 }
253 }
254
255 const std::vector<std::pair<std::string, VariableName>> quantities = {
256 {"pressure", _pressure_var_name},
257 {"temperature", _temperature_var_name},
258 {"speed", _velocity_var_name}};
259 for (const auto & quantity_and_name : quantities)
260 {
261 const std::string class_name = "VolumeJunction1PhaseAux";
262 InputParameters params = _factory.getValidParams(class_name);
263 params.set<AuxVariableName>("variable") = quantity_and_name.second;
264 params.set<MooseEnum>("quantity") = quantity_and_name.first;
265 params.set<Real>("volume") = _volume;
266 params.set<std::vector<VariableName>>("rhoV") = {_rhoV_var_name};
267 params.set<std::vector<VariableName>>("rhouV") = {_rhouV_var_name};
268 params.set<std::vector<VariableName>>("rhovV") = {_rhovV_var_name};
269 params.set<std::vector<VariableName>>("rhowV") = {_rhowV_var_name};
270 params.set<std::vector<VariableName>>("rhoEV") = {_rhoEV_var_name};
271 params.set<UserObjectName>("fp") = _fp_name;
272 const std::string obj_name = genName(name(), quantity_and_name.first + "_aux");
273 params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
274 getTHMProblem().addAuxKernel(class_name, obj_name, params);
275 }
276
277 // An error message results if there is any block without a material, so
278 // until this restriction is removed, we must add a dummy material that
279 // computes no material properties.
280 {
281 const std::string class_name = "GenericConstantMaterial";
282 InputParameters params = _factory.getValidParams(class_name);
283 params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
284 params.set<std::vector<std::string>>("prop_names") = {};
285 params.set<std::vector<Real>>("prop_values") = {};
286 getTHMProblem().addMaterial(class_name, genName(name(), "dummy_mat"), params);
287 }
288}
289
290std::string
291VolumeJunction1Phase::junctionVariableName(const std::string & var_base) const
292{
293 return var_base;
294}
295
296void
298 const VariableName & var,
299 Real scaling_factor)
300{
301 auto & problem = getTHMProblem();
302
303 const libMesh::FEType fe_type(CONSTANT, MONOMIAL);
304 const auto & subdomains = getSubdomainNames();
305
306 if (is_nonlinear)
307 problem.addSimVariable(is_nonlinear, var, fe_type, subdomains, scaling_factor);
308 else
309 problem.addSimVariable(is_nonlinear, var, fe_type, subdomains);
310}
311
312void
313VolumeJunction1Phase::addJunctionIC(const VariableName & var, Real value)
314{
316}
317
318void
319VolumeJunction1Phase::addVolumeJunctionIC(const VariableName & var, const std::string & quantity)
320{
321 const std::string class_name = "VolumeJunction1PhaseIC";
322 InputParameters params = _factory.getValidParams(class_name);
323 params.set<std::vector<SubdomainName>>("block") = getSubdomainNames();
324 params.set<VariableName>("variable") = var;
325 params.set<MooseEnum>("quantity") = quantity;
327 {"initial_p",
328 "initial_T",
329 "initial_vel_x",
330 "initial_vel_y",
331 "initial_vel_z",
332 "volume",
333 "position"});
334 params.set<UserObjectName>("fluid_properties") = _fp_name;
335 getTHMProblem().addSimInitialCondition(class_name, genName(name(), var, "ic"), params);
336}
const ExecFlagType EXEC_INITIAL
const ExecFlagType EXEC_LINEAR
const ExecFlagType EXEC_NONLINEAR
const std::string name
Definition Setup.h:21
registerMooseObject("ThermalHydraulicsApp", VolumeJunction1Phase)
std::vector< Real > _normals
Outward normals associated with connected components.
std::vector< BoundaryName > _boundary_names
Boundary names of connected components.
const std::vector< processor_id_type > & getConnectedProcessorIDs()
Gets the processor IDs of the connected 1D components.
const std::vector< dof_id_type > & getConnectedElementIDs()
Gets the element IDs of the connected 1D components.
subdomain_id_type _junction_subdomain_id
Junction subdomain ID.
virtual const std::vector< SubdomainName > & getSubdomainNames() const
Gets the subdomain names for this component.
Definition Component.C:345
void logError(Args &&... args) const
Logs an error.
Definition Component.h:226
Elem * addNodeElement(dof_id_type node)
Definition Component.C:211
THMProblem & getTHMProblem() const
Gets the THM problem.
Definition Component.C:135
Factory & _factory
The Factory associated with the MooseApp.
Definition Component.h:497
Node * addNode(const Point &pt)
Definition Component.C:203
virtual void setSubdomainInfo(SubdomainID subdomain_id, const std::string &subdomain_name, const Moose::CoordinateSystemType &coord_system=Moose::COORD_XYZ)
Sets the next subdomain ID, name, and coordinate system.
Definition Component.C:219
virtual void setupMesh()
Performs mesh setup such as creating mesh or naming mesh sets.
Definition Component.h:421
void connectObject(const InputParameters &obj_params, const std::string &obj_name, const std::string &param) const
Connects a controllable parameter of the component to a controllable parameter of a constituent objec...
Definition Component.C:98
THMMesh & mesh()
Non-const reference to THM mesh, which can only be called before the end of mesh setup.
Definition Component.C:60
void logWarning(Args &&... args) const
Logs a warning.
Definition Component.h:235
virtual std::vector< std::shared_ptr< UserObject > > addUserObject(const std::string &user_object_name, const std::string &name, InputParameters &parameters)
virtual void addMaterial(const std::string &material_name, const std::string &name, InputParameters &parameters)
virtual void addBoundaryCondition(const std::string &bc_name, const std::string &name, InputParameters &parameters)
virtual void addKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
virtual void addAuxKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
InputParameters getValidParams(const std::string &name) const
Base class for 1-phase flow junctions.
std::vector< UserObjectName > _numerical_flux_names
virtual void check() const override
Check the component integrity.
static InputParameters validParams()
const std::string _junction_uo_name
Name of junction user object name, if any.
UserObjectName _fp_name
Fluid property user object name.
static const std::string RHOUA
static const std::string RHOA
static const std::string RHOEA
static const std::string AREA
Definition FlowModel.h:102
static const std::string AREA_LINEAR
Definition FlowModel.h:103
void applySpecificParameters(const InputParameters &common, const std::vector< std::string > &include, bool allow_private=false)
void declareControllable(const std::string &name, std::set< ExecFlagType > execute_flags={})
bool isParamSetByUser(const std::string &name) const
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)
bool isParamRequired(const std::string &name) const
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
bool isRestarting() const
const InputParameters & parameters() const
void mooseDocumentedError(const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
bool isParamValid(const std::string &name) const
MooseApp & _app
std::string genName(const std::string &prefix, unsigned int id, const std::string &suffix="") const
Build a name from a prefix, number and possible suffix.
bool hasInitialConditionsFromFile() const
Are initial conditions specified from a file.
void addConstantIC(const VariableName &var_name, Real value, const std::vector< SubdomainName > &block_names)
Definition Simulation.C:512
virtual void augmentSparsity(const dof_id_type &elem_id1, const dof_id_type &elem_id2)
Hint how to augment sparsity pattern between two elements.
Definition Simulation.C:71
const bool & getImplicitTimeIntegrationFlag()
Gets the flag indicating whether an implicit time integration scheme is being used.
Definition Simulation.h:329
void addSimInitialCondition(const std::string &type, const std::string &name, InputParameters params)
Definition Simulation.C:495
virtual SubdomainID getNextSubdomainId()
Gets the next subdomain ID.
Definition THMMesh.C:202
Junction between 1-phase flow channels that has a non-zero volume.
const VariableName _rhovV_var_name
rho*v*V variable name for junction
const Real _volume
Volume of the junction.
const VariableName _temperature_var_name
temperature variable name for junction
const Real & _scaling_factor_rhoV
Scaling factor for rho*V.
const Real & _scaling_factor_rhovV
Scaling factor for rho*v*V.
std::string junctionVariableName(const std::string &var_base) const
Returns the name of junction variable, depending on whether scalar.
void addJunctionVariable(bool is_nonlinear, const VariableName &var, Real scaling_factor=1.0)
Adds a junction variable to the problem, as a scalar or field variable.
const Real & _scaling_factor_rhowV
Scaling factor for rho*w*V.
const VariableName _pressure_var_name
pressure variable name for junction
virtual void addVariables() override
const Real & _K
Form loss coefficient.
const VariableName _rhoEV_var_name
rho*E*V variable name for junction
static const unsigned int N_EQ
Number of equations for the junction.
const Real & _scaling_factor_rhouV
Scaling factor for rho*u*V.
const Real & _scaling_factor_rhoEV
Scaling factor for rho*E*V.
virtual void check() const override
Check the component integrity.
const VariableName _rhoV_var_name
rho*V variable name for junction
VolumeJunction1Phase(const InputParameters &params)
const Point & _position
Spatial position of center of the junction.
virtual void addMooseObjects() override
virtual void buildVolumeJunctionUserObject()
Builds user object for computing and storing the fluxes.
void addJunctionIC(const VariableName &var, Real value)
Adds a junction IC to the problem, as a scalar or field variable.
static InputParameters validParams()
const VariableName _rhowV_var_name
rho*w*V variable name for junction
void addVolumeJunctionIC(const VariableName &var, const std::string &quantity)
Adds a VolumeJunctionIC to the problem.
const VariableName _rhouV_var_name
rho*u*V variable name for junction
const VariableName _velocity_var_name
velocity variable name for junction
virtual void setupMesh() override
Performs mesh setup such as creating mesh or naming mesh sets.
const Real & _A_ref
Reference area.
processor_id_type n_processors() const
ExecFlagEnum getDefaultExecFlagEnum()
unsigned int n_threads()