VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleSpalartAllmarasDiffusivityCoefficient_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLESPALARTALLMARASDIFFUSIVITYCOEFFICIENT_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLESPALARTALLMARASDIFFUSIVITYCOEFFICIENT_IMPL_HPP
3 
4 #include <Panzer_HierarchicParallelism.hpp>
5 
6 namespace VertexCFD
7 {
8 namespace ClosureModel
9 {
10 //---------------------------------------------------------------------------//
11 template<class EvalType, class Traits>
12 IncompressibleSpalartAllmarasDiffusivityCoefficient<EvalType, Traits>::
13  IncompressibleSpalartAllmarasDiffusivityCoefficient(
14  const panzer::IntegrationRule& ir)
15  : _sa_var("spalart_allmaras_variable", ir.dl_scalar)
16  , _nu("kinematic_viscosity", ir.dl_scalar)
17  , _cn1(16.0)
18  , _sigma(2.0 / 3.0)
19  , _one(1.0)
20  , _num_grad_dim(ir.spatial_dimension)
21  , _diffusivity_var("diffusivity_spalart_allmaras_variable", ir.dl_scalar)
22 {
23  // Add dependent fields
24  this->addDependentField(_sa_var);
25  this->addDependentField(_nu);
26 
27  // Add evaluated fields
28  this->addEvaluatedField(_diffusivity_var);
29 
30  // Closure model name
31  this->setName("Spalart-Allmaras Incompressible Diffusivity Coefficient "
32  + std::to_string(_num_grad_dim) + "D");
33 }
34 
35 //---------------------------------------------------------------------------//
36 template<class EvalType, class Traits>
37 void IncompressibleSpalartAllmarasDiffusivityCoefficient<EvalType, Traits>::
38  evaluateFields(typename Traits::EvalData workset)
39 {
40  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
41  workset.num_cells);
42  Kokkos::parallel_for(this->getName(), policy, *this);
43 }
44 
45 //---------------------------------------------------------------------------//
46 template<class EvalType, class Traits>
47 KOKKOS_INLINE_FUNCTION void
48 IncompressibleSpalartAllmarasDiffusivityCoefficient<EvalType, Traits>::operator()(
49  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
50 {
51  const int cell = team.league_rank();
52  const int num_point = _diffusivity_var.extent(1);
53  using std::pow;
54 
55  Kokkos::parallel_for(
56  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
57  const scalar_type xi3
58  = pow(_sa_var(cell, point) / _nu(cell, point), 3.0);
59  const scalar_type f_n = _sa_var(cell, point) < 0.0
60  ? (_cn1 + xi3) / (_cn1 - xi3)
61  : _one;
62 
63  _diffusivity_var(cell, point)
64  = (_nu(cell, point) + _sa_var(cell, point) * f_n) / _sigma;
65  });
66 }
67 
68 //---------------------------------------------------------------------------//
69 
70 } // end namespace ClosureModel
71 } // end namespace VertexCFD
72 
73 #endif // end
74  // VERTEXCFD_CLOSURE_INCOMPRESSIBLESPALARTALLMARASDIFFUSIVITYCOEFFICIENT_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23