WarpX
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
17 
18 #include <AMReX_REAL.H>
19 
20 #include <limits>
21 
42 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
43 void doParticlePush(const GetParticlePosition& GetPosition,
44  const SetParticlePosition& SetPosition,
45  const CopyParticleAttribs& copyAttribs,
46  const long i,
47  amrex::ParticleReal& ux,
48  amrex::ParticleReal& uy,
49  amrex::ParticleReal& uz,
50  const amrex::ParticleReal Ex,
51  const amrex::ParticleReal Ey,
52  const amrex::ParticleReal Ez,
53  const amrex::ParticleReal Bx,
54  const amrex::ParticleReal By,
55  const amrex::ParticleReal Bz,
56  const int ion_lev,
57  const amrex::Real m,
58  const amrex::Real q,
59  const int pusher_algo,
60  const int do_crr,
61  const int do_copy,
62 #ifdef WARPX_QED
63  const int do_sync,
64  const amrex::Real t_chi_max,
65 #endif
66  const amrex::Real dt)
67 {
68  if (do_copy) copyAttribs(i);
69  if (do_crr) {
70 #ifdef WARPX_QED
71  if (do_sync) {
72  auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz,
73  Ex, Ey, Ez,
74  Bx, By, Bz);
75  if (chi < t_chi_max) {
77  Ex, Ey, Ez, Bx,
78  By, Bz, q, m, dt);
79  }
80  else {
81  UpdateMomentumBoris( ux, uy, uz,
82  Ex, Ey, Ez, Bx,
83  By, Bz, q, m, dt);
84  }
85  amrex::ParticleReal x, y, z;
86  GetPosition(i, x, y, z);
87  UpdatePosition(x, y, z, ux, uy, uz, dt );
88  SetPosition(i, x, y, z);
89  } else {
91  Ex, Ey, Ez, Bx,
92  By, Bz, q, m, dt);
93  amrex::ParticleReal x, y, z;
94  GetPosition(i, x, y, z);
95  UpdatePosition(x, y, z, ux, uy, uz, dt );
96  SetPosition(i, x, y, z);
97  }
98 #else
99  amrex::Real qp = q;
100  if (ion_lev) { qp *= ion_lev; }
102  Ex, Ey, Ez, Bx,
103  By, Bz, qp, m, dt);
104  amrex::ParticleReal x, y, z;
105  GetPosition(i, x, y, z);
106  UpdatePosition(x, y, z, ux, uy, uz, dt );
107  SetPosition(i, x, y, z);
108 #endif
109  } else if (pusher_algo == ParticlePusherAlgo::Boris) {
110  amrex::Real qp = q;
111  if (ion_lev) { qp *= ion_lev; }
112  UpdateMomentumBoris( ux, uy, uz,
113  Ex, Ey, Ez, Bx,
114  By, Bz, qp, m, dt);
115  amrex::ParticleReal x, y, z;
116  GetPosition(i, x, y, z);
117  UpdatePosition(x, y, z, ux, uy, uz, dt );
118  SetPosition(i, x, y, z);
119  } else if (pusher_algo == ParticlePusherAlgo::Vay) {
120  amrex::Real qp = q;
121  if (ion_lev){ qp *= ion_lev; }
122  UpdateMomentumVay( ux, uy, uz,
123  Ex, Ey, Ez, Bx,
124  By, Bz, qp, m, dt);
125  amrex::ParticleReal x, y, z;
126  GetPosition(i, x, y, z);
127  UpdatePosition(x, y, z, ux, uy, uz, dt );
128  SetPosition(i, x, y, z);
129  } else if (pusher_algo == ParticlePusherAlgo::HigueraCary) {
130  amrex::Real qp = q;
131  if (ion_lev){ qp *= ion_lev; }
132  UpdateMomentumHigueraCary( ux, uy, uz,
133  Ex, Ey, Ez, Bx,
134  By, Bz, qp, m, dt);
135  amrex::ParticleReal x, y, z;
136  GetPosition(i, x, y, z);
137  UpdatePosition(x, y, z, ux, uy, uz, dt );
138  SetPosition(i, x, y, z);
139  } else {
140  amrex::Abort("Unknown particle pusher");
141  }
142 }
143 
144 #endif // WARPX_PARTICLES_PUSHER_SELECTOR_H_
Definition: WarpXAlgorithmSelection.H:47
def x
Definition: read_lab_particles.py:25
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_ele_pos(const amrex::Real px, const amrex::Real py, const amrex::Real pz, const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, const amrex::Real bx, const amrex::Real by, const amrex::Real bz)
Definition: QedChiFunctions.H:51
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::Real m, const amrex::Real q, const int pusher_algo, const int do_crr, const int do_copy, const int do_sync, const amrex::Real t_chi_max, const amrex::Real dt)
Push position and momentum for a single particle.
Definition: PushSelector.H:43
def uz
Definition: read_lab_particles.py:29
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::Real q, const amrex::Real m, const amrex::Real dt)
Push the particle&#39;s positions over one timestep, given the value of its momenta ux, uy, uz
Definition: UpdateMomentumHigueraCary.H:22
def z
Definition: read_lab_particles.py:26
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::Real q, const amrex::Real m, const amrex::Real dt)
Push the particle&#39;s positions over one timestep, given the value of its momenta ux, uy, uz
Definition: UpdateMomentumVay.H:20
Functor that creates copies of the current particle positions and momenta for later use...
Definition: CopyParticleAttribs.H:21
Definition: WarpXAlgorithmSelection.H:49
i
Definition: check_interp_points_and_weights.py:171
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::Real q, const amrex::Real m, const amrex::Real dt)
Definition: UpdateMomentumBorisWithRadiationReaction.H:22
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::Real q, const amrex::Real m, const amrex::Real dt)
Push the particle&#39;s positions over one timestep, given the value of its momenta ux, uy, uz
Definition: UpdateMomentumBoris.H:16
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel...
Definition: GetAndSetPosition.H:25
Functor that can be used to modify the positions of the macroparticles, inside a ParallelFor kernel...
Definition: GetAndSetPosition.H:78
Definition: WarpXAlgorithmSelection.H:48
def ux
Definition: read_lab_particles.py:28
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&#39;s positions over one timestep, given the value of its momenta ux, uy, uz
Definition: UpdatePosition.H:21