1 #ifndef VERTEXCFD_CLOSURE_INDUCTIONRESISTIVEFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INDUCTIONRESISTIVEFLUX_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 InductionResistiveFlux<EvalType, Traits, NumSpaceDim>::InductionResistiveFlux(
16 const panzer::IntegrationRule& ir,
17 const MHDProperties::FullInductionMHDProperties& mhd_props,
18 const std::string& flux_prefix,
19 const std::string& gradient_prefix)
20 : _magnetic_correction_potential_flux(
21 flux_prefix +
"RESISTIVE_FLUX_magnetic_correction_potential",
23 , _total_magnetic_field(
24 "total_magnetic_field",
25 Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
26 , _resistivity(
"resistivity", ir.dl_scalar)
27 , _grad_total_magnetic_field(
28 gradient_prefix +
"GRAD_total_magnetic_field",
29 Utils::buildMagneticGradLayout(ir.dl_vector, num_magnetic_field_dim))
30 , _divergence_total_magnetic_field(
31 gradient_prefix +
"divergence_total_magnetic_field", ir.dl_scalar)
32 , _grad_resistivity(
"GRAD_resistivity", ir.dl_vector)
33 , _variable_resistivity(mhd_props.variableResistivity())
34 , _solve_magn_corr(mhd_props.buildMagnCorr())
35 , _magnetic_permeability(mhd_props.vacuumMagneticPermeability())
38 this->addEvaluatedField(_magnetic_correction_potential_flux);
40 Utils::addEvaluatedVectorField(*
this, ir.dl_vector, _induction_flux,
41 flux_prefix +
"RESISTIVE_FLUX_"
46 this->addEvaluatedField(_magnetic_correction_potential_flux);
50 this->addDependentField(_total_magnetic_field);
51 this->addDependentField(_resistivity);
52 this->addDependentField(_grad_total_magnetic_field);
53 this->addDependentField(_divergence_total_magnetic_field);
54 if (_variable_resistivity)
56 this->addDependentField(_grad_resistivity);
59 this->setName(
"Induction Resistive Flux " + std::to_string(num_space_dim)
64 template<
class EvalType,
class Traits,
int NumSpaceDim>
65 void InductionResistiveFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
66 typename Traits::EvalData workset)
68 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
70 Kokkos::parallel_for(this->getName(), policy, *
this);
74 template<
class EvalType,
class Traits,
int NumSpaceDim>
75 KOKKOS_INLINE_FUNCTION
void
76 InductionResistiveFlux<EvalType, Traits, NumSpaceDim>::operator()(
77 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
79 const int cell = team.league_rank();
80 const int num_point = _induction_flux[0].extent(1);
81 const int num_grad_dim = _induction_flux[0].extent(2);
82 const double mu_0_inv = 1.0 / _magnetic_permeability;
85 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
87 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
89 for (
int vec_dim = 0; vec_dim < num_space_dim; ++vec_dim)
91 _induction_flux[vec_dim](cell, point, flux_dim)
92 = _resistivity(cell, point)
93 * _grad_total_magnetic_field(
94 cell, point, flux_dim, vec_dim);
98 if (_variable_resistivity)
101 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
103 for (
int vec_dim = 0; vec_dim < num_grad_dim; ++vec_dim)
105 _induction_flux[vec_dim](cell, point, flux_dim)
106 += _total_magnetic_field(cell, point, flux_dim)
107 * _grad_resistivity(cell, point, vec_dim);
114 for (
int dim = 0; dim < num_grad_dim; ++dim)
116 _induction_flux[dim](cell, point, dim)
117 -= _resistivity(cell, point)
118 * _divergence_total_magnetic_field(cell, point);
121 if (_variable_resistivity)
124 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
126 for (
int grad_dim = 0; grad_dim < num_grad_dim; ++grad_dim)
128 _induction_flux[flux_dim](cell, point, flux_dim)
129 -= _grad_resistivity(cell, point, grad_dim)
130 * _total_magnetic_field(cell, point, grad_dim);
135 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
137 for (
int vec_dim = 0; vec_dim < num_grad_dim; ++vec_dim)
139 _induction_flux[vec_dim](cell, point, flux_dim)
140 += _total_magnetic_field(cell, point, flux_dim)
141 * _grad_resistivity(cell, point, vec_dim);
148 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
150 for (
int vec_dim = 0; vec_dim < num_space_dim; ++vec_dim)
152 _induction_flux[vec_dim](cell, point, flux_dim) *= mu_0_inv;
156 if (_solve_magn_corr)
158 for (
int flux_dim = 0; flux_dim < num_grad_dim; ++flux_dim)
160 _magnetic_correction_potential_flux(cell, point, flux_dim)
172 #endif // end VERTEXCFD_CLOSURE_INDUCTIONRESISTIVEFLUX_IMPL_HPP