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
76 for (const auto name_i : index_range(_passive_scalar_names))
77 {
78 // Dont add if the user already defined the variable
79 if (!shouldCreateVariable(_passive_scalar_names[name_i], _blocks, /*error if aux*/ true))
80 {
81 reportPotentiallyMissedParameters({"system_names", "passive_scalar_scaling"},
82 "MooseLinearVariableFVReal");
83 continue;
84 }
85
86 if (isParamValid("passive_scalar_scaling"))
87 params.set<std::vector<Real>>("scaling") = {
88 getParam<std::vector<Real>>("passive_scalar_scaling")[name_i]};
89
90 addSharedSolverVariable("MooseLinearVariableFVReal", _passive_scalar_names[name_i], params);
91 }
92}
93
94void
96{
97 std::string kernel_type = "LinearFVTimeDerivative";
98 InputParameters params = getFactory().getValidParams(kernel_type);
99 assignBlocks(params, _blocks);
100
101 for (const auto & vname : _passive_scalar_names)
102 {
103 params.set<LinearVariableName>("variable") = vname;
104 if (shouldCreateTimeDerivative(vname, _blocks, /*error if already defined */ false))
105 getProblem().addLinearFVKernel(kernel_type, prefix() + "ins_" + vname + "_time", params);
106 }
107}
108
109void
111{
112 const auto method_name =
113 isParamValid("passive_scalar_advection_interpolation_method_name")
114 ? getParam<InterpolationMethodName>("passive_scalar_advection_interpolation_method_name")
115 : InterpolationMethodName(
116 std::string(getParam<MooseEnum>("passive_scalar_advection_interpolation")));
117
118 const std::string kernel_type = "LinearFVScalarAdvection";
119 InputParameters params = getFactory().getValidParams(kernel_type);
120
121 assignBlocks(params, _blocks);
122 params.set<UserObjectName>("rhie_chow_user_object") = _flow_equations_physics->rhieChowUOName();
123 params.set<InterpolationMethodName>("advected_interp_method_name") = method_name;
124 setSlipVelocityParams(params);
125
126 for (const auto & vname : _passive_scalar_names)
127 {
128 params.set<LinearVariableName>("variable") = vname;
129 getProblem().addLinearFVKernel(kernel_type, prefix() + "ins_" + vname + "_advection", params);
130 }
131}
132
133void
135{
136 // Direct specification of diffusion term
137 const auto passive_scalar_diffusivities =
138 getParam<std::vector<MooseFunctorName>>("passive_scalar_diffusivity");
139
140 if (passive_scalar_diffusivities.size())
141 {
142 const std::string kernel_type = "LinearFVDiffusion";
143 InputParameters params = getFactory().getValidParams(kernel_type);
144 assignBlocks(params, _blocks);
145 params.set<bool>("use_nonorthogonal_correction") =
146 getParam<bool>("use_nonorthogonal_correction");
147 for (const auto name_i : index_range(_passive_scalar_names))
148 {
149 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
150 params.set<MooseFunctorName>("diffusion_coeff") =
151 passive_scalar_diffusivities[name_i] + (_has_turbulence_model ? "_plus_mut/Sc_t" : "");
153 kernel_type, prefix() + "ins_" + _passive_scalar_names[name_i] + "_diffusion", params);
154 }
155 }
156}
157
158void
160{
161 const std::string kernel_type = "LinearFVSource";
162 InputParameters params = getFactory().getValidParams(kernel_type);
163 assignBlocks(params, _blocks);
164
165 for (const auto scalar_i : index_range(_passive_scalar_names))
166 {
167 params.set<LinearVariableName>("variable") = _passive_scalar_names[scalar_i];
168
169 if (_passive_scalar_sources.size())
170 {
171 // Added for backward compatibility with former Modules/NavierStokesFV syntax
172 params.set<MooseFunctorName>("source_density") = _passive_scalar_sources[scalar_i];
174 kernel_type, prefix() + "ins_" + _passive_scalar_names[scalar_i] + "_source", params);
175 }
176
178 for (const auto i : index_range(_passive_scalar_coupled_sources[scalar_i]))
179 {
180 params.set<MooseFunctorName>("source_density") =
183 params.set<Real>("scaling_factor") = _passive_scalar_coupled_sources_coef[scalar_i][i];
185 params.set<std::vector<SubdomainName>>("block") =
187
188 getProblem().addLinearFVKernel(kernel_type,
189 prefix() + "ins_" + _passive_scalar_names[scalar_i] +
190 "_coupled_source_" + std::to_string(i),
191 params);
192 }
193 }
194}
195
196void
198{
199 const auto & inlet_boundaries = _flow_equations_physics->getInletBoundaries();
200 if (inlet_boundaries.empty())
201 return;
202
203 // Boundary checks
204 // TODO: once we have vectors of MooseEnum, we could use the same templated check for types and
205 // functors
206 if (inlet_boundaries.size() * _passive_scalar_names.size() != _passive_scalar_inlet_types.size())
208 "passive_scalar_inlet_types",
209 "The number of scalar inlet types (" + std::to_string(_passive_scalar_inlet_types.size()) +
210 ") is not equal to the number of inlet boundaries (" +
211 std::to_string(inlet_boundaries.size()) + ") times the number of passive scalars (" +
212 std::to_string(_passive_scalar_names.size()) + ")");
214 paramError("passive_scalar_inlet_functors",
215 "The number of groups of inlet functors (" +
216 std::to_string(_passive_scalar_inlet_functors.size()) +
217 ") is not equal to the number of passive scalars (" +
218 std::to_string(_passive_scalar_names.size()) + ")");
219
220 for (const auto name_i : index_range(_passive_scalar_names))
221 {
222 if (inlet_boundaries.size() != _passive_scalar_inlet_functors[name_i].size())
223 paramError("passive_scalar_inlet_functors",
224 "The number of inlet boundary functors for scalar '" +
225 _passive_scalar_names[name_i] +
226 "' does not match the number of inlet boundaries (" +
227 std::to_string(_passive_scalar_inlet_functors[name_i].size()) + ")");
228
229 unsigned int num_inlets = inlet_boundaries.size();
230 for (unsigned int bc_ind = 0; bc_ind < num_inlets; ++bc_ind)
231 {
232 if (_passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "fixed-value")
233 {
234 const std::string bc_type = "LinearFVAdvectionDiffusionFunctorDirichletBC";
235 InputParameters params = getFactory().getValidParams(bc_type);
236 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
237 params.set<MooseFunctorName>("functor") = _passive_scalar_inlet_functors[name_i][bc_ind];
238 params.set<std::vector<BoundaryName>>("boundary") = {inlet_boundaries[bc_ind]};
239
241 bc_type, _passive_scalar_names[name_i] + "_" + inlet_boundaries[bc_ind], params);
242 }
243 else if (_passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "flux-mass" ||
244 _passive_scalar_inlet_types[name_i * num_inlets + bc_ind] == "flux-velocity")
245 {
246 mooseError("Flux boundary conditions not supported at this time using the linear finite "
247 "volume discretization");
248 }
249 }
250 }
251}
252
253unsigned short
258
259void
261{
262 const auto & outlet_boundaries = _flow_equations_physics->getOutletBoundaries();
263 if (outlet_boundaries.empty())
264 return;
265
266 for (const auto & outlet_bdy : outlet_boundaries)
267 {
268 const std::string bc_type = "LinearFVAdvectionDiffusionOutflowBC";
269 InputParameters params = getFactory().getValidParams(bc_type);
270 params.set<std::vector<BoundaryName>>("boundary") = {outlet_bdy};
271 params.set<bool>("use_two_term_expansion") =
272 getParam<bool>("passive_scalar_two_term_bc_expansion");
273
274 for (const auto name_i : index_range(_passive_scalar_names))
275 {
276 params.set<LinearVariableName>("variable") = _passive_scalar_names[name_i];
277 getProblem().addLinearFVBC(bc_type, _passive_scalar_names[name_i] + "_" + outlet_bdy, params);
278 }
279 }
280}
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 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
void addSharedSolverVariable(const std::string &var_type, const VariableName &var_name, InputParameters params)
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