VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleCLSSign_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECLSSIGN_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECLSSIGN_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 IncompressibleCLSSign<EvalType, Traits>::IncompressibleCLSSign(
13  const panzer::IntegrationRule& ir, const std::string& field_prefix)
14  : _heaviside(field_prefix + "CLS_heaviside", ir.dl_scalar)
15  , _sign(field_prefix + "CLS_sign", ir.dl_scalar)
16  , _sign_star(field_prefix + "STAR_CLS_sign", ir.dl_scalar)
17  , _phi(field_prefix + "level_set", ir.dl_scalar)
18  , _phi_star(field_prefix + "STAR_level_set", ir.dl_scalar)
19  , _epsilon("CLS_epsilon", ir.dl_scalar)
20 {
21  // Evaluated fields
22  this->addEvaluatedField(_heaviside);
23  this->addEvaluatedField(_sign);
24  this->addEvaluatedField(_sign_star);
25 
26  // Dependent fields
27  this->addDependentField(_phi);
28  this->addDependentField(_phi_star);
29  this->addDependentField(_epsilon);
30 
31  this->setName("Incompressible CLS Sign");
32 }
33 
34 //---------------------------------------------------------------------------//
35 template<class EvalType, class Traits>
36 void IncompressibleCLSSign<EvalType, Traits>::evaluateFields(
37  typename Traits::EvalData workset)
38 {
39  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
40  workset.num_cells);
41  Kokkos::parallel_for(this->getName(), policy, *this);
42 }
43 
44 //---------------------------------------------------------------------------//
45 template<class EvalType, class Traits>
46 KOKKOS_INLINE_FUNCTION void IncompressibleCLSSign<EvalType, Traits>::operator()(
47  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
48 {
49  const int cell = team.league_rank();
50  const int num_point = _sign.extent(1);
51 
52  using Kokkos::sin;
53 
54  Kokkos::parallel_for(
55  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
56  // Update current sign field
57  if (_phi(cell, point) < (-_epsilon(cell, point)))
58  {
59  _heaviside(cell, point) = 0.0;
60  }
61  else if (_phi(cell, point) > _epsilon(cell, point))
62  {
63  _heaviside(cell, point) = 1.0;
64  }
65  else
66  {
67  _heaviside(cell, point)
68  = 0.5
69  * (1.0 + _phi(cell, point) / _epsilon(cell, point)
70  + 1.0 / pi
71  * sin(pi * _phi(cell, point)
72  / _epsilon(cell, point)));
73  }
74 
75  _sign(cell, point) = 2.0 * _heaviside(cell, point) - 1.0;
76 
77  // Update star sign field
78  if (_phi_star(cell, point) < (-_epsilon(cell, point)))
79  {
80  _sign_star(cell, point) = 0.0;
81  }
82  else if (_phi_star(cell, point) > _epsilon(cell, point))
83  {
84  _sign_star(cell, point) = 1.0;
85  }
86  else
87  {
88  _sign_star(cell, point)
89  = 0.5
90  * (1.0 + _phi_star(cell, point) / _epsilon(cell, point)
91  + 1.0 / pi
92  * sin(pi * _phi_star(cell, point)
93  / _epsilon(cell, point)));
94  }
95 
96  _sign_star(cell, point) = 2.0 * _sign_star(cell, point) - 1.0;
97  });
98 }
99 
100 //---------------------------------------------------------------------------//
101 
102 } // end namespace ClosureModel
103 } // end namespace VertexCFD
104 
105 #endif // end
106  // VERTEXCFD_CLOSURE_INCOMPRESSIBLECLSSIGN_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23