https://mooseframework.inl.gov
WCNSFVFluidHeatTransferPhysics.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 
11 #include "WCNSFVFlowPhysics.h"
12 #include "NSFVBase.h"
13 
16 
19 {
21  params.transferParam<MooseEnum>(NSFVBase::validParams(), "energy_face_interpolation");
22  params.transferParam<Real>(NSFVBase::validParams(), "energy_scaling");
23 
24  params.addParamNamesToGroup("energy_face_interpolation energy_scaling", "Numerical scheme");
25  return params;
26 }
27 
30 {
32  paramError("solve_for_enthalpy", "Enthalpy solve not supported at this time with Physics");
33 }
34 
35 void
37 {
38  // For compatibility with Modules/NavierStokesFV syntax
40  return;
41 
42  // Dont add if the user already defined the variable
43  if (!shouldCreateVariable(_fluid_temperature_name, _blocks, /*error if aux*/ true))
44  reportPotentiallyMissedParameters({"system_names",
45  "energy_scaling",
46  "energy_face_interpolation",
47  "energy_two_term_bc_expansion"},
48  "INSFVEnergyVariable");
49  else if (_define_variables)
50  {
51  auto params = getFactory().getValidParams("INSFVEnergyVariable");
52  assignBlocks(params, _blocks);
53  params.set<std::vector<Real>>("scaling") = {getParam<Real>("energy_scaling")};
54  params.set<MooseEnum>("face_interp_method") = getParam<MooseEnum>("energy_face_interpolation");
55  params.set<bool>("two_term_boundary_expansion") =
56  getParam<bool>("energy_two_term_bc_expansion");
57  params.set<SolverSystemName>("solver_sys") = getSolverSystem(_fluid_temperature_name);
58  getProblem().addVariable("INSFVEnergyVariable", _fluid_temperature_name, params);
59  }
60  else
61  paramError("fluid_temperature_variable",
62  "Variable (" + _fluid_temperature_name +
63  ") supplied to the WCNSFVFluidHeatTransferPhysics does not exist!");
64 }
65 
66 void
68 {
69  std::string kernel_type =
70  ((_compressibility == "weakly-compressible") ? "WCNSFVEnergyTimeDerivative"
71  : "INSFVEnergyTimeDerivative");
72  std::string kernel_name =
73  prefix() + ((_compressibility == "weakly-compressible") ? "wcns" : "ins") + "_energy_time";
75  {
76  kernel_type = "PINSFVEnergyTimeDerivative";
77  kernel_name = prefix() + ((_compressibility == "weakly-compressible") ? "pwcns" : "pins") +
78  "_energy_time";
79  }
80 
81  InputParameters params = getFactory().getValidParams(kernel_type);
82  assignBlocks(params, _blocks);
83  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
84  params.set<MooseFunctorName>(NS::density) = _density_name;
85  params.set<MooseFunctorName>(NS::time_deriv(NS::specific_enthalpy)) =
87  if (_compressibility == "weakly-compressible")
88  {
89  params.set<MooseFunctorName>(NS::time_deriv(NS::density)) = NS::time_deriv(_density_name);
90  params.set<MooseFunctorName>(NS::specific_enthalpy) = NS::specific_enthalpy;
91  }
93  {
94  params.set<MooseFunctorName>(NS::porosity) =
96  if (getProblem().hasFunctor(NS::time_deriv(_density_name),
97  /*thread_id=*/0))
98  {
99  params.set<MooseFunctorName>(NS::time_deriv(NS::density)) = NS::time_deriv(_density_name);
100  params.set<MooseFunctorName>(NS::specific_enthalpy) = NS::specific_enthalpy;
101  }
102 
103  params.set<bool>("is_solid") = false;
104  }
105 
106  getProblem().addFVKernel(kernel_type, kernel_name, params);
107 }
108 
109 void
111 {
112  std::string kernel_type = "INSFVEnergyAdvection";
113  std::string kernel_name = prefix() + "ins_energy_advection";
115  {
116  kernel_type = "PINSFVEnergyAdvection";
117  kernel_name = prefix() + "pins_energy_advection";
118  }
119 
120  InputParameters params = getFactory().getValidParams(kernel_type);
121  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
122  assignBlocks(params, _blocks);
123  params.set<MooseEnum>("velocity_interp_method") = _velocity_interpolation;
124  params.set<UserObjectName>("rhie_chow_user_object") = _flow_equations_physics->rhieChowUOName();
125  params.set<MooseEnum>("advected_interp_method") =
126  getParam<MooseEnum>("energy_advection_interpolation");
127 
128  getProblem().addFVKernel(kernel_type, kernel_name, params);
129 }
130 
131 void
133 {
134  const auto vector_conductivity = processThermalConductivity();
135  const auto num_blocks = _thermal_conductivity_blocks.size();
136  const auto num_used_blocks = num_blocks ? num_blocks : 1;
137 
138  for (const auto block_i : make_range(num_used_blocks))
139  {
140  std::string block_name = "";
141  if (num_blocks)
142  block_name = Moose::stringify(_thermal_conductivity_blocks[block_i]);
143  else
144  block_name = "all";
145 
147  {
148  const auto kernel_type =
149  vector_conductivity ? "PINSFVEnergyAnisotropicDiffusion" : "PINSFVEnergyDiffusion";
150 
151  InputParameters params = getFactory().getValidParams(kernel_type);
152  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
153  const auto block_names = num_blocks ? _thermal_conductivity_blocks[block_i] : _blocks;
154  assignBlocks(params, block_names);
155  const auto conductivity_name = vector_conductivity ? NS::kappa : NS::k;
156  params.set<MooseFunctorName>(conductivity_name) = _thermal_conductivity_name[block_i];
157  params.set<MooseFunctorName>(NS::porosity) =
159  params.set<bool>("effective_conductivity") = getParam<bool>("effective_conductivity");
160 
162  kernel_type, prefix() + "pins_energy_diffusion_" + block_name, params);
163  }
164  else
165  {
166  const std::string kernel_type = "FVDiffusion";
167  InputParameters params = getFactory().getValidParams(kernel_type);
168  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
169  std::vector<SubdomainName> block_names =
170  num_blocks ? _thermal_conductivity_blocks[block_i] : _blocks;
171  assignBlocks(params, block_names);
172  params.set<MooseFunctorName>("coeff") = _thermal_conductivity_name[block_i];
173 
175  kernel_type, prefix() + "ins_energy_diffusion_" + block_name, params);
176  }
177  }
178 }
179 
180 void
182 {
183  unsigned int num_convection_blocks = _ambient_convection_blocks.size();
184  unsigned int num_used_blocks = num_convection_blocks ? num_convection_blocks : 1;
185 
186  const std::string kernel_type = "PINSFVEnergyAmbientConvection";
187  InputParameters params = getFactory().getValidParams(kernel_type);
188  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
189  params.set<MooseFunctorName>(NS::T_fluid) = _fluid_temperature_name;
190  params.set<bool>("is_solid") = false;
191 
192  for (unsigned int block_i = 0; block_i < num_used_blocks; ++block_i)
193  {
194  std::string block_name = "";
195  if (num_convection_blocks)
196  {
197  params.set<std::vector<SubdomainName>>("block") = _ambient_convection_blocks[block_i];
198  block_name = Moose::stringify(_ambient_convection_blocks[block_i]);
199  }
200  else
201  {
202  assignBlocks(params, _blocks);
203  block_name = std::to_string(block_i);
204  }
205 
206  params.set<MooseFunctorName>("h_solid_fluid") = _ambient_convection_alpha[block_i];
207  params.set<MooseFunctorName>(NS::T_solid) = _ambient_temperature[block_i];
208 
209  getProblem().addFVKernel(kernel_type, prefix() + "ambient_convection_" + block_name, params);
210  }
211 }
212 
213 void
215 {
216  const std::string kernel_type = "FVCoupledForce";
217  InputParameters params = getFactory().getValidParams(kernel_type);
218  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
219  assignBlocks(params, _blocks);
220  params.set<MooseFunctorName>("v") = getParam<MooseFunctorName>("external_heat_source");
221  params.set<Real>("coef") = getParam<Real>("external_heat_source_coeff");
222 
223  getProblem().addFVKernel(kernel_type, prefix() + "external_heat_source", params);
224 }
225 
226 void
228 {
229  const auto & inlet_boundaries = _flow_equations_physics->getInletBoundaries();
230  // These are parameter errors for now. If Components add boundaries to Physics, the error
231  // may not be due to parameters anymore.
232  if (inlet_boundaries.size() != _energy_inlet_types.size())
233  paramError("energy_inlet_types",
234  "Energy inlet types (size " + std::to_string(_energy_inlet_types.size()) +
235  ") should be the same size as inlet_boundaries (size " +
236  std::to_string(inlet_boundaries.size()) + ")");
237  if (inlet_boundaries.size() != _energy_inlet_functors.size())
238  paramError("energy_inlet_functors",
239  "Energy inlet functors (size " + std::to_string(_energy_inlet_functors.size()) +
240  ") should be the same size as inlet_boundaries (size " +
241  std::to_string(inlet_boundaries.size()) + ")");
242 
243  unsigned int flux_bc_counter = 0;
244  for (const auto bc_ind : index_range(_energy_inlet_types))
245  {
246  if (_energy_inlet_types[bc_ind] == "fixed-temperature")
247  {
248  const std::string bc_type = "FVADFunctorDirichletBC";
249  InputParameters params = getFactory().getValidParams(bc_type);
250  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
251  params.set<MooseFunctorName>("functor") = _energy_inlet_functors[bc_ind];
252  params.set<std::vector<BoundaryName>>("boundary") = {inlet_boundaries[bc_ind]};
253 
255  bc_type, _fluid_temperature_name + "_" + inlet_boundaries[bc_ind], params);
256  }
257  else if (_energy_inlet_types[bc_ind] == "heatflux")
258  {
259  const std::string bc_type = "FVFunctionNeumannBC";
260  InputParameters params = getFactory().getValidParams(bc_type);
261  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
262  params.set<FunctionName>("function") = _energy_inlet_functors[bc_ind];
263  params.set<std::vector<BoundaryName>>("boundary") = {inlet_boundaries[bc_ind]};
264 
266  bc_type, _fluid_temperature_name + "_" + inlet_boundaries[bc_ind], params);
267  }
268  else if (_energy_inlet_types[bc_ind] == "flux-mass" ||
269  _energy_inlet_types[bc_ind] == "flux-velocity")
270  {
271  const std::string bc_type = "WCNSFVEnergyFluxBC";
272  InputParameters params = getFactory().getValidParams(bc_type);
273  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
274  const auto flux_inlet_directions = _flow_equations_physics->getFluxInletDirections();
275  const auto flux_inlet_pps = _flow_equations_physics->getFluxInletPPs();
276 
277  if (flux_inlet_directions.size())
278  params.set<Point>("direction") = flux_inlet_directions[flux_bc_counter];
279  if (_energy_inlet_types[bc_ind] == "flux-mass")
280  {
281  params.set<PostprocessorName>("mdot_pp") = flux_inlet_pps[flux_bc_counter];
282  params.set<PostprocessorName>("area_pp") = "area_pp_" + inlet_boundaries[bc_ind];
283  }
284  else
285  params.set<PostprocessorName>("velocity_pp") = flux_inlet_pps[flux_bc_counter];
286 
287  params.set<PostprocessorName>("temperature_pp") = _energy_inlet_functors[bc_ind];
288  params.set<MooseFunctorName>(NS::density) = _density_name;
289  params.set<MooseFunctorName>(NS::cp) = _specific_heat_name;
290  params.set<MooseFunctorName>(NS::T_fluid) = _fluid_temperature_name;
291 
292  for (const auto d : make_range(dimension()))
293  params.set<MooseFunctorName>(NS::velocity_vector[d]) = _velocity_names[d];
294 
295  params.set<std::vector<BoundaryName>>("boundary") = {inlet_boundaries[bc_ind]};
296 
298  bc_type, _fluid_temperature_name + "_" + inlet_boundaries[bc_ind], params);
299  flux_bc_counter += 1;
300  }
301  }
302 }
303 
304 void
306 {
307  const auto & wall_boundaries = isParamSetByUser("energy_wall_boundaries")
308  ? getParam<std::vector<BoundaryName>>("energy_wall_boundaries")
310  if (wall_boundaries.size() != _energy_wall_types.size())
311  paramError("energy_wall_types",
312  "Energy wall types (size " + std::to_string(_energy_wall_types.size()) +
313  ") should be the same size as wall_boundaries (size " +
314  std::to_string(wall_boundaries.size()) + ")");
315  if (wall_boundaries.size() != _energy_wall_functors.size())
316  paramError("energy_wall_functors",
317  "Energy wall functors (size " + std::to_string(_energy_wall_functors.size()) +
318  ") should be the same size as wall_boundaries (size " +
319  std::to_string(wall_boundaries.size()) + ")");
320 
321  for (unsigned int bc_ind = 0; bc_ind < _energy_wall_types.size(); ++bc_ind)
322  {
323  if (_energy_wall_types[bc_ind] == "fixed-temperature")
324  {
325  const std::string bc_type = "FVADFunctorDirichletBC";
326  InputParameters params = getFactory().getValidParams(bc_type);
327  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
328  params.set<MooseFunctorName>("functor") = _energy_wall_functors[bc_ind];
329  params.set<std::vector<BoundaryName>>("boundary") = {wall_boundaries[bc_ind]};
330 
332  bc_type, _fluid_temperature_name + "_" + wall_boundaries[bc_ind], params);
333  }
334  else if (_energy_wall_types[bc_ind] == "heatflux")
335  {
336  const std::string bc_type = "FVFunctorNeumannBC";
337  InputParameters params = getFactory().getValidParams(bc_type);
338  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
339  params.set<MooseFunctorName>("functor") = _energy_wall_functors[bc_ind];
340  params.set<std::vector<BoundaryName>>("boundary") = {wall_boundaries[bc_ind]};
341 
343  bc_type, _fluid_temperature_name + "_" + wall_boundaries[bc_ind], params);
344  }
345  else if (_energy_wall_types[bc_ind] == "convection")
346  {
347  const std::string bc_type = "FVFunctorConvectiveHeatFluxBC";
348  InputParameters params = getFactory().getValidParams(bc_type);
349  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
350  params.set<MooseFunctorName>("T_bulk") = _fluid_temperature_name;
351  params.set<std::vector<BoundaryName>>("boundary") = {wall_boundaries[bc_ind]};
352  params.set<bool>("is_solid") = false;
353  const auto Tinf_htc_functors =
354  MooseUtils::split(_energy_wall_functors[bc_ind], /*delimiter=*/":", /*max_count=*/1);
355  if (Tinf_htc_functors.size() != 2)
356  paramError("energy_wall_functors",
357  "'convective' wall types require two functors specified as "
358  "<Tinf_functor>:<htc_functor>.");
359  params.set<MooseFunctorName>("T_solid") = Tinf_htc_functors[0];
360  params.set<MooseFunctorName>("heat_transfer_coefficient") = Tinf_htc_functors[1];
361 
363  bc_type, _fluid_temperature_name + "_" + wall_boundaries[bc_ind], params);
364  }
365  // We add this boundary condition here to facilitate the input of wall boundaries / functors for
366  // energy. If there are too many turbulence options and this gets out of hand we will have to
367  // move this to the turbulence Physics
368  else if (_energy_wall_types[bc_ind] == "wallfunction")
369  {
370  if (!_turbulence_physics)
371  paramError("coupled_turbulence_physics",
372  "A coupled turbulence Physics was not found for defining the wall function "
373  "boundary condition on boundary: " +
374  wall_boundaries[bc_ind]);
375  const std::string bc_type = "INSFVTurbulentTemperatureWallFunction";
376  InputParameters params = getFactory().getValidParams(bc_type);
377  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
378  params.set<std::vector<BoundaryName>>("boundary") = {wall_boundaries[bc_ind]};
379  params.set<MooseEnum>("wall_treatment") =
381  params.set<MooseFunctorName>("T_w") = _energy_wall_functors[bc_ind];
382  params.set<MooseFunctorName>(NS::density) = _density_name;
383  params.set<MooseFunctorName>(NS::mu) = _dynamic_viscosity_name;
384  params.set<MooseFunctorName>(NS::TKE) = _turbulence_physics->tkeName();
385  if (_thermal_conductivity_name.size() != 1)
386  mooseError("Several anisotropic thermal conductivity (kappa) regions have been specified. "
387  "Selecting the right kappa coefficient for the turbulence boundaries is not "
388  "currently implemented.\nBoundaries:\n" +
390  "\nKappa(s) specified:\n" + Moose::stringify(_thermal_conductivity_name));
391  params.set<MooseFunctorName>(NS::kappa) = _thermal_conductivity_name[0];
392  params.set<MooseFunctorName>(NS::cp) = _specific_heat_name;
393  const std::string u_names[3] = {"u", "v", "w"};
394  for (const auto d : make_range(dimension()))
395  params.set<MooseFunctorName>(u_names[d]) = _velocity_names[d];
396  // Currently only Newton method for WCNSFVFluidHeatTransferPhysics
397  params.set<bool>("newton_solve") = true;
398  getProblem().addFVBC(bc_type, prefix() + "wallfunction_" + wall_boundaries[bc_ind], params);
399  }
400  else
401  paramError(
402  "energy_wall_types", _energy_wall_types[bc_ind], " wall type is currently unsupported.");
403  }
404 }
405 
406 void
408 {
410  {
411  const std::string bc_type = "INSFVScalarFieldSeparatorBC";
412  InputParameters params = getFactory().getValidParams(bc_type);
413  params.set<NonlinearVariableName>("variable") = _fluid_temperature_name;
414  params.set<std::vector<BoundaryName>>("boundary") =
416  getProblem().addFVBC(bc_type, prefix() + _fluid_temperature_name + "_separators", params);
417  }
418 }
std::string prefix() const
static InputParameters validParams()
Definition: NSFVBase.C:368
MooseFunctorName _specific_heat_name
Name of the specific heat material property.
Creates all the objects needed to solve the Navier Stokes energy equation.
void assignBlocks(InputParameters &params, const std::vector< SubdomainName > &blocks) const
bool shouldCreateVariable(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool error_if_aux)
const MooseFunctorName _density_name
Name of the density material property.
Factory & getFactory()
const std::vector< BoundaryName > & getInletBoundaries() const
Get the inlet boundaries.
std::vector< MooseFunctorName > _ambient_temperature
Name of the solid domain temperature for each block-group.
static const std::string T_solid
Definition: NS.h:107
T & set(const std::string &name, bool quiet_mode=false)
MooseEnum turbulenceTemperatureWallTreatment() const
The turbulence temperature wall treatment (same for all turbulence walls currently) ...
static const std::string density
Definition: NS.h:33
InputParameters getValidParams(const std::string &name) const
static const std::string TKE
Definition: NS.h:176
unsigned int size() const
VariableName _fluid_temperature_name
Fluid temperature name.
std::vector< std::vector< SubdomainName > > _ambient_convection_blocks
Vector of subdomain groups where we want to have different ambient convection.
const MooseFunctorName _dynamic_viscosity_name
Name of the dynamic viscosity material property.
MultiMooseEnum _energy_wall_types
Energy wall boundary types.
const std::vector< BoundaryName > & getHydraulicSeparators() const
Get the hydraulic separator boundaries.
std::vector< SubdomainName > _blocks
unsigned int dimension() const
std::vector< MooseFunctorName > _energy_wall_functors
Functors describing the wall boundary values. See energy_wall_types for what the functors actually re...
const WCNSFVTurbulencePhysics * _turbulence_physics
Turbulence.
std::vector< std::string > split(const std::string &str, const std::string &delimiter, std::size_t max_count=std::numeric_limits< std::size_t >::max())
MultiMooseEnum _energy_inlet_types
Energy inlet boundary types.
virtual FEProblemBase & getProblem()
static const std::string porosity
Definition: NS.h:104
static const std::string cp
Definition: NS.h:121
virtual UserObjectName rhieChowUOName() const =0
Return the name of the Rhie Chow user object.
const SolverSystemName & getSolverSystem(unsigned int variable_index) const
static const std::string T_fluid
Definition: NS.h:106
registerNavierStokesPhysicsBaseTasks("NavierStokesApp", WCNSFVFluidHeatTransferPhysics)
const MooseEnum _compressibility
Compressibility type, can be compressible, incompressible or weakly-compressible. ...
static const std::string mu
Definition: NS.h:123
Creates all the objects needed to solve the Navier Stokes energy equation.
MooseFunctorName getPorosityFunctorName(const bool smoothed) const
const bool _porous_medium_treatment
Switch to show if porous medium treatment is requested or not.
const std::vector< PostprocessorName > & getFluxInletPPs() const
Get the inlet flux postprocessor if using a flux inlet.
void paramError(const std::string &param, Args... args) const
std::string stringify(const T &t)
void addEnergyInletBC() override
Functions adding boundary conditions for the incompressible simulation.
void transferParam(const InputParameters &source_param, const std::string &name, const std::string &new_name="", const std::string &new_description="")
WCNSFVFluidHeatTransferPhysics(const InputParameters &parameters)
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
const bool _has_energy_equation
A boolean to help compatibility with the old Modules/NavierStokesFV syntax.
bool _define_variables
Whether to define variables if they do not exist.
const std::vector< std::string > _velocity_names
Velocity names.
std::vector< std::vector< SubdomainName > > _thermal_conductivity_blocks
Vector of subdomain groups where we want to have different thermal conduction.
bool isParamSetByUser(const std::string &nm) const
static const std::string kappa
Definition: NS.h:116
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool processThermalConductivity()
Process thermal conductivity (multiple functor input options are available).
std::vector< MooseFunctorName > _energy_inlet_functors
Functors describing the inlet boundary values. See energy_inlet_types for what the functors actually ...
std::vector< MooseFunctorName > _thermal_conductivity_name
Name of the thermal conductivity functor for each block-group.
IntRange< T > make_range(T beg, T end)
const bool _solve_for_enthalpy
User-selected option to solve for enthalpy.
void mooseError(Args &&... args) const
std::vector< MooseFunctorName > _ambient_convection_alpha
Name of the ambient convection heat transfer coefficients for each block-group.
MooseFunctorName tkeName() const
The name of the turbulent kinetic energy variable.
void reportPotentiallyMissedParameters(const std::vector< std::string > &param_names, const std::string &object_type) const
const std::string velocity_vector[3]
Definition: NS.h:49
const std::vector< Point > & getFluxInletDirections() const
Get the inlet direction if using a flux inlet.
virtual void addFVKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
virtual void addFVBC(const std::string &fv_bc_name, const std::string &name, InputParameters &parameters)
std::vector< BoundaryName > turbulenceWalls() const
The names of the boundaries with turbulence wall functions.
static const std::string k
Definition: NS.h:130
const WCNSFVFlowPhysicsBase * _flow_equations_physics
Flow physics.
auto index_range(const T &sizable)
registerWCNSFVFluidHeatTransferPhysicsBaseTasks("NavierStokesApp", WCNSFVFluidHeatTransferPhysics)
const std::vector< BoundaryName > & getWallBoundaries() const
Get the wall boundaries.
std::string time_deriv(const std::string &var)
Definition: NS.h:97
const MooseEnum _velocity_interpolation
The velocity / momentum face interpolation method for advecting other quantities. ...
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
static const std::string specific_enthalpy
Definition: NS.h:68
void addEnergyTimeKernels() override
Functions adding kernels for the incompressible / weakly compressible energy equation If the material...