aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar David Grote <grote1@llnl.gov> 2021-03-22 11:02:57 -0700
committerGravatar GitHub <noreply@github.com> 2021-03-22 11:02:57 -0700
commitb582c29089e9021ece3513b99c8fce3bcea73617 (patch)
treebe84a24b8bfda5fc34da7172b57494eb6da8a35d /Source/Particles/PhysicalParticleContainer.cpp
parent0310202ef8a1ffddbb07d708f5232baae8dd7cb5 (diff)
downloadWarpX-b582c29089e9021ece3513b99c8fce3bcea73617.tar.gz
WarpX-b582c29089e9021ece3513b99c8fce3bcea73617.tar.zst
WarpX-b582c29089e9021ece3513b99c8fce3bcea73617.zip
Applied boost to single and multiple particle input (#1800)
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.cpp')
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp62
1 files changed, 40 insertions, 22 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 1c666ed21..0c0b0d1e3 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -208,7 +208,7 @@ void PhysicalParticleContainer::InitData ()
}
void PhysicalParticleContainer::MapParticletoBoostedFrame (
- Real& x, Real& y, Real& z, std::array<Real, 3>& u)
+ Real& x, Real& y, Real& z, Real& ux, Real& uy, Real& uz)
{
// Map the particles from the lab frame to the boosted frame.
// This boosts the particle to the lab frame and calculates
@@ -217,7 +217,7 @@ void PhysicalParticleContainer::MapParticletoBoostedFrame (
// For now, start with the assumption that this will only happen
// at the start of the simulation.
- const Real t_lab = 0.;
+ const Real t_lab = 0._rt;
const Real uz_boost = WarpX::gamma_boost*WarpX::beta_boost*PhysConst::c;
@@ -230,18 +230,18 @@ void PhysicalParticleContainer::MapParticletoBoostedFrame (
Real zpr = WarpX::gamma_boost*z - uz_boost*t_lab;
// transform u and gamma to the boosted frame
- Real gamma_lab = std::sqrt(1._rt + (u[0]*u[0] + u[1]*u[1] + u[2]*u[2])/(PhysConst::c*PhysConst::c));
- // u[0] = u[0];
- // u[1] = u[1];
- u[2] = WarpX::gamma_boost*u[2] - uz_boost*gamma_lab;
- Real gammapr = std::sqrt(1._rt + (u[0]*u[0] + u[1]*u[1] + u[2]*u[2])/(PhysConst::c*PhysConst::c));
+ Real gamma_lab = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)/(PhysConst::c*PhysConst::c));
+ // ux = ux;
+ // uy = uy;
+ uz = WarpX::gamma_boost*uz - uz_boost*gamma_lab;
+ Real gammapr = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)/(PhysConst::c*PhysConst::c));
- Real vxpr = u[0]/gammapr;
- Real vypr = u[1]/gammapr;
- Real vzpr = u[2]/gammapr;
+ Real vxpr = ux/gammapr;
+ Real vypr = uy/gammapr;
+ Real vzpr = uz/gammapr;
if (do_backward_propagation){
- u[2] = -u[2];
+ uz = -uz;
}
// Move the particles to where they will be at t = 0 in the boosted frame
@@ -305,24 +305,24 @@ PhysicalParticleContainer::AddGaussianBeam (
u.z *= PhysConst::c;
if (do_symmetrize){
// Add four particles to the beam:
- CheckAndAddParticle(x, y, z, { u.x, u.y, u.z}, weight/4._rt,
+ CheckAndAddParticle(x, y, z, u.x, u.y, u.z, weight/4._rt,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
- CheckAndAddParticle(x, -y, z, { u.x, -u.y, u.z}, weight/4._rt,
+ CheckAndAddParticle(x, -y, z, u.x, -u.y, u.z, weight/4._rt,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
- CheckAndAddParticle(-x, y, z, { -u.x, u.y, u.z}, weight/4._rt,
+ CheckAndAddParticle(-x, y, z, -u.x, u.y, u.z, weight/4._rt,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
- CheckAndAddParticle(-x, -y, z, { -u.x, -u.y, u.z}, weight/4._rt,
+ CheckAndAddParticle(-x, -y, z, -u.x, -u.y, u.z, weight/4._rt,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
} else {
- CheckAndAddParticle(x, y, z, { u.x, u.y, u.z}, weight,
+ CheckAndAddParticle(x, y, z, u.x, u.y, u.z, weight,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
@@ -418,7 +418,7 @@ PhysicalParticleContainer::AddPlasmaFromFile(ParticleReal q_tot,
if (ps["momentum"].contains("y")) {
uy = ptr_uy.get()[i]*momentum_unit_y/PhysConst::m_e;
}
- CheckAndAddParticle(x, y, z, { ux, uy, uz}, weight,
+ CheckAndAddParticle(x, y, z, ux, uy, uz, weight,
particle_x, particle_y, particle_z,
particle_ux, particle_uy, particle_uz,
particle_w);
@@ -444,7 +444,7 @@ PhysicalParticleContainer::AddPlasmaFromFile(ParticleReal q_tot,
void
PhysicalParticleContainer::CheckAndAddParticle (
Real x, Real y, Real z,
- std::array<Real, 3> u,
+ Real ux, Real uy, Real uz,
Real weight,
Gpu::HostVector<ParticleReal>& particle_x,
Gpu::HostVector<ParticleReal>& particle_y,
@@ -455,14 +455,14 @@ PhysicalParticleContainer::CheckAndAddParticle (
Gpu::HostVector<ParticleReal>& particle_w)
{
if (WarpX::gamma_boost > 1.) {
- MapParticletoBoostedFrame(x, y, z, u);
+ MapParticletoBoostedFrame(x, y, z, ux, uy, uz);
}
particle_x.push_back(x);
particle_y.push_back(y);
particle_z.push_back(z);
- particle_ux.push_back(u[0]);
- particle_uy.push_back(u[1]);
- particle_uz.push_back(u[2]);
+ particle_ux.push_back(ux);
+ particle_uy.push_back(uy);
+ particle_uz.push_back(uz);
particle_w.push_back(weight);
}
@@ -472,6 +472,14 @@ PhysicalParticleContainer::AddParticles (int lev)
WARPX_PROFILE("PhysicalParticleContainer::AddParticles()");
if (plasma_injector->add_single_particle) {
+ if (WarpX::gamma_boost > 1.) {
+ MapParticletoBoostedFrame(plasma_injector->single_particle_pos[0],
+ plasma_injector->single_particle_pos[1],
+ plasma_injector->single_particle_pos[2],
+ plasma_injector->single_particle_vel[0],
+ plasma_injector->single_particle_vel[1],
+ plasma_injector->single_particle_vel[2]);
+ }
AddNParticles(lev, 1,
&(plasma_injector->single_particle_pos[0]),
&(plasma_injector->single_particle_pos[1]),
@@ -484,6 +492,16 @@ PhysicalParticleContainer::AddParticles (int lev)
}
if (plasma_injector->add_multiple_particles) {
+ if (WarpX::gamma_boost > 1.) {
+ for (int i=0 ; i < plasma_injector->multiple_particles_pos_x.size() ; i++) {
+ MapParticletoBoostedFrame(plasma_injector->multiple_particles_pos_x[i],
+ plasma_injector->multiple_particles_pos_y[i],
+ plasma_injector->multiple_particles_pos_z[i],
+ plasma_injector->multiple_particles_vel_x[i],
+ plasma_injector->multiple_particles_vel_y[i],
+ plasma_injector->multiple_particles_vel_z[i]);
+ }
+ }
AddNParticles(lev, plasma_injector->multiple_particles_pos_x.size(),
plasma_injector->multiple_particles_pos_x.dataPtr(),
plasma_injector->multiple_particles_pos_y.dataPtr(),