1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEKTAUSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEKTAUSOURCE_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 IncompressibleKTauSource<EvalType, Traits, NumSpaceDim>::IncompressibleKTauSource(
18 const panzer::IntegrationRule& ir,
19 const Teuchos::ParameterList& user_params)
20 : _nu(
"kinematic_viscosity", ir.dl_scalar)
21 , _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
22 , _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
23 , _turb_specific_dissipation_rate(
"turb_specific_dissipation_rate",
25 , _grad_turb_kinetic_energy(
"GRAD_turb_kinetic_energy", ir.dl_vector)
26 , _grad_turb_specific_dissipation_rate(
27 "GRAD_turb_specific_dissipation_rate", ir.dl_vector)
33 , _limit_production(true)
34 , _limit_destruction(true)
35 , _k_source(
"SOURCE_turb_kinetic_energy_equation", ir.dl_scalar)
36 , _k_prod(
"PRODUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
37 , _k_dest(
"DESTRUCTION_turb_kinetic_energy_equation", ir.dl_scalar)
38 , _t_source(
"SOURCE_turb_specific_dissipation_rate_equation", ir.dl_scalar)
39 , _t_prod(
"PRODUCTION_turb_specific_dissipation_rate_equation",
42 "DESTRUCTION_eddy_viscosity_turb_specific_dissipation_rate_equation",
45 "DESTRUCTION_viscosity_turb_specific_dissipation_rate_equation",
47 , _t_cross(
"CROSS_DIFFUSION_turb_specific_dissipation_rate_equation",
51 if (user_params.isSublist(
"Turbulence Parameters"))
53 Teuchos::ParameterList turb_list
54 = user_params.sublist(
"Turbulence Parameters");
56 if (turb_list.isType<
double>(
"beta_star"))
58 _beta_star = turb_list.get<
double>(
"beta_star");
61 if (turb_list.isType<
double>(
"gamma"))
63 _gamma = turb_list.get<
double>(
"gamma");
66 if (turb_list.isType<
double>(
"beta_0"))
68 _beta_0 = turb_list.get<
double>(
"beta_0");
71 if (turb_list.isType<
double>(
"sigma_d"))
73 _sigma_d = turb_list.get<
double>(
"sigma_d");
76 if (turb_list.isType<
double>(
"sigma_t"))
78 _sigma_t = turb_list.get<
double>(
"sigma_t");
81 if (turb_list.isType<
bool>(
"Limit Production Term"))
83 _limit_production = turb_list.get<
bool>(
"Limit Production Term");
86 if (turb_list.isType<
bool>(
"Limit Destruction Term"))
88 _limit_destruction = turb_list.get<
bool>(
"Limit Destruction Term");
93 this->addDependentField(_nu);
94 this->addDependentField(_nu_t);
95 this->addDependentField(_turb_kinetic_energy);
96 this->addDependentField(_turb_specific_dissipation_rate);
97 this->addDependentField(_grad_turb_kinetic_energy);
98 this->addDependentField(_grad_turb_specific_dissipation_rate);
100 Utils::addDependentVectorField(
101 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
104 this->addEvaluatedField(_k_source);
105 this->addEvaluatedField(_k_prod);
106 this->addEvaluatedField(_k_dest);
107 this->addEvaluatedField(_t_source);
108 this->addEvaluatedField(_t_prod);
109 this->addEvaluatedField(_t_dest_nut);
110 this->addEvaluatedField(_t_dest_nu);
111 this->addEvaluatedField(_t_cross);
114 this->setName(
"K-Tau Incompressible Source "
115 + std::to_string(num_space_dim) +
"D");
119 template<
class EvalType,
class Traits,
int NumSpaceDim>
120 void IncompressibleKTauSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
121 typename Traits::EvalData workset)
123 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
125 Kokkos::parallel_for(this->getName(), policy, *
this);
129 template<
class EvalType,
class Traits,
int NumSpaceDim>
130 KOKKOS_INLINE_FUNCTION
void
131 IncompressibleKTauSource<EvalType, Traits, NumSpaceDim>::operator()(
132 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
134 const int cell = team.league_rank();
135 const int num_point = _nu_t.extent(1);
136 const double max_tol = 1.0e-10;
139 Kokkos::parallel_for(
140 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
141 auto&& Sij_Sij = _t_prod(cell, point);
143 for (
int i = 0; i < num_space_dim; ++i)
145 Sij_Sij += pow(_grad_velocity[i](cell, point, i), 2.0);
146 for (
int j = i + 1; j < num_space_dim; ++j)
149 * pow(_grad_velocity[i](cell, point, j)
150 + _grad_velocity[j](cell, point, i),
156 _k_prod(cell, point) = 2.0 * _nu_t(cell, point) * Sij_Sij;
159 = _beta_star * _turb_kinetic_energy(cell, point)
161 _turb_specific_dissipation_rate(cell, point),
165 if (_limit_production)
168 _k_prod(cell, point) = SmoothMath::min(
169 _k_prod(cell, point), 10.0 * _k_dest(cell, point), 0.0);
172 _k_source(cell, point)
173 = (_k_prod(cell, point) - _k_dest(cell, point));
179 * pow(_turb_specific_dissipation_rate(cell, point), 2.0)
183 auto&& dkdxj_dwdxj = _t_cross(cell, point);
185 auto&& limit_source = _t_dest_nu(cell, point);
187 for (
int j = 0; j < num_space_dim; ++j)
190 _grad_turb_specific_dissipation_rate(cell, point, j), 2.0);
193 += _grad_turb_kinetic_energy(cell, point, j)
194 * _grad_turb_specific_dissipation_rate(cell, point, j);
197 _t_cross(cell, point)
198 = _sigma_d * _turb_specific_dissipation_rate(cell, point)
199 * SmoothMath::min(dkdxj_dwdxj, 0.0, 0.0);
201 _t_dest_nut(cell, point) = 2.0 * _turb_kinetic_energy(cell, point)
202 * _sigma_t * limit_source;
203 _t_dest_nu(cell, point)
204 = 2.0 * _nu(cell, point) * limit_source
208 _turb_specific_dissipation_rate(cell, point),
213 if (_limit_destruction
214 && _t_dest_nu(cell, point) >= _t_dest_nut(cell, point))
216 _t_source(cell, point)
217 = _t_prod(cell, point)
220 _t_dest_nut(cell, point) + _t_dest_nu(cell, point),
222 + _t_cross(cell, point);
224 else if (_limit_destruction
225 && _t_dest_nut(cell, point) > _t_dest_nu(cell, point))
227 _t_source(cell, point)
228 = _t_prod(cell, point)
230 4.0 / 3.0 * _beta_0, _t_dest_nu(cell, point), 0.0)
231 + _t_dest_nut(cell, point))
232 + _t_cross(cell, point);
236 _t_source(cell, point)
237 = _t_prod(cell, point)
238 - (_t_dest_nut(cell, point) + _t_dest_nu(cell, point))
239 + _t_cross(cell, point);