diff --git a/src/mesa_pd/domain/BlockForestDataHandling.cpp b/src/mesa_pd/domain/BlockForestDataHandling.cpp index 1a75c13849263038235113f8500dc17c698fd361..9ff515cc4bc57f684e9649e35c6f05eb8c66c0b5 100644 --- a/src/mesa_pd/domain/BlockForestDataHandling.cpp +++ b/src/mesa_pd/domain/BlockForestDataHandling.cpp @@ -97,6 +97,7 @@ void BlockForestDataHandling::serialize( IBlock * const block, //skip globals if (data::particle_flags::isSet( pIt->getFlags(), data::particle_flags::GLOBAL)) continue; + pIt->getGhostOwnersRef().clear(); buffer << ParticleCopyNotification( *pIt ); ++numOfParticles; } @@ -140,6 +141,7 @@ void BlockForestDataHandling::serializeCoarseToFine( Block * const block, const if( childAABB.contains( pIt->getPosition()) ) { + pIt->getGhostOwnersRef().clear(); buffer << ParticleCopyNotification( *pIt ); ++numOfParticles; } @@ -164,6 +166,7 @@ void BlockForestDataHandling::serializeFineToCoarse( Block * const block, const //skip globals if (data::particle_flags::isSet( pIt->getFlags(), data::particle_flags::GLOBAL)) continue; + pIt->getGhostOwnersRef().clear(); buffer << ParticleCopyNotification( *pIt ); ++numOfParticles; } diff --git a/tests/mesa_pd/domain/SerializeDeserialize.cpp b/tests/mesa_pd/domain/SerializeDeserialize.cpp index 11d5431027eca1b821a3c2ac91238f7f6c882b16..76a8bfe86e26be902ec50a05995eac93dc81b1fd 100644 --- a/tests/mesa_pd/domain/SerializeDeserialize.cpp +++ b/tests/mesa_pd/domain/SerializeDeserialize.cpp @@ -20,42 +20,45 @@ #include <mesa_pd/data/DataTypes.h> #include <mesa_pd/domain/BlockForestDataHandling.h> +#include <mesa_pd/domain/BlockForestDomain.h> #include <mesa_pd/data/ParticleStorage.h> #include <mesa_pd/data/ShapeStorage.h> +#include <mesa_pd/mpi/SyncNextNeighbors.h> #include <blockforest/Initialization.h> #include <core/debug/TestSubsystem.h> +#include <core/Environment.h> #include <core/grid_generator/SCIterator.h> #include <core/mpi/Reduce.h> #include <core/logging/Logging.h> namespace walberla { - -using namespace walberla::mesa_pd; +namespace mesa_pd { void createDump() { const real_t spacing = real_c(1); - const real_t radius = real_c(0.5); + const real_t radius = real_c(0.5); WALBERLA_LOG_INFO_ON_ROOT("*** MESA_PD ***"); auto ps = std::make_shared<data::ParticleStorage>(100); auto ss = std::make_shared<data::ShapeStorage>(); - auto smallSphere = ss->create<data::Sphere>( radius ); + auto smallSphere = ss->create<data::Sphere>(radius); ss->shapes[smallSphere]->updateMassAndInertia(real_t(2707)); WALBERLA_LOG_INFO_ON_ROOT("*** BLOCKFOREST ***"); // create forest - auto forest = blockforest::createBlockForest( math::AABB(real_t(0), - real_t(0), - real_t(0), - real_t(6), - real_t(6), - real_t(6)), - Vector3<uint_t>(2,2,2), - Vector3<bool>(true, true, true) ); + auto forest = blockforest::createBlockForest(math::AABB(real_t(0), + real_t(0), + real_t(0), + real_t(6), + real_t(6), + real_t(6)), + Vector3<uint_t>(2, 2, 2), + Vector3<bool>(true, true, true)); forest->saveToFile("SerializeDeserialize.sbf"); + domain::BlockForestDomain domain(forest); auto bfDataHandlingID = forest->addBlockData(domain::createBlockForestDataHandling(ps), "BFDataHandling"); @@ -65,61 +68,68 @@ void createDump() //add one global particle { auto p = ps->create(); - p->setPosition( Vec3(real_t(1)) ); - data::particle_flags::set( p->getFlagsRef(), data::particle_flags::GLOBAL); - p->setInteractionRadius( radius ); - p->setShapeID( smallSphere ); + p->setPosition(Vec3(real_t(1))); + data::particle_flags::set(p->getFlagsRef(), data::particle_flags::GLOBAL); + data::particle_flags::set(p->getFlagsRef(), data::particle_flags::NON_COMMUNICATING); + p->setInteractionRadius(radius); + p->setShapeID(smallSphere); + p->setOwner(walberla::mpi::MPIManager::instance()->rank()); } - for (auto& iBlk : *forest) + for (auto &iBlk : *forest) { - for (auto pt : grid_generator::SCGrid(iBlk.getAABB(), Vector3<real_t>(spacing, spacing, spacing) * real_c(0.5), spacing)) + for (auto pt : grid_generator::SCGrid(iBlk.getAABB(), Vector3<real_t>(spacing, spacing, spacing) * real_c(0.2), + spacing)) { WALBERLA_CHECK(iBlk.getAABB().contains(pt)); - auto p = ps->create(); - p->setPosition( pt ); - p->setInteractionRadius( radius ); - p->setShapeID( smallSphere ); - p->setOwner( mpi::MPIManager::instance()->rank() ); + auto p = ps->create(); + p->setPosition(pt); + p->setInteractionRadius(radius); + p->setShapeID(smallSphere); + p->setOwner(walberla::mpi::MPIManager::instance()->rank()); } } int64_t numParticles = int64_c(ps->size()); - mpi::reduceInplace(numParticles, mpi::SUM); + walberla::mpi::reduceInplace(numParticles, walberla::mpi::SUM); WALBERLA_LOG_INFO_ON_ROOT("#particles created: " << numParticles); WALBERLA_LOG_INFO_ON_ROOT("*** SETUP - END ***"); - WALBERLA_CHECK_EQUAL( ps->size(), 28 ); + WALBERLA_CHECK_EQUAL(ps->size(), 28); + + mesa_pd::mpi::SyncNextNeighbors SNN; + SNN(*ps, domain); WALBERLA_LOG_DEVEL_ON_ROOT("dumping simulation"); forest->saveBlockData("SerializeDeserialize.dump", bfDataHandlingID); - - WALBERLA_CHECK_EQUAL( ps->size(), 28 ); } void checkDump() { const real_t spacing = real_c(1); - const real_t radius = real_c(0.5); + const real_t radius = real_c(0.5); WALBERLA_LOG_INFO_ON_ROOT("*** MESA_PD ***"); auto ps = std::make_shared<data::ParticleStorage>(100); auto ss = std::make_shared<data::ShapeStorage>(); - auto smallSphere = ss->create<data::Sphere>( radius ); + auto smallSphere = ss->create<data::Sphere>(radius); ss->shapes[smallSphere]->updateMassAndInertia(real_t(2707)); WALBERLA_LOG_INFO_ON_ROOT("*** BLOCKFOREST ***"); - auto forest = make_shared< BlockForest >( uint_c( MPIManager::instance()->rank() ), "SerializeDeserialize.sbf", true, false ); + auto forest = make_shared<BlockForest>(uint_c(walberla::mpi::MPIManager::instance()->rank()), + "SerializeDeserialize.sbf", true, false); + domain::BlockForestDomain domain(forest); //add one global particle { auto p = ps->create(); - p->setPosition( Vec3(real_t(1)) ); - data::particle_flags::set( p->getFlagsRef(), data::particle_flags::GLOBAL); - p->setInteractionRadius( radius ); - p->setShapeID( smallSphere ); + p->setPosition(Vec3(real_t(1))); + data::particle_flags::set(p->getFlagsRef(), data::particle_flags::GLOBAL); + data::particle_flags::set(p->getFlagsRef(), data::particle_flags::NON_COMMUNICATING); + p->setInteractionRadius(radius); + p->setShapeID(smallSphere); } WALBERLA_CHECK_EQUAL(ps->size(), 1); @@ -128,9 +138,10 @@ void checkDump() WALBERLA_LOG_INFO_ON_ROOT("*** CHECKING ***"); auto pIt = ++ps->begin(); - for (auto& iBlk : *forest) + for (auto &iBlk : *forest) { - for (auto pt : grid_generator::SCGrid(iBlk.getAABB(), Vector3<real_t>(spacing, spacing, spacing) * real_c(0.5), spacing)) + for (auto pt : grid_generator::SCGrid(iBlk.getAABB(), Vector3<real_t>(spacing, spacing, spacing) * real_c(0.2), + spacing)) { WALBERLA_CHECK(iBlk.getAABB().contains(pt)); WALBERLA_CHECK_UNEQUAL(pIt, ps->end()); //still particles left @@ -139,16 +150,16 @@ void checkDump() } } WALBERLA_CHECK_EQUAL(pIt, ps->end()); //all particles have been checked + + mesa_pd::mpi::SyncNextNeighbors SNN; + SNN(*ps, domain); } -int main( int argc, char ** argv ) +int main(int argc, char **argv) { walberla::debug::enterTestMode(); - - WALBERLA_MPI_SECTION() - { - walberla::MPIManager::instance()->initializeMPI( &argc, &argv ); - } + Environment env(argc, argv); + WALBERLA_UNUSED(env); WALBERLA_LOG_DEVEL_ON_ROOT("*** DUMPING ***"); createDump(); @@ -161,9 +172,10 @@ int main( int argc, char ** argv ) return EXIT_SUCCESS; } +} //namespace mesa_pd } // namespace walberla int main( int argc, char* argv[] ) { - return walberla::main( argc, argv ); + return walberla::mesa_pd::main( argc, argv ); }