WarpX
Loading...
Searching...
No Matches
UpdateMomentumBoris.H
Go to the documentation of this file.
1/* Copyright 2019 David Grote, Maxence Thevenet, Remi Lehe
2 * Weiqun Zhang
3 *
4 * This file is part of WarpX.
5 *
6 * License: BSD-3-Clause-LBNL
7 */
8#ifndef WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_H_
9#define WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_H_
10
11#include <AMReX_REAL.H>
12
24 const amrex::ParticleReal q, const amrex::ParticleReal m, const amrex::Real dt, MomentumPushType momentum_push_type = MomentumPushType::Full)
25{
26 using namespace amrex::literals;
27
28 const amrex::ParticleReal econst = 0.5_prt*q*dt/m;
29
30 if (momentum_push_type == MomentumPushType::FirstHalf || momentum_push_type == MomentumPushType::Full) {
31 // First half-push for E
32 ux += econst*Ex;
33 uy += econst*Ey;
34 uz += econst*Ez;
35 }
36 // Compute temporary gamma factor
37 constexpr auto inv_c2 = PhysConst::inv_c2_v< amrex::ParticleReal>;
38 const amrex::ParticleReal inv_gamma = 1._prt/std::sqrt(1._prt + (ux*ux + uy*uy + uz*uz)*inv_c2);
39 // Magnetic rotation
40 // - Compute temporary variables
41 const amrex::Real bconst = (momentum_push_type == MomentumPushType::FirstHalf || momentum_push_type == MomentumPushType::SecondHalf) ? 0.5_rt*econst : econst;
42 const amrex::ParticleReal tx = bconst*inv_gamma*Bx;
43 const amrex::ParticleReal ty = bconst*inv_gamma*By;
44 const amrex::ParticleReal tz = bconst*inv_gamma*Bz;
45 const amrex::ParticleReal tsqi = 2._prt/(1._prt + tx*tx + ty*ty + tz*tz);
46 const amrex::ParticleReal sx = tx*tsqi;
47 const amrex::ParticleReal sy = ty*tsqi;
48 const amrex::ParticleReal sz = tz*tsqi;
49 const amrex::ParticleReal ux_p = ux + uy*tz - uz*ty;
50 const amrex::ParticleReal uy_p = uy + uz*tx - ux*tz;
51 const amrex::ParticleReal uz_p = uz + ux*ty - uy*tx;
52 // - Update momentum
53 ux += uy_p*sz - uz_p*sy;
54 uy += uz_p*sx - ux_p*sz;
55 uz += ux_p*sy - uy_p*sx;
56 if (momentum_push_type == MomentumPushType::SecondHalf || momentum_push_type == MomentumPushType::Full) {
57 // Second half-push for E
58 ux += econst*Ex;
59 uy += econst*Ey;
60 uz += econst*Ez;
61 }
62}
63#endif // WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_BORIS_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, 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
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:189
@ SecondHalf
Definition WarpXAlgorithmSelection.H:189
@ Full
Definition WarpXAlgorithmSelection.H:189
@ FirstHalf
Definition WarpXAlgorithmSelection.H:189
amrex_real Real
amrex_particle_real ParticleReal
constexpr auto inv_c2_v
inverse of the square of the vacuum speed of light [s^2/m^2] (variable template)
Definition constant.H:146