1 #ifndef VERTEXCFD_CLOSURE_TOTALMAGNETICFIELD_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_TOTALMAGNETICFIELD_IMPL_HPP
4 #include "utils/VertexCFD_Utils_MagneticLayout.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_HierarchicParallelism.hpp>
11 namespace ClosureModel
14 template<
class EvalType,
class Traits,
int NumSpaceDim>
15 TotalMagneticField<EvalType, Traits, NumSpaceDim>::TotalMagneticField(
16 const panzer::IntegrationRule& ir,
const std::string& field_prefix)
17 : _total_magnetic_field(
18 "total_magnetic_field",
19 Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
22 Utils::addDependentVectorField(*
this,
24 _induced_magnetic_field,
25 field_prefix +
"induced_magnetic_field_");
26 Utils::addDependentVectorField(*
this,
28 _external_magnetic_field,
29 "external_magnetic_field_");
31 this->addEvaluatedField(_total_magnetic_field);
34 this->setName(
"Total Magnetic Field " + std::to_string(num_space_dim)
39 template<
class EvalType,
class Traits,
int NumSpaceDim>
40 void TotalMagneticField<EvalType, Traits, NumSpaceDim>::evaluateFields(
41 typename Traits::EvalData workset)
43 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
45 Kokkos::parallel_for(this->getName(), policy, *
this);
49 template<
class EvalType,
class Traits,
int NumSpaceDim>
50 KOKKOS_INLINE_FUNCTION
void
51 TotalMagneticField<EvalType, Traits, NumSpaceDim>::operator()(
52 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
54 const int cell = team.league_rank();
55 const int num_point = _total_magnetic_field.extent(1);
58 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
59 for (
int dim = 0; dim < num_space_dim; ++dim)
61 _total_magnetic_field(cell, point, dim)
62 = _induced_magnetic_field[dim](cell, point)
63 + _external_magnetic_field[dim](cell, point);
66 for (
int dim = num_space_dim; dim < num_magnetic_field_dim; ++dim)
68 _total_magnetic_field(cell, point, dim)
69 = _external_magnetic_field[dim](cell, point);