1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#include <limits>
#include <sstream>
#include <algorithm>
#ifdef _OPENMP
#include <omp.h>
#endif
#include <PhotonParticleContainer.H>
#include <WarpX_f.H>
#include <WarpX.H>
#include <WarpXConst.H>
using namespace amrex;
PhotonParticleContainer::PhotonParticleContainer (AmrCore* amr_core, int ispecies,
const std::string& name)
: PhysicalParticleContainer(amr_core, ispecies, name)
{
// This will read <species>.[...] from the inputs file
// where <species> is the name of your species
ParmParse pp(species_name);
// read <species>.size_in_inches in the input file, and
// store it into member data.
pp.query("size_in_inches", size_in_inches);
#ifdef WARPX_QED
AddRealComp("tau");
plot_flags.resize(PIdx::nattribs + 6, 1);
#endif
}
void PhotonParticleContainer::InitData()
{
AddParticles(0); // Note - add on level 0
if (maxLevel() > 0) {
Redistribute(); // We then redistribute
}
}
void
PhotonParticleContainer::PushPX(WarpXParIter& pti,
Cuda::ManagedDeviceVector<Real>& xp,
Cuda::ManagedDeviceVector<Real>& yp,
Cuda::ManagedDeviceVector<Real>& zp,
Cuda::ManagedDeviceVector<Real>& giv,
Real dt)
{
// This wraps the call to warpx_particle_pusher so that inheritors can modify the call.
auto& attribs = pti.GetAttribs();
auto& uxp = attribs[PIdx::ux];
auto& uyp = attribs[PIdx::uy];
auto& uzp = attribs[PIdx::uz];
auto& Exp = attribs[PIdx::Ex];
auto& Eyp = attribs[PIdx::Ey];
auto& Ezp = attribs[PIdx::Ez];
auto& Bxp = attribs[PIdx::Bx];
auto& Byp = attribs[PIdx::By];
auto& Bzp = attribs[PIdx::Bz];
const long np = pti.numParticles();
// Using new pusher for positions
const amrex_real zero_mass = 0.0;
const amrex_real zero_charge = 0.0;
warpx_particle_pusher_positions(&np,
xp.dataPtr(),
yp.dataPtr(),
zp.dataPtr(),
uxp.dataPtr(), uyp.dataPtr(), uzp.dataPtr(),
giv.dataPtr(),
Exp.dataPtr(), Eyp.dataPtr(), Ezp.dataPtr(),
Bxp.dataPtr(), Byp.dataPtr(), Bzp.dataPtr(),
&zero_charge, &zero_mass, &dt,
&WarpX::particle_pusher_algo);
}
void
PhotonParticleContainer::Evolve (int lev,
const MultiFab& Ex, const MultiFab& Ey, const MultiFab& Ez,
const MultiFab& Bx, const MultiFab& By, const MultiFab& Bz,
MultiFab& jx, MultiFab& jy, MultiFab& jz,
MultiFab* cjx, MultiFab* cjy, MultiFab* cjz,
MultiFab* rho, MultiFab* crho,
const MultiFab* cEx, const MultiFab* cEy, const MultiFab* cEz,
const MultiFab* cBx, const MultiFab* cBy, const MultiFab* cBz,
Real t, Real dt)
{
// This does gather, push and depose.
// Push and depose have been re-written for photon,
// so they do not do anything.
// Currently, I guess photons do gather fields from the mesh.
PhysicalParticleContainer::Evolve (lev,
Ex, Ey, Ez,
Bx, By, Bz,
jx, jy, jz,
cjx, cjy, cjz,
rho, crho,
cEx, cEy, cEz,
cBx, cBy, cBz,
t, dt);
}
#ifdef WARPX_QED
void PhysicalParticleContainer::InitOpticalDepth(){
}
#endif
|