1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGAEDDYVISCOSITY_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGAEDDYVISCOSITY_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_HierarchicParallelism.hpp>
11 namespace ClosureModel
14 template<
class EvalType,
class Traits,
int NumSpaceDim>
15 IncompressibleKOmegaEddyViscosity<EvalType, Traits, NumSpaceDim>::
16 IncompressibleKOmegaEddyViscosity(
const panzer::IntegrationRule& ir,
17 const Teuchos::ParameterList& user_params)
18 : _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
19 , _turb_specific_dissipation_rate(
"turb_specific_dissipation_rate",
23 , _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
26 if (user_params.isSublist(
"Turbulence Parameters"))
28 const Teuchos::ParameterList turb_list
29 = user_params.sublist(
"Turbulence Parameters");
31 if (turb_list.isSublist(
"K-Omega Parameters"))
33 const Teuchos::ParameterList k_w_list
34 = turb_list.sublist(
"K-Omega Parameters");
36 if (k_w_list.isType<
double>(
"C_lim"))
38 _C_lim = k_w_list.get<
double>(
"C_lim");
41 if (k_w_list.isType<
double>(
"beta_star"))
43 _beta_star = k_w_list.get<
double>(
"beta_star");
48 this->addDependentField(_turb_kinetic_energy);
49 this->addDependentField(_turb_specific_dissipation_rate);
51 Utils::addDependentVectorField(
52 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
55 this->addEvaluatedField(_nu_t);
58 this->setName(
"Incompressible K-Omega Turbulent Eddy Viscosity "
59 + std::to_string(num_space_dim) +
"D");
63 template<
class EvalType,
class Traits,
int NumSpaceDim>
64 void IncompressibleKOmegaEddyViscosity<EvalType, Traits, NumSpaceDim>::evaluateFields(
65 typename Traits::EvalData workset)
67 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
69 Kokkos::parallel_for(this->getName(), policy, *
this);
73 template<
class EvalType,
class Traits,
int NumSpaceDim>
74 KOKKOS_INLINE_FUNCTION
void
75 IncompressibleKOmegaEddyViscosity<EvalType, Traits, NumSpaceDim>::operator()(
76 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
81 const int cell = team.league_rank();
82 const int num_point = _nu_t.extent(1);
83 const double max_tol = 1.0e-10;
86 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
87 _nu_t(cell, point) = 0.0;
88 for (
int i = 0; i < num_space_dim; ++i)
91 += pow(_grad_velocity[i](cell, point, i), 2.0);
92 for (
int j = i + 1; j < num_space_dim; ++j)
96 * pow(_grad_velocity[i](cell, point, j)
97 + _grad_velocity[j](cell, point, i),
102 = _turb_kinetic_energy(cell, point)
105 _turb_specific_dissipation_rate(cell, point),
106 _C_lim * sqrt(2.0 * _nu_t(cell, point) / _beta_star),