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