WarpX
Loading...
Searching...
No Matches
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
39template <int do_sync>
44 const amrex::ParticleReal Ex,
45 const amrex::ParticleReal Ey,
46 const amrex::ParticleReal Ez,
47 const amrex::ParticleReal Bx,
48 const amrex::ParticleReal By,
49 const amrex::ParticleReal Bz,
50 const int ion_lev,
51 const amrex::ParticleReal m,
52 const amrex::ParticleReal a_q,
53 const ParticlePusherAlgo pusher_algo,
54 const int do_crr,
55#ifdef WARPX_QED
56 const amrex::Real t_chi_max,
57#endif
58 const amrex::Real dt,
59 MomentumPushType momentum_push_type)
60{
61 amrex::ParticleReal qp = a_q;
62 qp *= ion_lev;
63
64 if (do_crr) {
65#ifdef WARPX_QED
66 amrex::ignore_unused(t_chi_max);
67 if constexpr (do_sync) {
68 auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz,
69 Ex, Ey, Ez,
70 Bx, By, Bz);
71 if (chi < t_chi_max) {
73 Ex, Ey, Ez, Bx,
74 By, Bz, qp, m, dt, momentum_push_type);
75 }
76 else {
77 UpdateMomentumBoris( ux, uy, uz,
78 Ex, Ey, Ez, Bx,
79 By, Bz, qp, m, dt, momentum_push_type);
80 }
81 } else
82#endif
83 {
84
86 Ex, Ey, Ez, Bx,
87 By, Bz, qp, m, dt, momentum_push_type);
88 }
89 } else if (pusher_algo == ParticlePusherAlgo::Boris) {
90 UpdateMomentumBoris( ux, uy, uz,
91 Ex, Ey, Ez, Bx,
92 By, Bz, qp, m, dt, momentum_push_type);
93 } else if (pusher_algo == ParticlePusherAlgo::Vay) {
94 UpdateMomentumVay( ux, uy, uz,
95 Ex, Ey, Ez, Bx,
96 By, Bz, qp, m, dt, momentum_push_type);
97 } else if (pusher_algo == ParticlePusherAlgo::HigueraCary) {
98 UpdateMomentumHigueraCary( ux, uy, uz,
99 Ex, Ey, Ez, Bx,
100 By, Bz, qp, m, dt);
101 } //else {
102// amrex::Abort("Unknown particle pusher");
103// }
104}
105
106#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 ParticlePusherAlgo pusher_algo, const int do_crr, const amrex::Real t_chi_max, const amrex::Real dt, MomentumPushType momentum_push_type)
Push momentum for a single particle.
Definition PushSelector.H:41
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, MomentumPushType momentum_push_type=MomentumPushType::Full)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition UpdateMomentumBoris.H:20
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, MomentumPushType momentum_push_type)
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, MomentumPushType momentum_push_type)
Push the particle's positions over one timestep, given the value of its momenta ux,...
Definition UpdateMomentumVay.H:27
ParticlePusherAlgo
Definition WarpXAlgorithmSelection.H:79
@ Boris
Definition WarpXAlgorithmSelection.H:79
@ HigueraCary
Definition WarpXAlgorithmSelection.H:79
@ Vay
Definition WarpXAlgorithmSelection.H:79
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:189
amrex_real Real
amrex_particle_real ParticleReal
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
__host__ __device__ void ignore_unused(const Ts &...)