20 params.
addClassDescription(
"Base class for Physics defining the Navier Stokes flow equations");
23 params.
addParam<
bool>(
"add_flow_equations",
25 "Whether to add the flow equations. This parameter is not necessary when " 26 "using the Physics syntax");
36 params.addParam<
bool>(
37 "include_deviatoric_stress",
39 "Whether to include the full expansion (the transposed term as well) of the stress tensor");
47 params.addParam<std::vector<std::vector<MooseFunctorName>>>(
48 "momentum_wall_functors",
50 "Functors for each component of the velocity value on walls. This is only necessary for the " 51 "fixed-velocity momentum wall types.");
59 params.deprecateParam(
"momentum_inlet_function",
"momentum_inlet_functors",
"01/01/2025");
60 params.deprecateParam(
"pressure_function",
"pressure_functors",
"01/01/2025");
73 MooseEnum coeff_interp_method(
"average harmonic",
"harmonic");
74 params.addParam<
MooseEnum>(
"mu_interp_method",
76 "Switch that can select face interpolation method for the viscosity.");
79 params.addParamNamesToGroup(
80 "velocity_variable pressure_variable initial_pressure initial_velocity",
"Variables");
81 params.addParamNamesToGroup(
"density dynamic_viscosity",
"Material properties");
82 params.addParamNamesToGroup(
"inlet_boundaries momentum_inlet_types momentum_inlet_functors",
83 "Inlet boundary conditions");
84 params.addParamNamesToGroup(
"outlet_boundaries momentum_outlet_types pressure_functors",
85 "Outlet boundary conditions");
86 params.addParamNamesToGroup(
"wall_boundaries momentum_wall_types momentum_wall_functors",
87 "Wall boundary conditions");
88 params.addParamNamesToGroup(
89 "include_deviatoric_stress velocity_interpolation momentum_advection_interpolation " 90 "momentum_two_term_bc_expansion pressure_two_term_bc_expansion mu_interp_method " 91 "momentum_face_interpolation",
93 params.addParamNamesToGroup(
"thermal_expansion",
"Gravity treatment");
100 _has_flow_equations(getParam<bool>(
"add_flow_equations")),
101 _compressibility(getParam<
MooseEnum>(
"compressibility")),
102 _solve_for_dynamic_pressure(getParam<bool>(
"solve_for_dynamic_pressure")),
103 _porous_medium_treatment(getParam<bool>(
"porous_medium_treatment")),
104 _porosity_name(getParam<MooseFunctorName>(
"porosity")),
105 _flow_porosity_functor_name(_porosity_name),
107 isParamValid(
"velocity_variable")
108 ? getParam<
std::vector<
std::string>>(
"velocity_variable")
109 : (_porous_medium_treatment
113 _pressure_name(isParamValid(
"pressure_variable")
114 ? getParam<NonlinearVariableName>(
"pressure_variable")
116 _fluid_temperature_name(isParamValid(
"fluid_temperature_variable")
117 ? getParam<NonlinearVariableName>(
"fluid_temperature_variable")
119 _density_name(getParam<MooseFunctorName>(
"density")),
120 _density_gravity_name(isParamValid(
"density_gravity")
121 ? getParam<MooseFunctorName>(
"density_gravity")
122 : getParam<MooseFunctorName>(
"density")),
123 _dynamic_viscosity_name(getParam<MooseFunctorName>(
"dynamic_viscosity")),
124 _velocity_interpolation(getParam<
MooseEnum>(
"velocity_interpolation")),
125 _momentum_advection_interpolation(getParam<
MooseEnum>(
"momentum_advection_interpolation")),
126 _momentum_face_interpolation(getParam<
MooseEnum>(
"momentum_face_interpolation")),
127 _friction_blocks(getParam<
std::vector<
std::vector<SubdomainName>>>(
"friction_blocks")),
128 _friction_types(getParam<
std::vector<
std::vector<
std::string>>>(
"friction_types")),
129 _friction_coeffs(getParam<
std::vector<
std::vector<
std::string>>>(
"friction_coeffs")),
130 _inlet_boundaries(getParam<
std::vector<BoundaryName>>(
"inlet_boundaries")),
131 _outlet_boundaries(getParam<
std::vector<BoundaryName>>(
"outlet_boundaries")),
132 _wall_boundaries(getParam<
std::vector<BoundaryName>>(
"wall_boundaries")),
133 _hydraulic_separators(getParam<
std::vector<BoundaryName>>(
"hydraulic_separator_sidesets")),
134 _flux_inlet_pps(getParam<
std::vector<PostprocessorName>>(
"flux_inlet_pps")),
135 _flux_inlet_directions(getParam<
std::vector<Point>>(
"flux_inlet_directions"))
140 checkVectorParamsSameLengthIfSet<PostprocessorName, Point>(
"flux_inlet_pps",
141 "flux_inlet_directions");
150 "Solving for dynamic pressure is only implemented for incompressible flow");
153 checkVectorParamAndMultiMooseEnumLength<BoundaryName>(
"inlet_boundaries",
"momentum_inlet_types");
154 checkVectorParamAndMultiMooseEnumLength<BoundaryName>(
"outlet_boundaries",
155 "momentum_outlet_types");
156 checkVectorParamAndMultiMooseEnumLength<BoundaryName>(
"wall_boundaries",
"momentum_wall_types");
158 std::vector<MooseFunctorName>,
160 "inlet_boundaries",
"momentum_inlet_functors",
"flux_inlet_pps");
161 checkVectorParamsNoOverlap<BoundaryName>(
162 {
"inlet_boundaries",
"outlet_boundaries",
"wall_boundaries"});
173 "For porous medium simulations, functor name " + *it +
174 " is already reserved for the automatically-computed interstitial velocity. " 175 "Please choose another name for your external velocity variable!");
181 "friction_blocks",
"friction_types");
182 checkTwoDVectorParamsSameLength<std::string, std::string>(
"friction_types",
"friction_coeffs");
194 std::vector<BoundaryName> inlet_boundaries_with_functors;
198 inlet_boundaries_with_functors.push_back(boundary);
200 Moose::createMapFromVectors<BoundaryName, std::vector<MooseFunctorName>>(
201 inlet_boundaries_with_functors,
202 getParam<std::vector<std::vector<MooseFunctorName>>>(
"momentum_inlet_functors"));
207 std::vector<BoundaryName> outlet_boundaries_with_functors;
211 outlet_boundaries_with_functors.push_back(boundary);
212 const auto & pressure_functors = getParam<std::vector<MooseFunctorName>>(
"pressure_functors");
213 if (outlet_boundaries_with_functors.size() != pressure_functors.size())
215 "Size (" + std::to_string(pressure_functors.size()) +
216 ") is not the same as the number of pressure outlet boundaries in " 217 "'fixed-pressure/fixed-pressure-zero-gradient' (size " +
218 std::to_string(outlet_boundaries_with_functors.size()) +
")");
220 outlet_boundaries_with_functors, pressure_functors);
226 std::vector<BoundaryName> wall_boundaries_with_functors;
229 wall_boundaries_with_functors.push_back(boundary);
230 const auto & momentum_wall_functors =
231 getParam<std::vector<std::vector<MooseFunctorName>>>(
"momentum_wall_functors");
232 if (wall_boundaries_with_functors.size() != momentum_wall_functors.size())
234 "Size (" + std::to_string(momentum_wall_functors.size()) +
235 ") is not the same as the number of momentum_wall wall boundaries with " 236 "no-slip boundary conditions ' (size " +
237 std::to_string(wall_boundaries_with_functors.size()) +
")");
240 Moose::createMapFromVectors<BoundaryName, std::vector<MooseFunctorName>>(
241 wall_boundaries_with_functors, momentum_wall_functors);
283 for (
unsigned int dim_i = 0; dim_i <
dimension(); ++dim_i)
297 const std::string class_name =
"ADVectorMagnitudeFunctorMaterial";
301 const std::vector<std::string> param_names{
"x_functor",
"y_functor",
"z_functor"};
302 for (
unsigned int dim_i = 0; dim_i <
dimension(); ++dim_i)
304 params.
set<MooseFunctorName>(
"vector_magnitude_name") =
NS::speed;
314 getParam<std::vector<FunctionName>>(
"initial_velocity").size() != 0)
317 "Velocity is defined externally of WCNSFVFlowPhysicsBase, so should the inital " 322 "Pressure is defined externally of WCNSFVFlowPhysicsBase, so should the inital " 326 if (
getParam<std::vector<FunctionName>>(
"initial_velocity").size() !=
dimension() &&
327 getParam<std::vector<FunctionName>>(
"initial_velocity").size() != 3 &&
328 getParam<std::vector<FunctionName>>(
"initial_velocity").size() != 0)
331 "The number of velocity components in the " +
type() +
" initial condition is not " +
336 auto vvalue = getParam<std::vector<FunctionName>>(
"initial_velocity");
341 params.
set<FunctionName>(
"function") = vvalue[
d];
356 params.
set<FunctionName>(
"function") = getParam<FunctionName>(
"initial_pressure");
365 unsigned short ghost_layers = 2;
372 const auto momentum_inlet_types = getParam<MultiMooseEnum>(
"momentum_inlet_types");
374 for (
unsigned int bc_ind = 0; bc_ind < momentum_inlet_types.size(); ++bc_ind)
375 if (momentum_inlet_types[bc_ind] ==
"flux-mass" ||
376 momentum_inlet_types[bc_ind] ==
"flux-velocity")
378 const std::string pp_type =
"AreaPostprocessor";
403 mooseError(
"Short Variable name '", short_name,
"' not recognized.");
420 return getCoupledPhysics<WCNSFVTurbulencePhysics>(
421 getParam<PhysicsName>(
"coupled_flow_physics"));
425 const auto all_turbulence_physics = getCoupledPhysics<const WCNSFVTurbulencePhysics>(
true);
426 for (
const auto physics : all_turbulence_physics)
428 physics->name(), physics->blocks(),
false))
std::string prefix() const
static InputParameters validParams()
unsigned short getNumberAlgebraicGhostingLayersNeeded() const override
Return the number of algebraic ghosting layers needed.
const std::vector< std::string > & getVelocityNames() const
To interface with other Physics.
void assignBlocks(InputParameters ¶ms, const std::vector< SubdomainName > &blocks) const
Creates all the objects needed to add a turbulence model to an incompressible / weakly-compressible N...
std::map< BoundaryName, MooseEnum > _momentum_inlet_types
Momentum inlet boundary types.
const std::vector< BoundaryName > _outlet_boundaries
Boundaries with a flow outlet specified on them.
virtual void addSeparatorBC()=0
static const std::string speed
virtual void initializePhysicsAdditional() override
virtual void needFV() override
virtual void addMaterial(const std::string &material_name, const std::string &name, InputParameters ¶meters)
virtual void addMaterials() override
static const std::string velocity_z
virtual void actOnAdditionalTasks() override
InputParameters getValidParams(const std::string &name) const
const WCNSFVTurbulencePhysics * _turbulence_physics
Can be set to a coupled turbulence physics.
std::map< BoundaryName, std::vector< MooseFunctorName > > _momentum_inlet_functors
Functors describing the momentum inlet for each boundary.
virtual void addOutletBC()=0
std::map< BoundaryName, std::vector< MooseFunctorName > > _momentum_wall_functors
Functors describing the momentum for each wall boundary.
static const std::string velocity_x
const NonlinearVariableName _pressure_name
Pressure name.
static const std::string temperature
const MooseFunctorName _porosity_name
Name of the porosity functor.
virtual void addWallsBC()=0
bool hasUserObject(const std::string &name) const
bool shouldCreateIC(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool ic_is_default_ic, const bool error_if_already_defined) const
static InputParameters validParams()
const bool _porous_medium_treatment
Whether to use the porous medium treatment.
virtual const std::string & name() const
std::vector< SubdomainName > _blocks
const std::vector< BoundaryName > _wall_boundaries
Boundaries which define a wall (slip/noslip/etc.)
virtual void addPostprocessors() override
unsigned int dimension() const
bool isParamValid(const std::string &name) const
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters ¶meters)
virtual FEProblemBase & getProblem()
virtual void addPostprocessor(const std::string &pp_name, const std::string &name, InputParameters ¶meters)
static const std::string porosity
static InputParameters validParams()
static InputParameters commonNavierStokesFlowParams()
static const std::string T_fluid
std::vector< std::vector< SubdomainName > > _friction_blocks
Subdomains where we want to have volumetric friction.
const NonlinearVariableName & getFluidTemperatureName() const
std::map< BoundaryName, MooseEnum > _momentum_outlet_types
Momentum outlet boundary types.
static const std::string superficial_velocity_vector[3]
const std::vector< std::string > _velocity_names
Velocity names.
virtual void addInletBC()=0
Functions adding boundary conditions for the flow simulation.
MooseFunctorName getPorosityFunctorName(const bool smoothed) const
static InputParameters commonMomentumBoundaryFluxesParams()
const std::string & type() const
const T & getParam(const std::string &name) const
const std::string & _current_task
static const std::string velocity_y
const WCNSFVTurbulencePhysics * getCoupledTurbulencePhysics() const
Find the turbulence physics.
void paramError(const std::string ¶m, Args... args) const
const bool _solve_for_dynamic_pressure
Whether we are solving for the total or dynamic pressure.
const MooseEnum _compressibility
Compressibility type, can be compressible, incompressible or weakly-compressible. ...
bool checkBlockRestrictionIdentical(const std::string &object_name, const std::vector< SubdomainName > &blocks, const bool error_if_not_identical=true) const
MooseFunctorName _flow_porosity_functor_name
Name of the porosity functor for the flow equations (if smoothed)
static InputParameters commonMomentumEquationParams()
bool _define_variables
Whether to define variables if they do not exist.
void addPorousMediumSpeedMaterial()
Add material to define the local speed in porous medium flows.
bool isParamSetByUser(const std::string &nm) const
std::map< BoundaryName, MooseEnum > _momentum_wall_types
Momentum wall boundary types.
VariableName getFlowVariableName(const std::string &default_name) const
Convenience routine to be able to retrieve the actual variable names from their default names...
void addNonPorousMediumSpeedMaterial()
Add material to define the local speed with no porous medium treatment.
std::map< BoundaryName, MooseFunctorName > _pressure_functors
Functors describing the outlet pressure on each boundary.
virtual bool hasForchheimerFriction() const =0
Return whether a Forchheimer friction model is in use.
static const std::string pressure
IntRange< T > make_range(T beg, T end)
virtual void addFVBCs() override
void mooseError(Args &&... args) const
const InputParameters & parameters() const
virtual void addInitialConditions() override
WCNSFVFlowPhysicsBase(const InputParameters ¶meters)
Base class to hold common parameters and utilities between all the weakly compressible Navier Stokes-...
const std::vector< BoundaryName > _inlet_boundaries
Boundaries with a flow inlet specified on them.
const std::string velocity_vector[3]
std::vector< Point > _flux_inlet_directions
Direction of each flux inlet. Indexing based on the number of flux boundaries.
static InputParameters commonMomentumBoundaryTypesParams()
const ExecFlagType EXEC_INITIAL
const NonlinearVariableName & getPressureName() const