diff options
Diffstat (limited to 'Source/Particles/Pusher/PushSelector.H')
-rw-r--r-- | Source/Particles/Pusher/PushSelector.H | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/Source/Particles/Pusher/PushSelector.H b/Source/Particles/Pusher/PushSelector.H index ed439b4b3..a56dda2b9 100644 --- a/Source/Particles/Pusher/PushSelector.H +++ b/Source/Particles/Pusher/PushSelector.H @@ -23,6 +23,7 @@ /** * \brief Push position and momentum for a single particle * + * \tparam do_sync Whether to include quantum synchrotron radiation (QSR) * \param GetPosition A functor for returning the particle position. * \param SetPosition A functor for setting the particle position. * \param copyAttribs A functor for storing the old u and x @@ -36,10 +37,11 @@ * \param pusher_algo 0: Boris, 1: Vay, 2: HigueraCary * \param do_crr Whether to do the classical radiation reaction * \param do_copy Whether to copy the old x and u for the BTD - * \param do_sync Whether to include quantum synchrotron radiation (QSR) * \param t_chi_max Cutoff chi for QSR * \param dt Time step size */ + +template <int do_sync> AMREX_GPU_DEVICE AMREX_FORCE_INLINE void doParticlePush(const GetParticlePosition& GetPosition, const SetParticlePosition& SetPosition, @@ -56,60 +58,53 @@ void doParticlePush(const GetParticlePosition& GetPosition, const amrex::ParticleReal Bz, const int ion_lev, const amrex::ParticleReal m, - const amrex::ParticleReal q, + const amrex::ParticleReal a_q, const int pusher_algo, const int do_crr, const int do_copy, #ifdef WARPX_QED - const int do_sync, const amrex::Real t_chi_max, #endif const amrex::Real dt) { + amrex::ParticleReal qp = a_q; + if (ion_lev) { qp *= ion_lev; } + if (do_copy) copyAttribs(i); if (do_crr) { #ifdef WARPX_QED - if (do_sync) { + amrex::ignore_unused(t_chi_max); + if constexpr (do_sync) { auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz, Ex, Ey, Ez, Bx, By, Bz); if (chi < t_chi_max) { UpdateMomentumBorisWithRadiationReaction(ux, uy, uz, Ex, Ey, Ez, Bx, - By, Bz, q, m, dt); + By, Bz, qp, m, dt); } else { UpdateMomentumBoris( ux, uy, uz, Ex, Ey, Ez, Bx, - By, Bz, q, m, dt); + By, Bz, qp, m, dt); } amrex::ParticleReal x, y, z; GetPosition(i, x, y, z); UpdatePosition(x, y, z, ux, uy, uz, dt ); SetPosition(i, x, y, z); - } else { + } else +#endif + { + UpdateMomentumBorisWithRadiationReaction(ux, uy, uz, Ex, Ey, Ez, Bx, - By, Bz, q, m, dt); + By, Bz, qp, m, dt); amrex::ParticleReal x, y, z; GetPosition(i, x, y, z); UpdatePosition(x, y, z, ux, uy, uz, dt ); SetPosition(i, x, y, z); } -#else - amrex::ParticleReal qp = q; - if (ion_lev) { qp *= ion_lev; } - UpdateMomentumBorisWithRadiationReaction(ux, uy, uz, - Ex, Ey, Ez, Bx, - By, Bz, qp, m, dt); - amrex::ParticleReal x, y, z; - GetPosition(i, x, y, z); - UpdatePosition(x, y, z, ux, uy, uz, dt ); - SetPosition(i, x, y, z); -#endif } else if (pusher_algo == ParticlePusherAlgo::Boris) { - amrex::ParticleReal qp = q; - if (ion_lev) { qp *= ion_lev; } UpdateMomentumBoris( ux, uy, uz, Ex, Ey, Ez, Bx, By, Bz, qp, m, dt); @@ -118,8 +113,6 @@ void doParticlePush(const GetParticlePosition& GetPosition, UpdatePosition(x, y, z, ux, uy, uz, dt ); SetPosition(i, x, y, z); } else if (pusher_algo == ParticlePusherAlgo::Vay) { - amrex::ParticleReal qp = q; - if (ion_lev){ qp *= ion_lev; } UpdateMomentumVay( ux, uy, uz, Ex, Ey, Ez, Bx, By, Bz, qp, m, dt); @@ -128,8 +121,6 @@ void doParticlePush(const GetParticlePosition& GetPosition, UpdatePosition(x, y, z, ux, uy, uz, dt ); SetPosition(i, x, y, z); } else if (pusher_algo == ParticlePusherAlgo::HigueraCary) { - amrex::ParticleReal qp = q; - if (ion_lev){ qp *= ion_lev; } UpdateMomentumHigueraCary( ux, uy, uz, Ex, Ey, Ez, Bx, By, Bz, qp, m, dt); @@ -137,9 +128,9 @@ void doParticlePush(const GetParticlePosition& GetPosition, GetPosition(i, x, y, z); UpdatePosition(x, y, z, ux, uy, uz, dt ); SetPosition(i, x, y, z); - } else { - amrex::Abort("Unknown particle pusher"); - } + } //else { +// amrex::Abort("Unknown particle pusher"); +// } } #endif // WARPX_PARTICLES_PUSHER_SELECTOR_H_ |