1 #ifndef VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_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 SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::
16 SolidFullInductionConvectiveFlux(
17 const panzer::IntegrationRule& ir,
18 const MHDProperties::FullInductionMHDProperties& mhd_props,
19 const std::string& flux_prefix,
20 const std::string& field_prefix)
21 : _magnetic_correction_potential_flux(
22 flux_prefix +
"CONVECTIVE_FLUX_magnetic_correction_potential",
24 , _total_magnetic_field(
25 "total_magnetic_field",
26 Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
27 , _scalar_magnetic_potential(field_prefix +
"scalar_magnetic_potential",
29 , _c_h(mhd_props.hyperbolicDivergenceCleaningSpeed())
32 this->addEvaluatedField(_magnetic_correction_potential_flux);
34 Utils::addEvaluatedVectorField(*
this, ir.dl_vector, _induction_flux,
35 flux_prefix +
"CONVECTIVE_FLUX_"
39 this->addDependentField(_scalar_magnetic_potential);
40 this->addDependentField(_total_magnetic_field);
42 this->setName(
"Solid Full Induction Convective Flux "
43 + std::to_string(num_space_dim) +
"D");
47 template<
class EvalType,
class Traits,
int NumSpaceDim>
48 void SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
49 typename Traits::EvalData workset)
51 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
53 Kokkos::parallel_for(this->getName(), policy, *
this);
57 template<
class EvalType,
class Traits,
int NumSpaceDim>
58 KOKKOS_INLINE_FUNCTION
void
59 SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::operator()(
60 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
62 const int cell = team.league_rank();
63 const int num_point = _induction_flux[0].extent(1);
66 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
67 for (
int flux_dim = 0; flux_dim < num_space_dim; ++flux_dim)
69 _induction_flux[flux_dim](cell, point, flux_dim)
70 = _c_h * _scalar_magnetic_potential(cell, point);
71 _magnetic_correction_potential_flux(cell, point, flux_dim)
72 = _c_h * _total_magnetic_field(cell, point, flux_dim);
82 #endif // end VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_IMPL_HPP