From 04b96737fe1759e55c8ee83cdb783dbf315f9431 Mon Sep 17 00:00:00 2001 From: Ryan Sandberg Date: Thu, 23 Mar 2023 14:14:09 -0700 Subject: 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> --- Source/Particles/PhysicalParticleContainer.cpp | 49 ++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) (limited to 'Source/Particles/PhysicalParticleContainer.cpp') 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 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; -- cgit v1.2.3