13 #include "libmesh/nonlinear_solver.h" 22 "Calculates the turbulent viscosity according to the k-epsilon model.");
23 params.
addRequiredParam<MooseFunctorName>(
"u",
"The velocity in the x direction.");
24 params.
addParam<MooseFunctorName>(
"v",
"The velocity in the y direction.");
25 params.
addParam<MooseFunctorName>(
"w",
"The velocity in the z direction.");
26 params.
addRequiredParam<MooseFunctorName>(
"k",
"Coupled turbulent kinetic energy.");
29 "Coupled turbulent kinetic energy dissipation rate.");
32 params.
addParam<
Real>(
"C_mu",
"Coupled turbulent kinetic energy closure.");
33 params.
addParam<
Real>(
"mu_t_ratio_max", 1e5,
"Maximum allowable mu_t_ratio : mu/mu_t.");
34 params.
addParam<std::vector<BoundaryName>>(
35 "walls", {},
"Boundaries that correspond to solid walls.");
36 params.
addParam<
bool>(
"bulk_wall_treatment",
false,
"Activate bulk wall treatment.");
37 MooseEnum wall_treatment(
"eq_newton eq_incremental eq_linearized neq",
"eq_newton");
40 "The method used for computing the wall functions." 41 "'eq_newton', 'eq_incremental', 'eq_linearized', 'neq'");
42 MooseEnum scale_limiter(
"none standard",
"standard");
45 "The method used to limit the k-epsilon time scale." 46 "'none', 'standard'");
47 params.
addParam<
bool>(
"newton_solve",
false,
"Whether a Newton nonlinear solve is being used");
55 _dim(_subproblem.
mesh().dimension()),
56 _u_var(getFunctor<
ADReal>(
"u")),
57 _v_var(params.isParamValid(
"v") ? &(getFunctor<
ADReal>(
"v")) : nullptr),
58 _w_var(params.isParamValid(
"w") ? &(getFunctor<
ADReal>(
"w")) : nullptr),
63 _C_mu(getParam<
Real>(
"C_mu")),
64 _mu_t_ratio_max(getParam<
Real>(
"mu_t_ratio_max")),
65 _wall_boundary_names(getParam<
std::vector<BoundaryName>>(
"walls")),
66 _bulk_wall_treatment(getParam<bool>(
"bulk_wall_treatment")),
68 _scale_limiter(getParam<
MooseEnum>(
"scale_limiter")),
69 _newton_solve(getParam<bool>(
"newton_solve"))
95 const auto nu =
mu / rho;
107 const auto & elem_distances =
_dist[&elem];
108 const auto min_wall_distance_iterator =
109 (std::min_element(elem_distances.begin(), elem_distances.end()));
110 const auto min_wall_dist = *min_wall_distance_iterator;
111 const size_t minIndex = std::distance(elem_distances.begin(), min_wall_distance_iterator);
112 const auto loc_normal =
_face_infos[&elem][minIndex]->normal();
117 velocity(1) = (*_v_var)(current_argument, state);
119 velocity(2) = (*_w_var)(current_argument, state);
133 const auto u_tau =
NS::findUStar(
mu, rho, parallel_speed, min_wall_dist);
134 y_plus = min_wall_dist * u_tau * rho /
mu;
135 mu_wall = rho * Utility::pow<2>(u_tau) * min_wall_dist / parallel_speed;
136 mut_log = mu_wall -
mu;
141 y_plus =
NS::findyPlus(
mu, rho, std::max(parallel_speed, 1e-10), min_wall_dist);
144 mut_log = mu_wall -
mu;
152 const ADReal c_c = parallel_speed;
154 const auto u_tau = (-b_c + std::sqrt(
std::pow(b_c, 2) + 4.0 * a_c * c_c)) / (2.0 * a_c);
155 y_plus = min_wall_dist * u_tau * rho /
mu;
156 mu_wall = rho * Utility::pow<2>(u_tau) * min_wall_dist / parallel_speed;
157 mut_log = mu_wall -
mu;
162 y_plus = min_wall_dist * std::sqrt(std::sqrt(
_C_mu) *
_k(current_argument, state)) * rho /
mu;
165 mut_log = mu_wall -
mu;
168 mooseAssert(
false,
"For `kEpsilonViscosityAux` , wall treatment should not reach here");
173 else if (y_plus >= 30.0)
179 const auto blending_function = (y_plus - 5.0) / 25.0;
192 time_scale = std::max(
_k(current_argument, state) /
_epsilon(current_argument, state),
193 std::sqrt(nu /
_epsilon(current_argument, state)));
197 time_scale =
_k(current_argument, state) /
_epsilon(current_argument, state);
201 time_scale =
_k(current_argument, state) /
205 _rho(current_argument, state) *
_C_mu *
_k(current_argument, state) * time_scale;
206 mu_t = mu_t_nl.value();
virtual void initialSetup() override
static constexpr Real von_karman_constant
const Moose::Functor< ADReal > & _k
Turbulent kinetic energy.
static const std::string mu_t
const Moose::Functor< ADReal > * _v_var
y-velocity
Computes the turbuent viscosity for the k-Epsilon model.
const Real _mu_t_ratio_max
const bool _bulk_wall_treatment
If the user wants to enable bulk wall treatment.
std::map< const Elem *, bool > _wall_bounded
void getWallBoundedElements(const std::vector< BoundaryName > &wall_boundary_name, const FEProblemBase &fe_problem, const SubProblem &subproblem, const std::set< SubdomainID > &block_ids, std::map< const Elem *, bool > &wall_bounded_map)
Map marking wall bounded elements The map passed in wall_bounded_map gets cleared and re-populated...
Moose::StateArg determineState() const
static const std::string density
static const std::string TKE
WallTreatmentEnum
Wall treatment options.
virtual const std::set< SubdomainID > & blockIDs() const
DualNumber< Real, DNDerivativeType, true > ADReal
FEProblemBase & _c_fe_problem
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
NS::WallTreatmentEnum _wall_treatment
Method used for wall treatment.
static const std::string mu
const bool _newton_solve
Whether we are using a newton solve.
ADReal findyPlus(const ADReal &mu, const ADReal &rho, const ADReal &u, Real dist)
Finds the non-dimensional wall distance normalized with the friction velocity Implements a fixed-poin...
std::map< const Elem *, std::vector< const FaceInfo * > > _face_infos
const Moose::Functor< ADReal > * _w_var
z-velocity
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...
std::map< const Elem *, std::vector< Real > > _dist
virtual Real computeValue() override
kEpsilonViscosityAux(const InputParameters ¶meters)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MooseEnum _scale_limiter
Method used to limit the k-e time scale.
static constexpr Real E_turb_constant
const Moose::Functor< ADReal > & _mu
Dynamic viscosity.
const std::vector< BoundaryName > & _wall_boundary_names
Wall boundaries.
static const std::string TKED
const Elem *const & _current_elem
const Moose::Functor< ADReal > & _u_var
x-velocity
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-...
static InputParameters validParams()
static const std::string velocity
ADReal findUStar(const ADReal &mu, const ADReal &rho, const ADReal &u, Real dist)
Finds the friction velocity using standard velocity wall functions formulation.
registerMooseObject("NavierStokesApp", kEpsilonViscosityAux)
static constexpr Real mu_t_low_limit
ADReal computeSpeed(const ADRealVectorValue &velocity)
Compute the speed (velocity norm) given the supplied velocity.
static InputParameters validParams()
const Moose::Functor< ADReal > & _rho
Density.
MooseUnits pow(const MooseUnits &, int)
static constexpr Real epsilon_low_limit
const Moose::Functor< ADReal > & _epsilon
Turbulent kinetic energy dissipation rate.
const Real _C_mu
C-mu closure coefficient.