VertexCFD  0.0-dev
VertexCFD_InitialCondition_Circle_impl.hpp
1 #ifndef VERTEXCFD_INITIALCONDITION_CIRCLE_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_CIRCLE_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, int NumSpaceDim>
20 Circle<EvalType, Traits, NumSpaceDim>::Circle(
21  const Teuchos::ParameterList& params, const panzer::PureBasis& basis)
22  : _basis_name(basis.name())
23 {
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)
28  {
29  _origin[dim] = origin[dim];
30  }
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);
38 }
39 
40 //---------------------------------------------------------------------------//
41 template<class EvalType, class Traits, int NumSpaceDim>
42 void Circle<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
43  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
44 {
45  _basis_index = panzer::getPureBasisIndex(
46  _basis_name, (*sd.worksets_)[0], this->wda);
47 }
48 
49 //---------------------------------------------------------------------------//
50 template<class EvalType, class Traits, int NumSpaceDim>
51 void Circle<EvalType, Traits, NumSpaceDim>::evaluateFields(
52  typename Traits::EvalData workset)
53 {
54  _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
55  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
56  workset.num_cells);
57  Kokkos::parallel_for(this->getName(), policy, *this);
58 }
59 
60 //---------------------------------------------------------------------------//
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
64 {
65  const int cell = team.league_rank();
66  const int num_basis = _ic.extent(1);
67 
68  Kokkos::parallel_for(
69  Kokkos::TeamThreadRange(team, 0, num_basis), [&](const int basis) {
70  using std::sqrt;
71  double sum = 0.0;
72  for (int dim = 0; dim < num_space_dim; ++dim)
73  {
74  const double coord = _basis_coords(cell, basis, dim)
75  - _origin[dim];
76  sum += coord * coord;
77  }
78  const double r = sqrt(sum);
79  _ic(cell, basis) = r < _radius ? _inside_value : _outside_value;
80  });
81 }
82 
83 //---------------------------------------------------------------------------//
84 
85 } // end namespace InitialCondition
86 } // end namespace VertexCFD
87 
88 #endif // end VERTEXCFD_INITIALCONDITION_CIRCLE_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23