1 #ifndef GRID_FIELD_PACK_HPP
2 #define GRID_FIELD_PACK_HPP
23 template<
class Device,
typename GFPT>
37 KOKKOS_INLINE_FUNCTION
const auto&
get()
const{
38 return pack.template get<FN>();
44 return pack.template get<FN>();
61 vec.
phi[i_simd]=(vec.
phi[i_simd]*Bmag - vec.
r[i_simd]*B.
r[i_simd] - vec.
z[i_simd]*B.
z[i_simd]) / B.
phi[i_simd];
65 template<
typename FieldT>
68 get<Label::E00>()(node).gather(fld.template get<Label::E00>(),i_simd, wp, grid_wts.phi_wts, corr);
69 get<Label::ddpotdt>()(i_phi,node).gather(fld.template get<Label::ddpotdt>(),i_simd, wp, grid_wts.phi_wts);
77 get<Label::E>()(node,0).gather(fld.template get<Label::E>(),i_simd, wp, corr);
81 const int i_phi = (grid_wts.phi_wts.phi.i[i_simd] -
phi_offset)%get<Label::E>().f.extent(0);
82 get<Label::E>()(i_phi,node).gather(fld.template get<Label::E>(),i_simd, wp, grid_wts.phi_wts, corr);
84 get<Label::Ah>()(i_phi,node).gather(fld.template get<Label::Ah>(),i_simd, wp, grid_wts.phi_wts);
85 get<Label::dAh>()(i_phi,node).gather(fld.template get<Label::dAh>(),i_simd, wp, grid_wts.phi_wts, corr);
87 if(push_controls.em_mixed_variable) {
88 get<Label::dAs>()(i_phi,node).gather(fld.template get<Label::dAs>(),i_simd, wp, grid_wts.phi_wts, corr);
89 get<Label::As>()(i_phi,node).gather(fld.template get<Label::As>(),i_simd, wp, grid_wts.phi_wts);
91 if(push_controls.em_mixed_variable && (push_controls.em_pullback_mode==4)) {
92 get<Label::Epar_em>()(i_phi,node).gather(fld.template get<Label::Epar_em>(),i_simd,wp,grid_wts.phi_wts);
100 fld.
pack.for_each_labeled([&](
auto& labeled_field) {
108 int irho = rho_wts.
irho(i_simd);
110 get<Label::E>()(node,irho).gather(fld.template get<Label::E>(),i_simd, wp, rho_wts, corr, get<Label::E>()(node,irho+1));
112 get<Label::dEr_B2>()(node,0).gather(fld.template get<Label::dEr_B2>(),i_simd, wp, corr);
113 get<Label::dEz_B2>()(node,0).gather(fld.template get<Label::dEz_B2>(),i_simd, wp, corr);
114 get<Label::du2_E>()(node,0).gather(fld.template get<Label::du2_E>(),i_simd, wp, corr);
119 get<Label::E>()(node,irho).gather(fld.template get<Label::E>(),i_simd, wp, rho_wts, grid_wts.phi_wts, corr, get<Label::E>()(node,irho+1));
121 get<Label::Ah>()(node,irho).gather(fld.template get<Label::Ah>(),i_simd, wp, rho_wts, grid_wts.phi_wts, get<Label::Ah>()(node,irho+1));
122 get<Label::dAh>()(node,irho).gather(fld.template get<Label::dAh>(),i_simd, wp, rho_wts, grid_wts.phi_wts, corr, get<Label::dAh>()(node,irho+1));
124 if(push_controls.em_mixed_variable) {
125 get<Label::dAs>()(node,irho).gather(fld.template get<Label::dAs>(),i_simd, wp, rho_wts, grid_wts.phi_wts, corr, get<Label::dAs>()(node,irho+1));
126 get<Label::As>()(node,irho).gather(fld.template get<Label::As>(),i_simd, wp, rho_wts, grid_wts.phi_wts, get<Label::As>()(node,irho+1));
128 if(push_controls.em_mixed_variable && (push_controls.em_pullback_mode==4)) {
129 get<Label::Epar_em>()(node,irho).gather(fld.template get<Label::Epar_em>(),i_simd,wp,rho_wts, grid_wts.phi_wts, get<Label::Epar_em>()(node,irho+1));
152 fld.
pack.for_each([&](
auto& field) { field.zero(); });
154 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
156 int itr_work = grid_wts.is_valid(i_simd) ? grid_wts.itr[i_simd] : 1;
162 for (
int ip = 0; ip<3; ip++){
163 int node = grid_wts.is_valid(i_simd) ? grid.
get_node_index(itr_work, ip) : 0;
164 double wp = grid_wts.is_valid(i_simd) ? grid_wts.p[ip][i_simd] : 0.0;
168 gather_all_fields(push_controls, i_simd, node, wp, field_correction, grid_wts, rho_wts, fld);
171 #ifdef NEOCLASSICAL_TEST
172 fld.template get<Label::E>().phi[i_simd]=0.0;
180 phi_from_para(fld.template get<Label::E>(), i_simd, B, Bmag);
182 phi_from_para(fld.template get<Label::dAh>(), i_simd, B, Bmag);
183 phi_from_para(fld.template get<Label::dAs>(), i_simd, B, Bmag);
186 fld.template get<Label::E>().phi[i_simd]=0.0;
188 fld.template get<Label::dAh>().phi[i_simd]=0.0;
189 fld.template get<Label::dAs>().phi[i_simd]=0.0;
bool turb_efield
Definition: grid_field_pack.hpp:27
KOKKOS_INLINE_FUNCTION void set(int i_simd, double basis, const SimdVector2D &gradpsi)
Definition: field.hpp:35
KOKKOS_INLINE_FUNCTION void gather_all_fields(const PushControls &push_controls, int i_simd, int node, double wp, const FieldCorrection &corr, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, const SimdGyroWeights< GyroKin > &rho_wts, LocalFields< GFPT > &fld) const
Definition: grid_field_pack.hpp:107
Simd< double > r
Definition: simd.hpp:150
std::unique_ptr< GridFieldPackGeneric > GridFieldPackPtr
Definition: grid_field_pack.hpp:21
GridFieldPack(bool turb_efield_in)
Definition: grid_field_pack.hpp:53
KOKKOS_INLINE_FUNCTION int irho(int i_simd) const
Definition: gyro_radius.hpp:109
Definition: grid_weights.hpp:47
Definition: push_controls.hpp:9
int node_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:30
pack_type pack
Definition: local_fields.hpp:36
Definition: grid_field_pack.hpp:24
int phi_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:29
KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const
Definition: grid.tpp:252
KOKKOS_INLINE_FUNCTION void fields_at_point(const PushControls &push_controls, const Grid< Device > &grid, const SimdVector &B, const SimdVector2D &gradpsi, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, const SimdGyroWeights< PT > &rho_wts, LocalFields< GFPT > &fld) const
Definition: grid_field_pack.hpp:149
Definition: gyro_radius.hpp:116
Definition: gyro_radius.hpp:24
Definition: gyro_radius.hpp:84
KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const
Definition: grid.tpp:158
Simd< double > phi
Definition: simd.hpp:152
Simd< double > z
Definition: simd.hpp:151
GFPT pack_type
Definition: grid_field_pack.hpp:25
GridFieldPack()
Definition: grid_field_pack.hpp:51
KOKKOS_INLINE_FUNCTION void gather_all_fields(const PushControls &push_controls, int i_simd, int i_node, double wp, const FieldCorrection &corr, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, const SimdGyroWeights< DriftKin > &rho_wts, LocalFields< GFPT > &fld) const
Definition: grid_field_pack.hpp:74
GridField< Device, VarType::Scalar, PIT_GLOBAL, TorType::OnePlane, KinType::DriftKin > loop_voltage
Definition: grid_field_pack.hpp:49
KOKKOS_INLINE_FUNCTION void phi_from_para(SimdVector &vec, int i_simd, const SimdVector &B, double Bmag) const
Definition: grid_field_pack.hpp:60
KOKKOS_INLINE_FUNCTION double magnitude(const int i_simd) const
Definition: simd.hpp:176
virtual ~GridFieldPackGeneric()=default
Definition: grid_field_pack.hpp:17
KOKKOS_INLINE_FUNCTION void gather_deltaf_conv(int i_simd, int node, int i_phi, double wp, const FieldCorrection &corr, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, LocalFields< GFPT > &fld, const FieldT &labeled_field) const
Definition: grid_field_pack.hpp:66
pack_type pack
Definition: grid_field_pack.hpp:33