1 #ifndef VERTEXCFD_INITIALCONDITION_CIRCLE_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_CIRCLE_IMPL_HPP
4 #include <Panzer_GlobalIndexer.hpp>
5 #include <Panzer_HierarchicParallelism.hpp>
6 #include <Panzer_PureBasis.hpp>
7 #include <Panzer_Workset_Utilities.hpp>
9 #include <Teuchos_Array.hpp>
16 namespace InitialCondition
19 template<
class EvalType,
class Traits,
int NumSpaceDim>
20 Circle<EvalType, Traits, NumSpaceDim>::Circle(
21 const Teuchos::ParameterList& params,
const panzer::PureBasis& basis)
22 : _basis_name(basis.name())
24 _inside_value = params.get<
double>(
"Inside Value");
25 _outside_value = params.get<
double>(
"Outside Value");
26 auto origin = params.get<Teuchos::Array<double>>(
"Center");
27 for (
int dim = 0; dim < num_space_dim; ++dim)
29 _origin[dim] = origin[dim];
31 _radius = params.get<
double>(
"Radius");
32 const std::string dof_name = params.get<std::string>(
"Equation Set Name");
33 _ic = PHX::MDField<scalar_type, panzer::Cell, panzer::BASIS>(
34 dof_name, basis.functional);
35 this->addEvaluatedField(_ic);
36 this->addUnsharedField(_ic.fieldTag().clone());
37 this->setName(
"Circle Initial Condition: " + dof_name);
41 template<
class EvalType,
class Traits,
int NumSpaceDim>
42 void Circle<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
43 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
45 _basis_index = panzer::getPureBasisIndex(
46 _basis_name, (*sd.worksets_)[0], this->wda);
50 template<
class EvalType,
class Traits,
int NumSpaceDim>
51 void Circle<EvalType, Traits, NumSpaceDim>::evaluateFields(
52 typename Traits::EvalData workset)
54 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
55 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
57 Kokkos::parallel_for(this->getName(), policy, *
this);
61 template<
class EvalType,
class Traits,
int NumSpaceDim>
62 KOKKOS_INLINE_FUNCTION
void Circle<EvalType, Traits, NumSpaceDim>::operator()(
63 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
65 const int cell = team.league_rank();
66 const int num_basis = _ic.extent(1);
69 Kokkos::TeamThreadRange(team, 0, num_basis), [&](
const int basis) {
72 for (
int dim = 0; dim < num_space_dim; ++dim)
74 const double coord = _basis_coords(cell, basis, dim)
78 const double r = sqrt(sum);
79 _ic(cell, basis) = r < _radius ? _inside_value : _outside_value;
88 #endif // end VERTEXCFD_INITIALCONDITION_CIRCLE_IMPL_HPP