1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEKEPSILONSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEKEPSILONSOURCE_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 IncompressibleKEpsilonSource<EvalType, Traits, NumSpaceDim>::
18 IncompressibleKEpsilonSource(
const panzer::IntegrationRule& ir)
19 : _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
20 , _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
21 , _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_t);
33 this->addDependentField(_turb_kinetic_energy);
34 this->addDependentField(_turb_dissipation_rate);
36 Utils::addDependentVectorField(
37 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
40 this->addEvaluatedField(_k_source);
41 this->addEvaluatedField(_k_prod);
42 this->addEvaluatedField(_k_dest);
43 this->addEvaluatedField(_e_source);
44 this->addEvaluatedField(_e_prod);
45 this->addEvaluatedField(_e_dest);
48 this->setName(
"K-Epsilon Incompressible Source "
49 + std::to_string(num_space_dim) +
"D");
53 template<
class EvalType,
class Traits,
int NumSpaceDim>
54 void IncompressibleKEpsilonSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
55 typename Traits::EvalData workset)
57 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
59 Kokkos::parallel_for(this->getName(), policy, *
this);
63 template<
class EvalType,
class Traits,
int NumSpaceDim>
64 KOKKOS_INLINE_FUNCTION
void
65 IncompressibleKEpsilonSource<EvalType, Traits, NumSpaceDim>::operator()(
66 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
68 const int cell = team.league_rank();
69 const int num_point = _nu_t.extent(1);
70 const double max_tol = 1.0e-10;
74 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
76 _k_prod(cell, point) = 0.0;
78 for (
int i = 0; i < num_space_dim; ++i)
80 for (
int j = 0; j < num_space_dim; ++j)
84 * (_grad_velocity[i](cell, point, j)
85 + _grad_velocity[j](cell, point, i)),
91 _k_prod(cell, point) *= (2.0 * _nu_t(cell, point));
92 if (_turb_kinetic_energy(cell, point) > 0.0)
94 _k_dest(cell, point) = -SmoothMath::max(
95 _turb_dissipation_rate(cell, point), 0.0, 0.0);
99 _k_dest(cell, point) = 0.0;
101 _k_source(cell, point) = _k_prod(cell, point)
102 + _k_dest(cell, point);
108 _turb_dissipation_rate(cell, point), 0.0, 0.0)
110 _turb_kinetic_energy(cell, point), max_tol, 0.0)
111 * _k_prod(cell, point);
114 * pow(SmoothMath::max(
115 _turb_dissipation_rate(cell, point), 0.0, 0.0),
118 _turb_kinetic_energy(cell, point), max_tol, 0.0);
119 _e_source(cell, point) = _e_prod(cell, point)
120 + _e_dest(cell, point);