VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleRealizableKEpsilonSource_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEREALIZABLEKEPSILONSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEREALIZABLEKEPSILONSOURCE_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
6 
7 #include <Panzer_HierarchicParallelism.hpp>
8 
9 #include <math.h>
10 
11 namespace VertexCFD
12 {
13 namespace ClosureModel
14 {
15 //---------------------------------------------------------------------------//
16 template<class EvalType, class Traits, int NumSpaceDim>
17 IncompressibleRealizableKEpsilonSource<EvalType, Traits, NumSpaceDim>::
18  IncompressibleRealizableKEpsilonSource(const panzer::IntegrationRule& ir)
19  : _nu("kinematic_viscosity", ir.dl_scalar)
20  , _nu_t("turbulent_eddy_viscosity", ir.dl_scalar)
21  , _turb_kinetic_energy("turb_kinetic_energy", ir.dl_scalar)
22  , _turb_dissipation_rate("turb_dissipation_rate", ir.dl_scalar)
23  , _C_2(1.9)
24  , _k_source("SOURCE_turb_kinetic_energy_equation", ir.dl_scalar)
25  , _k_prod("PRODUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
26  , _k_dest("DESTRUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
27  , _e_source("SOURCE_turb_dissipation_rate_equation", ir.dl_scalar)
28  , _e_prod("PRODUCTION_turb_dissipation_rate_equation", ir.dl_scalar)
29  , _e_dest("DESTRUCTION_turb_dissipation_rate_equation", ir.dl_scalar)
30 {
31  // Add dependent fields
32  this->addDependentField(_nu);
33  this->addDependentField(_nu_t);
34  this->addDependentField(_turb_kinetic_energy);
35  this->addDependentField(_turb_dissipation_rate);
36 
37  Utils::addDependentVectorField(
38  *this, ir.dl_vector, _grad_velocity, "GRAD_velocity_");
39 
40  // Add evaluated fields
41  this->addEvaluatedField(_k_source);
42  this->addEvaluatedField(_k_prod);
43  this->addEvaluatedField(_k_dest);
44  this->addEvaluatedField(_e_source);
45  this->addEvaluatedField(_e_prod);
46  this->addEvaluatedField(_e_dest);
47 
48  // Closure model name
49  this->setName("Realizable K-Epsilon Incompressible Source "
50  + std::to_string(num_space_dim) + "D");
51 }
52 
53 //---------------------------------------------------------------------------//
54 template<class EvalType, class Traits, int NumSpaceDim>
55 void IncompressibleRealizableKEpsilonSource<EvalType, Traits, NumSpaceDim>::
56  evaluateFields(typename Traits::EvalData workset)
57 {
58  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
59  workset.num_cells);
60  Kokkos::parallel_for(this->getName(), policy, *this);
61 }
62 
63 //---------------------------------------------------------------------------//
64 template<class EvalType, class Traits, int NumSpaceDim>
65 KOKKOS_INLINE_FUNCTION void
66 IncompressibleRealizableKEpsilonSource<EvalType, Traits, NumSpaceDim>::operator()(
67  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
68 {
69  const int cell = team.league_rank();
70  const int num_point = _nu_t.extent(1);
71  const double max_tol = 1.0e-10;
72  using std::pow;
73  using std::sqrt;
74 
75  Kokkos::parallel_for(
76  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
77  // Calculate S and mag square of velocity gradient
78  scalar_type S2 = 0.0;
79  scalar_type grad_u_sqr = 0.0;
80 
81  for (int i = 0; i < num_space_dim; ++i)
82  {
83  for (int j = 0; j < num_space_dim; ++j)
84  {
85  S2 += pow(0.5
86  * (_grad_velocity[i](cell, point, j)
87  + _grad_velocity[j](cell, point, i)),
88  2.0);
89  grad_u_sqr += pow(_grad_velocity[i](cell, point, j), 2.0);
90  }
91  }
92 
93  const scalar_type S = sqrt(SmoothMath::max(2.0 * S2, max_tol, 0.0));
94 
95  // Calculate model coefficients
96  const scalar_type eta
97  = S * _turb_kinetic_energy(cell, point)
98  / SmoothMath::max(
99  _turb_dissipation_rate(cell, point), max_tol, 0.0);
100  const scalar_type C_1
101  = SmoothMath::max(0.43, eta / (5.0 + eta), 0.0);
102 
103  // Turbulent kinetic energy terms (same as standard K-Epsilon)
104  _k_prod(cell, point) = _nu_t(cell, point) * grad_u_sqr;
105  _k_dest(cell, point) = -_turb_dissipation_rate(cell, point);
106  _k_source(cell, point) = _k_prod(cell, point)
107  + _k_dest(cell, point);
108 
109  // Turbulent dissipation rate terms (modified for RKE model)
110  _e_prod(cell, point) = C_1 * S
111  * _turb_dissipation_rate(cell, point);
112  _e_dest(cell, point)
113  = -_C_2 * pow(_turb_dissipation_rate(cell, point), 2.0)
114  / SmoothMath::max(
115  _turb_kinetic_energy(cell, point)
116  + sqrt(SmoothMath::max(
117  _nu(cell, point)
118  * _turb_dissipation_rate(cell, point),
119  max_tol,
120  0.0)),
121  max_tol,
122  0.0);
123  _e_source(cell, point) = _e_prod(cell, point)
124  + _e_dest(cell, point);
125  });
126 }
127 
128 //---------------------------------------------------------------------------//
129 
130 } // end namespace ClosureModel
131 } // end namespace VertexCFD
132 
133 #endif // end
134  // VERTEXCFD_CLOSURE_INCOMPRESSIBLEREALIZABLEKEPSILONSOURCE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23