1 #ifndef VERTEXCFD_INITIALCONDITION_DIVERGENCEADVECTIONTEST_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_DIVERGENCEADVECTIONTEST_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 "utils/VertexCFD_Utils_Constants.hpp"
10 #include "utils/VertexCFD_Utils_VectorField.hpp"
17 namespace InitialCondition
20 template<
class EvalType,
class Traits,
int NumSpaceDim>
21 DivergenceAdvectionTest<EvalType, Traits, NumSpaceDim>::DivergenceAdvectionTest(
22 const Teuchos::ParameterList& mhd_params,
const panzer::PureBasis& basis)
23 : _lagrange_pressure(
"lagrange_pressure", basis.functional)
24 , _basis_name(basis.name())
26 , _r0(1.0 / std::sqrt(8.0))
27 , _xy_0({0.0, 0.0, 0.0})
28 , _vel({1.0, 1.0, 0.0})
30 Teuchos::ParameterList params;
31 if (mhd_params.isSublist(
"Divergence Advection Test"))
33 params = mhd_params.sublist(
"Divergence Advection Test");
36 if (params.isType<
double>(
"Lagrange Pressure"))
38 _phi = params.get<
double>(
"Lagrange Pressure");
41 if (params.isType<
double>(
"Divergence Bubble Radius"))
43 _r0 = params.get<
double>(
"Divergence Bubble Radius");
46 if (params.isType<Teuchos::Array<double>>(
"Divergence Bubble Center"))
49 = params.get<Teuchos::Array<double>>(
"Divergence Bubble Center");
50 for (
int dim = 0; dim < num_space_dim; ++dim)
52 _xy_0[dim] = xy_0[dim];
56 if (params.isType<Teuchos::Array<double>>(
"Velocity"))
58 const auto vel = params.get<Teuchos::Array<double>>(
"Velocity");
59 for (
int dim = 0; dim < num_space_dim; ++dim)
65 this->addEvaluatedField(_lagrange_pressure);
66 this->addUnsharedField(_lagrange_pressure.fieldTag().clone());
68 Utils::addEvaluatedVectorField(
69 *
this, basis.functional, _velocity,
"velocity_",
true);
71 Utils::addEvaluatedVectorField(*
this,
73 _induced_magnetic_field,
74 "induced_magnetic_field_",
77 this->setName(
"DivergenceAdvectionTest " + std::to_string(num_space_dim)
78 +
"D Initial Condition");
82 template<
class EvalType,
class Traits,
int NumSpaceDim>
83 void DivergenceAdvectionTest<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
84 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
86 _basis_index = panzer::getPureBasisIndex(
87 _basis_name, (*sd.worksets_)[0], this->wda);
91 template<
class EvalType,
class Traits,
int NumSpaceDim>
92 void DivergenceAdvectionTest<EvalType, Traits, NumSpaceDim>::evaluateFields(
93 typename Traits::EvalData workset)
95 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
96 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
98 Kokkos::parallel_for(this->getName(), policy, *
this);
102 template<
class EvalType,
class Traits,
int NumSpaceDim>
103 KOKKOS_INLINE_FUNCTION
void
104 DivergenceAdvectionTest<EvalType, Traits, NumSpaceDim>::operator()(
105 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
107 const int cell = team.league_rank();
108 const int num_basis = _lagrange_pressure.extent(1);
113 const double b_coeff = 1.0 / sqrt(4.0 * pi);
115 Kokkos::parallel_for(
116 Kokkos::TeamThreadRange(team, 0, num_basis), [&](
const int basis) {
117 const double x = _basis_coords(cell, basis, 0);
118 const double y = _basis_coords(cell, basis, 1);
119 const double dx = x - _xy_0[0];
120 const double dy = y - _xy_0[1];
121 const double r = sqrt(dx * dx + dy * dy);
123 _lagrange_pressure(cell, basis) = _phi;
127 _induced_magnetic_field[0](cell, basis)
128 = b_coeff * (pow(r / _r0, 8) - 2.0 * pow(r / _r0, 4) + 1);
132 _induced_magnetic_field[0](cell, basis) = 0.0;
134 _induced_magnetic_field[1](cell, basis) = 0.0;
136 _velocity[0](cell, basis) = _vel[0];
137 _velocity[1](cell, basis) = _vel[1];
139 if (num_space_dim > 2)
146 _induced_magnetic_field[2](cell, basis) = 0.0;
147 _velocity[2](cell, basis) = _vel[2];
157 #endif // end VERTEXCFD_INITIALCONDITION_DIVERGENCEADVECTIONTEST_IMPL_HPP