VertexCFD  0.0-dev
VertexCFD_BoundaryState_VariableExtrapolate_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYSTATE_VARIABLEEXTRAPOLATE_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_VARIABLEEXTRAPOLATE_IMPL_HPP
3 
4 #include <Panzer_HierarchicParallelism.hpp>
5 
6 namespace VertexCFD
7 {
8 namespace BoundaryCondition
9 {
10 //---------------------------------------------------------------------------//
11 // This class should be used for extrapolate boundary conditions.
12 //---------------------------------------------------------------------------//
13 template<class EvalType, class Traits>
14 VariableExtrapolate<EvalType, Traits>::VariableExtrapolate(
15  const panzer::IntegrationRule& ir, const std::string variable_name)
16  : _boundary_variable("BOUNDARY_" + variable_name, ir.dl_scalar)
17  , _boundary_grad_variable("BOUNDARY_GRAD_" + variable_name, ir.dl_vector)
18  , _variable(variable_name, ir.dl_scalar)
19  , _grad_variable("GRAD_" + variable_name, ir.dl_vector)
20  , _num_grad_dim(ir.spatial_dimension)
21 {
22  // Add evaluated fields
23  this->addEvaluatedField(_boundary_variable);
24  this->addEvaluatedField(_boundary_grad_variable);
25 
26  // Add dependent fields
27  this->addDependentField(_variable);
28  this->addDependentField(_grad_variable);
29 
30  this->setName(variable_name + " Boundary State Variable Extrapolate "
31  + std::to_string(_num_grad_dim) + "D");
32 }
33 
34 //---------------------------------------------------------------------------//
35 template<class EvalType, class Traits>
36 void VariableExtrapolate<EvalType, Traits>::evaluateFields(
37  typename Traits::EvalData workset)
38 {
39  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
40  workset.num_cells);
41  Kokkos::parallel_for(this->getName(), policy, *this);
42 }
43 
44 //---------------------------------------------------------------------------//
45 template<class EvalType, class Traits>
46 KOKKOS_INLINE_FUNCTION void VariableExtrapolate<EvalType, Traits>::operator()(
47  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
48 {
49  const int cell = team.league_rank();
50  const int num_point = _grad_variable.extent(1);
51 
52  Kokkos::parallel_for(
53  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
54  // Assign boundary values
55  _boundary_variable(cell, point) = _variable(cell, point);
56 
57  // Assign gradient
58  for (int d = 0; d < _num_grad_dim; ++d)
59  {
60  _boundary_grad_variable(cell, point, d)
61  = _grad_variable(cell, point, d);
62  }
63  });
64 }
65 
66 //---------------------------------------------------------------------------//
67 
68 } // end namespace BoundaryCondition
69 } // end namespace VertexCFD
70 
71 #endif // end VERTEXCFD_BOUNDARYSTATE_VARIABLEEXTRAPOLATE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23