https://mooseframework.inl.gov
CNSAction.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 // Navier-Stokes includes
11 #include "CNSAction.h"
12 
13 #include "NS.h"
14 #include "AddVariableAction.h"
15 #include "MooseObject.h"
16 
17 // MOOSE includes
18 #include "FEProblem.h"
19 
20 #include "libmesh/fe.h"
21 #include "libmesh/vector_value.h"
22 #include "libmesh/string_to_enum.h"
23 
24 using namespace libMesh;
25 
26 registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_variables");
27 registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_kernels");
28 registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_bcs");
29 registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_ics");
30 
33 {
35  params.addClassDescription("This class allows us to have a section of the input file like the "
36  "following which automatically adds Kernels and AuxKernels for all "
37  "the required nonlinear and auxiliary variables.");
38 
39  MooseEnum type("steady-state transient", "steady-state");
40  params.addParam<MooseEnum>("equation_type", type, "Navier-Stokes equation type");
41 
42  params.addParam<std::vector<SubdomainName>>(
43  "block", {}, "The list of block ids (SubdomainID) on which NS equation is defined on");
44 
45  params.addRequiredParam<UserObjectName>("fluid_properties",
46  "The name of the user object for fluid properties");
47 
48  params.addParam<std::vector<BoundaryName>>(
49  "stagnation_boundary", std::vector<BoundaryName>(), "Stagnation boundaries");
50  params.addParam<std::vector<Real>>(
51  "stagnation_pressure", std::vector<Real>(), "Pressure on stagnation boundaries");
52  params.addParam<std::vector<Real>>(
53  "stagnation_temperature", std::vector<Real>(), "Temperature on stagnation boundaries");
54  params.addParam<std::vector<Real>>(
55  "stagnation_flow_direction", std::vector<Real>(), "Flow directions on stagnation boundaries");
56  params.addParam<std::vector<BoundaryName>>(
57  "no_penetration_boundary", std::vector<BoundaryName>(), "No-penetration boundaries");
58  params.addParam<std::vector<BoundaryName>>(
59  "static_pressure_boundary", std::vector<BoundaryName>(), "Static pressure boundaries");
60  params.addParam<std::vector<Real>>(
61  "static_pressure", std::vector<Real>(), "Static pressure on boundaries");
62 
65  params.addParam<MooseEnum>(
66  "family", families, "Specifies the family of FE shape functions to use for this variable");
67  params.addParam<MooseEnum>("order",
68  orders,
69  "Specifies the order of the FE shape function to use "
70  "for this variable (additional orders not listed are "
71  "allowed)");
72  params.addParam<Real>("density_scaling", 1, "Scaling for the density variable");
73  params.addParam<RealVectorValue>(
74  "momentum_scaling", RealVectorValue(1, 1, 1), "Scaling for the momentum variables");
75  params.addParam<Real>("total_energy_density_scaling", 1, "Scaling for the total-energy variable");
76 
77  params.addRequiredParam<Real>("initial_pressure",
78  "The initial pressure, assumed constant everywhere");
79  params.addRequiredParam<Real>("initial_temperature",
80  "The initial temperature, assumed constant everywhere");
81  params.addRequiredParam<RealVectorValue>("initial_velocity",
82  "The initial velocity, assumed constant everywhere");
83 
84  params.addParamNamesToGroup("equation_type block fluid_properties", "Base");
85  params.addParamNamesToGroup(
86  "stagnation_boundary stagnation_pressure stagnation_temperature "
87  "stagnation_flow_direction no_penetration_boundary static_pressure_boundary static_pressure",
88  "BoundaryCondition");
89  params.addParamNamesToGroup(
90  "family order density_scaling momentum_scaling total_energy_density_scaling", "Variable");
91  params.addParam<std::string>("pressure_variable_name",
92  "A name for the pressure variable. If this is not provided, a "
93  "sensible default will be used.");
94  return params;
95 }
96 
98  : Action(parameters),
99  _type(getParam<MooseEnum>("equation_type")),
100  _fp_name(getParam<UserObjectName>("fluid_properties")),
101  _blocks(getParam<std::vector<SubdomainName>>("block")),
102  _stagnation_boundary(getParam<std::vector<BoundaryName>>("stagnation_boundary")),
103  _stagnation_pressure(getParam<std::vector<Real>>("stagnation_pressure")),
104  _stagnation_temperature(getParam<std::vector<Real>>("stagnation_temperature")),
105  _stagnation_direction(getParam<std::vector<Real>>("stagnation_flow_direction")),
106  _no_penetration_boundary(getParam<std::vector<BoundaryName>>("no_penetration_boundary")),
107  _static_pressure_boundary(getParam<std::vector<BoundaryName>>("static_pressure_boundary")),
108  _static_pressure(getParam<std::vector<Real>>("static_pressure")),
109  _fe_type(Utility::string_to_enum<Order>(getParam<MooseEnum>("order")),
110  Utility::string_to_enum<FEFamily>(getParam<MooseEnum>("family"))),
111  _initial_pressure(getParam<Real>("initial_pressure")),
112  _initial_temperature(getParam<Real>("initial_temperature")),
113  _initial_velocity(getParam<RealVectorValue>("initial_velocity")),
114  _pressure_variable_name(isParamValid("pressure_variable_name")
115  ? getParam<std::string>("pressure_variable_name")
116  : "p")
117 {
118  if (_stagnation_pressure.size() != _stagnation_boundary.size())
119  paramError("stagnation_pressure",
120  "Size is not the same as the number of boundaries in 'stagnation_boundary'");
121  if (_stagnation_temperature.size() != _stagnation_boundary.size())
122  paramError("stagnation_temperature",
123  "Size is not the same as the number of boundaries in 'stagnation_boundary'");
124  if (_static_pressure.size() != _static_pressure_boundary.size())
125  paramError("static_pressure",
126  "Size is not the same as the number of boundaries in 'static_pressure_boundary'");
127 }
128 
129 void
131 {
132  if (_current_task == "add_navier_stokes_variables")
133  {
134  _dim = _mesh->dimension();
135  for (const auto & subdomain_name : _blocks)
136  {
137  SubdomainID id = _mesh->getSubdomainID(subdomain_name);
138  _block_ids.insert(id);
139  }
140  if (_stagnation_direction.size() != _stagnation_boundary.size() * _dim)
141  paramError("stagnation_flow_direction",
142  "Size is not the same as the number of boundaries in 'stagnation_boundary' times "
143  "the mesh dimension");
144 
145  // FIXME: need to check boundaries are non-overlapping and enclose the blocks
146 
147  auto var_type = AddVariableAction::variableType(_fe_type);
148  auto base_params = _factory.getValidParams(var_type);
149  base_params.set<MooseEnum>("order") = _fe_type.order.get_order();
150  base_params.set<MooseEnum>("family") = Moose::stringify(_fe_type.family);
151  if (_block_ids.size() != 0)
152  for (const SubdomainID & id : _block_ids)
153  base_params.set<std::vector<SubdomainName>>("block").push_back(Moose::stringify(id));
154 
155  // add primal variables
156  InputParameters params(base_params);
157  params.set<std::vector<Real>>("scaling") = {getParam<Real>("density_scaling")};
158  _problem->addVariable(var_type, NS::density, params);
159 
160  auto mscaling = getParam<RealVectorValue>("momentum_scaling");
161  params.set<std::vector<Real>>("scaling") = {mscaling(0)};
162  _problem->addVariable(var_type, NS::momentum_x, params);
163  if (_dim >= 2)
164  {
165  params.set<std::vector<Real>>("scaling") = {mscaling(1)};
166  _problem->addVariable(var_type, NS::momentum_y, params);
167  }
168  if (_dim >= 3)
169  {
170  params.set<std::vector<Real>>("scaling") = {mscaling(2)};
171  _problem->addVariable(var_type, NS::momentum_z, params);
172  }
173  params.set<std::vector<Real>>("scaling") = {getParam<Real>("total_energy_density_scaling")};
174  _problem->addVariable(var_type, NS::total_energy_density, params);
175 
176  // Add Aux variables. These are all required in order for the code
177  // to run, so they should not be independently selectable by the
178  // user.
179  _problem->addAuxVariable(var_type, NS::velocity_x, base_params);
180  if (_dim >= 2)
181  _problem->addAuxVariable(var_type, NS::velocity_y, base_params);
182  if (_dim >= 3)
183  _problem->addAuxVariable(var_type, NS::velocity_z, base_params);
184  _problem->addAuxVariable(var_type, _pressure_variable_name, base_params);
185  _problem->addAuxVariable(var_type, NS::temperature, base_params);
186  _problem->addAuxVariable(var_type, NS::specific_total_enthalpy, base_params);
187  _problem->addAuxVariable(var_type, NS::mach_number, base_params);
188 
189  // Needed for FluidProperties calculations
190  _problem->addAuxVariable(var_type, NS::specific_internal_energy, base_params);
191  _problem->addAuxVariable(var_type, NS::specific_volume, base_params);
192  }
193 
194  if (_current_task == "add_navier_stokes_kernels")
195  {
196  if (_type == "transient")
198 
199  // Add all the inviscid flux Kernels.
202  for (unsigned int component = 0; component < _dim; ++component)
204 
205  // Add SUPG Kernels
206  addNSSUPGMass();
207  addNSSUPGEnergy();
208  for (unsigned int component = 0; component < _dim; ++component)
210 
211  // Add AuxKernels.
212  addPressureOrTemperatureAux("PressureAux");
213  addPressureOrTemperatureAux("TemperatureAux");
215  addNSMachAux();
218  for (unsigned int component = 0; component < _dim; ++component)
220  }
221 
222  if (_current_task == "add_navier_stokes_bcs")
223  {
224  if (_stagnation_boundary.size() > 0)
225  {
228  for (unsigned int component = 0; component < _dim; ++component)
230  }
231 
232  if (_no_penetration_boundary.size() > 0)
233  {
234  for (unsigned int component = 0; component < _dim; ++component)
236  }
237 
238  if (_static_pressure_boundary.size() > 0)
239  {
242  for (unsigned int component = 0; component < _dim; ++component)
244  }
245  }
246 
247  if (_current_task == "add_navier_stokes_ics")
248  {
249  // add ICs for primal variables
250  std::vector<VariableName> vars;
251  vars.push_back(NS::density);
252  vars.push_back(NS::momentum_x);
253  if (_dim >= 2)
254  vars.push_back(NS::momentum_y);
255  if (_dim >= 3)
256  vars.push_back(NS::momentum_z);
257  vars.push_back(NS::total_energy_density);
258  for (const auto & name : vars)
259  {
260  InputParameters params = _factory.getValidParams("NSInitialCondition");
261  params.set<VariableName>("variable") = name;
262  params.set<Real>("initial_pressure") = _initial_pressure;
263  params.set<Real>("initial_temperature") = _initial_temperature;
264  params.set<RealVectorValue>("initial_velocity") = _initial_velocity;
265  params.set<UserObjectName>("fluid_properties") = _fp_name;
266  _problem->addInitialCondition("NSInitialCondition", name + std::string("_ic"), params);
267  }
268 
269  // add ICs for aux variables (possibly we do not need this)
270  std::vector<VariableName> auxs;
271  auxs.push_back(NS::velocity_x);
272  if (_dim >= 2)
273  auxs.push_back(NS::velocity_y);
274  if (_dim >= 3)
275  auxs.push_back(NS::velocity_z);
276 
277  auxs.push_back(_pressure_variable_name);
278  auxs.push_back(NS::temperature);
279  auxs.push_back(NS::specific_total_enthalpy);
280  auxs.push_back(NS::mach_number);
281 
282  // Needed for FluidProperties calculations
283  auxs.push_back(NS::specific_internal_energy);
284  auxs.push_back(NS::specific_volume);
285  for (const auto & name : auxs)
286  {
287  InputParameters params = _factory.getValidParams("NSInitialCondition");
288  params.set<VariableName>("variable") = name;
289  params.set<Real>("initial_pressure") = _initial_pressure;
290  params.set<Real>("initial_temperature") = _initial_temperature;
291  params.set<RealVectorValue>("initial_velocity") = _initial_velocity;
292  params.set<UserObjectName>("fluid_properties") = _fp_name;
294  params.set<MooseEnum>("variable_type") = NS::pressure;
295  _problem->addInitialCondition("NSInitialCondition", name + std::string("_ic"), params);
296  }
297  }
298 }
299 
300 void
302 {
303  const std::string kernel_type = "TimeDerivative";
304  InputParameters params = _factory.getValidParams(kernel_type);
305  params.set<std::vector<SubdomainName>>("block") = _blocks;
306 
307  params.set<NonlinearVariableName>("variable") = NS::density;
308  _problem->addKernel(kernel_type, NS::density + "_time_deriv", params);
309 
310  params.set<NonlinearVariableName>("variable") = NS::momentum_x;
311  _problem->addKernel(kernel_type, NS::momentum_x + "_time_deriv", params);
312  if (_dim >= 2)
313  {
314  params.set<NonlinearVariableName>("variable") = NS::momentum_y;
315  _problem->addKernel(kernel_type, NS::momentum_y + "_time_deriv", params);
316  }
317  if (_dim >= 3)
318  {
319  params.set<NonlinearVariableName>("variable") = NS::momentum_z;
320  _problem->addKernel(kernel_type, NS::momentum_z + "_time_deriv", params);
321  }
322 
323  params.set<NonlinearVariableName>("variable") = NS::total_energy_density;
324  _problem->addKernel(kernel_type, NS::total_energy_density + "_time_deriv", params);
325 }
326 
327 void
329 {
330  const std::string kernel_type = "NSSUPGMass";
331  InputParameters params = _factory.getValidParams(kernel_type);
332  params.set<NonlinearVariableName>("variable") = NS::density;
333  setKernelCommonParams(params);
334 
335  // SUPG Kernels also need temperature and specific_total_enthalpy currently.
338 
339  _problem->addKernel(kernel_type, "rho_supg", params);
340 }
341 
342 void
344 {
345  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
346 
347  const std::string kernel_type = "NSSUPGMomentum";
348  InputParameters params = _factory.getValidParams(kernel_type);
349  params.set<NonlinearVariableName>("variable") = momentums[component];
350  setKernelCommonParams(params);
351 
352  // SUPG Kernels also need temperature and specific_total_enthalpy currently.
355 
356  // Momentum Kernels also need the component.
357  params.set<unsigned int>("component") = component;
358 
359  _problem->addKernel(kernel_type, momentums[component] + std::string("_supg"), params);
360 }
361 
362 void
364 {
365  const std::string kernel_type = "NSSUPGEnergy";
366  InputParameters params = _factory.getValidParams(kernel_type);
367  params.set<NonlinearVariableName>("variable") = NS::total_energy_density;
368  setKernelCommonParams(params);
369 
370  // SUPG Kernels also need temperature and specific_total_enthalpy currently.
373 
374  _problem->addKernel(kernel_type, "rhoE_supg", params);
375 }
376 
377 void
379 {
380  const std::string kernel_type = "ParsedAux";
381 
382  InputParameters params = _factory.getValidParams(kernel_type);
383  params.set<AuxVariableName>("variable") = NS::specific_volume;
384 
385  // arguments
386  params.set<CoupledName>("args") = {NS::density};
387 
388  // expression
389  std::string function = "if(" + NS::density + " = 0, 1e10, 1 / " + NS::density + ")";
390  params.set<std::string>("function") = function;
391 
392  _problem->addAuxKernel(kernel_type, "specific_volume_auxkernel", params);
393 }
394 
395 void
397 {
398  const std::string kernel_type = "NSInternalEnergyAux";
399 
400  InputParameters params = _factory.getValidParams(kernel_type);
401  params.set<AuxVariableName>("variable") = NS::specific_internal_energy;
402 
403  // coupled variables
404  params.set<CoupledName>(NS::density) = {NS::density};
406 
407  // Couple the appropriate number of velocities
408  coupleVelocities(params);
409 
410  _problem->addAuxKernel(kernel_type, "specific_internal_energy_auxkernel", params);
411 }
412 
413 void
415 {
416  const std::string kernel_type = "NSMachAux";
417 
418  InputParameters params = _factory.getValidParams(kernel_type);
419  params.set<AuxVariableName>("variable") = NS::mach_number;
420 
421  // coupled variables
424 
425  // Couple the appropriate number of velocities
426  coupleVelocities(params);
427 
428  params.set<UserObjectName>("fluid_properties") = _fp_name;
429 
430  _problem->addAuxKernel(kernel_type, "mach_auxkernel", params);
431 }
432 
433 void
435 {
436  const std::string kernel_type = "NSSpecificTotalEnthalpyAux";
437 
438  InputParameters params = _factory.getValidParams(kernel_type);
439  params.set<AuxVariableName>("variable") = NS::specific_total_enthalpy;
440 
441  // coupled variables
442  params.set<CoupledName>(NS::density) = {NS::density};
445 
446  _problem->addAuxKernel(kernel_type, "specific_total_enthalpy_auxkernel", params);
447 }
448 
449 void
451 {
452  const std::string kernel_type = "NSVelocityAux";
453  const static std::string velocities[3] = {NS::velocity_x, NS::velocity_y, NS::velocity_z};
454  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
455 
456  InputParameters params = _factory.getValidParams(kernel_type);
457  params.set<AuxVariableName>("variable") = velocities[component];
458 
459  // coupled variables
460  params.set<CoupledName>(NS::density) = {NS::density};
461  params.set<CoupledName>("momentum") = {momentums[component]};
462  params.set<UserObjectName>("fluid_properties") = _fp_name;
463 
464  _problem->addAuxKernel(kernel_type, velocities[component] + "_auxkernel", params);
465 }
466 
467 void
468 CNSAction::addPressureOrTemperatureAux(const std::string & kernel_type)
469 {
470  InputParameters params = _factory.getValidParams(kernel_type);
471  std::string var_name = (kernel_type == "PressureAux" ? _pressure_variable_name : NS::temperature);
472  params.set<AuxVariableName>("variable") = var_name;
473 
474  // coupled variables
476  params.set<CoupledName>("v") = {NS::specific_volume};
477  params.set<UserObjectName>("fp") = _fp_name;
478 
479  _problem->addAuxKernel(kernel_type, var_name + "_auxkernel", params);
480 }
481 
482 void
484 {
485  const std::string kernel_type = "NSMassInviscidFlux";
486  InputParameters params = _factory.getValidParams(kernel_type);
487  params.set<NonlinearVariableName>("variable") = NS::density;
488  setKernelCommonParams(params);
489  _problem->addKernel(kernel_type, "rho_if", params);
490 }
491 
492 void
494 {
495  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
496  const std::string kernel_type = "NSMomentumInviscidFlux";
497  InputParameters params = _factory.getValidParams(kernel_type);
498  params.set<NonlinearVariableName>("variable") = momentums[component];
499  setKernelCommonParams(params);
500 
501  // Extra stuff needed by momentum Kernels
503  params.set<unsigned int>("component") = component;
504 
505  // Add the Kernel
506  _problem->addKernel(kernel_type, momentums[component] + std::string("if"), params);
507 }
508 
509 void
511 {
512  const std::string kernel_type = "NSEnergyInviscidFlux";
513  InputParameters params = _factory.getValidParams(kernel_type);
514  params.set<NonlinearVariableName>("variable") = NS::total_energy_density;
515  setKernelCommonParams(params);
516 
517  // Extra stuff needed by energy equation
519 
520  // Add the Kernel
521  _problem->addKernel(kernel_type, "rhoE_if", params);
522 }
523 
524 void
526 {
527  const std::string kernel_type = "NSMassWeakStagnationBC";
528  InputParameters params = _factory.getValidParams(kernel_type);
529  params.set<NonlinearVariableName>("variable") = NS::density;
530  setBCCommonParams(params);
531 
532  for (unsigned int i = 0; i < _stagnation_boundary.size(); ++i)
533  {
534  setStagnationBCCommonParams(params, i);
535  _problem->addBoundaryCondition(
536  kernel_type, "weak_stagnation_mass_inflow_" + Moose::stringify(i), params);
537  }
538 }
539 
540 void
542 {
543  const std::string kernel_type = "NSEnergyWeakStagnationBC";
544  InputParameters params = _factory.getValidParams(kernel_type);
545  params.set<NonlinearVariableName>("variable") = NS::total_energy_density;
546  setBCCommonParams(params);
547  for (unsigned int i = 0; i < _stagnation_boundary.size(); ++i)
548  {
549  setStagnationBCCommonParams(params, i);
550  _problem->addBoundaryCondition(
551  kernel_type, "weak_stagnation_energy_inflow_" + Moose::stringify(i), params);
552  }
553 }
554 
555 void
557 {
558  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
559 
560  // Convective part
561  {
562  const std::string kernel_type = "NSMomentumConvectiveWeakStagnationBC";
563  InputParameters params = _factory.getValidParams(kernel_type);
564  params.set<NonlinearVariableName>("variable") = momentums[component];
565  setBCCommonParams(params);
566  // Momentum BCs also need the component.
567  params.set<unsigned int>("component") = component;
568  for (unsigned int i = 0; i < _stagnation_boundary.size(); ++i)
569  {
570  setStagnationBCCommonParams(params, i);
571  _problem->addBoundaryCondition(kernel_type,
572  std::string("weak_stagnation_") + momentums[component] +
573  std::string("_convective_inflow_") + Moose::stringify(i),
574  params);
575  }
576  }
577 
578  // Pressure part
579  {
580  const std::string kernel_type = "NSMomentumPressureWeakStagnationBC";
581  InputParameters params = _factory.getValidParams(kernel_type);
582  params.set<NonlinearVariableName>("variable") = momentums[component];
583  setBCCommonParams(params);
584  // Momentum BCs also need the component.
585  params.set<unsigned int>("component") = component;
586 
587  for (unsigned int i = 0; i < _stagnation_boundary.size(); ++i)
588  {
589  setStagnationBCCommonParams(params, i);
590 
591  _problem->addBoundaryCondition(kernel_type,
592  std::string("weak_stagnation_") + momentums[component] +
593  std::string("_pressure_inflow_") + Moose::stringify(i),
594  params);
595  }
596  }
597 }
598 
599 void
601 {
602  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
603  const std::string kernel_type = "NSPressureNeumannBC";
604  InputParameters params = _factory.getValidParams(kernel_type);
605  params.set<NonlinearVariableName>("variable") = momentums[component];
606  setBCCommonParams(params);
607 
608  // These BCs also need the component and couping to the pressure.
609  params.set<unsigned int>("component") = component;
611 
612  params.set<std::vector<BoundaryName>>("boundary") = _no_penetration_boundary;
613  _problem->addBoundaryCondition(
614  kernel_type, momentums[component] + std::string("_no_penetration"), params);
615 }
616 
617 void
619 {
620  const std::string kernel_type = "NSMassUnspecifiedNormalFlowBC";
621  InputParameters params = _factory.getValidParams(kernel_type);
622  params.set<NonlinearVariableName>("variable") = NS::density;
623  setBCCommonParams(params);
624  for (unsigned int i = 0; i < _static_pressure_boundary.size(); ++i)
625  {
626  params.set<std::vector<BoundaryName>>("boundary") = {_static_pressure_boundary[i]};
627  params.set<Real>("specified_pressure") = _static_pressure[i];
628  _problem->addBoundaryCondition(kernel_type, "mass_outflow_" + Moose::stringify(i), params);
629  }
630 }
631 
632 void
634 {
635  const static std::string momentums[3] = {NS::momentum_x, NS::momentum_y, NS::momentum_z};
636  const std::string kernel_type = "NSMomentumInviscidSpecifiedPressureBC";
637  InputParameters params = _factory.getValidParams(kernel_type);
638  params.set<NonlinearVariableName>("variable") = momentums[component];
639  setBCCommonParams(params);
640 
641  // These BCs also need the component.
642  params.set<unsigned int>("component") = component;
643 
644  for (unsigned int i = 0; i < _static_pressure_boundary.size(); ++i)
645  {
646  params.set<std::vector<BoundaryName>>("boundary") = {_static_pressure_boundary[i]};
647  params.set<Real>("specified_pressure") = _static_pressure[i];
648  _problem->addBoundaryCondition(
649  kernel_type,
650  momentums[component] + std::string("_specified_pressure_outflow_") + Moose::stringify(i),
651  params);
652  }
653 }
654 
655 void
657 {
658  const std::string kernel_type = "NSEnergyInviscidSpecifiedPressureBC";
659  InputParameters params = _factory.getValidParams(kernel_type);
660  params.set<NonlinearVariableName>("variable") = NS::total_energy_density;
661  setBCCommonParams(params);
662  // This BC also requires the current value of the temperature.
664  for (unsigned int i = 0; i < _static_pressure_boundary.size(); ++i)
665  {
666  params.set<std::vector<BoundaryName>>("boundary") = {_static_pressure_boundary[i]};
667  params.set<Real>("specified_pressure") = _static_pressure[i];
668  _problem->addBoundaryCondition(
669  kernel_type, "rhoE_specified_pressure_outflow_" + Moose::stringify(i), params);
670  }
671 }
672 
673 void
675 {
676  params.set<std::vector<SubdomainName>>("block") = _blocks;
677 
678  // coupled variables
679  params.set<CoupledName>(NS::density) = {NS::density};
681 
682  // Couple the appropriate number of velocities
683  coupleVelocities(params);
684  coupleMomentums(params);
685 
686  // FluidProperties object
687  params.set<UserObjectName>("fluid_properties") = _fp_name;
688 }
689 
690 void
692 {
693  // coupled variables
694  params.set<CoupledName>(NS::density) = {NS::density};
696 
697  // Couple the appropriate number of velocities
698  coupleVelocities(params);
699  coupleMomentums(params);
700 
701  // FluidProperties object
702  params.set<UserObjectName>("fluid_properties") = _fp_name;
703 }
704 
705 void
707 {
708  params.set<std::vector<BoundaryName>>("boundary") = {_stagnation_boundary[i]};
709  params.set<Real>("stagnation_pressure") = _stagnation_pressure[i];
710  params.set<Real>("stagnation_temperature") = _stagnation_temperature[i];
711  params.set<Real>("sx") = _stagnation_direction[_dim * i];
712  if (_dim == 1)
713  params.set<Real>("sy") = 0;
714  if (_dim >= 2)
715  params.set<Real>("sy") = _stagnation_direction[_dim * i + 1];
716  if (_dim >= 3)
717  params.set<Real>("sz") = _stagnation_direction[_dim * i + 2];
718 }
719 
720 void
722 {
724 
725  if (_dim >= 2)
727 
728  if (_dim >= 3)
730 }
731 
732 void
734 {
736 
737  if (_dim >= 2)
739 
740  if (_dim >= 3)
742 }
void addNSMachAux()
Definition: CNSAction.C:414
static const std::string total_energy_density
Definition: NS.h:65
Real _initial_temperature
Initial value for temperature.
Definition: CNSAction.h:107
static const std::string momentum_x
Definition: NS.h:35
std::vector< Real > _stagnation_direction
Flow directions on stagnation boundaries.
Definition: CNSAction.h:95
Order
std::set< SubdomainID > _block_ids
Subdomain IDs.
Definition: CNSAction.h:113
void addPressureOrTemperatureAux(const std::string &kernel_type)
Definition: CNSAction.C:468
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void setKernelCommonParams(InputParameters &params)
Definition: CNSAction.C:674
libMesh::FEType _fe_type
FE type for various variables.
Definition: CNSAction.h:103
static const std::string mach_number
Definition: NS.h:80
VectorValue< Real > RealVectorValue
std::vector< SubdomainName > _blocks
Subdomains Navier-Stokes equation is defined on.
Definition: CNSAction.h:87
std::vector< BoundaryName > _no_penetration_boundary
Boundaries no-penetration BC applies.
Definition: CNSAction.h:97
static const std::string component
Definition: NS.h:153
void setStagnationBCCommonParams(InputParameters &params, unsigned int i)
Definition: CNSAction.C:706
char ** vars
void addNSSUPGMomentum(unsigned int component)
Definition: CNSAction.C:343
T & set(const std::string &name, bool quiet_mode=false)
static const std::string velocity_z
Definition: NS.h:48
std::vector< BoundaryName > _static_pressure_boundary
Boundaries static pressure BC applies.
Definition: CNSAction.h:99
void addNSMassUnspecifiedNormalFlowBC()
Definition: CNSAction.C:618
static const std::string density
Definition: NS.h:33
void addSpecificTotalEnthalpyAux()
Definition: CNSAction.C:434
void addNSInternalEnergyAux()
Definition: CNSAction.C:396
OrderWrapper order
static const std::string velocity_x
Definition: NS.h:46
static const std::string temperature
Definition: NS.h:59
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
void addNSVelocityAux(unsigned int component)
Definition: CNSAction.C:450
static const std::string specific_internal_energy
Definition: NS.h:62
virtual const std::string & name() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
static MooseEnum getNonlinearVariableFamilies()
void addNSSUPGMass()
Definition: CNSAction.C:328
Factory & _factory
void addNSMassWeakStagnationBC()
Definition: CNSAction.C:525
MooseEnum _type
Equation type, transient or steady-state.
Definition: CNSAction.h:83
std::vector< Real > _static_pressure
Pressures on static pressure boundaries.
Definition: CNSAction.h:101
static InputParameters validParams()
Definition: CNSAction.C:32
unsigned int _dim
Mesh dimension.
Definition: CNSAction.h:111
static InputParameters validParams()
static MooseEnum getNonlinearVariableOrders()
UserObjectName _fp_name
Name of the FluidProperties object to pass on to Kernels.
Definition: CNSAction.h:85
void addNSMassInviscidFlux()
Definition: CNSAction.C:483
This class allows us to have a section of the input file like the following which automatically adds ...
Definition: CNSAction.h:28
T string_to_enum(const std::string &s)
static const std::string specific_volume
Definition: NS.h:81
registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_variables")
const std::string & _current_task
static std::string variableType(const libMesh::FEType &fe_type, const bool is_fv=false, const bool is_array=false)
static const std::string velocity_y
Definition: NS.h:47
void addNSMomentumWeakStagnationBC(unsigned int component)
Definition: CNSAction.C:556
void paramError(const std::string &param, Args... args) const
RealVectorValue _initial_velocity
Initial value for velocity.
Definition: CNSAction.h:109
void addNSEnergyInviscidFlux()
Definition: CNSAction.C:510
std::string stringify(const T &t)
const std::string _pressure_variable_name
pressure variable name
Definition: CNSAction.h:115
void addNoPenetrationBC(unsigned int component)
Definition: CNSAction.C:600
void addNSMomentumInviscidFlux(unsigned int component)
Definition: CNSAction.C:493
void addNSEnergyWeakStagnationBC()
Definition: CNSAction.C:541
static const std::string momentum_y
Definition: NS.h:36
std::vector< BoundaryName > _stagnation_boundary
Boundaries stagnation BC applies.
Definition: CNSAction.h:89
virtual void act() override
Definition: CNSAction.C:130
std::shared_ptr< MooseMesh > & _mesh
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addNSEnergyInviscidSpecifiedPressureBC()
Definition: CNSAction.C:656
static const std::string specific_total_enthalpy
Definition: NS.h:69
CNSAction(const InputParameters &parameters)
Definition: CNSAction.C:97
std::vector< VariableName > CoupledName
std::vector< Real > _stagnation_pressure
Pressures on stagnation boundaries.
Definition: CNSAction.h:91
static const std::string pressure
Definition: NS.h:56
void addSpecificVolumeComputation()
Definition: CNSAction.C:378
void addNSMomentumInviscidSpecifiedPressureBC(unsigned int component)
Definition: CNSAction.C:633
void addClassDescription(const std::string &doc_string)
std::shared_ptr< FEProblemBase > & _problem
void addNSTimeKernels()
Definition: CNSAction.C:301
static const std::string momentum_z
Definition: NS.h:37
std::vector< Real > _stagnation_temperature
Temperatures on stagnation boundaries.
Definition: CNSAction.h:93
void setBCCommonParams(InputParameters &params)
Definition: CNSAction.C:691
FEFamily
void addNSSUPGEnergy()
Definition: CNSAction.C:363
void coupleMomentums(InputParameters &params)
Definition: CNSAction.C:733
Real _initial_pressure
Initial value for pressure.
Definition: CNSAction.h:105
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void coupleVelocities(InputParameters &params)
Definition: CNSAction.C:721