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