1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECLSSIGN_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECLSSIGN_IMPL_HPP
4 #include <Panzer_HierarchicParallelism.hpp>
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)
22 this->addEvaluatedField(_heaviside);
23 this->addEvaluatedField(_sign);
24 this->addEvaluatedField(_sign_star);
27 this->addDependentField(_phi);
28 this->addDependentField(_phi_star);
29 this->addDependentField(_epsilon);
31 this->setName(
"Incompressible CLS Sign");
35 template<
class EvalType,
class Traits>
36 void IncompressibleCLSSign<EvalType, Traits>::evaluateFields(
37 typename Traits::EvalData workset)
39 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
41 Kokkos::parallel_for(this->getName(), policy, *
this);
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
49 const int cell = team.league_rank();
50 const int num_point = _sign.extent(1);
55 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
57 if (_phi(cell, point) < (-_epsilon(cell, point)))
59 _heaviside(cell, point) = 0.0;
61 else if (_phi(cell, point) > _epsilon(cell, point))
63 _heaviside(cell, point) = 1.0;
67 _heaviside(cell, point)
69 * (1.0 + _phi(cell, point) / _epsilon(cell, point)
71 * sin(pi * _phi(cell, point)
72 / _epsilon(cell, point)));
75 _sign(cell, point) = 2.0 * _heaviside(cell, point) - 1.0;
78 if (_phi_star(cell, point) < (-_epsilon(cell, point)))
80 _sign_star(cell, point) = 0.0;
82 else if (_phi_star(cell, point) > _epsilon(cell, point))
84 _sign_star(cell, point) = 1.0;
88 _sign_star(cell, point)
90 * (1.0 + _phi_star(cell, point) / _epsilon(cell, point)
92 * sin(pi * _phi_star(cell, point)
93 / _epsilon(cell, point)));
96 _sign_star(cell, point) = 2.0 * _sign_star(cell, point) - 1.0;