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