aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Ryan Sandberg <RSandberg@lbl.gov> 2023-03-23 14:14:09 -0700
committerGravatar GitHub <noreply@github.com> 2023-03-23 14:14:09 -0700
commit04b96737fe1759e55c8ee83cdb783dbf315f9431 (patch)
tree3285c4909d27e4f5f68fd15e292862dbbd6796d1 /Source/Particles/PhysicalParticleContainer.cpp
parent8f2a9da6e84056c33b64b80f14864160c1b61a48 (diff)
downloadWarpX-04b96737fe1759e55c8ee83cdb783dbf315f9431.tar.gz
WarpX-04b96737fe1759e55c8ee83cdb783dbf315f9431.tar.zst
WarpX-04b96737fe1759e55c8ee83cdb783dbf315f9431.zip
Gaussian beam: allow 8-fold symmetry option (#3768)
* add 8-fold beam symmetrization * Improve docs and fix examples * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix signature bug, can compile * fix example * Apply suggestions from code review Co-authored-by: Edoardo Zoni <59625522+EZoni@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Edoardo Zoni <59625522+EZoni@users.noreply.github.com>
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.cpp')
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp49
1 files changed, 43 insertions, 6 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 3e4c60737..37457ac7d 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -445,7 +445,8 @@ PhysicalParticleContainer::AddGaussianBeam (
const Real x_rms, const Real y_rms, const Real z_rms,
const Real x_cut, const Real y_cut, const Real z_cut,
const Real q_tot, long npart,
- const int do_symmetrize) {
+ const int do_symmetrize,
+ const int symmetrization_order) {
// Declare temporary vectors on the CPU
Gpu::HostVector<ParticleReal> particle_x;
@@ -458,10 +459,11 @@ PhysicalParticleContainer::AddGaussianBeam (
int np = 0;
if (ParallelDescriptor::IOProcessor()) {
- // If do_symmetrize, create 4x fewer particles, and
- // Replicate each particle 4 times (x,y) (-x,y) (x,-y) (-x,-y)
+ // If do_symmetrize, create either 4x or 8x fewer particles, and
+ // Replicate each particle either 4 times (x,y) (-x,y) (x,-y) (-x,-y)
+ // or 8 times, additionally (y,x), (-y,x), (y,-x), (-y,-x)
if (do_symmetrize){
- npart /= 4;
+ npart /= symmetrization_order;
}
for (long i = 0; i < npart; ++i) {
#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ)
@@ -488,7 +490,41 @@ PhysicalParticleContainer::AddGaussianBeam (
u.x *= PhysConst::c;
u.y *= PhysConst::c;
u.z *= PhysConst::c;
- if (do_symmetrize){
+ if (do_symmetrize && symmetrization_order == 8){
+ // Add eight particles to the beam:
+ CheckAndAddParticle(x, y, z, u.x, u.y, u.z, weight/8._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/8._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/8._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/8._rt,
+ particle_x, particle_y, particle_z,
+ particle_ux, particle_uy, particle_uz,
+ particle_w);
+ CheckAndAddParticle(y, x, z, u.y, u.x, u.z, weight/8._rt,
+ particle_x, particle_y, particle_z,
+ particle_ux, particle_uy, particle_uz,
+ particle_w);
+ CheckAndAddParticle(-y, x, z, -u.y, u.x, u.z, weight/8._rt,
+ particle_x, particle_y, particle_z,
+ particle_ux, particle_uy, particle_uz,
+ particle_w);
+ CheckAndAddParticle(y, -x, z, u.y, -u.x, u.z, weight/8._rt,
+ particle_x, particle_y, particle_z,
+ particle_ux, particle_uy, particle_uz,
+ particle_w);
+ CheckAndAddParticle(-y, -x, z, -u.y, -u.x, u.z, weight/8._rt,
+ particle_x, particle_y, particle_z,
+ particle_ux, particle_uy, particle_uz,
+ particle_w);
+ } else if (do_symmetrize && symmetrization_order == 4){
// Add four particles to the beam:
CheckAndAddParticle(x, y, z, u.x, u.y, u.z, weight/4._rt,
particle_x, particle_y, particle_z,
@@ -832,7 +868,8 @@ PhysicalParticleContainer::AddParticles (int lev)
plasma_injector->z_cut,
plasma_injector->q_tot,
plasma_injector->npart,
- plasma_injector->do_symmetrize);
+ plasma_injector->do_symmetrize,
+ plasma_injector->symmetrization_order);
return;