1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLESSTSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLESSTSOURCE_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_HierarchicParallelism.hpp>
11 #include <type_traits>
15 namespace ClosureModel
18 template<
class EvalType,
class Traits,
int NumSpaceDim>
19 IncompressibleSSTSource<EvalType, Traits, NumSpaceDim>::IncompressibleSSTSource(
20 const panzer::IntegrationRule& ir,
21 const Teuchos::ParameterList& user_params)
22 : _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
23 , _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
24 , _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)
29 , _sst_blending_function(
"sst_blending_function", ir.dl_scalar)
36 , _limit_production(true)
37 , _k_source(
"SOURCE_turb_kinetic_energy_equation", ir.dl_scalar)
38 , _k_prod(
"PRODUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
39 , _k_dest(
"DESTRUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
40 , _w_source(
"SOURCE_turb_specific_dissipation_rate_equation", ir.dl_scalar)
41 , _w_prod(
"PRODUCTION_turb_specific_dissipation_rate_equation",
43 , _w_dest(
"DESTRUCTION_turb_specific_dissipation_rate_equation",
45 , _w_cross(
"CROSS_DIFFUSION_turb_specific_dissipation_rate_equation",
49 if (user_params.isSublist(
"Turbulence Parameters"))
51 Teuchos::ParameterList turb_list
52 = user_params.sublist(
"Turbulence Parameters");
54 if (turb_list.isSublist(
"SST K-Omega Parameters"))
56 Teuchos::ParameterList sst_list
57 = turb_list.sublist(
"SST K-Omega Parameters");
59 if (sst_list.isType<
double>(
"beta_star"))
61 _beta_star = sst_list.get<
double>(
"beta_star");
64 if (sst_list.isType<
double>(
"kappa"))
66 _kappa = sst_list.get<
double>(
"kappa");
69 if (sst_list.isType<
double>(
"beta_1"))
71 _beta_1 = sst_list.get<
double>(
"beta_1");
74 if (sst_list.isType<
double>(
"beta_2"))
76 _beta_2 = sst_list.get<
double>(
"beta_2");
79 if (sst_list.isType<
double>(
"sigma_w1"))
81 _sigma_w1 = sst_list.get<
double>(
"sigma_w1");
84 if (sst_list.isType<
double>(
"sigma_w2"))
86 _sigma_w2 = sst_list.get<
double>(
"sigma_w2");
89 if (sst_list.isType<
bool>(
"Limit Production Term"))
92 = sst_list.get<
bool>(
"Limit Production Term");
96 _gamma_1 = _beta_1 / _beta_star
97 - _sigma_w1 * _kappa * _kappa / std::sqrt(_beta_star);
98 _gamma_2 = _beta_2 / _beta_star
99 - _sigma_w2 * _kappa * _kappa / std::sqrt(_beta_star);
102 this->addDependentField(_nu_t);
103 this->addDependentField(_turb_kinetic_energy);
104 this->addDependentField(_turb_specific_dissipation_rate);
105 this->addDependentField(_grad_turb_kinetic_energy);
106 this->addDependentField(_grad_turb_specific_dissipation_rate);
107 this->addDependentField(_sst_blending_function);
109 Utils::addDependentVectorField(
110 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
113 this->addEvaluatedField(_k_source);
114 this->addEvaluatedField(_k_prod);
115 this->addEvaluatedField(_k_dest);
116 this->addEvaluatedField(_w_source);
117 this->addEvaluatedField(_w_prod);
118 this->addEvaluatedField(_w_dest);
119 this->addEvaluatedField(_w_cross);
122 this->setName(
"SST Incompressible Source " + std::to_string(num_space_dim)
127 template<
class EvalType,
class Traits,
int NumSpaceDim>
128 void IncompressibleSSTSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
129 typename Traits::EvalData workset)
131 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
133 Kokkos::parallel_for(this->getName(), policy, *
this);
137 template<
class EvalType,
class Traits,
int NumSpaceDim>
138 KOKKOS_INLINE_FUNCTION
void
139 IncompressibleSSTSource<EvalType, Traits, NumSpaceDim>::operator()(
140 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
142 const int cell = team.league_rank();
143 const int num_point = _nu_t.extent(1);
144 const double max_tol = 1.0e-10;
148 Kokkos::parallel_for(
149 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
150 auto&& Sij_Sij = _k_source(cell, point);
152 for (
int i = 0; i < num_space_dim; ++i)
154 Sij_Sij += pow(_grad_velocity[i](cell, point, i), 2.0);
155 for (
int j = i + 1; j < num_space_dim; ++j)
158 * pow(_grad_velocity[i](cell, point, j)
159 + _grad_velocity[j](cell, point, i),
164 auto&& dkdxj_domegadxj = _w_source(cell, point);
165 dkdxj_domegadxj = 0.0;
166 for (
int j = 0; j < num_space_dim; ++j)
169 += _grad_turb_kinetic_energy(cell, point, j)
170 * _grad_turb_specific_dissipation_rate(cell, point, j);
176 auto&& pk_unlimited = _w_dest(cell, point);
177 pk_unlimited = _k_prod(cell, point) = 2.0 * _nu_t(cell, point)
180 = -_beta_star * _turb_specific_dissipation_rate(cell, point)
181 * _turb_kinetic_energy(cell, point);
182 if (_limit_production)
185 _k_prod(cell, point) = SmoothMath::min(
186 _k_prod(cell, point), -20.0 * _k_dest(cell, point), 0.0);
188 _k_source(cell, point) = _k_prod(cell, point)
189 + _k_dest(cell, point);
194 = (_gamma_1 * _sst_blending_function(cell, point)
195 + _gamma_2 * (1.0 - _sst_blending_function(cell, point)))
197 / SmoothMath::max(_nu_t(cell, point), max_tol, 0.0);
199 = -(_beta_1 * _sst_blending_function(cell, point)
200 + _beta_2 * (1.0 - _sst_blending_function(cell, point)))
201 * pow(_turb_specific_dissipation_rate(cell, point), 2);
203 _w_cross(cell, point)
204 = 2.0 * (1.0 - _sst_blending_function(cell, point)) * _sigma_w2
207 _turb_specific_dissipation_rate(cell, point),
210 _w_source(cell, point) = _w_prod(cell, point) + _w_dest(cell, point)
211 + _w_cross(cell, point);