1 #ifndef FIELD_ALIGNED_LOCAL_FIELDS_HPP
2 #define FIELD_ALIGNED_LOCAL_FIELDS_HPP
20 template<KinType KT, PhiInterpType PIT,
typename GFPT>
27 template<
class Device>
32 template<
class Device>
36 fields.
fields_at_point(push_controls, grid, B,gradpsi,grid_wts,rho_wts, fld);
43 template<
typename GFPT>
51 const auto& fld_E = fld.template get<Label::E>();
53 const auto& fld_dAh = fld.template get<Label::dAh>();
54 const auto& fld_dAs = fld.template get<Label::dAs>();
56 auto&
E = fa_fld.template get<Label::E>();
58 auto&
dAh = fa_fld.template get<Label::dAh>();
59 auto&
dAs = fa_fld.template get<Label::dAs>();
61 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
64 double grad2 = gradpsi.
r[i_simd]*gradpsi.
r[i_simd] + gradpsi.
z[i_simd]*gradpsi.
z[i_simd];
67 E.r[i_simd] = (fld_E.r[i_simd] *gradpsi.
r[i_simd] + fld_E.z[i_simd] *gradpsi.
z[i_simd])/grad2;
68 E.z[i_simd] = (fld_E.r[i_simd] *B.
r[i_simd] + fld_E.z[i_simd] *B.
z[i_simd] )/Bp;
69 E.phi[i_simd] = (E.z[i_simd]*Bp + fld_E.phi[i_simd]*B.
phi[i_simd] )/Bmag;
73 dAh.r[i_simd] = (fld_dAh.r[i_simd]*gradpsi.
r[i_simd] + fld_dAh.z[i_simd]*gradpsi.
z[i_simd])/grad2;
74 dAh.z[i_simd] = (fld_dAh.r[i_simd]*B.
r[i_simd] + fld_dAh.z[i_simd]*B.
z[i_simd] )/Bp;
75 dAh.phi[i_simd] = (dAh.z[i_simd] *Bp + fld_dAh.phi[i_simd]*B.
phi[i_simd] )/Bmag;
80 dAs.r[i_simd] = (fld_dAs.r[i_simd]*gradpsi.
r[i_simd] + fld_dAs.z[i_simd]*gradpsi.
z[i_simd])/grad2;
81 dAs.z[i_simd] = (fld_dAs.r[i_simd]*B.
r[i_simd] + fld_dAs.z[i_simd]*B.
z[i_simd] )/Bp;
82 dAs.phi[i_simd] = (dAs.z[i_simd] *Bp + fld_dAs.phi[i_simd]*B.
phi[i_simd] )/Bmag;
89 auto& fld_E = fld.template get<Label::E>();
91 auto& fld_dAh = fld.template get<Label::dAh>();
92 auto& fld_dAs = fld.template get<Label::dAs>();
94 const auto&
E = fa_fld.template get<Label::E>();
96 const auto&
dAh = fa_fld.template get<Label::dAh>();
97 const auto&
dAs = fa_fld.template get<Label::dAs>();
99 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
102 double Br_norm = B.
r[i_simd] / Bp;
103 double Bz_norm = B.
z[i_simd] / Bp;
105 fld_E.r[i_simd] = E.r[i_simd]*gradpsi.
r[i_simd]+E.z[i_simd]*Br_norm;
106 fld_E.z[i_simd] = E.r[i_simd]*gradpsi.
z[i_simd]+E.z[i_simd]*Bz_norm;
107 fld_E.phi[i_simd] = (E.phi[i_simd]*Bmag - fld_E.r[i_simd]*B.
r[i_simd] - fld_E.z[i_simd]*B.
z[i_simd])/B.
phi[i_simd];
110 fld_dAh.r[i_simd] = dAh.r[i_simd]*gradpsi.
r[i_simd]+dAh.z[i_simd]*Br_norm;
111 fld_dAh.z[i_simd] = dAh.r[i_simd]*gradpsi.
z[i_simd]+dAh.z[i_simd]*Bz_norm;
112 fld_dAh.phi[i_simd] = (dAh.phi[i_simd]*Bmag - fld_dAh.r[i_simd]*B.
r[i_simd] - fld_dAh.z[i_simd]*B.
z[i_simd])/B.
phi[i_simd];
116 fld_dAs.r[i_simd] = dAs.r[i_simd]*gradpsi.
r[i_simd]+dAs.z[i_simd]*Br_norm;
117 fld_dAs.z[i_simd] = dAs.r[i_simd]*gradpsi.
z[i_simd]+dAs.z[i_simd]*Bz_norm;
118 fld_dAs.phi[i_simd] = (dAs.phi[i_simd]*Bmag - fld_dAs.r[i_simd]*B.
r[i_simd] - fld_dAs.z[i_simd]*B.
z[i_simd])/B.
phi[i_simd];
126 template<
class Device>
137 magnetic_field.
field(part.
ph.
v(), B, jacb, psi, gradpsi, rz_outside);
148 gfpack.
fields_at_point(push_controls, grid, B,gradpsi,grid_wts,rho_wts, fld);
151 convert_cyl_to_mag(B, gradpsi, fld);
160 fa_fld.template get<Label::Ah>() = fld.template get<Label::Ah>();
161 fa_fld.template get<Label::As>() = fld.template get<Label::As>();
162 fa_fld.template get<Label::Epar_em>() = fld.template get<Label::Epar_em>();
167 template<
class Device>
171 convert_mag_to_cyl(B, gradpsi, fld);
180 fld.template get<Label::Ah>() = fa_fld.template get<Label::Ah>();
181 fld.template get<Label::As>() = fa_fld.template get<Label::As>();
182 fld.template get<Label::Epar_em>() = fa_fld.template get<Label::Epar_em>();
Simd< double > r
Definition: simd.hpp:150
KOKKOS_INLINE_FUNCTION void fields_at_point(const GridFieldPack< Device, GFPT > fields, const PushControls &push_controls, const Grid< Device > &grid, const SimdVector &B, const SimdVector2D &gradpsi, const SimdGridWeights< Order::One, PhiInterpType::Planes > &grid_wts, SimdGyroWeights< GyroKin > &rho_wts, LocalFields< GFPT > &fld) const
Definition: field_aligned_local_fields.hpp:168
KOKKOS_INLINE_FUNCTION void field(const SimdVector &v, SimdVector &bvec, SimdVector(&jacb)[3], Simd< double > &psivec, SimdVector2D &gradpsi, Simd< bool > &rz_outside) const
Definition: magnetic_field.tpp:164
KOKKOS_INLINE_FUNCTION FieldAlignedLocalFields(const Grid< Device > &grid, const PushControls &push_controls, const Species< Device > &species, const MagneticField< Device > &magnetic_field, const GridFieldPack< Device, GFPT > &gfpack, SimdParticles &part, SimdGridWeights< Order::One, PIT > &grid_wts)
Definition: field_aligned_local_fields.hpp:28
Definition: grid_weights.hpp:73
LocalFields< GFPT > fa_fld
Definition: field_aligned_local_fields.hpp:47
Definition: grid_weights.hpp:47
Definition: push_controls.hpp:9
Definition: magnetic_field.hpp:12
Definition: grid_field_pack.hpp:24
KOKKOS_INLINE_FUNCTION void convert_mag_to_cyl(const SimdVector &B, const SimdVector2D &gradpsi, LocalFields< GFPT > &fld) const
Definition: field_aligned_local_fields.hpp:88
KOKKOS_INLINE_FUNCTION void fields_at_point(const GridFieldPack< Device, GFPT > fields, const PushControls &push_controls, const Grid< Device > &grid, const SimdVector &B, const SimdVector2D &gradpsi, const SimdGridWeights< Order::One, PIT > &grid_wts, SimdGyroWeights< KT > &rho_wts, LocalFields< GFPT > &fld) const
Definition: field_aligned_local_fields.hpp:33
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
KOKKOS_INLINE_FUNCTION double poloidal_magnitude(const int i_simd) const
Definition: simd.hpp:181
PhiInterpType
Definition: globals.hpp:95
Definition: gyro_radius.hpp:24
Definition: gyro_radius.hpp:84
KOKKOS_INLINE_FUNCTION void convert_cyl_to_mag(const SimdVector &B, const SimdVector2D &gradpsi, const LocalFields< GFPT > &fld)
Definition: field_aligned_local_fields.hpp:50
KOKKOS_INLINE_FUNCTION SimdVector & v()
Definition: particles.hpp:39
Simd< double > z
Definition: simd.hpp:141
Definition: globals.hpp:90
SimdPhase ph
Definition: particles.hpp:62
Simd< double > phi
Definition: simd.hpp:152
Definition: particles.hpp:61
Simd< double > z
Definition: simd.hpp:151
Simd< double > r
Definition: simd.hpp:140
Definition: field_aligned_local_fields.hpp:21
Definition: magnetic_field.F90:1
SimdConstants ct
Definition: particles.hpp:63
Definition: species.hpp:75
KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField< Device > &magnetic_field, const SimdVector &v, const Simd< double > &psi, SimdVector2D &xff, SimdGridWeights< Order::One, PIT > &grid_wts) const
Definition: grid.tpp:32
KOKKOS_INLINE_FUNCTION double magnitude(const int i_simd) const
Definition: simd.hpp:176
Simd< double > mu
m*v_perp^2/(2B)
Definition: particles.hpp:52
KOKKOS_INLINE_FUNCTION FieldAlignedLocalFields(const Grid< Device > &grid, const PushControls &push_controls, const Species< Device > &species, const MagneticField< Device > &magnetic_field, const GridFieldPack< Device, GFPT > &gfpack, SimdParticles &part, SimdGridWeights< Order::One, PhiInterpType::Planes > &grid_wts)
Definition: field_aligned_local_fields.hpp:127
KOKKOS_INLINE_FUNCTION void deactivate(const Simd< bool > &mask)
Definition: particles.hpp:79