1 #ifndef VERTEXCFD_CLOSURE_DIVERGENCECLEANINGSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_DIVERGENCECLEANINGSOURCE_IMPL_HPP
4 #include <utils/VertexCFD_Utils_VectorField.hpp>
6 #include <Panzer_HierarchicParallelism.hpp>
12 namespace ClosureModel
15 template<
class EvalType,
class Traits,
int NumSpaceDim>
16 DivergenceCleaningSource<EvalType, Traits, NumSpaceDim>::DivergenceCleaningSource(
17 const panzer::IntegrationRule& ir)
18 : _div_cleaning_potential_source(
19 "DIV_CLEANING_SOURCE_magnetic_correction_potential", ir.dl_scalar)
20 , _grad_scalar_magnetic_potential(
"GRAD_scalar_magnetic_potential",
24 this->addEvaluatedField(_div_cleaning_potential_source);
27 this->addDependentField(_grad_scalar_magnetic_potential);
28 Utils::addDependentVectorField(*
this, ir.dl_scalar, _velocity,
"velocity_");
30 this->setName(
"Divergence Cleaning Source " + std::to_string(num_space_dim)
35 template<
class EvalType,
class Traits,
int NumSpaceDim>
36 void DivergenceCleaningSource<EvalType, Traits, NumSpaceDim>::evaluateFields(
37 typename Traits::EvalData workset)
39 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
41 Kokkos::parallel_for(this->getName(), policy, *
this);
45 template<
class EvalType,
class Traits,
int NumSpaceDim>
46 KOKKOS_INLINE_FUNCTION
void
47 DivergenceCleaningSource<EvalType, Traits, NumSpaceDim>::operator()(
48 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
50 const int cell = team.league_rank();
51 const int num_point = _grad_scalar_magnetic_potential.extent(1);
52 const int num_grad_dim = _grad_scalar_magnetic_potential.extent(2);
55 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
56 _div_cleaning_potential_source(cell, point) = 0.0;
58 for (
int dim = 0; dim < num_grad_dim; ++dim)
60 _div_cleaning_potential_source(cell, point)
61 -= _velocity[dim](cell, point)
62 * _grad_scalar_magnetic_potential(cell, point, dim);
72 #endif // end VERTEXCFD_CLOSURE_DIVERGENCECLEANINGSOURCE_IMPL_HPP