VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleKOmegaEddyViscosity_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGAEDDYVISCOSITY_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGAEDDYVISCOSITY_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
6 
7 #include <Panzer_HierarchicParallelism.hpp>
8 
9 namespace VertexCFD
10 {
11 namespace ClosureModel
12 {
13 //---------------------------------------------------------------------------//
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",
20  ir.dl_scalar)
21  , _C_lim(7.0 / 8.0)
22  , _beta_star(0.09)
23  , _nu_t("turbulent_eddy_viscosity", ir.dl_scalar)
24 {
25  // Check for user-defined coefficients or parameters
26  if (user_params.isSublist("Turbulence Parameters"))
27  {
28  const Teuchos::ParameterList turb_list
29  = user_params.sublist("Turbulence Parameters");
30 
31  if (turb_list.isSublist("K-Omega Parameters"))
32  {
33  const Teuchos::ParameterList k_w_list
34  = turb_list.sublist("K-Omega Parameters");
35 
36  if (k_w_list.isType<double>("C_lim"))
37  {
38  _C_lim = k_w_list.get<double>("C_lim");
39  }
40 
41  if (k_w_list.isType<double>("beta_star"))
42  {
43  _beta_star = k_w_list.get<double>("beta_star");
44  }
45  }
46  }
47  // Add dependent fields
48  this->addDependentField(_turb_kinetic_energy);
49  this->addDependentField(_turb_specific_dissipation_rate);
50 
51  Utils::addDependentVectorField(
52  *this, ir.dl_vector, _grad_velocity, "GRAD_velocity_");
53 
54  // Add evaluated fields
55  this->addEvaluatedField(_nu_t);
56 
57  // Closure model name
58  this->setName("Incompressible K-Omega Turbulent Eddy Viscosity "
59  + std::to_string(num_space_dim) + "D");
60 }
61 
62 //---------------------------------------------------------------------------//
63 template<class EvalType, class Traits, int NumSpaceDim>
64 void IncompressibleKOmegaEddyViscosity<EvalType, Traits, NumSpaceDim>::evaluateFields(
65  typename Traits::EvalData workset)
66 {
67  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
68  workset.num_cells);
69  Kokkos::parallel_for(this->getName(), policy, *this);
70 }
71 
72 //---------------------------------------------------------------------------//
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
77 {
78  using Kokkos::pow;
79  using Kokkos::sqrt;
80 
81  const int cell = team.league_rank();
82  const int num_point = _nu_t.extent(1);
83  const double max_tol = 1.0e-10;
84 
85  Kokkos::parallel_for(
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)
89  {
90  _nu_t(cell, point)
91  += pow(_grad_velocity[i](cell, point, i), 2.0);
92  for (int j = i + 1; j < num_space_dim; ++j)
93  {
94  _nu_t(cell, point)
95  += 0.5
96  * pow(_grad_velocity[i](cell, point, j)
97  + _grad_velocity[j](cell, point, i),
98  2.0);
99  }
100  }
101  _nu_t(cell, point)
102  = _turb_kinetic_energy(cell, point)
103  / SmoothMath::max(
104  SmoothMath::max(
105  _turb_specific_dissipation_rate(cell, point),
106  _C_lim * sqrt(2.0 * _nu_t(cell, point) / _beta_star),
107  0.0),
108  max_tol,
109  0.0);
110  });
111 }
112 
113 //---------------------------------------------------------------------------//
114 
115 } // end namespace ClosureModel
116 } // end namespace VertexCFD
117 
118 #endif // end
119  // VERTEXCFD_CLOSURE_INCOMPRESSIBLEKOMEGAEDDYVISCOSITY_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23