WarpX
UpdateMomentumBorisWithRadiationReaction.H
Go to the documentation of this file.
1 /* Copyright 2019 Luca Fedeli
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_WITHRR_H_
8 #define WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_WITHRR_H_
9 
10 #include "UpdateMomentumBoris.H"
11 
12 #include <AMReX_REAL.H>
13 
22  amrex::ParticleReal& ux, amrex::ParticleReal& uy, amrex::ParticleReal& uz,
23  const amrex::ParticleReal Ex, const amrex::ParticleReal Ey, const amrex::ParticleReal Ez,
24  const amrex::ParticleReal Bx, const amrex::ParticleReal By, const amrex::ParticleReal Bz,
25  const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt )
26 {
27  using namespace amrex::literals;
28 
29  //RR algorithm needs to store old value of the normalized momentum
30  const amrex::ParticleReal ux_old = ux;
31  const amrex::ParticleReal uy_old = uy;
32  const amrex::ParticleReal uz_old = uz;
33 
34  //Useful constant
35  constexpr amrex::ParticleReal inv_c2 = 1._prt/(PhysConst::c*PhysConst::c);
36 
37  //Call to regular Boris pusher
39  ux, uy, uz,
40  Ex, Ey, Ez,
41  Bx, By, Bz,
42  q, m, dt );
43 
44  //Estimation of the normalized momentum at intermediate (integer) time
45  const amrex::ParticleReal ux_n = (ux+ux_old)*0.5_prt;
46  const amrex::ParticleReal uy_n = (uy+uy_old)*0.5_prt;
47  const amrex::ParticleReal uz_n = (uz+uz_old)*0.5_prt;
48 
49  // Compute Lorentz factor (and inverse) at intermediate (integer) time
50  const amrex::ParticleReal gamma_n = std::sqrt( 1._prt +
51  (ux_n*ux_n + uy_n*uy_n + uz_n*uz_n)*inv_c2);
52  const amrex::ParticleReal inv_gamma_n = 1.0_prt/gamma_n;
53 
54  //Estimation of the velocity at intermediate (integer) time
55  const amrex::ParticleReal vx_n = ux_n*inv_gamma_n;
56  const amrex::ParticleReal vy_n = uy_n*inv_gamma_n;
57  const amrex::ParticleReal vz_n = uz_n*inv_gamma_n;
58  const amrex::ParticleReal bx_n = vx_n/PhysConst::c;
59  const amrex::ParticleReal by_n = vy_n/PhysConst::c;
60  const amrex::ParticleReal bz_n = vz_n/PhysConst::c;
61 
62  //Lorentz force over charge
63  const amrex::ParticleReal flx_q = (Ex + vy_n*Bz - vz_n*By);
64  const amrex::ParticleReal fly_q = (Ey + vz_n*Bx - vx_n*Bz);
65  const amrex::ParticleReal flz_q = (Ez + vx_n*By - vy_n*Bx);
66  const amrex::ParticleReal fl_q2 = flx_q*flx_q + fly_q*fly_q + flz_q*flz_q;
67 
68  //Calculation of auxiliary quantities
69  const amrex::ParticleReal bdotE = (bx_n*Ex + by_n*Ey + bz_n*Ez);
70  const amrex::ParticleReal bdotE2 = bdotE*bdotE;
71  const amrex::ParticleReal coeff = gamma_n*gamma_n*(fl_q2-bdotE2);
72 
73  //Radiation reaction constant
74  const amrex::ParticleReal q_over_mc = q/(m*PhysConst::c);
75  const amrex::ParticleReal RRcoeff = (2.0_prt/3.0_prt)*PhysConst::r_e*q_over_mc*q_over_mc;
76 
77  //Compute the components of the RR force
78  const amrex::ParticleReal frx =
79  RRcoeff*(PhysConst::c*(fly_q*Bz - flz_q*By) + bdotE*Ex - coeff*bx_n);
80  const amrex::ParticleReal fry =
81  RRcoeff*(PhysConst::c*(flz_q*Bx - flx_q*Bz) + bdotE*Ey - coeff*by_n);
82  const amrex::ParticleReal frz =
83  RRcoeff*(PhysConst::c*(flx_q*By - fly_q*Bx) + bdotE*Ez - coeff*bz_n);
84 
85  //Update momentum using the RR force
86  ux += frx*dt;
87  uy += fry*dt;
88  uz += frz*dt;
89 }
90 
91 #endif // WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_WITHRR_H_
#define AMREX_INLINE
#define AMREX_GPU_HOST_DEVICE
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
static constexpr auto r_e
classical electron radius = 1./(4*pi*ep0) * q_e*q_e/(m_e*c*c) [m]
Definition: constant.H:63
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
float dt
Definition: stencil.py:442