diff options
author | 2021-07-06 15:35:01 -0700 | |
---|---|---|
committer | 2021-07-06 15:35:01 -0700 | |
commit | 0356216f504643a0e33a6932efc5c2cbf9a2abe1 (patch) | |
tree | 73266aaec6dec16bde6349e49e55e1bd9c8bfca5 /Source/Particles/WarpXParticleContainer.cpp | |
parent | 82eec2a5032286c617449ea45a341b72b6f8bed2 (diff) | |
download | WarpX-0356216f504643a0e33a6932efc5c2cbf9a2abe1.tar.gz WarpX-0356216f504643a0e33a6932efc5c2cbf9a2abe1.tar.zst WarpX-0356216f504643a0e33a6932efc5c2cbf9a2abe1.zip |
Reflective particle boundary condition (#1728)
* Added ParticleBoundaries and reflecting boundary conditions
* Added ParticleBoundaries::AllNone
* Allowed different particle boundary conditions on each side of the domain
* Updated the documentation for particle boundaries
* Fix end of line space in Docs/source/running_cpp/parameters.rst
* Updated the reflecting BC to use boundary input group
* Fixes to reflective boundary conditions
* Bug fix in AsStored
* Added particle boundaries regression test particle_boundaries_3d
* Fixed particle_boundaries_3d.json
* Minor updates
* Added algo.particle_shape to test case
* Remove do_pml from test case
Co-authored-by: Revathi Jambunathan <41089244+RevathiJambunathan@users.noreply.github.com>
* Need to explicitly turn off pml in CI test
* Re-add include
* Fixed includes
Co-authored-by: Remi Lehe <remi.lehe@normalesup.org>
Co-authored-by: Revathi Jambunathan <41089244+RevathiJambunathan@users.noreply.github.com>
Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
Diffstat (limited to 'Source/Particles/WarpXParticleContainer.cpp')
-rw-r--r-- | Source/Particles/WarpXParticleContainer.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp index 8c5ad7f7f..b5ed32c94 100644 --- a/Source/Particles/WarpXParticleContainer.cpp +++ b/Source/Particles/WarpXParticleContainer.cpp @@ -1090,13 +1090,17 @@ WarpXParticleContainer::particlePostLocate(ParticleType& p, } void -WarpXParticleContainer::ApplyBoundaryConditions (ParticleBC boundary_conditions){ +WarpXParticleContainer::ApplyBoundaryConditions (ParticleBoundaries& boundary_conditions){ WARPX_PROFILE("WarpXParticleContainer::ApplyBoundaryConditions()"); + + if (boundary_conditions.CheckAll(ParticleBoundaryType::Periodic)) return; + for (int lev = 0; lev <= finestLevel(); ++lev) { for (WarpXParIter pti(*this, lev); pti.isValid(); ++pti) { auto GetPosition = GetParticlePosition(pti); + auto SetPosition = SetParticlePosition(pti); const Real xmin = Geom(lev).ProbLo(0); const Real xmax = Geom(lev).ProbHi(0); #ifdef WARPX_DIM_3D @@ -1109,22 +1113,34 @@ WarpXParticleContainer::ApplyBoundaryConditions (ParticleBC boundary_conditions) ParticleTileType& ptile = ParticlesAt(lev, pti); ParticleType * const pp = ptile.GetArrayOfStructs()().data(); + auto& soa = ptile.GetStructOfArrays(); + amrex::ParticleReal * const AMREX_RESTRICT ux = soa.GetRealData(PIdx::ux).data(); + amrex::ParticleReal * const AMREX_RESTRICT uy = soa.GetRealData(PIdx::uy).data(); + amrex::ParticleReal * const AMREX_RESTRICT uz = soa.GetRealData(PIdx::uz).data(); + // Loop over particles and apply BC to each particle amrex::ParallelFor( pti.numParticles(), [=] AMREX_GPU_DEVICE (long i) { ParticleType& p = pp[i]; ParticleReal x, y, z; - GetPosition(i, x, y, z); + GetPosition.AsStored(i, x, y, z); + // Note that for RZ, (x, y, z) is actually (r, theta, z). + + bool particle_lost = false; + ParticleBoundaries::apply_boundaries(x, xmin, xmax, #ifdef WARPX_DIM_3D - if (x < xmin || x > xmax || y < ymin || y > ymax || z < zmin || z > zmax){ - if (boundary_conditions == ParticleBC::absorbing) p.id() = -1; - } -#else - if (x < xmin || x > xmax || z < zmin || z > zmax){ - if (boundary_conditions == ParticleBC::absorbing) p.id() = -1; - } + y, ymin, ymax, #endif + z, zmin, zmax, + ux[i], uy[i], uz[i], particle_lost, + boundary_conditions); + + if (particle_lost) { + p.id() = -1; + } else { + SetPosition.AsStored(i, x, y, z); + } } ); } |