1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONSOURCE_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 IncompressibleChienKEpsilonSource<EvalType, Traits, NumSpaceDim>::
18 IncompressibleChienKEpsilonSource(
19 const panzer::IntegrationRule& ir,
20 const Teuchos::RCP<panzer::GlobalData>& global_data,
21 const Teuchos::ParameterList& user_params)
22 : _nu(
"kinematic_viscosity", ir.dl_scalar)
23 , _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
24 , _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
25 , _turb_dissipation_rate(
"turb_dissipation_rate", ir.dl_scalar)
26 , _distance(
"distance", ir.dl_scalar)
27 , _global_data(global_data)
32 , _k_source(
"SOURCE_turb_kinetic_energy_equation", ir.dl_scalar)
33 , _k_prod(
"PRODUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
34 , _k_dest(
"DESTRUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
35 , _e_source(
"SOURCE_turb_dissipation_rate_equation", ir.dl_scalar)
36 , _e_prod(
"PRODUCTION_turb_dissipation_rate_equation", ir.dl_scalar)
37 , _e_dest(
"DESTRUCTION_turb_dissipation_rate_equation", ir.dl_scalar)
39 const Teuchos::ParameterList turb_list
40 = user_params.sublist(
"Turbulence Parameters");
43 _area = turb_list.get<
double>(
"Boundary Surface Area");
46 this->addDependentField(_nu);
47 this->addDependentField(_nu_t);
48 this->addDependentField(_turb_kinetic_energy);
49 this->addDependentField(_turb_dissipation_rate);
50 this->addDependentField(_distance);
52 Utils::addDependentVectorField(
53 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
56 this->addEvaluatedField(_k_source);
57 this->addEvaluatedField(_k_prod);
58 this->addEvaluatedField(_k_dest);
59 this->addEvaluatedField(_e_source);
60 this->addEvaluatedField(_e_prod);
61 this->addEvaluatedField(_e_dest);
64 this->setName(
"Chien K-Epsilon Incompressible Source "
65 + std::to_string(num_space_dim) +
"D");
69 template<
class EvalType,
class Traits,
int NumSpaceDim>
70 void IncompressibleChienKEpsilonSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
71 typename Traits::EvalData workset)
73 const auto& pl = *_global_data->pl;
74 const std::string wall_shear_stress_name
75 =
"Friction Velocity - friction_velocity";
76 _wall_shear_stress = pl.getValue<EvalType>(wall_shear_stress_name) / _area;
78 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
80 Kokkos::parallel_for(this->getName(), policy, *
this);
84 template<
class EvalType,
class Traits,
int NumSpaceDim>
85 KOKKOS_INLINE_FUNCTION
void
86 IncompressibleChienKEpsilonSource<EvalType, Traits, NumSpaceDim>::operator()(
87 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
89 const int cell = team.league_rank();
90 const int num_point = _nu_t.extent(1);
91 const double max_tol = 1.0e-14;
96 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
98 _k_prod(cell, point) = 0.0;
100 for (
int i = 0; i < num_space_dim; ++i)
102 for (
int j = 0; j < num_space_dim; ++j)
106 * (_grad_velocity[i](cell, point, j)
107 + _grad_velocity[j](cell, point, i)),
113 _k_prod(cell, point) *= (2.0 * _nu_t(cell, point));
116 = _turb_dissipation_rate(cell, point)
117 + 2 * _nu(cell, point) * _turb_kinetic_energy(cell, point)
119 pow(_distance(cell, point), 2.0), max_tol, 0.0);
121 _k_source(cell, point) = _k_prod(cell, point)
122 - _k_dest(cell, point);
126 = _k_prod(cell, point) * _f_one * _C_1
127 * _turb_dissipation_rate(cell, point)
129 _turb_kinetic_energy(cell, point), max_tol, 0.0);
131 if (_turb_dissipation_rate(cell, point) > 0.0)
138 pow(_turb_kinetic_energy(cell, point),
141 6.0 * _nu(cell, point)
142 * _turb_dissipation_rate(
147 * pow(_turb_dissipation_rate(cell, point), 2.0)
149 _turb_kinetic_energy(cell, point), max_tol, 0.0)
150 + 2.0 * _nu(cell, point)
151 * _turb_dissipation_rate(cell, point)
153 pow(_distance(cell, point), 2.0), max_tol, 0.0)
154 * exp(-0.5 * _wall_shear_stress
155 * _distance(cell, point) / _nu(cell, point));
159 _e_dest(cell, point) = 0.0;
162 _e_source(cell, point) = _e_prod(cell, point)
163 - _e_dest(cell, point);