https://mooseframework.inl.gov
INSFVTKEDWallFunctionBC.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 "Function.h"
12 #include "NavierStokesMethods.h"
13 #include "NS.h"
14 
16 
19 {
21  params.addClassDescription("Adds Reichardt extrapolated wall values to set up directly the"
22  "Dirichlet BC for the turbulent kinetic energy dissipation rate.");
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::density, "Density");
27  params.addRequiredParam<MooseFunctorName>(NS::mu, "Dynamic viscosity.");
28  params.addRequiredParam<MooseFunctorName>(NS::mu_t, "The turbulent viscosity.");
29  params.addRequiredParam<MooseFunctorName>("k", "The turbulent kinetic energy.");
30  params.deprecateParam("k", NS::TKE, "01/01/2025");
31  params.addParam<MooseFunctorName>("C_mu", 0.09, "Coupled turbulent kinetic energy closure.");
32  params.addParam<bool>("newton_solve", false, "Whether a Newton nonlinear solve is being used");
33  params.addParamNamesToGroup("newton_solve", "Advanced");
34  return params;
35 }
36 
38  : FVDirichletBCBase(params),
39  _dim(_subproblem.mesh().dimension()),
40  _u_var(getFunctor<ADReal>("u")),
41  _v_var(params.isParamValid("v") ? &(getFunctor<ADReal>("v")) : nullptr),
42  _w_var(params.isParamValid("w") ? &(getFunctor<ADReal>("w")) : nullptr),
43  _rho(getFunctor<ADReal>(NS::density)),
44  _mu(getFunctor<ADReal>(NS::mu)),
45  _mu_t(getFunctor<ADReal>(NS::mu_t)),
46  _k(getFunctor<ADReal>(NS::TKE)),
47  _C_mu(getFunctor<ADReal>("C_mu")),
48  _newton_solve(getParam<bool>("newton_solve"))
49 {
50 }
51 
52 ADReal
54 {
55  const bool use_elem = (fi.faceType(std::make_pair(_var.number(), _var.sys().number())) ==
57  const Real dist = std::abs(
58  ((use_elem ? fi.elemCentroid() : fi.neighborCentroid()) - fi.faceCentroid()) * fi.normal());
59  const Elem * const elem_ptr = use_elem ? fi.elemPtr() : fi.neighborPtr();
60  const auto elem_arg = makeElemArg(elem_ptr);
61  const auto mu = _mu(elem_arg, state);
62  const auto rho = _rho(elem_arg, state);
63 
64  // Assign boundary weights to element
65  // This is based on the theory of linear TKE development for each boundary
66  // This is, it assumes no interaction across turbulence production from boundaries
67  Real weight = 0.0;
68  for (unsigned int i_side = 0; i_side < elem_ptr->n_sides(); ++i_side)
69  weight += static_cast<Real>(_subproblem.mesh().getBoundaryIDs(elem_ptr, i_side).size());
70 
71  // Get the velocity vector
72  ADRealVectorValue velocity(_u_var(elem_arg, state));
73  if (_v_var)
74  velocity(1) = (*_v_var)(elem_arg, state);
75  if (_w_var)
76  velocity(2) = (*_w_var)(elem_arg, state);
77 
78  // Compute the velocity and direction of the velocity component that is parallel to the wall
79  const ADReal parallel_speed =
81 
82  // Get friction velocity
83  const ADReal u_star = NS::findUStar<ADReal>(mu, rho, parallel_speed, dist);
84 
85  // Get associated non-dimensional wall distance
86  const ADReal y_plus = dist * u_star * rho / mu;
87 
88  const auto TKE = _k(elem_arg, state);
89 
90  if (y_plus <= 5.0) // sub-laminar layer
91  {
92  const auto laminar_value = 2.0 * weight * TKE * mu / std::pow(dist, 2);
93  if (!_newton_solve)
94  return laminar_value;
95  else
96  // Additional zero term to make sure new derivatives are not introduced as y_plus
97  // changes
98  return laminar_value + 0 * _mu_t(elem_arg, state);
99  }
100  else if (y_plus >= 30.0) // log-layer
101  {
102  const auto turbulent_value = weight * _C_mu(elem_arg, state) * std::pow(std::abs(TKE), 1.5) /
103  (_mu_t(elem_arg, state) * dist);
104  if (!_newton_solve)
105  return turbulent_value;
106  else
107  // Additional zero term to make sure new derivatives are not introduced as y_plus changes
108  return turbulent_value + 0 * mu;
109  }
110  else // blending function
111  {
112  const auto laminar_value = 2.0 * weight * TKE * mu / std::pow(dist, 2);
113  const auto turbulent_value = weight * _C_mu(elem_arg, state) * std::pow(std::abs(TKE), 1.5) /
114  (_mu_t(elem_arg, state) * dist);
115  const auto interpolation_coef = (y_plus - 5.0) / 25.0;
116  return (interpolation_coef * (turbulent_value - laminar_value) + laminar_value);
117  }
118 }
const Moose::Functor< ADReal > & _rho
Density.
virtual MooseMesh & mesh()=0
ADReal boundaryValue(const FaceInfo &fi, const Moose::StateArg &state) const override
const Moose::Functor< ADReal > & _mu
Dynamic viscosity.
static const std::string mu_t
Definition: NS.h:125
const Moose::Functor< ADReal > & _mu_t
Turbulent dynamic viscosity.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int number() const
const Point & faceCentroid() const
MeshBase & mesh
static const std::string density
Definition: NS.h:33
static const std::string TKE
Definition: NS.h:176
const Moose::Functor< ADReal > & _C_mu
C_mu turbulent coefficient.
static InputParameters validParams()
MooseVariableFV< Real > & _var
const Moose::Functor< ADReal > * _v_var
y-velocity
const Point & neighborCentroid() const
DualNumber< Real, DNDerivativeType, true > ADReal
const Moose::Functor< ADReal > & _k
Turbulent kinetic energy.
void addRequiredParam(const std::string &name, const std::string &doc_string)
const Moose::Functor< ADReal > & _u_var
x-velocity
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
const Elem * neighborPtr() const
const Point & elemCentroid() const
static InputParameters validParams()
void deprecateParam(const std::string &old_name, const std::string &new_name, const std::string &removal_date)
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
static const std::string mu
Definition: NS.h:123
SubProblem & _subproblem
template ADReal findUStar< ADReal >(const ADReal &mu, const ADReal &rho, const ADReal &u, const Real dist)
const Point & normal() const
unsigned int number() const
const Elem * elemPtr() const
const Moose::Functor< ADReal > * _w_var
z-velocity
registerMooseObject("NavierStokesApp", INSFVTKEDWallFunctionBC)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
template ADReal computeSpeed< ADReal >(const libMesh::VectorValue< ADReal > &velocity)
const bool _newton_solve
Whether we are using a newton solve.
Applies a wall function to the turbulent kinetic energy dissipation rate.
void addClassDescription(const std::string &doc_string)
static const std::string velocity
Definition: NS.h:45
std::vector< BoundaryID > getBoundaryIDs(const Elem *const elem, const unsigned short int side) const
MooseUnits pow(const MooseUnits &, int)
INSFVTKEDWallFunctionBC(const InputParameters &parameters)
VarFaceNeighbors faceType(const std::pair< unsigned int, unsigned int > &var_sys) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)