1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONEDDYVISCOSITY_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONEDDYVISCOSITY_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
6 #include <Panzer_HierarchicParallelism.hpp>
10 namespace ClosureModel
13 template<
class EvalType,
class Traits>
14 IncompressibleChienKEpsilonEddyViscosity<EvalType, Traits>::
15 IncompressibleChienKEpsilonEddyViscosity(
16 const panzer::IntegrationRule& ir,
17 const Teuchos::RCP<panzer::GlobalData>& global_data,
18 const Teuchos::ParameterList& user_params)
19 : _turb_kinetic_energy(
"turb_kinetic_energy", ir.dl_scalar)
20 , _turb_dissipation_rate(
"turb_dissipation_rate", ir.dl_scalar)
21 , _nu(
"kinematic_viscosity", ir.dl_scalar)
22 , _distance(
"distance", ir.dl_scalar)
23 , _global_data(global_data)
26 , _num_grad_dim(ir.spatial_dimension)
27 , _nu_t(
"turbulent_eddy_viscosity", ir.dl_scalar)
29 _area = user_params.sublist(
"Turbulence Parameters")
30 .get<
double>(
"Boundary Surface Area");
33 this->addDependentField(_turb_kinetic_energy);
34 this->addDependentField(_turb_dissipation_rate);
35 this->addDependentField(_nu);
36 this->addDependentField(_distance);
39 this->addEvaluatedField(_nu_t);
42 this->setName(
"Chien K-Epsilon Incompressible Turbulent Eddy Viscosity "
43 + std::to_string(_num_grad_dim) +
"D");
47 template<
class EvalType,
class Traits>
48 void IncompressibleChienKEpsilonEddyViscosity<EvalType, Traits>::evaluateFields(
49 typename Traits::EvalData workset)
51 const auto& pl = *_global_data->pl;
52 const std::string wall_shear_stress_name
53 =
"Friction Velocity - friction_velocity";
54 _wall_shear_stress = pl.getValue<EvalType>(wall_shear_stress_name) / _area;
56 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
58 Kokkos::parallel_for(this->getName(), policy, *
this);
62 template<
class EvalType,
class Traits>
63 KOKKOS_INLINE_FUNCTION
void
64 IncompressibleChienKEpsilonEddyViscosity<EvalType, Traits>::operator()(
65 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
67 const int cell = team.league_rank();
68 const int num_point = _nu_t.extent(1);
69 const auto max_tol = 1.0e-12;
75 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
76 _nu_t(cell, point) = SmoothMath::max(
78 * pow(SmoothMath::max(
79 _turb_kinetic_energy(cell, point), max_tol, 0.0),
82 _turb_dissipation_rate(cell, point), max_tol, 0.0)
84 - exp(_C_tau * _wall_shear_stress
85 * _distance(cell, point) / _nu(cell, point))),