https://mooseframework.inl.gov
Loading...
Searching...
No Matches
WCNSLinearFVScalarTransportPhysics.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
12#include "NSFVUtils.h"
13#include "NS.h"
14
17registerMooseAction("NavierStokesApp",
19 "add_interpolation_method_physics");
20
23{
25 params.addClassDescription("Define the Navier Stokes weakly-compressible scalar field transport "
26 "equation(s) using the linear finite volume discretization");
27 params.set<MooseEnum>("passive_scalar_advection_interpolation") =
29 params.addParam<InterpolationMethodName>(
30 "passive_scalar_advection_interpolation_method_name",
31 "Name of an externally defined FVInterpolationMethod to use for passive scalar advection. "
32 "When provided, this overrides 'passive_scalar_advection_interpolation'.");
33 params.addParam<bool>("use_nonorthogonal_correction",
34 true,
35 "If the nonorthogonal correction should be used when computing the normal "
36 "gradient, notably in the diffusion term.");
37
38 // Not supported
39 params.suppressParameter<MooseEnum>("preconditioning");
40
41 params.addParamNamesToGroup("passive_scalar_advection_interpolation_method_name",
42 "Numerical scheme");
43
44 return params;
45}
46
48 const InputParameters & parameters)
50{
51 addRequiredPhysicsTask("add_interpolation_method_physics");
52
54 _flow_equations_physics->paramError("porous_medium_treatment",
55 "Porous media scalar advection is currently unimplemented");
56}
57
58void
60{
61 if (!_has_scalar_equation || isParamValid("passive_scalar_advection_interpolation_method_name"))
62 return;
63
64 addFVAdvectedInterpolationMethod(getParam<MooseEnum>("passive_scalar_advection_interpolation"));
65}
66
67void
69{
70 // For compatibility with Modules/NavierStokesFV syntax
72 return;
73
74 auto params = getFactory().getValidParams("MooseLinearVariableFVReal");
75 assignBlocks(params, _blocks);
76
77 for (const auto name_i : index_range(_passive_scalar_names))
78 {
79 // Dont add if the user already defined the variable
80 if (!shouldCreateVariable(_passive_scalar_names[name_i], _blocks, /*error if aux*/ true))
81 {
82 reportPotentiallyMissedParameters({"system_names", "passive_scalar_scaling"},
83 "MooseLinearVariableFVReal");
84 continue;
85 }
86
87 params.set<SolverSystemName>("solver_sys") = getSolverSystem(name_i);
88 if (isParamValid("passive_scalar_scaling"))
89 params.set<std::vector<Real>>("scaling") = {
90 getParam<std::vector<Real>>("passive_scalar_scaling")[name_i]};
91
92 getProblem().addVariable("MooseLinearVariableFVReal", _passive_scalar_names[name_i], params);
93 }
94}
95
96void
98{
99 std::string kernel_type = "LinearFVTimeDerivative";
100 InputParameters params = getFactory().getValidParams(kernel_type);
101 assignBlocks(params, _blocks);
102
103 for (const auto & vname : _passive_scalar_names)
104 {
105 params.set<LinearVariableName>("variable") = vname;
106 if (shouldCreateTimeDerivative(vname, _blocks, /*error if already defined */ false))
107 getProblem().addLinearFVKernel(kernel_type, prefix() + "ins_" + vname + "_time", params);
108 }
109}
110
111void
113{
114 const auto method_name =
115 isParamValid("passive_scalar_advection_interpolation_method_name")
116 ? getParam<InterpolationMethodName>("passive_scalar_advection_interpolation_method_name")
117 : InterpolationMethodName(
118 std::string(getParam<MooseEnum>("passive_scalar_advection_interpolation")));
119
120 const std::string kernel_type = "LinearFVScalarAdvection";
121 InputParameters params = getFactory().getValidParams(kernel_type);
122
123 assignBlocks(params, _blocks);
124 params.set<UserObjectName>("rhie_chow_user_object") = _flow_equations_physics->rhieChowUOName();
125 params.set<InterpolationMethodName>("advected_interp_method_name") = method_name;
126 setSlipVelocityParams(params);
127
128 for (const auto & vname : _passive_scalar_names)
129 {
130 params.set<LinearVariableName>("variable") = vname;
131 getProblem().addLinearFVKernel(kernel_type, prefix() + "ins_" + vname + "_advection", params);
132 }
133}
134
135void
137{
138 // Direct specification of diffusion term
139 const auto passive_scalar_diffusivities =
140 getParam<std::vector<MooseFunctorName>>("passive_scalar_diffusivity");
141
142 if (passive_scalar_diffusivities.size())
143 {
144 const std::string kernel_type = "LinearFVDiffusion";
145 InputParameters params = getFactory().getValidParams(kernel_type);
146 assignBlocks(params, _blocks);
147 params.set<bool>("use_nonorthogonal_correction") =
148 getParam<bool>("use_nonorthogonal_correction");
149 for (const auto name_i : index_range(_passive_scalar_names))
150 {
151 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
152 params.set<MooseFunctorName>("diffusion_coeff") =
153 passive_scalar_diffusivities[name_i] + (_has_turbulence_model ? "_plus_mut/Sc_t" : "");
155 kernel_type, prefix() + "ins_" + _passive_scalar_names[name_i] + "_diffusion", params);
156 }
157 }
158}
159
160void
162{
163 const std::string kernel_type = "LinearFVSource";
164 InputParameters params = getFactory().getValidParams(kernel_type);
165 assignBlocks(params, _blocks);
166
167 for (const auto scalar_i : index_range(_passive_scalar_names))
168 {
169 params.set<LinearVariableName>("variable") = _passive_scalar_names[scalar_i];
170
171 if (_passive_scalar_sources.size())
172 {
173 // Added for backward compatibility with former Modules/NavierStokesFV syntax
174 params.set<MooseFunctorName>("source_density") = _passive_scalar_sources[scalar_i];
176 kernel_type, prefix() + "ins_" + _passive_scalar_names[scalar_i] + "_source", params);
177 }
178
180 for (const auto i : index_range(_passive_scalar_coupled_sources[scalar_i]))
181 {
182 params.set<MooseFunctorName>("source_density") =
185 params.set<Real>("scaling_factor") = _passive_scalar_coupled_sources_coef[scalar_i][i];
187 params.set<std::vector<SubdomainName>>("block") =
189
190 getProblem().addLinearFVKernel(kernel_type,
191 prefix() + "ins_" + _passive_scalar_names[scalar_i] +
192 "_coupled_source_" + std::to_string(i),
193 params);
194 }
195 }
196}
197
198void
200{
201 const auto & inlet_boundaries = _flow_equations_physics->getInletBoundaries();
202 if (inlet_boundaries.empty())
203 return;
204
205 // Boundary checks
206 // TODO: once we have vectors of MooseEnum, we could use the same templated check for types and
207 // functors
208 if (inlet_boundaries.size() * _passive_scalar_names.size() != _passive_scalar_inlet_types.size())
210 "passive_scalar_inlet_types",
211 "The number of scalar inlet types (" + std::to_string(_passive_scalar_inlet_types.size()) +
212 ") is not equal to the number of inlet boundaries (" +
213 std::to_string(inlet_boundaries.size()) + ") times the number of passive scalars (" +
214 std::to_string(_passive_scalar_names.size()) + ")");
216 paramError("passive_scalar_inlet_functors",
217 "The number of groups of inlet functors (" +
218 std::to_string(_passive_scalar_inlet_functors.size()) +
219 ") is not equal to the number of passive scalars (" +
220 std::to_string(_passive_scalar_names.size()) + ")");
221
222 for (const auto name_i : index_range(_passive_scalar_names))
223 {
224 if (inlet_boundaries.size() != _passive_scalar_inlet_functors[name_i].size())
225 paramError("passive_scalar_inlet_functors",
226 "The number of inlet boundary functors for scalar '" +
227 _passive_scalar_names[name_i] +
228 "' does not match the number of inlet boundaries (" +
229 std::to_string(_passive_scalar_inlet_functors[name_i].size()) + ")");
230
231 unsigned int num_inlets = inlet_boundaries.size();
232 for (unsigned int bc_ind = 0; bc_ind < num_inlets; ++bc_ind)
233 {
234 if (_passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "fixed-value")
235 {
236 const std::string bc_type = "LinearFVAdvectionDiffusionFunctorDirichletBC";
237 InputParameters params = getFactory().getValidParams(bc_type);
238 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
239 params.set<MooseFunctorName>("functor") = _passive_scalar_inlet_functors[name_i][bc_ind];
240 params.set<std::vector<BoundaryName>>("boundary") = {inlet_boundaries[bc_ind]};
241
243 bc_type, _passive_scalar_names[name_i] + "_" + inlet_boundaries[bc_ind], params);
244 }
245 else if (_passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "flux-mass" ||
246 _passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "flux-velocity")
247 {
248 mooseError("Flux boundary conditions not supported at this time using the linear finite "
249 "volume discretization");
250 }
251 }
252 }
253}
254
255unsigned short
260
261void
263{
264 const auto & outlet_boundaries = _flow_equations_physics->getOutletBoundaries();
265 if (outlet_boundaries.empty())
266 return;
267
268 for (const auto & outlet_bdy : outlet_boundaries)
269 {
270 const std::string bc_type = "LinearFVAdvectionDiffusionOutflowBC";
271 InputParameters params = getFactory().getValidParams(bc_type);
272 params.set<std::vector<BoundaryName>>("boundary") = {outlet_bdy};
273 params.set<bool>("use_two_term_expansion") =
274 getParam<bool>("passive_scalar_two_term_bc_expansion");
275
276 for (const auto name_i : index_range(_passive_scalar_names))
277 {
278 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
279 getProblem().addLinearFVBC(bc_type, _passive_scalar_names[name_i] + "_" + outlet_bdy, params);
280 }
281 }
282}
registerMooseAction("NavierStokesApp", WCNSLinearFVScalarTransportPhysics, "add_interpolation_method_physics")
registerNavierStokesPhysicsBaseTasks("NavierStokesApp", WCNSLinearFVScalarTransportPhysics)
registerWCNSFVScalarTransportBaseTasks("NavierStokesApp", WCNSLinearFVScalarTransportPhysics)
virtual void addLinearFVKernel(const std::string &kernel_name, const std::string &name, InputParameters &parameters)
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
virtual void addLinearFVBC(const std::string &fv_bc_name, const std::string &name, InputParameters &parameters)
InputParameters getValidParams(const std::string &name) const
void suppressParameter(const std::string &name)
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
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)
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
unsigned int size() const
void addFVAdvectedInterpolationMethod(const MooseEnum &interpolation_method)
Add the FVInterpolationMethod object for an advected interpolation method if absent.
virtual FEProblemBase & getProblem()
Factory & getFactory()
bool shouldCreateTimeDerivative(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool error_if_already_defined) const
void assignBlocks(InputParameters &params, const std::vector< SubdomainName > &blocks) const
void reportPotentiallyMissedParameters(const std::vector< std::string > &param_names, const std::string &object_type, const std::string &object_name="") const
std::string prefix() const
const SolverSystemName & getSolverSystem(unsigned int variable_index) const
bool shouldCreateVariable(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool error_if_aux)
std::vector< SubdomainName > _blocks
void addRequiredPhysicsTask(const std::string &task)
const WCNSFVFlowPhysicsBase * _flow_equations_physics
Flow physics.
bool _has_turbulence_model
Because of the Modules/navierStokesFV syntax, a turbulence physics often exists without a model we sa...
const bool _porous_medium_treatment
Switch to show if porous medium treatment is requested or not.
const UserObjectName & rhieChowUOName() const
Return the name of the Rhie Chow user object.
const std::vector< BoundaryName > & getOutletBoundaries() const
Get the outlet boundaries.
const std::vector< BoundaryName > & getInletBoundaries() const
Get the inlet boundaries.
Creates all the objects needed to solve the Navier Stokes scalar transport equations.
const bool _has_scalar_equation
A boolean to help compatibility with the old Modules/NavierStokesFV syntax or to deliberately skip ad...
std::vector< MooseFunctorName > _passive_scalar_sources
Functors for the passive scalar sources. Indexing is scalar variable index.
std::vector< std::vector< MooseFunctorName > > _passive_scalar_coupled_sources
Functors for the passive scalar (coupled) sources. Outer indexing is scalar variable index.
MultiMooseEnum _passive_scalar_inlet_types
Passive scalar inlet boundary types.
std::vector< std::vector< std::vector< SubdomainName > > > _passive_scalar_coupled_sources_blocks
Subdomains for the sources. Outer indexing is scalar index, intermediate is source index,...
std::vector< std::vector< Real > > _passive_scalar_coupled_sources_coef
Coefficients for multiplying for the passive scalar sources. Outer indexing is scalar variable index.
virtual void setSlipVelocityParams(InputParameters &) const
std::vector< NonlinearVariableName > _passive_scalar_names
Names of the passive scalar variables.
std::vector< std::vector< MooseFunctorName > > _passive_scalar_inlet_functors
Functors describing the inlet boundary values. See passive_scalar_inlet_types for what the functors a...
Creates all the objects needed to solve the Navier Stokes scalar transport equations using the linear...
virtual unsigned short getNumberAlgebraicGhostingLayersNeeded() const override
Return the number of ghosting layers needed.
virtual void addScalarTimeKernels() override
Functions adding kernels for the incompressible / weakly-compressible scalar transport equation If th...
virtual void addScalarInletBC() override
Functions adding boundary conditions for the incompressible simulation.
WCNSLinearFVScalarTransportPhysics(const InputParameters &parameters)
virtual void addScalarSourceKernels() override
Equivalent of NSFVAction addScalarCoupledSourceKernels.
MooseEnum fvAdvectedInterpolationMethods()
Enum of the advected interpolation methods supported by FVInterpolationMethod objects.
Definition NSFVUtils.C:61