diff options
author | 2023-03-23 14:14:09 -0700 | |
---|---|---|
committer | 2023-03-23 14:14:09 -0700 | |
commit | 04b96737fe1759e55c8ee83cdb783dbf315f9431 (patch) | |
tree | 3285c4909d27e4f5f68fd15e292862dbbd6796d1 /Source/Particles/PhysicalParticleContainer.cpp | |
parent | 8f2a9da6e84056c33b64b80f14864160c1b61a48 (diff) | |
download | WarpX-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.cpp | 49 |
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; |