VertexCFD  0.0-dev
VertexCFD_InitialCondition_Gaussian_impl.hpp
1 #ifndef VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_Constants.hpp"
5 
6 #include <Panzer_GlobalIndexer.hpp>
7 #include <Panzer_HierarchicParallelism.hpp>
8 #include <Panzer_PureBasis.hpp>
9 #include <Panzer_Workset_Utilities.hpp>
10 #include <Teuchos_StandardParameterEntryValidators.hpp>
11 
12 #include <Teuchos_Array.hpp>
13 
14 #include <cmath>
15 #include <string>
16 
17 namespace VertexCFD
18 {
19 namespace InitialCondition
20 {
21 //---------------------------------------------------------------------------//
22 template<class EvalType, class Traits, int NumSpaceDim>
23 Gaussian<EvalType, Traits, NumSpaceDim>::Gaussian(
24  const Teuchos::ParameterList& params, const panzer::PureBasis& basis)
25  : _basis_name(basis.name())
26  , _scaling(Scaling::unscaled)
27 {
28  const std::string dof_name = params.get<std::string>("Equation Set Name");
29  _ic = PHX::MDField<scalar_type, panzer::Cell, panzer::BASIS>(
30  dof_name, basis.functional);
31  this->addEvaluatedField(_ic);
32  this->addUnsharedField(_ic.fieldTag().clone());
33  this->setName("Gaussian Initial Condition: " + dof_name);
34 
35  // Get scaling flag
36  if (params.isType<std::string>("Scaling"))
37  {
38  const auto type_validator = Teuchos::rcp(
39  new Teuchos::StringToIntegralParameterEntryValidator<Scaling>(
40  Teuchos::tuple<std::string>("scaled", "unscaled"), "unscaled"));
41  _scaling = type_validator->getIntegralValue(
42  params.get<std::string>("Scaling"));
43  }
44 
45  // Get Gaussian profile parameters
46  const auto center = params.get<Teuchos::Array<double>>("Center");
47  const auto sigma = params.get<Teuchos::Array<double>>("Sigma");
48  _d = params.get<double>("Base");
49 
50  const double sqrt2pi = std::sqrt(2.0 * Constants::pi);
51  for (int dim = 0; dim < basis.dimension(); ++dim)
52  {
53  double scale;
54  if (_scaling == Scaling::scaled)
55  {
56  scale = params.get<double>("Scale");
57  }
58  else
59  {
60  scale = 1.0 / (sqrt2pi * sigma[dim]);
61  }
62 
63  _a[dim] = scale;
64  _b[dim] = center[dim];
65  _c[dim] = 0.5 / (sigma[dim] * sigma[dim]);
66  }
67 }
68 
69 //---------------------------------------------------------------------------//
70 template<class EvalType, class Traits, int NumSpaceDim>
71 void Gaussian<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
72  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
73 {
74  _basis_index = panzer::getPureBasisIndex(
75  _basis_name, (*sd.worksets_)[0], this->wda);
76 }
77 
78 //---------------------------------------------------------------------------//
79 template<class EvalType, class Traits, int NumSpaceDim>
80 void Gaussian<EvalType, Traits, NumSpaceDim>::evaluateFields(
81  typename Traits::EvalData workset)
82 {
83  _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
84  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
85  workset.num_cells);
86  Kokkos::parallel_for(this->getName(), policy, *this);
87 }
88 
89 //---------------------------------------------------------------------------//
90 template<class EvalType, class Traits, int NumSpaceDim>
91 KOKKOS_INLINE_FUNCTION void Gaussian<EvalType, Traits, NumSpaceDim>::operator()(
92  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
93 {
94  const int cell = team.league_rank();
95  const int num_basis = _ic.extent(1);
96 
97  Kokkos::parallel_for(
98  Kokkos::TeamThreadRange(team, 0, num_basis), [&](const int basis) {
99  using Kokkos::exp;
100  double result = 1.0;
101  for (int dim = 0; dim < num_space_dim; ++dim)
102  {
103  const auto x = _basis_coords(cell, basis, dim);
104  result *= _a[dim]
105  * exp((_b[dim] - x) * (x - _b[dim]) * _c[dim]);
106  }
107  _ic(cell, basis) = result + _d;
108  });
109 }
110 
111 //---------------------------------------------------------------------------//
112 
113 } // end namespace InitialCondition
114 } // end namespace VertexCFD
115 
116 #endif // end VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23