1 #ifndef VERTEXCFD_INITIALCONDITION_SINUSOIDAL_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_SINUSOIDAL_IMPL_HPP
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>
10 #include <Teuchos_Array.hpp>
17 namespace InitialCondition
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)
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");
31 this->addEvaluatedField(_ic);
32 this->addUnsharedField(_ic.fieldTag().clone());
33 this->setName(
"Sinusoidal Initial Condition: " + dof_name);
37 template<
class EvalType,
class Traits>
38 void Sinusoidal<EvalType, Traits>::postRegistrationSetup(
39 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
41 _basis_index = panzer::getPureBasisIndex(
42 _basis_name, (*sd.worksets_)[0], this->wda);
46 template<
class EvalType,
class Traits>
47 void Sinusoidal<EvalType, Traits>::evaluateFields(
48 typename Traits::EvalData workset)
50 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
51 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
53 Kokkos::parallel_for(this->getName(), policy, *
this);
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
61 const int cell = team.league_rank();
62 const int num_basis = _ic.extent(1);
64 Kokkos::parallel_for(Kokkos::TeamThreadRange(team, 0, num_basis),
65 [&](
const int basis) {
67 for (
int dim = 0; dim < _basis_dim; ++dim)
69 sum += _basis_coords(cell, basis, dim);
71 _ic(cell, basis) = _amplitude * sin(sum + _phase);
80 #endif // end VERTEXCFD_INITIALCONDITION_SINUSOIDAL_IMPL_HPP