From 7fc2ff66bab9372f34d051b860439fa637d0159e Mon Sep 17 00:00:00 2001
From: Grigorii Drozdov <drozd013@umn.edu>
Date: Thu, 22 Apr 2021 21:23:10 -0500
Subject: [PATCH] fix: reduce_to_root restart

---
 apps/benchmarks/CNT/01_cnt_film.cpp    |  4 +-
 apps/benchmarks/CNT/Config.cpp         |  5 ++-
 apps/benchmarks/CNT/InitializeCNTs.cpp | 51 ++++++++++++--------------
 apps/benchmarks/CNT/InitializeCNTs.h   |  3 +-
 4 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/apps/benchmarks/CNT/01_cnt_film.cpp b/apps/benchmarks/CNT/01_cnt_film.cpp
index 7d1cafd79..9714486f8 100644
--- a/apps/benchmarks/CNT/01_cnt_film.cpp
+++ b/apps/benchmarks/CNT/01_cnt_film.cpp
@@ -126,7 +126,7 @@ int main(int argc, char **argv)
       numParticles = generateCNTs(filmSpecimen, ps, *domain);
    } else
    {
-      numParticles = loadCNTs(filmSpecimen.initialConfigurationFile, ps);
+      numParticles = loadCNTs(filmSpecimen.initialConfigurationFile, ps, *domain);
    }
    walberla::mpi::reduceInplace(numParticles, walberla::mpi::SUM);
    WALBERLA_LOG_INFO_ON_ROOT("#particles created: " << numParticles);
@@ -304,7 +304,7 @@ int main(int argc, char **argv)
          WALBERLA_LOG_INFO_ON_ROOT(CYAN << "            SAVING CONFIG                  " << RESET);
          saveConfig(ps,
                     filmSpecimen.confFolder + "/conf_" + std::to_string((i + 1) * 0.00002) + "ns",
-                    IO_MODE::USE_MPI_IO);
+                    IO_MODE::REDUCE_TO_ROOT);
          loopTP["save config"].end();
       }
    }
diff --git a/apps/benchmarks/CNT/Config.cpp b/apps/benchmarks/CNT/Config.cpp
index ee19d2a97..17e3b0896 100644
--- a/apps/benchmarks/CNT/Config.cpp
+++ b/apps/benchmarks/CNT/Config.cpp
@@ -74,9 +74,10 @@ void saveConfig(const shared_ptr<data::ParticleStorage>& ps,
          WALBERLA_ROOT_SECTION()
          {
             uint_t dataSize = sizeof(mpi::RecvBuffer::ElementType) * rb.size();
+            size_t size     = rb.size() / 104;
             std::ofstream binfile;
-            binfile.open(filename + ".sav",
-                         std::ios::out | std::ios::binary);
+            binfile.open(filename + ".sav", std::ios::out | std::ios::binary);
+            binfile.write((char*) &size, sizeof(size_t));
             binfile.write(reinterpret_cast< const char * >(rb.ptr()), numeric_cast<std::streamsize>(dataSize));
             binfile.close();
          }
diff --git a/apps/benchmarks/CNT/InitializeCNTs.cpp b/apps/benchmarks/CNT/InitializeCNTs.cpp
index 9ca22484d..ff9d29996 100644
--- a/apps/benchmarks/CNT/InitializeCNTs.cpp
+++ b/apps/benchmarks/CNT/InitializeCNTs.cpp
@@ -116,7 +116,6 @@ int64_t generateCNTs(const FilmSpecimen& spec,
 {
    auto myRank = mpi::MPIManager::instance()->rank();
 
-   //auto CNT_length = 2_r * spec.spacing * real_c(spec.numSegs);
    // Fixed random seed is necessary for coordinated generation on all MPI proc.
    auto rand0_1 = math::RealRandom<real_t>(static_cast<std::mt19937::result_type>(spec.seed));
    // Create an assembly of CNTs
@@ -137,7 +136,8 @@ int64_t generateCNTs(const FilmSpecimen& spec,
 }
 
 int64_t loadCNTs(const std::string& filename,
-                 const shared_ptr<data::ParticleStorage>& ps)
+                 const shared_ptr<data::ParticleStorage>& ps,
+                 const domain::IDomain& domain)
 {
    WALBERLA_LOG_INFO_ON_ROOT(GREEN << "Loading configuration (binary format): " << filename);
    const auto numProcesses = mpi::MPIManager::instance()->numProcesses();
@@ -154,15 +154,13 @@ int64_t loadCNTs(const std::string& filename,
       if (i != rank) continue; //bad practice but with the current file format we have to do this
       std::ifstream binfile;
       binfile.open(filename.c_str(), std::ios::in | std::ios::binary);
-      int size;
-      binfile.read((char *) &size, sizeof(int));
+      size_t size;
+      binfile.read((char *) &size, sizeof(size_t));
       std::cout << RED << "size read form binary file is" << size << RESET << std::endl;
-      for (int id = 0; id < size; id++)
+      for (size_t id = 0; id < size; id++)
       {
-         int ID;
-         int sID;
-         int cID;
-         int gID;
+         int64_t sID;
+         int64_t cID;
          double x;
          double y;
          double z;
@@ -174,10 +172,8 @@ int64_t loadCNTs(const std::string& filename,
          double wx;
          double wy;
          double wz;
-         binfile.read((char *) &ID, sizeof(int));
-         binfile.read((char *) &sID, sizeof(int));
-         binfile.read((char *) &cID, sizeof(int));
-         binfile.read((char *) &gID, sizeof(int));
+         binfile.read((char *) &sID, sizeof(int64_t));
+         binfile.read((char *) &cID, sizeof(int64_t));
          binfile.read((char *) &x, sizeof(double));
          binfile.read((char *) &y, sizeof(double));
          binfile.read((char *) &z, sizeof(double));
@@ -194,25 +190,26 @@ int64_t loadCNTs(const std::string& filename,
          pos[1] = real_c(y);
          pos[2] = real_c(z);
 
-         data::Particle &&sp = *ps->create();
-         sp.setPosition(pos);
-         sp.setOwner(rank);
-         sp.setInteractionRadius(kernel::cnt::outer_radius);
-         sp.setSegmentID(sID);
-         sp.setClusterID(cID);
-         sp.getRotationRef().rotate( Vec3(0_r, 1_r, 0_r), -0.5_r * math::pi + real_c(theta));
-         sp.getRotationRef().rotate( Vec3(0_r, 0_r, 1_r), real_c(phi));
-         sp.setLinearVelocity( Vec3(real_c(vx), real_c(vy), real_c(vz)) );
-         sp.setAngularVelocity( Vec3(real_c(wx), real_c(wy), real_c(wz)) );
-         numParticles++;
+         if (domain.isContainedInProcessSubdomain(uint_c(rank), pos))
+         {
+            data::Particle&& sp = *ps->create();
+            sp.setPosition(pos);
+            sp.setOwner(rank);
+            sp.setInteractionRadius(kernel::cnt::outer_radius);
+            sp.setSegmentID(sID);
+            sp.setClusterID(cID);
+            sp.getRotationRef().rotate(Vec3(0_r, 1_r, 0_r), -0.5_r * math::pi + real_c(theta));
+            sp.getRotationRef().rotate(Vec3(0_r, 0_r, 1_r), real_c(phi));
+            sp.setLinearVelocity(Vec3(real_c(vx), real_c(vy), real_c(vz)));
+            sp.setAngularVelocity(Vec3(real_c(wx), real_c(wy), real_c(wz)));
+            numParticles++;
+         }
       }
    }
 
-   mpi::reduceInplace(numParticles, mpi::SUM);
-   WALBERLA_LOG_INFO_ON_ROOT("#particles created: " << numParticles);
-
    return numParticles;
 }
 
 } //namespace mesa_pd
 } //namespace walberla
+
diff --git a/apps/benchmarks/CNT/InitializeCNTs.h b/apps/benchmarks/CNT/InitializeCNTs.h
index f8a114eda..b916389e6 100644
--- a/apps/benchmarks/CNT/InitializeCNTs.h
+++ b/apps/benchmarks/CNT/InitializeCNTs.h
@@ -46,7 +46,8 @@ int64_t generateCNTs(const FilmSpecimen& spec,
                      const domain::IDomain& domain);
 
 int64_t loadCNTs(const std::string& filename,
-                 const shared_ptr<data::ParticleStorage>& ps);
+                 const shared_ptr<data::ParticleStorage>& ps,
+                 const domain::IDomain& domain);
 
 } //namespace mesa_pd
 } //namespace walberla
-- 
GitLab