26 " terms of turbulent kinetic energy dissipation (TKED).");
27 params.
addRequiredParam<MooseFunctorName>(
"u",
"The velocity in the x direction.");
28 params.
addParam<MooseFunctorName>(
"v",
"The velocity in the y direction.");
29 params.
addParam<MooseFunctorName>(
"w",
"The velocity in the z direction.");
35 params.
addParam<std::vector<BoundaryName>>(
36 "walls", {},
"Boundaries that correspond to solid walls.");
37 MooseEnum wall_treatment(
"eq_newton eq_incremental eq_linearized neq",
"neq");
40 "The method used for computing the wall functions "
41 "'eq_newton', 'eq_incremental', 'eq_linearized', 'neq'");
43 params.
addParam<MooseFunctorName>(
"C1_eps", 1.44,
"First epsilon coefficient");
44 params.
addParam<MooseFunctorName>(
"C2_eps", 1.92,
"Second epsilon coefficient");
45 params.
addParam<Real>(
"C_mu", 0.09,
"Coupled turbulent kinetic energy closure.");
46 params.
addParam<Real>(
"C_pl", 10.0,
"Production limiter constant multiplier.");
53 _dim(_subproblem.
mesh().dimension()),
54 _u_var(getFunctor<Real>(
"u")),
55 _v_var(params.isParamValid(
"v") ? &(getFunctor<Real>(
"v")) : nullptr),
56 _w_var(params.isParamValid(
"w") ? &(getFunctor<Real>(
"w")) : nullptr),
57 _k(getFunctor<Real>(
NS::TKE)),
58 _rho(getFunctor<Real>(
NS::density)),
59 _mu(getFunctor<Real>(
NS::
mu)),
60 _mu_t(getFunctor<Real>(
NS::mu_t)),
61 _wall_boundary_names(getParam<
std::vector<BoundaryName>>(
"walls")),
62 _wall_treatment(getParam<
MooseEnum>(
"wall_treatment").getEnum<
NS::WallTreatmentEnum>()),
63 _C1_eps(getFunctor<Real>(
"C1_eps")),
64 _C2_eps(getFunctor<Real>(
"C2_eps")),
65 _C_mu(getParam<Real>(
"C_mu")),
66 _C_pl(getParam<Real>(
"C_pl"))
71 mooseInfo(
"No 'walls' were specified for the turbulent kinetic energy dissipation rate. "
72 "Wall-bounded flows need 'walls' for the wall treatment of this variable, "
73 "otherwise no wall boundary condition is applied to it.");
76 paramError(
"v",
"In two or more dimensions, the v velocity must be supplied!");
79 paramError(
"w",
"In three or more dimensions, the w velocity must be supplied!");
100 std::vector<LinearFVKernel *> kernels;
101 for (
const auto & system : {
"LinearFVElementalKernel",
"LinearFVFluxKernel"})
103 std::vector<LinearFVKernel *> system_kernels;
109 .condition<AttribThread>(
_tid)
110 .queryInto(system_kernels);
111 kernels.insert(kernels.end(), system_kernels.begin(), system_kernels.end());
113 for (
const auto kernel : kernels)
117 kernel->getParam<std::vector<BoundaryName>>(
"walls").empty())
118 kernel->paramError(
"walls",
119 "Walls must be specified for turbulent kernels acting on the "
120 "turbulent kinetic energy dissipation rate variable '",
122 "' when they are specified in '",
124 "'. Otherwise the wall-bounded cells, whose value is set by the wall "
125 "function, are not skipped by this kernel.");
145 const Real
rho =
_rho(elem_arg, state);
146 const Real TKE =
_k(elem_arg, state);
150 const auto destruction =
_C2_eps(elem_arg, state) *
rho * epsilon / TKE;
165 const Real
rho =
_rho(elem_arg, state);
166 const Real
mu =
_mu(elem_arg, state);
167 const Real TKE =
_k(elem_arg, state);
170 Real destruction = 0.0;
171 std::vector<Real> y_plus_vec, velocity_grad_norm_vec;
172 Real tot_weight = 0.0;
175 RealVectorValue velocity(
_u_var(elem_arg, state));
177 velocity(1) = (*_v_var)(elem_arg, state);
179 velocity(2) = (*_w_var)(elem_arg, state);
184 mooseAssert(distance_vec.size(),
"Should have found a distance vector");
185 mooseAssert(distance_vec.size() == face_info_vec.size(),
186 "Should be as many distance vectors as face info vectors");
189 for (
unsigned int i = 0; i < distance_vec.size(); i++)
191 const auto distance = distance_vec[i];
192 mooseAssert(
distance > 0,
"Should be at a non-zero distance");
200 velocity - velocity * face_info_vec[i]->normal() * face_info_vec[i]->normal());
204 y_plus_vec.push_back(y_plus);
209 for (
const auto i : index_range(y_plus_vec))
211 const auto y_plus = y_plus_vec[i];
214 destruction += 2.0 * TKE *
mu /
rho / Utility::pow<2>(distance_vec[i]) / tot_weight;
216 destruction += std::pow(
_C_mu, 0.75) * std::pow(TKE, 1.5) /
228 const Real
rho =
_rho(elem_arg, state);
229 const Real TKE =
_k(elem_arg, state);
235 const unsigned int rz_radial_coord =
239 Real production =
_mu_t(elem_arg, state) * symmetric_strain_tensor_sq_norm;
242 const Real production_limit =
_C_pl *
rho * TKED;
243 production = std::min(production, production_limit);
246 const auto production_epsilon =
_C1_eps(elem_arg, state) * production * TKED / TKE;
registerMooseObject("NavierStokesApp", LinearFVTKEDSourceSink)
virtual const std::set< SubdomainID > & blockIDs() const
const Elem * elem() const
TheWarehouse & theWarehouse() const
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
const ElemInfo * _current_elem_info
static InputParameters validParams()
Real _current_elem_volume
MooseLinearVariableFV< Real > & _var
void requestVariableCellGradient(const std::string &variable_name)
Kernel that adds contributions to the source and the sink of the turbulent kinetic energy dissipation...
const Moose::Functor< Real > & _u_var
x-velocity
const Moose::Functor< Real > * _w_var
z-velocity
const Moose::Functor< Real > & _C1_eps
Value of the first epsilon closure coefficient.
NS::WallTreatmentEnum _wall_treatment
Method used for wall treatment.
std::map< const Elem *, std::vector< Real > > _dist
static InputParameters validParams()
const unsigned int _dim
The dimension of the simulation.
const Moose::Functor< Real > & _C2_eps
Value of the second epsilon closure coefficient.
std::map< const Elem *, std::vector< const FaceInfo * > > _face_infos
virtual void initialSetup() override
const Moose::Functor< Real > & _mu_t
Turbulent dynamic viscosity.
const Moose::Functor< Real > & _k
Turbulent kinetic energy.
virtual Real computeMatrixContribution() override
const std::vector< BoundaryName > & _wall_boundary_names
Wall boundaries.
const Real _C_pl
Production Limiter Constant.
std::unordered_set< const Elem * > _wall_bounded
Maps for wall treatment.
virtual Real computeRightHandSideContribution() override
const Moose::Functor< Real > * _v_var
y-velocity
const Moose::Functor< Real > & _rho
Density.
LinearFVTKEDSourceSink(const InputParameters ¶ms)
Class constructor.
const Moose::Functor< Real > & _mu
Dynamic viscosity.
const Real _C_mu
C_mu constant.
An advection kernel that implements the advection term for the turbulent variables limited for the fi...
Kernel that adds contributions from a diffusion term of the turbulent variables, limited in the near-...
Kernel that adds contributions from a time derivative term of the turbulent variables,...
FEProblemBase & _fe_problem
const std::string & name() const
void paramError(const std::string ¶m, Args... args) const
void mooseInfo(Args &&... args) const
Real getElemValue(const ElemInfo &elem_info, const StateArg &state) const
unsigned int number() const
virtual void initialSetup()
unsigned int getAxisymmetricRadialCoord() const
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
unsigned int number() const
Moose::StateArg determineState() const
void getWallBoundedElements(const std::vector< BoundaryName > &wall_boundary_name, const FEProblemBase &fe_problem, const SubProblem &subproblem, const std::set< SubdomainID > &block_ids, std::unordered_set< const Elem * > &wall_bounded)
Map marking wall bounded elements The map passed in wall_bounded_map gets cleared and re-populated.
void getWallDistance(const std::vector< BoundaryName > &wall_boundary_name, const FEProblemBase &fe_problem, const SubProblem &subproblem, const std::set< SubdomainID > &block_ids, std::map< const Elem *, std::vector< Real > > &dist_map)
Map storing wall ditance for near-wall marked elements The map passed in dist_map gets cleared and re...
static const std::string density
template Real computeSpeed< Real >(const libMesh::VectorValue< Real > &velocity)
static constexpr Real von_karman_constant
static const std::string mu_t
static const std::string mu
static const std::string TKE
template Real findyPlus< Real >(const Real &mu, const Real &rho, const Real &u, Real dist)
template Real computeShearStrainRateNormSquared< Real >(const Moose::Functor< Real > &u, const Moose::Functor< Real > *v, const Moose::Functor< Real > *w, const Moose::ElemArg &elem_arg, const Moose::StateArg &state, const Moose::CoordinateSystemType coord_sys, const unsigned int rz_radial_coord)
void getElementFaceArgs(const std::vector< BoundaryName > &wall_boundary_name, const FEProblemBase &fe_problem, const SubProblem &subproblem, const std::set< SubdomainID > &block_ids, std::map< const Elem *, std::vector< const FaceInfo * > > &face_info_map)
Map storing face arguments to wall bounded faces The map passed in face_info_map gets cleared and re-...
Real distance(const Point &p)