1 #ifndef VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_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 InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::
16 InductionConvectiveMomentumFlux(
17 const panzer::IntegrationRule& ir,
18 const MHDProperties::FullInductionMHDProperties& mhd_props,
19 const std::string& flux_prefix)
20 : _total_magnetic_field(
21 "total_magnetic_field",
22 Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
23 , _magnetic_pressure(
"magnetic_pressure", ir.dl_scalar)
24 , _magnetic_permeability(mhd_props.vacuumMagneticPermeability())
27 Utils::addContributedVectorField(*
this, ir.dl_vector, _momentum_flux,
28 flux_prefix +
"CONVECTIVE_FLUX_"
32 this->addDependentField(_total_magnetic_field);
33 this->addDependentField(_magnetic_pressure);
35 this->setName(
"Induction Convective Momentum Flux "
36 + std::to_string(num_space_dim) +
"D");
40 template<
class EvalType,
class Traits,
int NumSpaceDim>
41 void InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
42 typename Traits::EvalData workset)
44 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
46 Kokkos::parallel_for(this->getName(), policy, *
this);
50 template<
class EvalType,
class Traits,
int NumSpaceDim>
51 KOKKOS_INLINE_FUNCTION
void
52 InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::operator()(
53 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
55 const int cell = team.league_rank();
56 const int num_point = _momentum_flux[0].extent(1);
59 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
60 for (
int flux_dim = 0; flux_dim < num_space_dim; ++flux_dim)
62 for (
int vec_dim = 0; vec_dim < num_space_dim; ++vec_dim)
64 _momentum_flux[vec_dim](cell, point, flux_dim)
65 -= _total_magnetic_field(cell, point, flux_dim)
66 * _total_magnetic_field(cell, point, vec_dim)
67 / _magnetic_permeability;
70 _momentum_flux[flux_dim](cell, point, flux_dim)
71 += _magnetic_pressure(cell, point);
81 #endif // end VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_IMPL_HPP