https://mooseframework.inl.gov
Loading...
Searching...
No Matches
RANSYPlusAux.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
10#include "RANSYPlusAux.h"
11#include "NonlinearSystemBase.h"
12#include "NavierStokesMethods.h"
13#include "libmesh/nonlinear_solver.h"
14
16
19{
21 params.addClassDescription("Calculates non-dimensional wall distance (y+) value.");
22 params.addRequiredCoupledVar("u", "The velocity in the x direction.");
23 params.addCoupledVar("v", "The velocity in the y direction.");
24 params.addCoupledVar("w", "The velocity in the z direction.");
25 params.addParam<MooseFunctorName>(NS::TKE, "Turbulent kinetic energy functor.");
26 params.addRequiredParam<MooseFunctorName>(NS::density, "Fluid density.");
27 params.addRequiredParam<MooseFunctorName>(NS::mu, "Dynamic viscosity.");
28 params.addParam<std::vector<BoundaryName>>(
29 "walls", {}, "Boundaries that correspond to solid walls.");
30 MooseEnum wall_treatment("eq_newton eq_incremental eq_linearized neq", "neq");
31 params.addParam<MooseEnum>("wall_treatment",
32 wall_treatment,
33 "The method used for computing the y_plus in the wall functions "
34 "'eq_newton', 'eq_incremental', 'eq_linearized', 'neq'");
35 params.addParam<Real>("C_mu", 0.09, "Coupled turbulent kinetic energy closure coefficient.");
36
37 return params;
38}
39
41 : AuxKernel(params),
42 _dim(_subproblem.mesh().dimension()),
43 _u_var(getFunctor<Real>("u")),
44 _v_var(params.isParamValid("v") ? &(getFunctor<Real>("v")) : nullptr),
45 _w_var(params.isParamValid("w") ? &(getFunctor<Real>("w")) : nullptr),
46 _k(params.isParamValid(NS::TKE) ? &(getFunctor<Real>(NS::TKE)) : nullptr),
47 _rho(getFunctor<Real>(NS::density)),
48 _mu(getFunctor<Real>(NS::mu)),
49 _wall_boundary_names(getParam<std::vector<BoundaryName>>("walls")),
50 _wall_treatment(getParam<MooseEnum>("wall_treatment").getEnum<NS::WallTreatmentEnum>()),
51 _C_mu(getParam<Real>("C_mu"))
52{
53 if (_dim >= 2 && !_v_var)
54 paramError("v", "In two or more dimensions, the v velocity must be supplied!");
55
56 if (_dim >= 3 && !_w_var)
57 paramError("w", "In three or more dimensions, the w velocity must be supplied!");
58
60 paramError(NS::TKE, "In the non-equilibrium wall treatment the TKE must be supplied!");
61}
62
63void
72
73Real
75{
76 if (_wall_bounded.find(_current_elem) != _wall_bounded.end())
77 {
78 const auto state = determineState();
79 const auto elem_arg = makeElemArg(_current_elem);
80 const auto rho = _rho(elem_arg, state);
81 const auto mu = _mu(elem_arg, state);
82 Real y_plus;
83 std::vector<Real> y_plus_vec;
84
85 RealVectorValue velocity(_u_var(elem_arg, state));
86 if (_v_var)
87 velocity(1) = (*_v_var)(elem_arg, state);
88 if (_w_var)
89 velocity(2) = (*_w_var)(elem_arg, state);
90
91 const auto & face_info_vec = libmesh_map_find(_face_infos, _current_elem);
92 const auto & distance_vec = libmesh_map_find(_dist, _current_elem);
93
94 for (unsigned int i = 0; i < distance_vec.size(); i++)
95 {
96 const auto parallel_speed = NS::computeSpeed<Real>(
97 velocity - velocity * face_info_vec[i]->normal() * face_info_vec[i]->normal());
98 const auto distance = distance_vec[i];
99
101 // Non-equilibrium / Non-iterative
102 y_plus = std::pow(_C_mu, 0.25) * distance * std::sqrt((*_k)(elem_arg, state)) * rho / mu;
103 else
104 // Equilibrium / Iterative
105 y_plus = NS::findyPlus<Real>(mu, rho, std::max(parallel_speed, 1e-10), distance);
106
107 y_plus_vec.push_back(y_plus);
108 }
109 // Return average of y+ for cells with multiple wall faces
110 return std::accumulate(y_plus_vec.begin(), y_plus_vec.end(), 0.0) / y_plus_vec.size();
111 }
112 else
113 return 0.;
114}
const double mu
const double rho
registerMooseObject("NavierStokesApp", RANSYPlusAux)
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 addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
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)
void addCoupledVar(const std::string &name, const std::string &doc_string)
void paramError(const std::string &param, Args... args) const
Computes wall y+ based on wall functions.
std::unordered_set< const Elem * > _wall_bounded
const Moose::Functor< Real > & _rho
Density.
virtual void initialSetup() override
virtual Real computeValue() override
const Moose::Functor< Real > & _mu
Dynamic viscosity.
const Moose::Functor< Real > * _w_var
z-velocity
RANSYPlusAux(const InputParameters &parameters)
static InputParameters validParams()
const Moose::Functor< Real > & _u_var
x-velocity
const Moose::Functor< Real > * _k
Turbulent kinetic energy.
std::map< const Elem *, std::vector< const FaceInfo * > > _face_infos
const Moose::Functor< Real > * _v_var
y-velocity
const Real _C_mu
C_mu constant.
const std::vector< BoundaryName > & _wall_boundary_names
Wall boundary names.
std::map< const Elem *, std::vector< Real > > _dist
NS::WallTreatmentEnum _wall_treatment
Method used for wall treatment.
const unsigned int _dim
the dimension of the simulation
Moose::StateArg determineState() const
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.
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 const std::string mu
Definition NS.h:127
static const std::string TKE
Definition NS.h:180
template Real findyPlus< Real >(const Real &mu, const Real &rho, const Real &u, 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-...
Real distance(const Point &p)