ARTEMIS
PushSelector.H
Go to the documentation of this file.
1 /* Copyright 2020 Andrew Myers
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_PARTICLES_PUSHER_PUSHSELECTOR_H_
8 #define WARPX_PARTICLES_PUSHER_PUSHSELECTOR_H_
9 
10 // Import low-level single-particle kernels
18 
19 #include <AMReX_REAL.H>
20 
21 #include <limits>
22 
44 template <int do_sync>
46 void doParticlePush(const GetParticlePosition& GetPosition,
47  const SetParticlePosition& SetPosition,
48  const CopyParticleAttribs& copyAttribs,
49  const long i,
50  amrex::ParticleReal& ux,
51  amrex::ParticleReal& uy,
52  amrex::ParticleReal& uz,
53  const amrex::ParticleReal Ex,
54  const amrex::ParticleReal Ey,
55  const amrex::ParticleReal Ez,
56  const amrex::ParticleReal Bx,
57  const amrex::ParticleReal By,
58  const amrex::ParticleReal Bz,
59  const int ion_lev,
60  const amrex::ParticleReal m,
61  const amrex::ParticleReal a_q,
62  const int pusher_algo,
63  const int do_crr,
64  const int do_copy,
65 #ifdef WARPX_QED
66  const amrex::Real t_chi_max,
67 #endif
68  const amrex::Real dt)
69 {
70  amrex::ParticleReal qp = a_q;
71  if (ion_lev) { qp *= ion_lev; }
72 
73  if (do_copy) copyAttribs(i);
74  if (do_crr) {
75 #ifdef WARPX_QED
76  amrex::ignore_unused(t_chi_max);
77  if constexpr (do_sync) {
78  auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz,
79  Ex, Ey, Ez,
80  Bx, By, Bz);
81  if (chi < t_chi_max) {
83  Ex, Ey, Ez, Bx,
84  By, Bz, qp, m, dt);
85  }
86  else {
87  UpdateMomentumBoris( ux, uy, uz,
88  Ex, Ey, Ez, Bx,
89  By, Bz, qp, m, dt);
90  }
91  amrex::ParticleReal x, y, z;
92  GetPosition(i, x, y, z);
93  UpdatePosition(x, y, z, ux, uy, uz, dt );
94  SetPosition(i, x, y, z);
95  } else
96 #endif
97  {
98 
100  Ex, Ey, Ez, Bx,
101  By, Bz, qp, m, dt);
102  amrex::ParticleReal x, y, z;
103  GetPosition(i, x, y, z);
104  UpdatePosition(x, y, z, ux, uy, uz, dt );
105  SetPosition(i, x, y, z);
106  }
107  } else if (pusher_algo == ParticlePusherAlgo::Boris) {
108  UpdateMomentumBoris( ux, uy, uz,
109  Ex, Ey, Ez, Bx,
110  By, Bz, qp, m, dt);
111  amrex::ParticleReal x, y, z;
112  GetPosition(i, x, y, z);
113  UpdatePosition(x, y, z, ux, uy, uz, dt );
114  SetPosition(i, x, y, z);
115  } else if (pusher_algo == ParticlePusherAlgo::Vay) {
116  UpdateMomentumVay( ux, uy, uz,
117  Ex, Ey, Ez, Bx,
118  By, Bz, qp, m, dt);
119  amrex::ParticleReal x, y, z;
120  GetPosition(i, x, y, z);
121  UpdatePosition(x, y, z, ux, uy, uz, dt );
122  SetPosition(i, x, y, z);
123  } else if (pusher_algo == ParticlePusherAlgo::HigueraCary) {
124  UpdateMomentumHigueraCary( ux, uy, uz,
125  Ex, Ey, Ez, Bx,
126  By, Bz, qp, m, dt);
127  amrex::ParticleReal x, y, z;
128  GetPosition(i, x, y, z);
129  UpdatePosition(x, y, z, ux, uy, uz, dt );
130  SetPosition(i, x, y, z);
131  } //else {
132 // amrex::Abort("Unknown particle pusher");
133 // }
134 }
135 
136 #endif // WARPX_PARTICLES_PUSHER_SELECTOR_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_DEVICE
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void doParticlePush(const GetParticlePosition &GetPosition, const SetParticlePosition &SetPosition, const CopyParticleAttribs &copyAttribs, const long i, amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez, const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz, const int ion_lev, const amrex::ParticleReal m, const amrex::ParticleReal a_q, const int pusher_algo, const int do_crr, const int do_copy, const amrex::Real t_chi_max, const amrex::Real dt)
Push position and momentum for a single particle.
Definition: PushSelector.H:46
AMREX_GPU_HOST_DEVICE AMREX_INLINE void UpdateMomentumBoris(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez, const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz, const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition: UpdateMomentumBoris.H:16
AMREX_GPU_HOST_DEVICE AMREX_INLINE void UpdateMomentumBorisWithRadiationReaction(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez, const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz, const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt)
Definition: UpdateMomentumBorisWithRadiationReaction.H:21
AMREX_GPU_HOST_DEVICE AMREX_INLINE void UpdateMomentumHigueraCary(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez, const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz, const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition: UpdateMomentumHigueraCary.H:22
AMREX_GPU_HOST_DEVICE AMREX_INLINE void UpdateMomentumVay(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez, const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz, const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition: UpdateMomentumVay.H:20
AMREX_GPU_HOST_DEVICE AMREX_INLINE void UpdatePosition(amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &z, const amrex::ParticleReal ux, const amrex::ParticleReal uy, const amrex::ParticleReal uz, const amrex::Real dt)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition: UpdatePosition.H:21
def y
Definition: Excitation_Flag_Generator.py:76
def x
Formats datastring to remove "+" at the end of the string #####.
Definition: Excitation_Flag_Generator.py:75
def z
Definition: Excitation_Flag_Generator.py:77
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_ele_pos(const amrex::ParticleReal px, const amrex::ParticleReal py, const amrex::ParticleReal pz, const amrex::ParticleReal ex, const amrex::ParticleReal ey, const amrex::ParticleReal ez, const amrex::ParticleReal bx, const amrex::ParticleReal by, const amrex::ParticleReal bz)
Definition: QedChiFunctions.H:53
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
i
Definition: check_interp_points_and_weights.py:174
int dt
Definition: stencil.py:440
Functor that creates copies of the current particle positions and momenta for later use....
Definition: CopyParticleAttribs.H:22
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition: GetAndSetPosition.H:53
@ HigueraCary
Definition: WarpXAlgorithmSelection.H:84
@ Boris
Definition: WarpXAlgorithmSelection.H:82
@ Vay
Definition: WarpXAlgorithmSelection.H:83
Functor that can be used to modify the positions of the macroparticles, inside a ParallelFor kernel.
Definition: GetAndSetPosition.H:150