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