From 6ea4987e53e1939ca1aff65f61ff6cda47895f20 Mon Sep 17 00:00:00 2001 From: Sebastian Eibl <sebastian.eibl@fau.de> Date: Tue, 8 Oct 2019 11:04:01 +0200 Subject: [PATCH] [BUGFIX] accidential particle deletion in load balancing --- .../domain/BlockForestDataHandling.cpp | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/mesa_pd/domain/BlockForestDataHandling.cpp b/src/mesa_pd/domain/BlockForestDataHandling.cpp index 683c5aa15..1a75c1384 100644 --- a/src/mesa_pd/domain/BlockForestDataHandling.cpp +++ b/src/mesa_pd/domain/BlockForestDataHandling.cpp @@ -44,11 +44,25 @@ ParticleDeleter::~ParticleDeleter() { for (auto pIt = ps_->begin(); pIt != ps_->end(); ) { + //skip ghosts + if (data::particle_flags::isSet( pIt->getFlags(), data::particle_flags::GHOST)) + { + ++pIt; + continue; + } + //skip globals + if (data::particle_flags::isSet( pIt->getFlags(), data::particle_flags::GLOBAL)) + { + ++pIt; + continue; + } + if (aabb_.contains(pIt->getPosition())) { pIt = ps_->erase(pIt); continue; } + ++pIt; } } @@ -64,7 +78,9 @@ internal::ParticleDeleter* BlockForestDataHandling::initialize( IBlock * const b return new internal::ParticleDeleter(ps_, block->getAABB()); } -void BlockForestDataHandling::serialize( IBlock * const block, const BlockDataID & /*id*/, mpi::SendBuffer & buffer ) +void BlockForestDataHandling::serialize( IBlock * const block, + const BlockDataID & /*id*/, + mpi::SendBuffer & buffer ) { decltype(ps_->size()) numOfParticles = 0; @@ -93,7 +109,9 @@ internal::ParticleDeleter* BlockForestDataHandling::deserialize( IBlock * const return initialize(block); } -void BlockForestDataHandling::deserialize( IBlock * const block, const BlockDataID & id, mpi::RecvBuffer & buffer ) +void BlockForestDataHandling::deserialize( IBlock * const block, + const BlockDataID & id, + mpi::RecvBuffer & buffer ) { deserializeImpl( block, id, buffer); } @@ -187,6 +205,7 @@ void BlockForestDataHandling::deserializeImpl( IBlock * const block, const Block auto pIt = createNewParticle(*ps_, objparam); WALBERLA_CHECK(!data::particle_flags::isSet(pIt->getFlags(), data::particle_flags::GHOST)); + WALBERLA_CHECK(!data::particle_flags::isSet(pIt->getFlags(), data::particle_flags::GLOBAL)); pIt->setOwner( MPIManager::instance()->rank() ); if ( !block->getAABB().contains( pIt->getPosition()) ) -- GitLab