1 #ifndef GRID_FIELD_PACK_HPP
2 #define GRID_FIELD_PACK_HPP
19 template<
class Device, PhiInterpType PIT>
101 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];
109 E_rho(node,0).gather(fld.
E,i_simd, wp, corr);
113 const int i_phi = (wts.phi.i -
phi_offset)%E_phi_ff.f.extent(0);
114 E_phi_ff(i_phi,node).gather(fld.
E,i_simd, wp, wts.phi.w, corr);
116 Ah_phi_ff(i_phi,node).gather(fld.Ah,i_simd, wp, wts.phi.w);
117 dAh_phi_ff(i_phi,node).gather(fld.dAh,i_simd, wp, wts.phi.w, corr);
119 if(push_controls.em_mixed_variable) {
120 dAs_phi_ff(i_phi,node).gather(fld.dAs,i_simd, wp, wts.phi.w, corr);
121 As_phi_ff(i_phi,node).gather(fld.As,i_simd, wp, wts.phi.w);
123 if(push_controls.em_mixed_variable && (push_controls.em_pullback_mode==4)) {
124 Epar_em_phi_ff(i_phi,node).gather(fld.Epar_em,i_simd,wp,wts.phi.w);
131 #if defined(XGC1) && defined(DELTAF_CONV)
132 E00_ff(node).gather(fld.E00,i_simd, wp, wts.phi.w, corr);
133 ddpotdt_phi_ff(i_phi,node).gather(fld.ddpotdt,i_simd, wp, wts.phi.w);
141 int irho = wts.rho[0].i;
143 int irho = wts.rho.i;
146 E_rho(node,irho).gather(fld.
E,i_simd, wp, wts, corr,
E_rho(node,irho+1));
148 dEr_B2_rho(node,0).gather(fld.dEr_B2,i_simd, wp, corr);
149 dEz_B2_rho(node,0).gather(fld.dEz_B2,i_simd, wp, corr);
150 du2_E_rho(node,0).gather(fld.du2_E,i_simd, wp, corr);
155 E_rho_ff(node,irho).gather(fld.
E,i_simd, wp, wts, corr, E_rho_ff(node,irho+1));
157 Ah_rho_ff(node,irho).gather(fld.Ah,i_simd, wp, wts, Ah_rho_ff(node,irho+1));
158 dAh_rho_ff(node,irho).gather(fld.dAh,i_simd, wp, wts, corr, dAh_rho_ff(node,irho+1));
160 if(push_controls.em_mixed_variable) {
161 dAs_rho_ff(node,irho).gather(fld.dAs,i_simd, wp, wts, corr, dAs_rho_ff(node,irho+1));
162 As_rho_ff(node,irho).gather(fld.As,i_simd, wp, wts, As_rho_ff(node,irho+1));
164 if(push_controls.em_mixed_variable && (push_controls.em_pullback_mode==4)) {
165 Epar_em_rho_ff(node,irho).gather(fld.Epar_em,i_simd,wp,wts, Epar_em_rho_ff(node,irho+1));
207 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
209 int itr_work = grid_wts.is_valid(i_simd) ? grid_wts.itr[i_simd] : 1;
211 double phi= grid_wts.is_valid(i_simd) ? fld_phi[i_simd] : 0.0;
220 for (
int ip = 0; ip<3; ip++){
221 int node = grid_wts.is_valid(i_simd) ? grid.
get_node_index(itr_work, ip) : 0;
222 double wp = grid_wts.is_valid(i_simd) ? grid_wts.p[ip][i_simd] : 0.0;
229 #ifdef NEOCLASSICAL_TEST
230 fld.
E.
phi[i_simd]=0.0;
244 fld.
E.
phi[i_simd]=0.0;
246 fld.dAh.phi[i_simd]=0.0;
247 fld.dAs.phi[i_simd]=0.0;
262 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
264 int itr_work = grid_wts.is_valid(i_simd) ? grid_wts.itr[i_simd] : 1;
265 double phi= grid_wts.is_valid(i_simd) ? fld_phi[i_simd] : 0.0;
271 int irho = wts.rho[0].i;
273 int irho = wts.rho.i;
277 for (
int ip = 0; ip<3; ip++){
278 int node = grid_wts.is_valid(i_simd) ? grid.
get_node_index(itr_work, ip) : 0;
279 double wp = grid_wts.is_valid(i_simd) ? grid_wts.p[ip][i_simd] : 0.0;
281 Ah_rho_ff(node,irho).gather(Ah,i_simd, wp, wts, Ah_rho_ff(node,irho+1));
293 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
295 int itr_work = grid_wts.is_valid(i_simd) ? grid_wts.itr[i_simd] : 1;
296 double phi= grid_wts.is_valid(i_simd) ? fld_phi[i_simd] : 0.0;
302 for (
int ip = 0; ip<3; ip++){
303 int i_node = grid_wts.is_valid(i_simd) ? grid.
get_node_index(itr_work, ip) : 0;
304 double wp = grid_wts.is_valid(i_simd) ? grid_wts.p[ip][i_simd] : 0.0;
309 Ah_phi_ff(i_phi,node).gather(Ah,i_simd, wp, wts.phi.w);
319 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
321 int itr_work = grid_wts.is_valid(i_simd) ? grid_wts.itr[i_simd] : 1;
323 double phi = grid_wts.is_valid(i_simd) ? fld_phi[i_simd] : 0.0;
327 for(
int ip=0; ip<3; ip++){
328 int node = grid_wts.is_valid(i_simd) ? grid.
get_node_index(itr_work, ip) : 0;
329 double wp = grid_wts.is_valid(i_simd) ? grid_wts.p[ip][i_simd] : 0.0;
334 dpot_ff(node).gather(dpot_out,i_simd, wp, wts.phi.w);
340 dpot(node).gather(dpot_out,i_simd,wp);
KOKKOS_INLINE_FUNCTION void set(int i_simd, double basis, const SimdVector2D &gradpsi)
Definition: field.hpp:40
Simd< double > r
Definition: simd.hpp:150
GridFieldPack()
Definition: grid_field_pack.hpp:70
GridField< Device, VarType::Scalar, PIT, TorType::OnePlane, KinType::DriftKin > loop_voltage
Definition: grid_field_pack.hpp:68
Definition: gyro_radius.hpp:24
bool turb_efield
Definition: grid_field_pack.hpp:27
double inv_drho
1.0 over rho spacing - Used if kintype==Gyrokin
Definition: grid_field_pack.hpp:33
Definition: field_weights.hpp:13
KOKKOS_INLINE_FUNCTION void fields_at_point(const PushControls &push_controls, const Grid< Device > &grid, const SimdVector &B, const SimdVector2D &gradpsi, const Simd< double > &fld_phi, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, SimdGyroRadius< PT > &rho, LocalFields &fld) const
Definition: grid_field_pack.hpp:186
Definition: globals.hpp:89
Definition: grid_weights.hpp:51
Definition: push_controls.hpp:8
int phi_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:29
GridField< Device, vec2d_if_axisym< PIT >), PIT, TorType::OnePlane, KinType::GyroKin > E_rho
Definition: grid_field_pack.hpp:58
int nplanes
Number of planes.
Definition: grid.hpp:269
Definition: grid_field_pack.hpp:20
KOKKOS_INLINE_FUNCTION void gather_all_fields(const PushControls &push_controls, int i_simd, int i_node, double wp, const FieldCorrection &corr, const FieldWeights< DriftKin, PIT > &wts, LocalFields &fld) const
Definition: grid_field_pack.hpp:106
KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const
Definition: grid.tpp:1008
Definition: local_fields.hpp:7
Definition: grid_field.hpp:25
bool can_reuse(KinType kintype_in)
Definition: grid_field_pack.hpp:82
GridFieldPack(KinType kintype_in, bool turb_efield_in, int nrho_in, double inv_drho_in)
Definition: grid_field_pack.hpp:73
KOKKOS_INLINE_FUNCTION void get_Ah(const Grid< Device > &grid, const Simd< double > &fld_phi, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, SimdGyroRadius< DriftKin > &rho, Simd< double > &Ah) const
Definition: grid_field_pack.hpp:287
KinType kintype
Definition: grid_field_pack.hpp:22
int nrho
Gyroavg dimension (not including 0) - Used if kintype==GyroKin.
Definition: grid_field_pack.hpp:32
KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const
Definition: grid.tpp:885
KOKKOS_INLINE_FUNCTION void phi_from_para(SimdVector &vec, int i_simd, const SimdVector &B, double Bmag) const
Definition: grid_field_pack.hpp:100
Definition: globals.hpp:90
KOKKOS_INLINE_FUNCTION void get_dpot(const Grid< Device > &grid, const Simd< double > &fld_phi, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, Simd< double > &dpot_out) const
Definition: grid_field_pack.hpp:315
Simd< double > phi
Definition: simd.hpp:152
int node_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:30
Simd< double > z
Definition: simd.hpp:151
KinType
Definition: globals.hpp:88
KOKKOS_INLINE_FUNCTION void zero()
Definition: simd.hpp:76
GridField< Device, VarType::Scalar, PIT, TorType::OnePlane, KinType::DriftKin > dpot
Definition: grid_field_pack.hpp:59
KOKKOS_INLINE_FUNCTION void get_Ah(const Grid< Device > &grid, const Simd< double > &fld_phi, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, SimdGyroRadius< GyroKin > &rho, Simd< double > &Ah) const
Definition: grid_field_pack.hpp:256
KOKKOS_INLINE_FUNCTION void zero()
Definition: simd.hpp:167
bool is_initialized
Definition: grid_field_pack.hpp:23
Definition: gyro_radius.hpp:96
KOKKOS_INLINE_FUNCTION void gather_all_fields(const PushControls &push_controls, int i_simd, int node, double wp, const FieldCorrection &corr, const FieldWeights< GyroKin, PIT > &wts, LocalFields &fld) const
Definition: grid_field_pack.hpp:138
Definition: gyro_radius.hpp:74
KOKKOS_INLINE_FUNCTION double magnitude(const int i_simd) const
Definition: simd.hpp:176
Definition: grid_field_pack.hpp:16
SimdVector E
Definition: local_fields.hpp:8