VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleTimeDerivative_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLETIMEDERIVATIVE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLETIMEDERIVATIVE_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 IncompressibleTimeDerivative<EvalType, Traits, NumSpaceDim>::
15  IncompressibleTimeDerivative(const panzer::IntegrationRule& ir,
16  const Teuchos::ParameterList& fluid_params)
17  : _dqdt_continuity("DQDT_continuity", ir.dl_scalar)
18  , _dqdt_energy("DQDT_energy", ir.dl_scalar)
19  , _dxdt_lagrange_pressure("DXDT_lagrange_pressure", ir.dl_scalar)
20  , _rho("density", ir.dl_scalar)
21  , _cp("specific_heat_capacity", ir.dl_scalar)
22  , _dxdt_temperature("DXDT_temperature", ir.dl_scalar)
23  , _solve_temp(fluid_params.get<bool>("Build Temperature Equation"))
24  , _beta(fluid_params.get<double>("Artificial compressibility"))
25 {
26  // Evaluated continuity
27  this->addEvaluatedField(_dqdt_continuity);
28 
29  // Dependent and evaluated velocity-based fields
30  this->addDependentField(_rho);
31  Utils::addEvaluatedVectorField(
32  *this, ir.dl_scalar, _dqdt_momentum, "DQDT_momentum_");
33  Utils::addDependentVectorField(
34  *this, ir.dl_scalar, _dxdt_velocity, "DXDT_velocity_");
35  this->addDependentField(_dxdt_lagrange_pressure);
36 
37  // Dependent and evaluated temperature
38  if (_solve_temp)
39  {
40  this->addDependentField(_cp);
41  this->addEvaluatedField(_dqdt_energy);
42  this->addDependentField(_dxdt_temperature);
43  }
44 
45  this->setName("Incompressible Time Derivative "
46  + std::to_string(num_space_dim) + "D");
47 }
48 
49 //---------------------------------------------------------------------------//
50 template<class EvalType, class Traits, int NumSpaceDim>
51 void IncompressibleTimeDerivative<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 IncompressibleTimeDerivative<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 = _dqdt_continuity.extent(1);
67 
68  Kokkos::parallel_for(
69  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
70  _dqdt_continuity(cell, point)
71  = _dxdt_lagrange_pressure(cell, point) / _beta;
72 
73  for (int dim = 0; dim < num_space_dim; ++dim)
74  _dqdt_momentum[dim](cell, point)
75  = _rho(cell, point) * _dxdt_velocity[dim](cell, point);
76 
77  if (_solve_temp)
78  {
79  _dqdt_energy(cell, point) = _rho(cell, point) * _cp(cell, point)
80  * _dxdt_temperature(cell, point);
81  }
82  });
83 }
84 
85 //---------------------------------------------------------------------------//
86 
87 } // end namespace ClosureModel
88 } // namespace VertexCFD
89 
90 #endif // end VERTEXCFD_CLOSURE_INCOMPRESSIBLETIMEDERIVATIVE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23