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
37
38template <int do_sync>
40void 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 ParticlePusherAlgo 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 ParticlePusherAlgo 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
ParticlePusherAlgo
Definition WarpXAlgorithmSelection.H:79
@ Boris
Definition WarpXAlgorithmSelection.H:79
@ HigueraCary
Definition WarpXAlgorithmSelection.H:79
@ Vay
Definition WarpXAlgorithmSelection.H:79
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 &...)