1 #ifndef VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP
4 #include "utils/VertexCFD_Utils_Constants.hpp"
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>
12 #include <Teuchos_Array.hpp>
19 namespace InitialCondition
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)
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);
36 if (params.isType<std::string>(
"Scaling"))
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"));
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");
50 const double sqrt2pi = std::sqrt(2.0 * Constants::pi);
51 for (
int dim = 0; dim < basis.dimension(); ++dim)
54 if (_scaling == Scaling::scaled)
56 scale = params.get<
double>(
"Scale");
60 scale = 1.0 / (sqrt2pi * sigma[dim]);
64 _b[dim] = center[dim];
65 _c[dim] = 0.5 / (sigma[dim] * sigma[dim]);
70 template<
class EvalType,
class Traits,
int NumSpaceDim>
71 void Gaussian<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
72 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
74 _basis_index = panzer::getPureBasisIndex(
75 _basis_name, (*sd.worksets_)[0], this->wda);
79 template<
class EvalType,
class Traits,
int NumSpaceDim>
80 void Gaussian<EvalType, Traits, NumSpaceDim>::evaluateFields(
81 typename Traits::EvalData workset)
83 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
84 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
86 Kokkos::parallel_for(this->getName(), policy, *
this);
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
94 const int cell = team.league_rank();
95 const int num_basis = _ic.extent(1);
98 Kokkos::TeamThreadRange(team, 0, num_basis), [&](
const int basis) {
101 for (
int dim = 0; dim < num_space_dim; ++dim)
103 const auto x = _basis_coords(cell, basis, dim);
105 * exp((_b[dim] - x) * (x - _b[dim]) * _c[dim]);
107 _ic(cell, basis) = result + _d;
116 #endif // end VERTEXCFD_INITIALCONDITION_GAUSSIAN_IMPL_HPP