1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEREALIZABLEKEPSILONSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEREALIZABLEKEPSILONSOURCE_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_HierarchicParallelism.hpp>
13 namespace ClosureModel
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)
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)
32 this->addDependentField(_nu);
33 this->addDependentField(_nu_t);
34 this->addDependentField(_turb_kinetic_energy);
35 this->addDependentField(_turb_dissipation_rate);
37 Utils::addDependentVectorField(
38 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
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);
49 this->setName(
"Realizable K-Epsilon Incompressible Source "
50 + std::to_string(num_space_dim) +
"D");
54 template<
class EvalType,
class Traits,
int NumSpaceDim>
55 void IncompressibleRealizableKEpsilonSource<EvalType, Traits, NumSpaceDim>::
56 evaluateFields(
typename Traits::EvalData workset)
58 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
60 Kokkos::parallel_for(this->getName(), policy, *
this);
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
69 const int cell = team.league_rank();
70 const int num_point = _nu_t.extent(1);
71 const double max_tol = 1.0e-10;
76 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
79 scalar_type grad_u_sqr = 0.0;
81 for (
int i = 0; i < num_space_dim; ++i)
83 for (
int j = 0; j < num_space_dim; ++j)
86 * (_grad_velocity[i](cell, point, j)
87 + _grad_velocity[j](cell, point, i)),
89 grad_u_sqr += pow(_grad_velocity[i](cell, point, j), 2.0);
93 const scalar_type S = sqrt(SmoothMath::max(2.0 * S2, max_tol, 0.0));
97 = S * _turb_kinetic_energy(cell, point)
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);
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);
110 _e_prod(cell, point) = C_1 * S
111 * _turb_dissipation_rate(cell, point);
113 = -_C_2 * pow(_turb_dissipation_rate(cell, point), 2.0)
115 _turb_kinetic_energy(cell, point)
116 + sqrt(SmoothMath::max(
118 * _turb_dissipation_rate(cell, point),
123 _e_source(cell, point) = _e_prod(cell, point)
124 + _e_dest(cell, point);