VertexCFD  0.0-dev
VertexCFD_Closure_VectorFieldDivergence_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_VECTORFIELDDIVERGENCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_VECTORFIELDDIVERGENCE_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 #include <string>
10 
11 namespace VertexCFD
12 {
13 namespace ClosureModel
14 {
15 //---------------------------------------------------------------------------//
16 template<class EvalType, class Traits, int NumSpaceDim>
17 VectorFieldDivergence<EvalType, Traits, NumSpaceDim>::VectorFieldDivergence(
18  const panzer::IntegrationRule& ir,
19  const std::string& field_name,
20  const std::string& closure_name)
21  : _num_grad_dim(ir.spatial_dimension)
22  , _use_abs(closure_name == "AbsVectorFieldDivergence" ? true : false)
23  , _vector_field_divergence(
24  (_use_abs ? "abs_divergence_" : "divergence_") + field_name,
25  ir.dl_scalar)
26 {
27  // Evaluated fields
28  this->addEvaluatedField(_vector_field_divergence);
29 
30  // Dependent fields
31  Utils::addDependentVectorField(
32  *this, ir.dl_vector, _grad_vector_field, "GRAD_" + field_name + "_");
33 
34  this->setName("Vector Field Divergence " + std::to_string(_num_grad_dim)
35  + "D");
36 }
37 
38 //---------------------------------------------------------------------------//
39 template<class EvalType, class Traits, int NumSpaceDim>
40 void VectorFieldDivergence<EvalType, Traits, NumSpaceDim>::evaluateFields(
41  typename Traits::EvalData workset)
42 {
43  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
44  workset.num_cells);
45  Kokkos::parallel_for(this->getName(), policy, *this);
46 }
47 
48 //---------------------------------------------------------------------------//
49 template<class EvalType, class Traits, int NumSpaceDim>
50 KOKKOS_INLINE_FUNCTION void
51 VectorFieldDivergence<EvalType, Traits, NumSpaceDim>::operator()(
52  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
53 {
54  const int cell = team.league_rank();
55  const int num_point = _grad_vector_field[0].extent(1);
56  const double abs_tol = 1.0e-12;
57 
58  Kokkos::parallel_for(
59  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
60  _vector_field_divergence(cell, point) = 0.0;
61  for (int d = 0; d < _num_grad_dim; ++d)
62  {
63  _vector_field_divergence(cell, point)
64  += _grad_vector_field[d](cell, point, d);
65  }
66  if (_use_abs)
67  {
68  _vector_field_divergence(cell, point) = SmoothMath::abs(
69  _vector_field_divergence(cell, point), abs_tol);
70  }
71  });
72 }
73 
74 //---------------------------------------------------------------------------//
75 
76 } // end namespace ClosureModel
77 } // end namespace VertexCFD
78 
79 #endif // end VERTEXCFD_CLOSURE_VECTORFIELDDIVERGENCE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23