1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGASOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGASOURCE_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 IncompressibleKOmegaSource<EvalType, Traits, NumSpaceDim>::IncompressibleKOmegaSource(
18 const panzer::IntegrationRule& ir,
19 const Teuchos::ParameterList& user_params)
20 : _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
21 , _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
22 , _turb_specific_dissipation_rate(
"turb_specific_dissipation_rate",
26 _grad_turb_kinetic_energy(
"GRAD_turb_kinetic_energy", ir.dl_vector)
27 , _grad_turb_specific_dissipation_rate(
28 "GRAD_turb_specific_dissipation_rate", ir.dl_vector)
33 , _limit_production(true)
34 , _k_source(
"SOURCE_turb_kinetic_energy_equation", ir.dl_scalar)
35 , _k_prod(
"PRODUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
36 , _k_dest(
"DESTRUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
37 , _w_source(
"SOURCE_turb_specific_dissipation_rate_equation", ir.dl_scalar)
38 , _w_prod(
"PRODUCTION_turb_specific_dissipation_rate_equation",
40 , _w_dest(
"DESTRUCTION_turb_specific_dissipation_rate_equation",
42 , _w_cross(
"CROSS_DIFFUSION_turb_specific_dissipation_rate_equation",
46 if (user_params.isSublist(
"Turbulence Parameters"))
48 const Teuchos::ParameterList turb_list
49 = user_params.sublist(
"Turbulence Parameters");
51 if (turb_list.isSublist(
"K-Omega Parameters"))
53 const Teuchos::ParameterList k_w_list
54 = turb_list.sublist(
"K-Omega Parameters");
56 if (k_w_list.isType<
double>(
"beta_star"))
58 _beta_star = k_w_list.get<
double>(
"beta_star");
61 if (k_w_list.isType<
double>(
"gamma"))
63 _gamma = k_w_list.get<
double>(
"gamma");
66 if (k_w_list.isType<
double>(
"beta_0"))
68 _beta_0 = k_w_list.get<
double>(
"beta_0");
71 if (k_w_list.isType<
double>(
"sigma_d"))
73 _sigma_d = k_w_list.get<
double>(
"sigma_d");
76 if (k_w_list.isType<
bool>(
"Limit Production Term"))
79 = k_w_list.get<
bool>(
"Limit Production Term");
85 this->addDependentField(_nu_t);
86 this->addDependentField(_turb_kinetic_energy);
87 this->addDependentField(_turb_specific_dissipation_rate);
88 this->addDependentField(_grad_turb_kinetic_energy);
89 this->addDependentField(_grad_turb_specific_dissipation_rate);
91 Utils::addDependentVectorField(
92 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
95 this->addEvaluatedField(_k_source);
96 this->addEvaluatedField(_k_prod);
97 this->addEvaluatedField(_k_dest);
98 this->addEvaluatedField(_w_source);
99 this->addEvaluatedField(_w_prod);
100 this->addEvaluatedField(_w_dest);
101 this->addEvaluatedField(_w_cross);
104 this->setName(
"K-Omega Incompressible Source "
105 + std::to_string(num_space_dim) +
"D");
109 template<
class EvalType,
class Traits,
int NumSpaceDim>
110 void IncompressibleKOmegaSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
111 typename Traits::EvalData workset)
113 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
115 Kokkos::parallel_for(this->getName(), policy, *
this);
119 template<
class EvalType,
class Traits,
int NumSpaceDim>
120 KOKKOS_INLINE_FUNCTION
void
121 IncompressibleKOmegaSource<EvalType, Traits, NumSpaceDim>::operator()(
122 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
124 const int cell = team.league_rank();
125 const int num_point = _nu_t.extent(1);
126 const double max_tol = 1.0e-10;
130 Kokkos::parallel_for(
131 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
132 auto&& Sij_Sij = _w_source(cell, point);
134 for (
int i = 0; i < num_space_dim; ++i)
136 Sij_Sij += pow(_grad_velocity[i](cell, point, i), 2.0);
137 for (
int j = i + 1; j < num_space_dim; ++j)
140 * pow(_grad_velocity[i](cell, point, j)
141 + _grad_velocity[j](cell, point, i),
146 auto&& chi_w = _w_dest(cell, point);
148 for (
int i = 0; i < num_space_dim; ++i)
150 for (
int j = 0; j < num_space_dim; ++j)
152 for (
int k = 0; k < num_space_dim; ++k)
155 * (_grad_velocity[i](cell, point, j)
156 - _grad_velocity[j](cell, point, i))
157 * (_grad_velocity[j](cell, point, k)
158 - _grad_velocity[k](cell, point, j))
159 * (_grad_velocity[i](cell, point, k)
160 + _grad_velocity[k](cell, point, i));
169 * _turb_specific_dissipation_rate(cell, point),
174 auto&& f_beta = _w_cross(cell, point);
175 f_beta = (1.0 + 85.0 * chi_w) / (1.0 + 100.0 * chi_w);
178 _k_prod(cell, point) = 2.0 * _nu_t(cell, point) * Sij_Sij;
181 = -_beta_star * _turb_specific_dissipation_rate(cell, point)
182 * _turb_kinetic_energy(cell, point);
184 if (_limit_production)
187 _k_prod(cell, point) = SmoothMath::min(
188 _k_prod(cell, point), -20.0 * _k_dest(cell, point), 0.0);
191 _k_source(cell, point) = _k_prod(cell, point)
192 + _k_dest(cell, point);
196 = _gamma * _turb_specific_dissipation_rate(cell, point) * 2.0
197 * _nu_t(cell, point) * Sij_Sij
199 _turb_kinetic_energy(cell, point), max_tol, 0.0);
202 * pow(_turb_specific_dissipation_rate(cell, point), 2);
205 _w_cross(cell, point) = 0.0;
206 for (
int j = 0; j < num_space_dim; ++j)
208 _w_cross(cell, point)
209 += _grad_turb_kinetic_energy(cell, point, j)
210 * _grad_turb_specific_dissipation_rate(cell, point, j);
212 if (_w_cross(cell, point) > 0.0)
214 _w_cross(cell, point)
215 = _sigma_d * _w_cross(cell, point)
217 _turb_specific_dissipation_rate(cell, point),
223 _w_cross(cell, point) = 0.0;
226 _w_source(cell, point) = _w_prod(cell, point) + _w_dest(cell, point)
227 + _w_cross(cell, point);