VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleChienKEpsilonEddyViscosity_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONEDDYVISCOSITY_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONEDDYVISCOSITY_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 
6 #include <Panzer_HierarchicParallelism.hpp>
7 
8 namespace VertexCFD
9 {
10 namespace ClosureModel
11 {
12 //---------------------------------------------------------------------------//
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)
24  , _C_nu(0.09)
25  , _C_tau(-0.0115)
26  , _num_grad_dim(ir.spatial_dimension)
27  , _nu_t("turbulent_eddy_viscosity", ir.dl_scalar)
28 {
29  _area = user_params.sublist("Turbulence Parameters")
30  .get<double>("Boundary Surface Area");
31 
32  // Add dependent fields
33  this->addDependentField(_turb_kinetic_energy);
34  this->addDependentField(_turb_dissipation_rate);
35  this->addDependentField(_nu);
36  this->addDependentField(_distance);
37 
38  // Add evaluated fields
39  this->addEvaluatedField(_nu_t);
40 
41  // Closure model name
42  this->setName("Chien K-Epsilon Incompressible Turbulent Eddy Viscosity "
43  + std::to_string(_num_grad_dim) + "D");
44 }
45 
46 //---------------------------------------------------------------------------//
47 template<class EvalType, class Traits>
48 void IncompressibleChienKEpsilonEddyViscosity<EvalType, Traits>::evaluateFields(
49  typename Traits::EvalData workset)
50 {
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;
55 
56  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
57  workset.num_cells);
58  Kokkos::parallel_for(this->getName(), policy, *this);
59 }
60 
61 //---------------------------------------------------------------------------//
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
66 {
67  const int cell = team.league_rank();
68  const int num_point = _nu_t.extent(1);
69  const auto max_tol = 1.0e-12;
70  using Kokkos::abs;
71  using Kokkos::exp;
72  using Kokkos::pow;
73 
74  Kokkos::parallel_for(
75  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
76  _nu_t(cell, point) = SmoothMath::max(
77  _C_nu
78  * pow(SmoothMath::max(
79  _turb_kinetic_energy(cell, point), max_tol, 0.0),
80  2.0)
81  / SmoothMath::max(
82  _turb_dissipation_rate(cell, point), max_tol, 0.0)
83  * (1.0
84  - exp(_C_tau * _wall_shear_stress
85  * _distance(cell, point) / _nu(cell, point))),
86  max_tol,
87  0.0);
88  });
89 }
90 
91 //---------------------------------------------------------------------------//
92 
93 } // end namespace ClosureModel
94 } // end namespace VertexCFD
95 
96 #endif // end
97  // VERTEXCFD_CLOSURE_INCOMPRESSIBLECHIENKEPSILONEDDYVISCOSITY_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23