https://mooseframework.inl.gov
FlowModel1PhaseBase.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 "FlowModel1PhaseBase.h"
11 #include "FlowChannel1PhaseBase.h"
12 #include "THMNames.h"
13 
16 {
18  params.addRequiredParam<UserObjectName>("numerical_flux", "Numerical flux user object name");
19  params.addRequiredParam<MooseEnum>("rdg_slope_reconstruction",
20  "Slope reconstruction type for rDG");
21  return params;
22 }
23 
25  : FlowModel(params),
26  _rdg_slope_reconstruction(params.get<MooseEnum>("rdg_slope_reconstruction")),
27  _numerical_flux_name(params.get<UserObjectName>("numerical_flux"))
28 {
29 }
30 
31 void
33 {
35 
36  const std::vector<SubdomainName> & subdomains = _flow_channel.getSubdomainNames();
37 
38  // Nonlinear variables
42 
43  // Auxiliary variables
44  _sim.addSimVariable(false, THM::DENSITY, _fe_type, subdomains);
46  {
47  _sim.addSimVariable(false, THM::VELOCITY_X, _fe_type, subdomains);
48  _sim.addSimVariable(false, THM::VELOCITY_Y, _fe_type, subdomains);
49  _sim.addSimVariable(false, THM::VELOCITY_Z, _fe_type, subdomains);
50  }
51  else
52  _sim.addSimVariable(false, THM::VELOCITY, _fe_type, subdomains);
53  _sim.addSimVariable(false, THM::PRESSURE, _fe_type, subdomains);
54  _sim.addSimVariable(false, THM::SPECIFIC_VOLUME, _fe_type, subdomains);
56  _sim.addSimVariable(false, THM::TEMPERATURE, _fe_type, subdomains);
58 
61 }
62 
63 void
65 {
67 
69  {
70  addRhoAIC();
71  addRhoUAIC();
72  addRhoEAIC();
73 
74  addFunctionIC(THM::PRESSURE, _flow_channel.getParam<FunctionName>("initial_p"));
75  addFunctionIC(THM::TEMPERATURE, _flow_channel.getParam<FunctionName>("initial_T"));
76  addVelocityIC();
77  addDensityIC();
81  }
82 }
83 
84 bool
86 {
87  const auto & flow_channel_1phase_base =
88  dynamic_cast<const FlowChannel1PhaseBase &>(_flow_channel);
89 
90  for (const auto & param : flow_channel_1phase_base.ICParameters())
91  if (!_flow_channel.isParamValid(param))
92  return false;
93 
94  return true;
95 }
96 
97 void
98 FlowModel1PhaseBase::addFunctionIC(const VariableName & var_name,
99  const FunctionName & function_name)
100 {
101  const std::string class_name = "FunctionIC";
102  InputParameters params = _factory.getValidParams(class_name);
103  params.set<VariableName>("variable") = var_name;
104  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
105  params.set<FunctionName>("function") = function_name;
106  _sim.addSimInitialCondition(class_name, genName(_comp_name, var_name + "_ic"), params);
107 }
108 
109 void
111 {
112  const std::string class_name = "VariableProductIC";
113  InputParameters params = _factory.getValidParams(class_name);
114  params.set<VariableName>("variable") = THM::RHOA;
115  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
116  params.set<std::vector<VariableName>>("values") = {THM::DENSITY, THM::AREA};
117  _sim.addSimInitialCondition(class_name, genName(_comp_name, "rhoA_ic"), params);
118 }
119 
120 void
122 {
123  const std::string class_name = "VariableFunctionProductIC";
124  InputParameters params = _factory.getValidParams(class_name);
125  params.set<VariableName>("variable") = THM::RHOUA;
126  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
127  params.set<std::vector<VariableName>>("var") = {THM::RHOA};
128  params.set<FunctionName>("fn") = _flow_channel.getParam<FunctionName>("initial_vel");
129  _sim.addSimInitialCondition(class_name, genName(_comp_name, "rhouA_ic"), params);
130 }
131 
132 void
134 {
136  {
137  std::vector<VariableName> var_name = {THM::VELOCITY_X, THM::VELOCITY_Y, THM::VELOCITY_Z};
138  for (const auto i : make_range(Moose::dim))
139  {
140  const std::string class_name = "VectorVelocityIC";
141  InputParameters params = _factory.getValidParams(class_name);
142  params.set<VariableName>("variable") = var_name[i];
143  params.set<FunctionName>("vel_fn") = _flow_channel.getParam<FunctionName>("initial_vel");
144  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
145  params.set<unsigned int>("component") = i;
146  _sim.addSimInitialCondition(class_name, genName(_comp_name, "vel_ic", i), params);
147  }
148  }
149  else
150  addFunctionIC(THM::VELOCITY, _flow_channel.getParam<FunctionName>("initial_vel"));
151 }
152 
153 void
155 {
156  const std::string class_name = "SpecificVolumeIC";
157  InputParameters params = _factory.getValidParams(class_name);
158  params.set<VariableName>("variable") = THM::SPECIFIC_VOLUME;
159  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
160  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
161  params.set<std::vector<VariableName>>("A") = {THM::AREA};
162  _sim.addSimInitialCondition(class_name, genName(_comp_name, "v_ic"), params);
163 }
164 
165 void
167 {
168  const std::string class_name = "SpecificInternalEnergyIC";
169  InputParameters params = _factory.getValidParams(class_name);
170  params.set<VariableName>("variable") = THM::SPECIFIC_INTERNAL_ENERGY;
171  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
172  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
173  params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
174  params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
175  _sim.addSimInitialCondition(class_name, genName(_comp_name, "e_ic"), params);
176 }
177 
178 void
180 {
181  const std::string class_name = "SpecificTotalEnthalpyIC";
182  InputParameters params = _factory.getValidParams(class_name);
183  params.set<VariableName>("variable") = THM::SPECIFIC_TOTAL_ENTHALPY;
184  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
185  params.set<std::vector<VariableName>>("p") = {THM::PRESSURE};
186  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
187  params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
188  params.set<std::vector<VariableName>>("A") = {THM::AREA};
189  _sim.addSimInitialCondition(class_name, genName(_comp_name, "H_ic"), params);
190 }
191 
192 void
194 {
196 
197  addKernels();
198  addDGKernels();
199  addAuxKernels();
203 }
204 
205 void
207 {
208  // Mass equation
210 
211  // Momentum equation
216 
217  // Energy equation
220 }
221 
222 void
224 {
226  {
227  const std::string class_name = "ADTimeDerivative";
228  InputParameters params = _factory.getValidParams(class_name);
229  params.set<NonlinearVariableName>("variable") = var_name;
230  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
231  _sim.addKernel(class_name, genName(_comp_name, var_name + "_td"), params);
232  }
233 }
234 
235 void
237 {
238  const std::string class_name = "ADOneD3EqnMomentumAreaGradient";
239  InputParameters params = _factory.getValidParams(class_name);
240  params.set<NonlinearVariableName>("variable") = THM::RHOUA;
241  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
242  params.set<std::vector<VariableName>>("A") = {THM::AREA_LINEAR};
243  params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
244  params.set<MaterialPropertyName>("p") = THM::PRESSURE;
245  _sim.addKernel(class_name, genName(_comp_name, "mom_area_grad"), params);
246 }
247 
248 void
250 {
251  const std::string class_name = "ADOneD3EqnMomentumFriction";
252  InputParameters params = _factory.getValidParams(class_name);
253  params.set<NonlinearVariableName>("variable") = THM::RHOUA;
254  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
255  params.set<std::vector<VariableName>>("A") = {THM::AREA};
256  params.set<MaterialPropertyName>("D_h") = {THM::HYDRAULIC_DIAMETER};
257  params.set<MaterialPropertyName>("rho") = THM::DENSITY;
258  params.set<MaterialPropertyName>("vel") = THM::VELOCITY;
259  params.set<MaterialPropertyName>("f_D") = THM::FRICTION_FACTOR_DARCY;
260  _sim.addKernel(class_name, genName(_comp_name, "mom_friction"), params);
261 }
262 
263 void
265 {
266  const std::string class_name = "ADOneD3EqnMomentumGravity";
267  InputParameters params = _factory.getValidParams(class_name);
268  params.set<NonlinearVariableName>("variable") = THM::RHOUA;
269  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
270  params.set<std::vector<VariableName>>("A") = {THM::AREA};
271  params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
272  params.set<MaterialPropertyName>("rho") = THM::DENSITY;
273  params.set<RealVectorValue>("gravity_vector") = _gravity_vector;
274  _sim.addKernel(class_name, genName(_comp_name, "mom_gravity"), params);
275 }
276 
277 void
279 {
280  const std::string class_name = "ADOneD3EqnEnergyGravity";
281  InputParameters params = _factory.getValidParams(class_name);
282  params.set<NonlinearVariableName>("variable") = THM::RHOEA;
283  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
284  params.set<std::vector<VariableName>>("A") = {THM::AREA};
285  params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
286  params.set<MaterialPropertyName>("rho") = THM::DENSITY;
287  params.set<MaterialPropertyName>("vel") = THM::VELOCITY;
288  params.set<RealVectorValue>("gravity_vector") = _gravity_vector;
289  _sim.addKernel(class_name, genName(_comp_name, "energy_gravity"), params);
290 }
291 
292 void
294 {
295 }
296 
297 void
299 {
300  addPressureAux();
302  addVelocityAux();
303  addDensityAux();
307 }
308 
309 void
311 {
313  {
314  std::vector<AuxVariableName> var_names = {THM::VELOCITY_X, THM::VELOCITY_Y, THM::VELOCITY_Z};
315  for (const auto i : make_range(Moose::dim))
316  {
317  const std::string class_name = "ADVectorVelocityComponentAux";
318  InputParameters params = _factory.getValidParams(class_name);
319  params.set<AuxVariableName>("variable") = var_names[i];
320  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
321  params.set<std::vector<VariableName>>("arhoA") = {THM::RHOA};
322  params.set<std::vector<VariableName>>("arhouA") = {THM::RHOUA};
323  params.set<MaterialPropertyName>("direction") = THM::DIRECTION;
324  params.set<unsigned int>("component") = i;
325  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
326  _sim.addAuxKernel(class_name, genName(_comp_name, i, "vel_vec"), params);
327  }
328  }
329  else
330  {
331  const std::string class_name = "QuotientAux";
332  InputParameters params = _factory.getValidParams(class_name);
333  params.set<AuxVariableName>("variable") = THM::VELOCITY;
334  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
335  params.set<std::vector<VariableName>>("numerator") = {THM::RHOUA};
336  params.set<std::vector<VariableName>>("denominator") = {THM::RHOA};
337  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
338  _sim.addAuxKernel(class_name, genName(_comp_name, "vel"), params);
339  }
340 }
341 
342 void
344 {
345  const std::string class_name = "QuotientAux";
346  InputParameters params = _factory.getValidParams(class_name);
347  params.set<AuxVariableName>("variable") = THM::DENSITY;
348  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
349  params.set<std::vector<VariableName>>("numerator") = {THM::RHOA};
350  params.set<std::vector<VariableName>>("denominator") = {THM::AREA};
351  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
352  _sim.addAuxKernel(class_name, genName(_comp_name, "rho_aux"), params);
353 }
354 
355 void
357 {
358  const std::string class_name = "THMSpecificVolumeAux";
359  InputParameters params = _factory.getValidParams(class_name);
360  params.set<AuxVariableName>("variable") = THM::SPECIFIC_VOLUME;
361  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
362  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
363  params.set<std::vector<VariableName>>("A") = {THM::AREA};
364  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
365  _sim.addAuxKernel(class_name, genName(_comp_name, "v_aux"), params);
366 }
367 
368 void
370 {
371  const std::string class_name = "THMSpecificInternalEnergyAux";
372  InputParameters params = _factory.getValidParams(class_name);
373  params.set<AuxVariableName>("variable") = THM::SPECIFIC_INTERNAL_ENERGY;
374  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
375  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
376  params.set<std::vector<VariableName>>("rhouA") = {THM::RHOUA};
377  params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
378  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
379  _sim.addAuxKernel(class_name, genName(_comp_name, "e_aux"), params);
380 }
381 
382 void
384 {
385  const std::string class_name = "SpecificTotalEnthalpyAux";
386  InputParameters params = _factory.getValidParams(class_name);
387  params.set<AuxVariableName>("variable") = THM::SPECIFIC_TOTAL_ENTHALPY;
388  params.set<std::vector<SubdomainName>>("block") = _flow_channel.getSubdomainNames();
389  params.set<std::vector<VariableName>>("rhoA") = {THM::RHOA};
390  params.set<std::vector<VariableName>>("rhoEA") = {THM::RHOEA};
391  params.set<std::vector<VariableName>>("p") = {THM::PRESSURE};
392  params.set<std::vector<VariableName>>("A") = {THM::AREA};
393  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_TIMESTEP_END};
394  _sim.addAuxKernel(class_name, genName(_comp_name, "H_auxkernel"), params);
395 }
396 
397 void
399 {
402 }
virtual Real getScalingFactorRhoEA() const =0
virtual void addRDGAdvectionDGKernels()=0
Adds DG kernels.
virtual void addInitialConditions() override
Add initial conditions.
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.
virtual void addDGKernels()
Adds the DG kernels.
static const std::string SPECIFIC_INTERNAL_ENERGY
Definition: THMNames.h:36
virtual void addMomentumFrictionKernel()
static const std::string RHOEA
Definition: THMNames.h:30
const bool & _output_vector_velocity
True if we output velocity as a vector-value field, false for outputting velocity as a scalar...
Definition: FlowModel.h:82
static InputParameters validParams()
virtual void addSpecificInternalEnergyIC()
static const std::string VELOCITY_Z
Definition: THMNames.h:46
virtual void addAuxKernels()
Adds the aux kernels.
virtual void addSpecificTotalEnthalpyIC()
virtual std::vector< VariableName > solutionVariableNames() const =0
Returns the solution variable names for the flow model.
virtual void addMooseObjects() override
Add MOOSE objects this model uses.
virtual void addRDGMooseObjects()
Adds RDG objects.
Provides functions to setup the flow model.
Definition: FlowModel.h:27
T & set(const std::string &name, bool quiet_mode=false)
virtual void addCommonInitialConditions()
Adds initial conditions common to any flow model.
Definition: FlowModel.C:80
virtual void addFluidPropertiesMaterials()=0
Adds materials to compute fluid properties.
InputParameters getValidParams(const std::string &name) const
bool ICParametersAreValid() const
Returns true if all of the IC parameters are valid.
static constexpr std::size_t dim
static InputParameters validParams()
Definition: FlowModel.C:19
static const std::string FRICTION_FACTOR_DARCY
Definition: THMNames.h:19
const ExecFlagType EXEC_TIMESTEP_END
virtual void addAuxKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
virtual void addSpecificInternalEnergyAux()
virtual void addKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
FlowChannelBase & _flow_channel
The flow channel component that built this class.
Definition: FlowModel.h:59
void addRequiredParam(const std::string &name, const std::string &doc_string)
static const std::string TEMPERATURE
Definition: THMNames.h:39
virtual void addNumericalFluxUserObject()=0
Adds numerical flux user object.
virtual Real getScalingFactorRhoA() const =0
bool isParamValid(const std::string &name) const
virtual void addMomentumAreaGradientKernel()
static const std::string AREA_LINEAR
Definition: THMNames.h:15
void addSimVariable(bool nl, const VariableName &name, libMesh::FEType fe_type, Real scaling_factor=1.0)
Queues a variable of type MooseVariableScalar to be added to the nonlinear or aux system...
Definition: Simulation.C:271
static const std::string PRESSURE
Definition: THMNames.h:27
virtual void addEnergyGravityKernel()
virtual void addPressureAux()=0
static const std::string VELOCITY_Y
Definition: THMNames.h:45
static const std::string HYDRAULIC_DIAMETER
Definition: THMNames.h:23
bool problemIsTransient() const
Whether the problem is transient.
Definition: Component.h:252
virtual void addCommonVariables()
Adds variables common to any flow model (A, P_hf, ...)
Definition: FlowModel.C:70
FlowModel1PhaseBase(const InputParameters &params)
virtual void addRhoEAIC()=0
const T & getParam(const std::string &name) const
static const std::string VELOCITY
Definition: THMNames.h:43
const libMesh::FEType & _fe_type
The type of FE used for flow.
Definition: FlowModel.h:62
Factory & _factory
The Factory associated with the MooseApp.
Definition: FlowModel.h:56
const RealVectorValue & _gravity_vector
Gravitational acceleration vector.
Definition: FlowModel.h:71
static const std::string AREA
Definition: THMNames.h:14
static const std::string SPECIFIC_VOLUME
Definition: THMNames.h:38
static const std::string DIRECTION
Definition: THMNames.h:17
virtual void addSlopeReconstructionMaterial()=0
Adds slope reconstruction material.
void addSimInitialCondition(const std::string &type, const std::string &name, InputParameters params)
Definition: Simulation.C:495
virtual void addDensityIC()=0
virtual void addVelocityIC()
void addTimeDerivativeKernelIfTransient(const VariableName &var_name)
Adds a time derivative kernel for the given variable if problem is transient.
virtual void addVariables() override
Add variables the model uses.
virtual void addDensityAux()
static const std::string VELOCITY_X
Definition: THMNames.h:44
IntRange< T > make_range(T beg, T end)
virtual void addKernels()
Adds the kernels.
std::vector< VariableName > _solution_vars
Definition: FlowModel.h:76
static const std::string RHOUA
Definition: THMNames.h:31
virtual const std::vector< SubdomainName > & getSubdomainNames() const
Gets the subdomain names for this component.
Definition: Component.C:307
virtual Real getScalingFactorRhoUA() const =0
virtual void addCommonMooseObjects()
Adds common MOOSE objects.
Definition: FlowModel.C:112
const std::string _comp_name
The component name.
Definition: FlowModel.h:68
virtual void addSpecificTotalEnthalpyAux()
THMProblem & _sim
Definition: FlowModel.h:53
virtual void addSpecificVolumeAux()
virtual void addMomentumGravityKernel()
Base class for single-phase flow channels.
void addFunctionIC(const VariableName &var_name, const FunctionName &function_name)
Adds an IC from a function.
virtual void addVelocityAux()
static const std::string RHOA
Definition: THMNames.h:29
virtual void addSpecificVolumeIC()
const Elem & get(const ElemType type_in)
static const std::string SPECIFIC_TOTAL_ENTHALPY
Definition: THMNames.h:37
virtual void addTemperatureAux()=0
std::vector< VariableName > _derivative_vars
Definition: FlowModel.h:79
static const std::string DENSITY
Definition: THMNames.h:16
const ExecFlagType EXEC_INITIAL