VertexCFD  0.0-dev
VertexCFD_InitialCondition_Step_impl.hpp
1 #ifndef VERTEXCFD_INITIALCONDITION_STEP_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_STEP_IMPL_HPP
3 
4 #include <Panzer_GlobalIndexer.hpp>
5 #include <Panzer_HierarchicParallelism.hpp>
6 #include <Panzer_PureBasis.hpp>
7 #include <Panzer_Workset_Utilities.hpp>
8 
9 #include <Teuchos_Array.hpp>
10 
11 #include <cmath>
12 #include <string>
13 
14 namespace VertexCFD
15 {
16 namespace InitialCondition
17 {
18 //---------------------------------------------------------------------------//
19 template<class EvalType, class Traits>
20 Step<EvalType, Traits>::Step(const Teuchos::ParameterList& params,
21  const panzer::PureBasis& basis)
22  : _basis_name(basis.name())
23 {
24  _left_value = params.get<double>("Left Value");
25  _right_value = params.get<double>("Right Value");
26  _origin = params.get<double>("Origin");
27  const std::string dof_name = params.get<std::string>("Equation Set Name");
28  _ic = PHX::MDField<scalar_type, panzer::Cell, panzer::BASIS>(
29  dof_name, basis.functional);
30  this->addEvaluatedField(_ic);
31  this->addUnsharedField(_ic.fieldTag().clone());
32  this->setName("Step Initial Condition: " + dof_name);
33 }
34 
35 //---------------------------------------------------------------------------//
36 template<class EvalType, class Traits>
37 void Step<EvalType, Traits>::postRegistrationSetup(typename Traits::SetupData sd,
38  PHX::FieldManager<Traits>&)
39 {
40  _basis_index = panzer::getPureBasisIndex(
41  _basis_name, (*sd.worksets_)[0], this->wda);
42 }
43 
44 //---------------------------------------------------------------------------//
45 template<class EvalType, class Traits>
46 void Step<EvalType, Traits>::evaluateFields(typename Traits::EvalData workset)
47 {
48  _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
49  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
50  workset.num_cells);
51  Kokkos::parallel_for(this->getName(), policy, *this);
52 }
53 
54 //---------------------------------------------------------------------------//
55 template<class EvalType, class Traits>
56 KOKKOS_INLINE_FUNCTION void Step<EvalType, Traits>::operator()(
57  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
58 {
59  const int cell = team.league_rank();
60  const int num_basis = _ic.extent(1);
61 
62  Kokkos::parallel_for(
63  Kokkos::TeamThreadRange(team, 0, num_basis), [&](const int basis) {
64  const double x = _basis_coords(cell, basis, 0);
65  _ic(cell, basis) = x < _origin ? _left_value : _right_value;
66  });
67 }
68 
69 //---------------------------------------------------------------------------//
70 
71 } // end namespace InitialCondition
72 } // end namespace VertexCFD
73 
74 #endif // end VERTEXCFD_INITIALCONDITION_STEP_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23