aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/ParticleBoundaryBuffer.cpp
diff options
context:
space:
mode:
authorGravatar David Grote <grote1@llnl.gov> 2022-08-03 13:34:11 -0700
committerGravatar GitHub <noreply@github.com> 2022-08-03 13:34:11 -0700
commit0a4d82fd5c514760871d11c8db037f560f07bc89 (patch)
tree0e322ae83a9aa4b71020a315ff91e4384e0cca6b /Source/Particles/ParticleBoundaryBuffer.cpp
parenta4c36c317403d2b8050524ba2a37d8d237b0df32 (diff)
downloadWarpX-0a4d82fd5c514760871d11c8db037f560f07bc89.tar.gz
WarpX-0a4d82fd5c514760871d11c8db037f560f07bc89.tar.zst
WarpX-0a4d82fd5c514760871d11c8db037f560f07bc89.zip
Implement output of scraped particles at domain boundaries (#3274)
* Implement scraping from all boundaries * Update input script * Output all particles to the same buffer * Dump different boundaries into different files * Avoid writing species that are not allocated * Improve documentation * Allow output of some boundaries only * Correct compilation error * Fixes and updates to BoundaryScraping * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: Remi Lehe <remi.lehe@normalesup.org> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Diffstat (limited to '')
-rw-r--r--Source/Particles/ParticleBoundaryBuffer.cpp47
1 files changed, 38 insertions, 9 deletions
diff --git a/Source/Particles/ParticleBoundaryBuffer.cpp b/Source/Particles/ParticleBoundaryBuffer.cpp
index 86475aa05..0eecbe0d3 100644
--- a/Source/Particles/ParticleBoundaryBuffer.cpp
+++ b/Source/Particles/ParticleBoundaryBuffer.cpp
@@ -64,6 +64,8 @@ ParticleBoundaryBuffer::ParticleBoundaryBuffer ()
{
m_particle_containers.resize(numBoundaries());
m_do_boundary_buffer.resize(numBoundaries());
+ m_do_any_boundary.resize(numBoundaries(), 0);
+ m_boundary_names.resize(numBoundaries());
for (int i = 0; i < numBoundaries(); ++i)
{
@@ -93,7 +95,32 @@ ParticleBoundaryBuffer::ParticleBoundaryBuffer ()
#ifdef AMREX_USE_EB
pp_species.query("save_particles_at_eb", m_do_boundary_buffer[AMREX_SPACEDIM*2][ispecies]);
#endif
+ // Set the flag whether the boundary is active or any species
+ for (int i = 0; i < numBoundaries(); ++i) {
+ if (m_do_boundary_buffer[i][ispecies]) m_do_any_boundary[i] = 1;
+ }
}
+
+#if defined(WARPX_DIM_1D_Z)
+ m_boundary_names[0] = "zlo";
+ m_boundary_names[1] = "zhi";
+#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
+ m_boundary_names[0] = "xlo";
+ m_boundary_names[1] = "xhi";
+ m_boundary_names[2] = "zlo";
+ m_boundary_names[3] = "zhi";
+#else
+ m_boundary_names[0] = "xlo";
+ m_boundary_names[1] = "xhi";
+ m_boundary_names[2] = "ylo";
+ m_boundary_names[3] = "yhi";
+ m_boundary_names[4] = "zlo";
+ m_boundary_names[5] = "zhi";
+#endif
+#ifdef AMREX_USE_EB
+ m_boundary_names[AMREX_SPACEDIM*2] = "eb";
+#endif
+
}
void ParticleBoundaryBuffer::printNumParticles () const {
@@ -143,12 +170,16 @@ void ParticleBoundaryBuffer::redistribute () {
void ParticleBoundaryBuffer::clearParticles () {
for (int i = 0; i < numBoundaries(); ++i)
{
- auto& buffer = m_particle_containers[i];
- for (int ispecies = 0; ispecies < numSpecies(); ++ispecies)
- {
- auto& species_buffer = buffer[ispecies];
- if (species_buffer.isDefined()) species_buffer.clearParticles();
- }
+ clearParticles(i);
+ }
+}
+
+void ParticleBoundaryBuffer::clearParticles (int const i) {
+ auto& buffer = m_particle_containers[i];
+ for (int ispecies = 0; ispecies < numSpecies(); ++ispecies)
+ {
+ auto& species_buffer = buffer[ispecies];
+ if (species_buffer.isDefined()) species_buffer.clearParticles();
}
}
@@ -233,6 +264,7 @@ void ParticleBoundaryBuffer::gatherParticles (MultiParticleContainer& mypc,
auto& buffer = m_particle_containers[m_particle_containers.size()-1];
for (int i = 0; i < numSpecies(); ++i)
{
+ if (!m_do_boundary_buffer[AMREX_SPACEDIM*2][i]) continue;
const auto& pc = mypc.GetParticleContainer(i);
if (!buffer[i].isDefined())
{
@@ -332,8 +364,5 @@ ParticleBoundaryBuffer::getParticleBufferPointer(const std::string species_name,
auto& buffer = m_particle_containers[boundary];
auto index = WarpX::GetInstance().GetPartContainer().getSpeciesID(species_name);
- WARPX_ALWAYS_ASSERT_WITH_MESSAGE(m_do_boundary_buffer[boundary][index],
- "Attempted to get particle buffer for boundary "
- + std::to_string(boundary) + ", which is not used!");
return &buffer[index];
}