From 40d8709d1e69bf866ea1bb232a55934598bf913d Mon Sep 17 00:00:00 2001
From: Dominik Schuster <dominik.schuster@cerfacs.fr>
Date: Wed, 12 Jun 2019 13:52:13 +0200
Subject: [PATCH] Fixed restart synchronization problem

---
 .../FluidizedBedMEM/FluidizedBedMEM.cpp       | 45 ++++++++++---------
 1 file changed, 25 insertions(+), 20 deletions(-)

diff --git a/apps/showcases/FluidizedBedMEM/FluidizedBedMEM.cpp b/apps/showcases/FluidizedBedMEM/FluidizedBedMEM.cpp
index 54c172d32..6963635d9 100644
--- a/apps/showcases/FluidizedBedMEM/FluidizedBedMEM.cpp
+++ b/apps/showcases/FluidizedBedMEM/FluidizedBedMEM.cpp
@@ -811,10 +811,6 @@ namespace fluidizedBed {
 
             WALBERLA_LOG_INFO_ON_ROOT("Initializing data from checkpoint file!");
 
-            WALBERLA_LOG_RESULT_ON_ROOT("Reading body from checkpoint file");
-
-            bodyStorageID = blocks->loadBlockData(checkpointPathBodies, pe::createStorageDataHandling<BodyTypeTuple>());
-
             WALBERLA_LOG_RESULT_ON_ROOT("Reading pdf from checkpoint file");
 
             shared_ptr<lbm::internal::PdfFieldHandling<LatticeModel_T> > pdfDataHandling =
@@ -823,6 +819,10 @@ namespace fluidizedBed {
             // add pdf field
             pdfFieldID = (blocks->getBlockStorage()).loadBlockData(checkpointPathPdf, pdfDataHandling, "pdf field (fzyx)");
 
+            WALBERLA_LOG_RESULT_ON_ROOT("Reading body from checkpoint file");
+
+            bodyStorageID = blocks->loadBlockData(checkpointPathBodies, pe::createStorageDataHandling<BodyTypeTuple>());
+
         } else {
 
             std::mt19937 rnd(MPIManager::instance()->rank());
@@ -912,12 +912,12 @@ namespace fluidizedBed {
                 mpi::allReduceInplace(numberCreatedParticlesA, mpi::SUM);
                 mpi::allReduceInplace(numberCreatedParticlesB, mpi::SUM);
             }
-/*
+
             WALBERLA_ROOT_SECTION() {
                 std::cout << "Number of created particles A is:     " << numberCreatedParticlesA << std::endl;
                 std::cout << "Number of created particles B is:     " << numberCreatedParticlesB << std::endl << std::endl;
             }
-*/
+
             ///////////////////
             // PACKED BED ////
             //////////////////
@@ -1064,8 +1064,6 @@ namespace fluidizedBed {
                                                    uint_t(1), field::fzyx);
         }
 
-        syncCall();
-
         // Communication scheme
         std::function<void()> commFunction;
 
@@ -1073,28 +1071,35 @@ namespace fluidizedBed {
         scheme.addPackInfo(make_shared<lbm::PdfFieldPackInfo<LatticeModel_T> >(pdfFieldID));
         commFunction = scheme;
 
-        commFunction();
-
-
         ////////////////////////
         // ADD DATA TO BLOCKS //
         ////////////////////////
 
+        // add flag field
+        BlockDataID flagFieldID = field::addFlagFieldToStorage<FlagField_T>(blocks, "flag field");
+
+        // add body field
+        BlockDataID bodyFieldID = field::addToStorage<BodyField_T>(blocks, "body field", NULL, field::fzyx);
+
+        std::function<void(void)> syncCall2 = std::bind(pe::syncNextNeighbors<BodyTypeTuple>, std::ref(blocks->getBlockForest()), bodyStorageID,
+                                                        static_cast<WcTimingTree *>(NULL), overlap, false);
+        syncCall2();
+
         for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt) {
             pe::ccd::ICCD* ccd = blockIt->getData<pe::ccd::ICCD>(ccdID);
             ccd->reloadBodies();
         }
 
-        for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt){
-            pe::ccd::ICCD *ccd = blockIt->getData<pe::ccd::ICCD>(ccdID);
-            std::cout << "Bodies: " << ccd->getObservedBodyCount() << std::endl ;
-        }
+        int numberSpheres = 0;
 
-        // add flag field
-        BlockDataID flagFieldID = field::addFlagFieldToStorage<FlagField_T>(blocks, "flag field");
+        for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt) {
+            for (auto bodyIt = pe::ShadowBodyIterator::begin(*blockIt, bodyStorageID); bodyIt != pe::ShadowBodyIterator::end(); ++bodyIt) {
+                if (bodyIt->isFixed() || !bodyIt->isFinite())
+                    continue;
 
-        // add body field
-        BlockDataID bodyFieldID = field::addToStorage<BodyField_T>(blocks, "body field", NULL, field::fzyx);
+                ++numberSpheres;
+            }
+        }
 
         // Object for keeping track of time
         shared_ptr<lbm::TimeTracker> timeTrack = make_shared<lbm::TimeTracker>();
@@ -1189,7 +1194,7 @@ namespace fluidizedBed {
 
         timeloop.addFuncAfterTimeStep(
                 makeSharedFunctor( field::makeStabilityChecker< lbm::PdfField< LatticeModel_T >, FlagField_T >(
-                        blocks, pdfFieldID, flagFieldID, FBfunc::Fluid_Flag, uint_t(1), true, true ) ), "LBM stability check" );
+                        blocks, pdfFieldID, flagFieldID, FBfunc::Fluid_Flag, uint_t(1), false, true ) ), "LBM stability check" );
 
         // sweep for updating the pe body mapping into the LBM simulation
         timeloop.add() << Sweep(
-- 
GitLab