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.");
30 params.
addParam<MooseFunctorName>(
"Pr_t", 0.58,
"The turbulent Prandtl number.");
31 params.
addParam<MooseFunctorName>(
NS::TKE,
"Turbulent kinetic energy functor.");
32 params.
addParam<Real>(
"C_mu", 0.09,
"Coupled turbulent kinetic energy closure.");
33 MooseEnum wall_treatment(
"eq_newton eq_incremental eq_linearized neq",
"neq");
35 "wall_treatment", wall_treatment,
"The method used for computing the wall functions");
37 params.
addParam<
bool>(
"newton_solve",
false,
"Whether a Newton nonlinear solve is being used");
45 _dim(_subproblem.
mesh().dimension()),
46 _T_w(getFunctor<
ADReal>(
"T_w")),
47 _u_var(getFunctor<
ADReal>(
"u")),
48 _v_var(parameters.isParamValid(
"v") ? &(getFunctor<
ADReal>(
"v")) : nullptr),
49 _w_var(parameters.isParamValid(
"w") ? &(getFunctor<
ADReal>(
"w")) : nullptr),
50 _rho(getFunctor<
ADReal>(
NS::density)),
53 _kappa(getFunctor<
ADReal>(
NS::kappa)),
54 _Pr_t(getFunctor<
ADReal>(
"Pr_t")),
56 _C_mu(getParam<Real>(
"C_mu")),
57 _wall_treatment(getParam<
MooseEnum>(
"wall_treatment")),
58 _newton_solve(getParam<bool>(
"newton_solve"))
65 using std::abs, std::log, std::max, std::sqrt, std::pow, std::exp;
71 const bool use_elem = (
_face_type == FaceInfo::VarFaceNeighbors::ELEM);
72 const Real wall_dist = abs(
77 const auto old_state =
Moose::StateArg(1, Moose::SolutionIterationType::Nonlinear);
78 const auto mu =
_mu(elem_arg, state);
79 const auto rho =
_rho(elem_arg, state);
80 const auto cp =
_cp(elem_arg, state);
81 const auto kappa =
_kappa(elem_arg, state);
86 velocity(1) = (*_v_var)(elem_arg, state);
88 velocity(2) = (*_w_var)(elem_arg, state);
91 const ADReal parallel_speed =
95 ADReal u_tau = 0, y_plus = 0;
101 y_plus = wall_dist * u_tau *
rho /
mu;
107 u_tau = parallel_speed /
116 const ADReal c_c = parallel_speed;
118 u_tau = (-b_c + sqrt(
pow(b_c, 2) + 4.0 * a_c * c_c)) / (2.0 * a_c);
119 y_plus = wall_dist * u_tau *
rho /
mu;
124 y_plus = wall_dist * sqrt(sqrt(
_C_mu) *
_k(elem_arg, old_state)) *
rho /
mu;
125 u_tau = parallel_speed /
132 alpha = kappa / (
rho * cp);
134 else if (y_plus >= 30.0)
136 const auto Pr = cp *
mu / kappa;
137 const auto Pr_ratio = Pr /
_Pr_t(elem_arg, state);
138 const auto jayatilleke_P =
139 9.24 * (
pow(Pr_ratio, 0.75) - 1.0) * (1.0 + 0.28 * exp(-0.007 * Pr_ratio));
140 const auto wall_scaling =
142 alpha = u_tau * wall_dist / (
_Pr_t(elem_arg, state) * wall_scaling);
146 const auto alpha_lam = kappa / (
rho * cp);
147 const auto Pr = cp *
mu / kappa;
148 const auto Pr_t =
_Pr_t(elem_arg, state);
149 const auto Pr_ratio = Pr / Pr_t;
150 const auto jayatilleke_P =
151 9.24 * (
pow(Pr_ratio, 0.75) - 1.0) * (1.0 + 0.28 * exp(-0.007 * Pr_ratio));
152 const auto wall_scaling =
154 const auto alpha_turb = u_tau * wall_dist / (Pr_t * wall_scaling);
155 const auto blending_function = (y_plus - 5.0) / 25.0;
156 alpha = blending_function * alpha_turb + (1.0 - blending_function) * alpha_lam;
161 alpha += 0 * kappa * (
rho * cp) + 0 * u_tau *
_Pr_t(elem_arg, state) * y_plus;
164 return -
rho * cp * alpha * (
_T_w(face_arg, state) -
_var(elem_arg, state)) / wall_dist;
DualNumber< Real, DNDerivativeType, true > ADReal
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
registerADMooseObject("NavierStokesApp", INSFVTurbulentTemperatureWallFunction)
MooseVariableFV< Real > & _var
const FaceInfo * _face_info
Moose::FaceArg singleSidedFaceArg(const FaceInfo *fi=nullptr, Moose::FV::LimiterType limiter_type=Moose::FV::LimiterType::CentralDifference, bool correct_skewness=false, const Moose::StateArg *state_limiter=nullptr) const
FaceInfo::VarFaceNeighbors _face_type
static InputParameters validParams()
const Point & normal() const
const Elem * neighborPtr() const
const Elem * elemPtr() const
const Point & neighborCentroid() const
const Point & elemCentroid() const
const Point & faceCentroid() const
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
This boundary condition applies a wall function for the energy equation for turbulent flows.
const Moose::Functor< ADReal > & _u_var
x-velocity
const Real _C_mu
C_mu turbulent coefficient.
virtual ADReal computeQpResidual() override
const Moose::Functor< ADReal > * _w_var
z-velocity
const bool _newton_solve
For Newton solves we want to add extra zero-valued terms regardless of y-plus to avoid sparsity patte...
const Moose::Functor< ADReal > * _v_var
y-velocity
const Moose::Functor< ADReal > & _k
Turbulent kinetic energy.
INSFVTurbulentTemperatureWallFunction(const InputParameters ¶meters)
const MooseEnum _wall_treatment
Method used for wall treatment.
const Moose::Functor< ADReal > & _Pr_t
Turbulent Prandtl number near the wall.
static InputParameters validParams()
const Moose::Functor< ADReal > & _mu
Dynamic viscosity.
const Moose::Functor< ADReal > & _kappa
Thermal conductivity.
const Moose::Functor< ADReal > & _T_w
Wall Temperature.
const Moose::Functor< ADReal > & _cp
The specific heat at constant pressure.
const Moose::Functor< ADReal > & _rho
Density.
Moose::StateArg determineState() const
template ADReal findyPlus< ADReal >(const ADReal &mu, const ADReal &rho, const ADReal &u, Real dist)
static const std::string density
static constexpr Real von_karman_constant
static const std::string cp
template ADReal computeSpeed< ADReal >(const libMesh::VectorValue< ADReal > &velocity)
static const std::string mu
static const std::string TKE
static constexpr Real E_turb_constant
static const std::string kappa
template ADReal findUStar< ADReal >(const ADReal &mu, const ADReal &rho, const ADReal &u, const Real dist)