https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
24using namespace libMesh;
25
26registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_variables");
27registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_kernels");
28registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_bcs");
29registerMooseAction("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");
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");
86 "stagnation_boundary stagnation_pressure stagnation_temperature "
87 "stagnation_flow_direction no_penetration_boundary static_pressure_boundary static_pressure",
88 "BoundaryCondition");
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'");
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
129void
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
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)
203 addNSMomentumInviscidFlux(component);
204
205 // Add SUPG Kernels
208 for (unsigned int component = 0; component < _dim; ++component)
209 addNSSUPGMomentum(component);
210
211 // Add AuxKernels.
212 addPressureOrTemperatureAux("PressureAux");
213 addPressureOrTemperatureAux("TemperatureAux");
215 addNSMachAux();
218 for (unsigned int component = 0; component < _dim; ++component)
219 addNSVelocityAux(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)
235 addNoPenetrationBC(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);
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
300void
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
327void
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
342void
343CNSAction::addNSSUPGMomentum(unsigned int component)
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
362void
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
377void
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>("coupled_variables") = {NS::density};
387
388 // expression
389 std::string function = "if(" + NS::density + " = 0, 1e10, 1 / " + NS::density + ")";
390 params.set<std::string>("expression") = function;
391
392 _problem->addAuxKernel(kernel_type, "specific_volume_auxkernel", params);
393}
394
395void
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
406
407 // Couple the appropriate number of velocities
408 coupleVelocities(params);
409
410 _problem->addAuxKernel(kernel_type, "specific_internal_energy_auxkernel", params);
411}
412
413void
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
433void
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
445
446 _problem->addAuxKernel(kernel_type, "specific_total_enthalpy_auxkernel", params);
447}
448
449void
450CNSAction::addNSVelocityAux(unsigned int component)
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
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
467void
468CNSAction::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
482void
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
492void
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
509void
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
524void
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 {
535 _problem->addBoundaryCondition(
536 kernel_type, "weak_stagnation_mass_inflow_" + Moose::stringify(i), params);
537 }
538}
539
540void
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 {
550 _problem->addBoundaryCondition(
551 kernel_type, "weak_stagnation_energy_inflow_" + Moose::stringify(i), params);
552 }
553}
554
555void
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 {
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 {
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
599void
600CNSAction::addNoPenetrationBC(unsigned int component)
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
617void
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
632void
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
655void
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
673void
675{
676 params.set<std::vector<SubdomainName>>("block") = _blocks;
677
678 // coupled variables
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
690void
692{
693 // coupled variables
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
705void
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
720void
722{
724
725 if (_dim >= 2)
727
728 if (_dim >= 3)
730}
731
732void
734{
736
737 if (_dim >= 2)
739
740 if (_dim >= 3)
742}
registerMooseAction("NavierStokesApp", CNSAction, "add_navier_stokes_variables")
std::vector< VariableName > CoupledName
char ** vars
std::shared_ptr< MooseMesh > & _mesh
static InputParameters validParams()
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
static MooseEnum getNonlinearVariableFamilies()
static MooseEnum getNonlinearVariableOrders()
static std::string variableType(const libMesh::FEType &fe_type, const bool is_fv=false, const bool is_array=false)
This class allows us to have a section of the input file like the following which automatically adds ...
Definition CNSAction.h:29
const std::string _pressure_variable_name
pressure variable name
Definition CNSAction.h:115
void addNSMomentumInviscidSpecifiedPressureBC(unsigned int component)
Definition CNSAction.C:633
void addNSMomentumInviscidFlux(unsigned int component)
Definition CNSAction.C:493
void addNSMomentumWeakStagnationBC(unsigned int component)
Definition CNSAction.C:556
void addSpecificTotalEnthalpyAux()
Definition CNSAction.C:434
virtual void act() override
Definition CNSAction.C:130
UserObjectName _fp_name
Name of the FluidProperties object to pass on to Kernels.
Definition CNSAction.h:85
void addNSMassUnspecifiedNormalFlowBC()
Definition CNSAction.C:618
void addNSSUPGMass()
Definition CNSAction.C:328
void addNSMachAux()
Definition CNSAction.C:414
unsigned int _dim
Mesh dimension.
Definition CNSAction.h:111
std::vector< Real > _stagnation_temperature
Temperatures on stagnation boundaries.
Definition CNSAction.h:93
void addNSEnergyInviscidSpecifiedPressureBC()
Definition CNSAction.C:656
void addNSInternalEnergyAux()
Definition CNSAction.C:396
void addNSSUPGMomentum(unsigned int component)
Definition CNSAction.C:343
std::vector< BoundaryName > _stagnation_boundary
Boundaries stagnation BC applies.
Definition CNSAction.h:89
void addNSVelocityAux(unsigned int component)
Definition CNSAction.C:450
void addNSMassWeakStagnationBC()
Definition CNSAction.C:525
std::vector< BoundaryName > _static_pressure_boundary
Boundaries static pressure BC applies.
Definition CNSAction.h:99
std::vector< SubdomainName > _blocks
Subdomains Navier-Stokes equation is defined on.
Definition CNSAction.h:87
void setBCCommonParams(InputParameters &params)
Definition CNSAction.C:691
void setStagnationBCCommonParams(InputParameters &params, unsigned int i)
Definition CNSAction.C:706
void setKernelCommonParams(InputParameters &params)
Definition CNSAction.C:674
void addNoPenetrationBC(unsigned int component)
Definition CNSAction.C:600
static InputParameters validParams()
Definition CNSAction.C:32
CNSAction(const InputParameters &parameters)
Definition CNSAction.C:97
void addNSEnergyInviscidFlux()
Definition CNSAction.C:510
void coupleVelocities(InputParameters &params)
Definition CNSAction.C:721
void addNSTimeKernels()
Definition CNSAction.C:301
MooseEnum _type
Equation type, transient or steady-state.
Definition CNSAction.h:83
libMesh::FEType _fe_type
FE type for various variables.
Definition CNSAction.h:103
RealVectorValue _initial_velocity
Initial value for velocity.
Definition CNSAction.h:109
void addNSMassInviscidFlux()
Definition CNSAction.C:483
std::set< SubdomainID > _block_ids
Subdomain IDs.
Definition CNSAction.h:113
void coupleMomentums(InputParameters &params)
Definition CNSAction.C:733
std::vector< BoundaryName > _no_penetration_boundary
Boundaries no-penetration BC applies.
Definition CNSAction.h:97
Real _initial_pressure
Initial value for pressure.
Definition CNSAction.h:105
std::vector< Real > _stagnation_direction
Flow directions on stagnation boundaries.
Definition CNSAction.h:95
void addNSEnergyWeakStagnationBC()
Definition CNSAction.C:541
void addSpecificVolumeComputation()
Definition CNSAction.C:378
void addPressureOrTemperatureAux(const std::string &kernel_type)
Definition CNSAction.C:468
Real _initial_temperature
Initial value for temperature.
Definition CNSAction.h:107
std::vector< Real > _stagnation_pressure
Pressures on stagnation boundaries.
Definition CNSAction.h:91
void addNSSUPGEnergy()
Definition CNSAction.C:363
std::vector< Real > _static_pressure
Pressures on static pressure boundaries.
Definition CNSAction.h:101
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
const std::string & type() const
const std::string & name() const
void paramError(const std::string &param, Args... args) const
Factory & _factory
OrderWrapper order
std::string stringify(const T &t)
static const std::string specific_volume
Definition NS.h:82
static const std::string density
Definition NS.h:34
static const std::string velocity_y
Definition NS.h:48
static const std::string temperature
Definition NS.h:60
static const std::string total_energy_density
Definition NS.h:66
static const std::string momentum_x
Definition NS.h:36
static const std::string velocity_z
Definition NS.h:49
static const std::string momentum_y
Definition NS.h:37
static const std::string mach_number
Definition NS.h:81
static const std::string specific_total_enthalpy
Definition NS.h:70
static const std::string velocity_x
Definition NS.h:47
static const std::string specific_internal_energy
Definition NS.h:63
static const std::string pressure
Definition NS.h:57
static const std::string momentum_z
Definition NS.h:38
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
VectorValue< Real > RealVectorValue
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real