WarpX
Toggle main menu visibility
Loading...
Searching...
No Matches
Source
Particles
Pusher
UpdateMomentumVay.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_VAY_H_
9
#define WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_VAY_H_
10
11
#include "
Utils/WarpXConst.H
"
12
13
#include <
AMReX_FArrayBox.H
>
14
#include <
AMReX_REAL.H
>
15
16
26
AMREX_GPU_HOST_DEVICE
AMREX_INLINE
27
void
UpdateMomentumVay
(
28
amrex::ParticleReal
& ux,
amrex::ParticleReal
& uy,
amrex::ParticleReal
& uz,
29
const
amrex::ParticleReal
Ex,
const
amrex::ParticleReal
Ey,
const
amrex::ParticleReal
Ez,
30
const
amrex::ParticleReal
Bx,
const
amrex::ParticleReal
By,
const
amrex::ParticleReal
Bz,
31
const
amrex::ParticleReal
q,
const
amrex::ParticleReal
m,
const
amrex::Real
dt,
32
MomentumPushType
momentum_push_type)
33
{
34
using namespace
amrex::literals
;
35
36
// Constants
37
const
amrex::ParticleReal
econst = q*dt/m * ((momentum_push_type ==
MomentumPushType::Full
) ? 1.0_prt : 0.5_prt);
38
const
amrex::ParticleReal
bconst = 0.5_prt*q*dt/m;
39
// Compute initial gamma
40
const
amrex::ParticleReal
inv_gamma = 1._prt/std::sqrt(1._prt + (ux*ux + uy*uy + uz*uz)*
PhysConst::inv_c2_v<amrex::ParticleReal>
);
41
// Get tau
42
const
amrex::ParticleReal
taux = bconst*Bx;
43
const
amrex::ParticleReal
tauy = bconst*By;
44
const
amrex::ParticleReal
tauz = bconst*Bz;
45
const
amrex::ParticleReal
tausq = taux*taux+tauy*tauy+tauz*tauz;
46
// Get U', gamma'^2
47
const
amrex::ParticleReal
uxpr = ux + econst*Ex + ((momentum_push_type ==
MomentumPushType::SecondHalf
) ? 0.0_prt : (uy*tauz-uz*tauy)*inv_gamma);
48
const
amrex::ParticleReal
uypr = uy + econst*Ey + ((momentum_push_type ==
MomentumPushType::SecondHalf
) ? 0.0_prt : (uz*taux-ux*tauz)*inv_gamma);
49
const
amrex::ParticleReal
uzpr = uz + econst*Ez + ((momentum_push_type ==
MomentumPushType::SecondHalf
) ? 0.0_prt : (ux*tauy-uy*taux)*inv_gamma);
50
51
if
(momentum_push_type !=
MomentumPushType::FirstHalf
) {
52
// Get gamma'^2
53
const
amrex::ParticleReal
gprsq = (1._prt + (uxpr*uxpr + uypr*uypr + uzpr*uzpr)*
PhysConst::inv_c2_v<amrex::ParticleReal>
);
54
// Get u*
55
const
amrex::ParticleReal
ust = (uxpr*taux + uypr*tauy + uzpr*tauz)*
PhysConst::inv_c_v<amrex::ParticleReal>
;
56
// Get new gamma
57
const
amrex::ParticleReal
sigma = gprsq-tausq;
58
const
amrex::ParticleReal
gisq = 2._prt/(sigma + std::sqrt(sigma*sigma + 4._prt*(tausq + ust*ust)) );
59
// Get t, s
60
const
amrex::ParticleReal
bg = bconst*std::sqrt(gisq);
61
const
amrex::ParticleReal
tx = bg*Bx;
62
const
amrex::ParticleReal
ty = bg*By;
63
const
amrex::ParticleReal
tz = bg*Bz;
64
const
amrex::ParticleReal
s = 1._prt/(1._prt+tausq*gisq);
65
// Get t.u'
66
const
amrex::ParticleReal
tu = tx*uxpr + ty*uypr + tz*uzpr;
67
// Get new U
68
ux = s*(uxpr+tx*tu+uypr*tz-uzpr*ty);
69
uy = s*(uypr+ty*tu+uzpr*tx-uxpr*tz);
70
uz = s*(uzpr+tz*tu+uxpr*ty-uypr*tx);
71
}
72
else
{
73
ux = uxpr;
74
uy = uypr;
75
uz = uzpr;
76
}
77
}
78
79
#endif
// WARPX_PARTICLES_PUSHER_UPDATEMOMENTUM_VAY_H_
AMREX_INLINE
#define AMREX_INLINE
AMReX_FArrayBox.H
AMREX_GPU_HOST_DEVICE
#define AMREX_GPU_HOST_DEVICE
AMReX_REAL.H
UpdateMomentumVay
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
MomentumPushType
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition
WarpXAlgorithmSelection.H:188
MomentumPushType::SecondHalf
@ SecondHalf
Definition
WarpXAlgorithmSelection.H:188
MomentumPushType::Full
@ Full
Definition
WarpXAlgorithmSelection.H:188
MomentumPushType::FirstHalf
@ FirstHalf
Definition
WarpXAlgorithmSelection.H:188
WarpXConst.H
amrex::Real
amrex_real Real
amrex::ParticleReal
amrex_particle_real ParticleReal
ablastr::constant::SI::inv_c_v
constexpr auto inv_c_v
inverse of the vacuum speed of light [s/m] (variable template)
Definition
constant.H:149
ablastr::constant::SI::inv_c2_v
constexpr auto inv_c2_v
inverse of the square of the vacuum speed of light [s^2/m^2] (variable template)
Definition
constant.H:153
amrex::literals
Generated by
1.17.0