VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleBuoyancySource_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 IncompressibleBuoyancySource<EvalType, Traits, NumSpaceDim>::
17  IncompressibleBuoyancySource(const panzer::IntegrationRule& ir,
18  const Teuchos::ParameterList& closure_params,
19  const Teuchos::ParameterList& user_params)
20  : _buoyancy_continuity_source("BUOYANCY_SOURCE_continuity", ir.dl_scalar)
21  , _buoyancy_energy_source("BUOYANCY_SOURCE_energy", ir.dl_scalar)
22  , _temperature("temperature", ir.dl_scalar)
23  , _beta_T(closure_params.get<double>("Expansion coefficient"))
24  , _T_ref(closure_params.get<double>("Reference temperature"))
25 {
26  const auto gravity = user_params.get<Teuchos::Array<double>>("Gravity");
27  for (int dim = 0; dim < num_space_dim; ++dim)
28  {
29  _gravity[dim] = gravity[dim];
30  }
31 
32  // Evaluated fields
33  this->addEvaluatedField(_buoyancy_continuity_source);
34  this->addEvaluatedField(_buoyancy_energy_source);
35 
36  Utils::addEvaluatedVectorField(*this,
37  ir.dl_scalar,
38  _buoyancy_momentum_source,
39  "BUOYANCY_SOURCE_"
40  "momentum_");
41 
42  // Dependent fields
43  this->addDependentField(_temperature);
44 
45  this->setName("Incompressible Buoyancy Source "
46  + std::to_string(num_space_dim) + "D");
47 }
48 
49 //---------------------------------------------------------------------------//
50 template<class EvalType, class Traits, int NumSpaceDim>
51 void IncompressibleBuoyancySource<EvalType, Traits, NumSpaceDim>::evaluateFields(
52  typename Traits::EvalData workset)
53 {
54  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
55  workset.num_cells);
56  Kokkos::parallel_for(this->getName(), policy, *this);
57 }
58 
59 //---------------------------------------------------------------------------//
60 template<class EvalType, class Traits, int NumSpaceDim>
61 KOKKOS_INLINE_FUNCTION void
62 IncompressibleBuoyancySource<EvalType, Traits, NumSpaceDim>::operator()(
63  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
64 {
65  const int cell = team.league_rank();
66  const int num_point = _buoyancy_continuity_source.extent(1);
67 
68  Kokkos::parallel_for(
69  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
70  _buoyancy_continuity_source(cell, point) = 0.0;
71  _buoyancy_energy_source(cell, point) = 0.0;
72 
73  for (int mom_dim = 0; mom_dim < num_space_dim; ++mom_dim)
74  {
75  _buoyancy_momentum_source[mom_dim](cell, point)
76  = -_beta_T * _gravity[mom_dim]
77  * (_temperature(cell, point) - _T_ref);
78  }
79  });
80 }
81 
82 //---------------------------------------------------------------------------//
83 
84 } // end namespace ClosureModel
85 } // end namespace VertexCFD
86 
87 #endif // end VERTEXCFD_CLOSURE_BUOYANCYSOURCE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23