https://mooseframework.inl.gov
INSFVMixingLengthScalarDiffusion.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 "MathFVUtils.h"
12 
14 
17 {
20  params.addClassDescription("Computes the turbulent diffusive flux that appears in "
21  "Reynolds-averaged fluid conservation equations.");
22  params.addRequiredParam<MooseFunctorName>("u", "The velocity in the x direction.");
23  params.addParam<MooseFunctorName>("v", "The velocity in the y direction.");
24  params.addParam<MooseFunctorName>("w", "The velocity in the z direction.");
25  params.addRequiredParam<MooseFunctorName>("mixing_length", "The turbulent mixing length.");
26  params.addRequiredParam<Real>(
27  "schmidt_number",
28  "The turbulent Schmidt number (or turbulent Prandtl number if the passive scalar is energy) "
29  "that relates the turbulent scalar diffusivity to the turbulent momentum diffusivity.");
30  params.set<unsigned short>("ghost_layers") = 2;
31 
32  // We add the relationship manager here, this will select the right number of
33  // ghosting layers depending on the chosen interpolation method
35  "ElementSideNeighborLayers",
38  [](const InputParameters & obj_params, InputParameters & rm_params)
39  { FVRelationshipManagerInterface::setRMParamsDiffusion(obj_params, rm_params, 3); });
40 
41  return params;
42 }
43 
45  : FVFluxKernel(params),
47  _dim(_subproblem.mesh().dimension()),
48  _u(getFunctor<ADReal>("u")),
49  _v(isParamValid("v") ? &getFunctor<ADReal>("v") : nullptr),
50  _w(isParamValid("w") ? &getFunctor<ADReal>("w") : nullptr),
51  _mixing_len(getFunctor<ADReal>("mixing_length")),
52  _schmidt_number(getParam<Real>("schmidt_number"))
53 {
54  if (_dim >= 2 && !_v)
55  mooseError(
56  "In two or more dimensions, the v velocity must be supplied using the 'v' parameter");
57  if (_dim >= 3 && !_w)
58  mooseError("In three dimensions, the w velocity must be supplied using the 'w' parameter");
59 }
60 
61 ADReal
63 {
64  using std::sqrt;
65 
66  constexpr Real offset = 1e-15; // prevents explosion of sqrt(x) derivative to infinity
67 
68  auto face = makeCDFace(*_face_info);
69  const auto state = determineState();
70 
71  const auto grad_u = _u.gradient(face, state);
72  ADReal symmetric_strain_tensor_norm = 2.0 * Utility::pow<2>(grad_u(0));
73  if (_dim >= 2)
74  {
75  const auto grad_v = _v->gradient(face, state);
76  symmetric_strain_tensor_norm +=
77  2.0 * Utility::pow<2>(grad_v(1)) + Utility::pow<2>(grad_v(0) + grad_u(1));
78  if (_dim >= 3)
79  {
80  const auto grad_w = _w->gradient(face, state);
81  symmetric_strain_tensor_norm += 2.0 * Utility::pow<2>(grad_w(2)) +
82  Utility::pow<2>(grad_u(2) + grad_w(0)) +
83  Utility::pow<2>(grad_v(2) + grad_w(1));
84  }
85  }
86 
87  symmetric_strain_tensor_norm = sqrt(symmetric_strain_tensor_norm + offset);
88 
89  // Interpolate the mixing length to the face
90  ADReal mixing_len = _mixing_len(face, state);
91 
92  // Compute the eddy diffusivity for momentum
93  ADReal eddy_diff = symmetric_strain_tensor_norm * mixing_len * mixing_len;
94 
95  // Use the turbulent Schmidt/Prandtl number to get the eddy diffusivity for
96  // the scalar variable
97  eddy_diff /= _schmidt_number;
98 
99  // Compute the diffusive flux of the scalar variable, skewness correction is not used here
100  auto dudn = gradUDotNormal(state, _correct_skewness);
101  return -1 * eddy_diff * dudn;
102 }
virtual ADReal gradUDotNormal(const Moose::StateArg &time, const bool correct_skewness) const
const Real & _schmidt_number
Turbulent Schmidt number (or turbulent Prandtl number)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const unsigned int _dim
the dimension of the simulation
const FaceInfo * _face_info
Moose::StateArg determineState() const
const Moose::Functor< ADReal > *const _w
z-velocity
T & set(const std::string &name, bool quiet_mode=false)
MeshBase & mesh
void addRelationshipManager(const std::string &name, Moose::RelationshipManagerType rm_type, Moose::RelationshipManagerInputParameterCallback input_parameter_callback=nullptr)
DualNumber< Real, DNDerivativeType, true > ADReal
const Moose::Functor< ADReal > & _mixing_len
Turbulent eddy mixing length.
void addRequiredParam(const std::string &name, const std::string &doc_string)
const Moose::Functor< ADReal > *const _v
y-velocity
static InputParameters validParams()
static InputParameters validParams()
INSFVMixingLengthScalarDiffusion(const InputParameters &params)
const Moose::Functor< ADReal > & _u
x-velocity
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
registerMooseObject("NavierStokesApp", INSFVMixingLengthScalarDiffusion)
static void setRMParamsDiffusion(const InputParameters &obj_params, InputParameters &rm_params, const unsigned short conditional_extended_layers)
Moose::FaceArg makeCDFace(const FaceInfo &fi, const bool correct_skewness=false) const