VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleLSVOFBuoyancySource_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_BUOYANCYSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_BUOYANCYSOURCE_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_VectorField.hpp"
5 
6 #include <Panzer_HierarchicParallelism.hpp>
7 
8 #include <string>
9 
10 namespace VertexCFD
11 {
12 namespace ClosureModel
13 {
14 //---------------------------------------------------------------------------//
15 template<class EvalType, class Traits, int NumSpaceDim>
16 IncompressibleLSVOFBuoyancySource<EvalType, Traits, NumSpaceDim>::
17  IncompressibleLSVOFBuoyancySource(const panzer::IntegrationRule& ir,
18  const Teuchos::ParameterList& user_params,
19  const std::string& field_prefix)
20  : _rho(field_prefix + "density", ir.dl_scalar)
21 {
22  const auto gravity = user_params.get<Teuchos::Array<double>>("Gravity");
23  for (int dim = 0; dim < num_space_dim; ++dim)
24  {
25  _gravity[dim] = gravity[dim];
26  }
27 
28  // Evaluated fields
29  Utils::addEvaluatedVectorField(*this,
30  ir.dl_scalar,
31  _buoyancy_momentum_source,
32  "LSVOF_BUOYANCY_SOURCE_"
33  "momentum_");
34 
35  // Dependent fields
36  this->addDependentField(_rho);
37 
38  this->setName("Incompressible LSVOF Buoyancy Source "
39  + std::to_string(num_space_dim) + "D");
40 }
41 
42 //---------------------------------------------------------------------------//
43 template<class EvalType, class Traits, int NumSpaceDim>
44 void IncompressibleLSVOFBuoyancySource<EvalType, Traits, NumSpaceDim>::evaluateFields(
45  typename Traits::EvalData workset)
46 {
47  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
48  workset.num_cells);
49  Kokkos::parallel_for(this->getName(), policy, *this);
50 }
51 
52 //---------------------------------------------------------------------------//
53 template<class EvalType, class Traits, int NumSpaceDim>
54 KOKKOS_INLINE_FUNCTION void
55 IncompressibleLSVOFBuoyancySource<EvalType, Traits, NumSpaceDim>::operator()(
56  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
57 {
58  const int cell = team.league_rank();
59  const int num_point = _buoyancy_momentum_source[0].extent(1);
60 
61  Kokkos::parallel_for(
62  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
63  for (int mom_dim = 0; mom_dim < num_space_dim; ++mom_dim)
64  {
65  _buoyancy_momentum_source[mom_dim](cell, point)
66  = _rho(cell, point) * _gravity[mom_dim];
67  }
68  });
69 }
70 
71 //---------------------------------------------------------------------------//
72 
73 } // end namespace ClosureModel
74 } // end namespace VertexCFD
75 
76 #endif // end VERTEXCFD_CLOSURE_BUOYANCYSOURCE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23