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 
38 template <int do_sync>
40 void doParticleMomentumPush(amrex::ParticleReal& ux,
41  amrex::ParticleReal& uy,
42  amrex::ParticleReal& uz,
43  const amrex::ParticleReal Ex,
44  const amrex::ParticleReal Ey,
45  const amrex::ParticleReal Ez,
46  const amrex::ParticleReal Bx,
47  const amrex::ParticleReal By,
48  const amrex::ParticleReal Bz,
49  const int ion_lev,
50  const amrex::ParticleReal m,
51  const amrex::ParticleReal a_q,
52  const int pusher_algo,
53  const int do_crr,
54 #ifdef WARPX_QED
55  const amrex::Real t_chi_max,
56 #endif
57  const amrex::Real dt)
58 {
59  amrex::ParticleReal qp = a_q;
60  qp *= ion_lev;
61 
62  if (do_crr) {
63 #ifdef WARPX_QED
64  amrex::ignore_unused(t_chi_max);
65  if constexpr (do_sync) {
66  auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz,
67  Ex, Ey, Ez,
68  Bx, By, Bz);
69  if (chi < t_chi_max) {
71  Ex, Ey, Ez, Bx,
72  By, Bz, qp, m, dt);
73  }
74  else {
75  UpdateMomentumBoris( ux, uy, uz,
76  Ex, Ey, Ez, Bx,
77  By, Bz, qp, m, dt);
78  }
79  } else
80 #endif
81  {
82 
84  Ex, Ey, Ez, Bx,
85  By, Bz, qp, m, dt);
86  }
87  } else if (pusher_algo == ParticlePusherAlgo::Boris) {
88  UpdateMomentumBoris( ux, uy, uz,
89  Ex, Ey, Ez, Bx,
90  By, Bz, qp, m, dt);
91  } else if (pusher_algo == ParticlePusherAlgo::Vay) {
92  UpdateMomentumVay( ux, uy, uz,
93  Ex, Ey, Ez, Bx,
94  By, Bz, qp, m, dt);
95  } else if (pusher_algo == ParticlePusherAlgo::HigueraCary) {
96  UpdateMomentumHigueraCary( ux, uy, uz,
97  Ex, Ey, Ez, Bx,
98  By, Bz, qp, m, dt);
99  } //else {
100 // amrex::Abort("Unknown particle pusher");
101 // }
102 }
103 
104 #endif // WARPX_PARTICLES_PUSHER_SELECTOR_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_DEVICE
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void doParticleMomentumPush(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 amrex::Real t_chi_max, const amrex::Real dt)
Push momentum for a single particle.
Definition: PushSelector.H:40
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(T &ux, T &uy, T &uz, const T Ex, const T Ey, const T Ez, const T Bx, const T By, const T Bz, const T q, const T 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_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 &...)
integer, parameter qp
float dt
Definition: stencil.py:442
@ HigueraCary
Definition: WarpXAlgorithmSelection.H:95
@ Boris
Definition: WarpXAlgorithmSelection.H:93
@ Vay
Definition: WarpXAlgorithmSelection.H:94