1 #ifndef VERTEXCFD_CLOSURE_LORENTZFORCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_LORENTZFORCE_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 LorentzForce<EvalType, Traits, NumSpaceDim>::LorentzForce(
17 const panzer::IntegrationRule& ir)
18 : _sigma(
"electrical_conductivity", ir.dl_scalar)
19 , _grad_electric_potential(
"GRAD_electric_potential", ir.dl_vector)
22 Utils::addEvaluatedVectorField(
23 *
this, ir.dl_scalar, _lorentz_force,
"VOLUMETRIC_SOURCE_momentum_");
26 this->addDependentField(_sigma);
27 this->addDependentField(_grad_electric_potential);
28 Utils::addDependentVectorField(*
this, ir.dl_scalar, _velocity,
"velocity_");
29 Utils::addDependentVectorField(
30 *
this, ir.dl_scalar, _ext_magn_field,
"external_magnetic_field_");
32 this->setName(
"Electric Potential Lorentz Force "
33 + std::to_string(num_space_dim) +
"D");
37 template<
class EvalType,
class Traits,
int NumSpaceDim>
38 void LorentzForce<EvalType, Traits, NumSpaceDim>::evaluateFields(
39 typename Traits::EvalData workset)
41 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
43 Kokkos::parallel_for(this->getName(), policy, *
this);
47 template<
class EvalType,
class Traits,
int NumSpaceDim>
48 KOKKOS_INLINE_FUNCTION
void
49 LorentzForce<EvalType, Traits, NumSpaceDim>::operator()(
50 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
52 const int cell = team.league_rank();
53 const int num_point = _grad_electric_potential.extent(1);
54 const int num_grad_dim = _grad_electric_potential.extent(2);
57 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
59 _lorentz_force[0](cell, point)
60 = -_grad_electric_potential(cell, point, 1)
61 * _ext_magn_field[2](cell, point);
63 _lorentz_force[1](cell, point)
64 = _grad_electric_potential(cell, point, 0)
65 * _ext_magn_field[2](cell, point);
67 if (num_grad_dim == 3)
70 _lorentz_force[0](cell, point)
71 += _grad_electric_potential(cell, point, 2)
72 * _ext_magn_field[1](cell, point);
74 _lorentz_force[1](cell, point)
75 -= _grad_electric_potential(cell, point, 2)
76 * _ext_magn_field[0](cell, point);
78 _lorentz_force[2](cell, point)
79 = -_grad_electric_potential(cell, point, 0)
80 * _ext_magn_field[1](cell, point)
81 + _grad_electric_potential(cell, point, 1)
82 * _ext_magn_field[0](cell, point);
89 scalar_type B_dot_u = 0.0;
90 for (
int dim = 0; dim < num_grad_dim; ++dim)
92 B2 += _ext_magn_field[dim](cell, point)
93 * _ext_magn_field[dim](cell, point);
94 B_dot_u += _ext_magn_field[dim](cell, point)
95 * _velocity[dim](cell, point);
99 for (
int dim = 0; dim < num_grad_dim; ++dim)
101 _lorentz_force[dim](cell, point)
102 += _ext_magn_field[dim](cell, point) * B_dot_u;
103 _lorentz_force[dim](cell, point)
104 -= B2 * _velocity[dim](cell, point);
105 _lorentz_force[dim](cell, point) *= _sigma(cell, point);