VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleGradDiv_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLEGRADDIV_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLEGRADDIV_IMPL_HPP
3 
4 #include <utils/VertexCFD_Utils_VectorField.hpp>
5 
6 #include <Panzer_HierarchicParallelism.hpp>
7 
8 namespace VertexCFD
9 {
10 namespace ClosureModel
11 {
12 //---------------------------------------------------------------------------//
13 template<class EvalType, class Traits, int NumSpaceDim>
14 IncompressibleGradDiv<EvalType, Traits, NumSpaceDim>::IncompressibleGradDiv(
15  const panzer::IntegrationRule& ir,
16  const Teuchos::ParameterList& stability_param_list,
17  const std::string& flux_prefix,
18  const std::string& gradient_prefix)
19  : _gamma(stability_param_list.get<double>("GradDiv Stabilization "
20  "Coefficient"))
21 
22 {
23  // Add evaludated/contributed fields
24  Utils::addContributedVectorField(*this, ir.dl_vector, _momentum_flux,
25  flux_prefix + "VISCOUS_FLUX_"
26  "momentum_");
27 
28  // Add dependent fields
29  Utils::addDependentVectorField(*this,
30  ir.dl_vector,
31  _grad_velocity,
32  gradient_prefix + "GRAD_velocity_");
33 
34  this->setName("Incompressible Grad-Div Source "
35  + std::to_string(num_space_dim) + "D");
36 }
37 
38 //---------------------------------------------------------------------------//
39 template<class EvalType, class Traits, int NumSpaceDim>
40 void IncompressibleGradDiv<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 IncompressibleGradDiv<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 = _momentum_flux[0].extent(1);
56 
57  Kokkos::parallel_for(
58  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
59  // Calculate weak form of grad(\gamma * div U)
60  for (int i = 0; i < num_space_dim; ++i)
61  {
62  for (int j = 0; j < num_space_dim; ++j)
63  {
64  _momentum_flux[i](cell, point, i)
65  += _gamma * _grad_velocity[j](cell, point, j);
66  }
67  }
68  });
69 }
70 
71 //---------------------------------------------------------------------------//
72 
73 } // end namespace ClosureModel
74 } // end namespace VertexCFD
75 
76 #endif // end VERTEXCFD_CLOSURE_INCOMPRESSIBLEGRADDIV_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23