https://mooseframework.inl.gov
Loading...
Searching...
No Matches
kEpsilonViscosityAux.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
11#include "NavierStokesMethods.h"
12#include "NonlinearSystemBase.h"
13#include "libmesh/nonlinear_solver.h"
14
16
19{
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>(NS::TKE, "Coupled turbulent kinetic energy.");
27 params.addRequiredParam<MooseFunctorName>(NS::TKED,
28 "Coupled turbulent kinetic energy dissipation rate.");
29 params.addRequiredParam<MooseFunctorName>(NS::density, "Density");
30 params.addRequiredParam<MooseFunctorName>(NS::mu, "Dynamic viscosity.");
31 params.addRequiredParam<Real>("C_mu", "Coupled turbulent kinetic energy closure.");
32 params.addParam<Real>("mu_t_ratio_max", 1e5, "Maximum allowable mu_t_ratio : mu/mu_t.");
33 params.addParam<std::vector<BoundaryName>>(
34 "walls", {}, "Boundaries that correspond to solid walls.");
35 params.addParam<bool>("bulk_wall_treatment", false, "Activate bulk wall treatment.");
36 MooseEnum wall_treatment("eq_newton eq_incremental eq_linearized neq", "eq_newton");
37 params.addParam<MooseEnum>("wall_treatment",
38 wall_treatment,
39 "The method used for computing the wall functions."
40 "'eq_newton', 'eq_incremental', 'eq_linearized', 'neq'");
41 MooseEnum scale_limiter("none standard", "standard");
42 params.addParam<MooseEnum>("scale_limiter",
43 scale_limiter,
44 "The method used to limit the k-epsilon time scale."
45 "'none', 'standard'");
46 params.addParam<bool>("newton_solve", false, "Whether a Newton nonlinear solve is being used");
47 params.addParamNamesToGroup("newton_solve", "Advanced");
48
49 return params;
50}
51
53 : AuxKernel(params),
54 _dim(_subproblem.mesh().dimension()),
55 _u_var(getFunctor<Real>("u")),
56 _v_var(params.isParamValid("v") ? &(getFunctor<Real>("v")) : nullptr),
57 _w_var(params.isParamValid("w") ? &(getFunctor<Real>("w")) : nullptr),
58 _k(getFunctor<Real>(NS::TKE)),
59 _epsilon(getFunctor<Real>(NS::TKED)),
60 _rho(getFunctor<Real>(NS::density)),
61 _mu(getFunctor<Real>(NS::mu)),
62 _C_mu(getParam<Real>("C_mu")),
63 _mu_t_ratio_max(getParam<Real>("mu_t_ratio_max")),
64 _wall_boundary_names(getParam<std::vector<BoundaryName>>("walls")),
65 _bulk_wall_treatment(getParam<bool>("bulk_wall_treatment")),
66 _wall_treatment(getParam<MooseEnum>("wall_treatment").getEnum<NS::WallTreatmentEnum>()),
67 _scale_limiter(getParam<MooseEnum>("scale_limiter")),
68 _newton_solve(getParam<bool>("newton_solve"))
69{
70}
71
72void
84
85Real
87{
88 // Convenient Arguments
89 const Elem & elem = *_current_elem;
90 const auto elem_arg = makeElemArg(_current_elem);
91 const Moose::StateArg state = determineState();
92 const auto rho = _rho(makeElemArg(_current_elem), state);
93 const auto mu = _mu(makeElemArg(_current_elem), state);
94 const auto nu = mu / rho;
95
96 // Determine if the element is wall bounded
97 // and if bulk wall treatment needs to be activated
98 const bool wall_bounded = _wall_bounded.find(_current_elem) != _wall_bounded.end();
99 Real mu_t;
100
101 // Computing wall value for near-wall elements if bulk wall treatment is activated
102 // bulk_wall_treatment should only be used for very coarse mesh problems
103 if (wall_bounded && _bulk_wall_treatment)
104 {
105 // Computing wall value for turbulent dynamic viscosity
106 const auto & elem_distances = _dist[&elem];
107 const auto min_wall_distance_iterator =
108 (std::min_element(elem_distances.begin(), elem_distances.end()));
109 const auto min_wall_dist = *min_wall_distance_iterator;
110 const size_t minIndex = std::distance(elem_distances.begin(), min_wall_distance_iterator);
111 const auto loc_normal = _face_infos[&elem][minIndex]->normal();
112
113 // Getting y_plus
114 RealVectorValue velocity(_u_var(elem_arg, state));
115 if (_v_var)
116 velocity(1) = (*_v_var)(elem_arg, state);
117 if (_w_var)
118 velocity(2) = (*_w_var)(elem_arg, state);
119
120 // Compute the velocity and direction of the velocity component that is parallel to the wall
121 const auto parallel_speed =
122 NS::computeSpeed<Real>(velocity - velocity * loc_normal * loc_normal);
123
124 // Switch for determining the near wall quantities
125 // wall_treatment can be: "eq_newton eq_incremental eq_linearized neq"
126 Real y_plus = 0;
127 Real mut_log; // turbulent log-layer viscosity
128 Real mu_wall; // total wall viscosity to obtain the shear stress at the wall
129
131 {
132 // Full Newton-Raphson solve to find the wall quantities from the law of the wall
133 const auto u_tau = NS::findUStar<Real>(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;
137 }
139 {
140 // Incremental solve on y_plus to get the near-wall quantities
141 y_plus = NS::findyPlus<Real>(mu, rho, std::max(parallel_speed, 1e-10), min_wall_dist);
142 mu_wall = mu * (NS::von_karman_constant * y_plus /
143 std::log(std::max(NS::E_turb_constant * y_plus, 1 + 1e-4)));
144 mut_log = mu_wall - mu;
145 }
147 {
148 // Linearized approximation to the wall function to find the near-wall quantities faster
149 const Real a_c = 1 / NS::von_karman_constant;
150 const Real b_c = 1 / NS::von_karman_constant *
151 (std::log(NS::E_turb_constant * std::max(min_wall_dist, 1.0) / mu) + 1.0);
152 const Real c_c = parallel_speed;
153
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;
158 }
160 {
161 // Assign non-equilibrium wall function value
162 y_plus = min_wall_dist * std::sqrt(std::sqrt(_C_mu) * _k(elem_arg, state)) * rho / mu;
163 mu_wall = mu * (NS::von_karman_constant * y_plus /
164 std::log(std::max(NS::E_turb_constant * y_plus, 1 + 1e-4)));
165 mut_log = mu_wall - mu;
166 }
167 else
168 mooseAssert(false, "For `kEpsilonViscosityAux` , wall treatment should not reach here");
169
170 if (y_plus <= 5.0)
171 // sub-laminar layer
172 mu_t = 0.0;
173 else if (y_plus >= 30.0)
174 // log-layer
175 mu_t = std::max(mut_log, NS::mu_t_low_limit);
176 else
177 {
178 // buffer layer
179 const auto blending_function = (y_plus - 5.0) / 25.0;
180 // the blending depends on the mut_log at y+=30
181 const auto mut_log = mu * (NS::von_karman_constant * 30.0 /
182 std::log(std::max(NS::E_turb_constant * 30.0, 1 + 1e-4)) -
183 1.0);
184 mu_t = std::max(blending_function * mut_log, NS::mu_t_low_limit);
185 }
186 }
187 else
188 {
189 Real time_scale;
190 if (_scale_limiter == "standard")
191 {
192 time_scale = std::max(_k(elem_arg, state) / _epsilon(elem_arg, state),
193 std::sqrt(nu / _epsilon(elem_arg, state)));
194 }
195 else
196 {
197 time_scale = _k(elem_arg, state) / _epsilon(elem_arg, state);
198 }
199 // For newton solvers, epsilon might not be bounded
200 if (_newton_solve)
201 time_scale = _k(elem_arg, state) / std::max(NS::epsilon_low_limit, _epsilon(elem_arg, state));
202
203 const Real mu_t_nl = _rho(elem_arg, state) * _C_mu * _k(elem_arg, state) * time_scale;
204 mu_t = mu_t_nl;
205 if (_newton_solve)
206 mu_t = std::max(mu_t, NS::mu_t_low_limit);
207 }
208 // Turbulent viscosity limiter
209 return std::min(mu_t, _mu_t_ratio_max * mu);
210}
const double mu
const double rho
SubProblem & _subproblem
const Elem *const & _current_elem
static InputParameters validParams()
virtual const std::set< SubdomainID > & blockIDs() const
FEProblemBase & _c_fe_problem
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addRequiredParam(const std::string &name, const std::string &doc_string)
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)
Moose::StateArg determineState() const
Computes the turbuent viscosity for the k-Epsilon model.
const Real _C_mu
C-mu closure coefficient.
const Moose::Functor< Real > * _w_var
z-velocity
NS::WallTreatmentEnum _wall_treatment
Method used for wall treatment.
std::unordered_set< const Elem * > _wall_bounded
virtual Real computeValue() override
const bool _newton_solve
Whether we are using a newton solve.
const Moose::Functor< Real > & _k
Turbulent kinetic energy.
kEpsilonViscosityAux(const InputParameters &parameters)
virtual void initialSetup() override
const Moose::Functor< Real > & _mu
Dynamic viscosity.
std::map< const Elem *, std::vector< const FaceInfo * > > _face_infos
const bool _bulk_wall_treatment
If the user wants to enable bulk wall treatment.
static InputParameters validParams()
const MooseEnum _scale_limiter
Method used to limit the k-e time scale.
const Moose::Functor< Real > * _v_var
y-velocity
const Moose::Functor< Real > & _u_var
x-velocity
const Moose::Functor< Real > & _rho
Density.
std::map< const Elem *, std::vector< Real > > _dist
const Moose::Functor< Real > & _epsilon
Turbulent kinetic energy dissipation rate.
const std::vector< BoundaryName > & _wall_boundary_names
Wall boundaries.
registerMooseObject("NavierStokesApp", kEpsilonViscosityAux)
MeshBase & mesh
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.
static constexpr Real mu_t_low_limit
Definition NS.h:208
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
Definition NS.h:34
template Real computeSpeed< Real >(const libMesh::VectorValue< Real > &velocity)
static constexpr Real epsilon_low_limit
Definition NS.h:210
static constexpr Real von_karman_constant
Definition NS.h:205
static const std::string TKED
Definition NS.h:181
static const std::string mu
Definition NS.h:127
static const std::string TKE
Definition NS.h:180
static constexpr Real E_turb_constant
Definition NS.h:206
template Real findyPlus< Real >(const Real &mu, const Real &rho, const Real &u, Real dist)
template Real findUStar< Real >(const Real &mu, const Real &rho, const Real &u, const Real dist)
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-...