From 38fe2972b4e95cf7ba7dd692d7bc2d864e013bfc Mon Sep 17 00:00:00 2001
From: Konstantin Kutscher <kutscher@irmb.tu-bs.de>
Date: Tue, 9 Apr 2019 13:56:36 +0200
Subject: [PATCH] fix MPIIOMigrationCoProcessor::readDataSet() issue

---
 source/Applications/LaminarTubeFlow/ltf.cpp   | 66 +++++++------------
 .../MPIIOMigrationCoProcessor.cpp             |  1 +
 .../Visitors/SetUndefinedNodesBlockVisitor.h  |  2 +-
 3 files changed, 24 insertions(+), 45 deletions(-)

diff --git a/source/Applications/LaminarTubeFlow/ltf.cpp b/source/Applications/LaminarTubeFlow/ltf.cpp
index 00e05aea7..8b1577853 100644
--- a/source/Applications/LaminarTubeFlow/ltf.cpp
+++ b/source/Applications/LaminarTubeFlow/ltf.cpp
@@ -13,7 +13,7 @@ void run(string configname)
       ConfigurationFile   config;
       config.load(configname);
 
-      string          pathname = config.getString("pathname");
+      string          pathname = config.getValue<string>("pathname");
       int             numOfThreads = config.getValue<int>("numOfThreads");
       vector<int>     blocknx = config.getVector<int>("blocknx");
       double          uLB = config.getValue<double>("uLB");
@@ -90,11 +90,21 @@ void run(string configname)
 
       SPtr<Grid3D> grid(new Grid3D(comm));
 
+      SPtr<BCProcessor> bcProc;
+      bcProc = SPtr<BCProcessor>(new BCProcessor());
+
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
+      double bulckViscosity = 3700*nuLB;
+      dynamicPointerCast<CompressibleCumulant4thOrderViscosityLBMKernel>(kernel)->setBulkViscosity(bulckViscosity);
+      kernel->setBCProcessor(bcProc);
+      kernel->setBCProcessor(bcProc);
+
       //////////////////////////////////////////////////////////////////////////
       //restart
-      SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart));
-      //RestartCoProcessor rp(grid, rSch, comm, pathname, RestartCoProcessor::TXT);
-      MPIIORestartCoProcessor rcp(grid, rSch, pathname, comm);
+      SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
+      SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, pathname + "/mig", comm));
+      migCoProcessor->setLBMKernel(kernel);
+      migCoProcessor->setBCProcessor(bcProc);
       //////////////////////////////////////////////////////////////////////////
 
       if (newStart)
@@ -187,14 +197,11 @@ void run(string configname)
          SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
          velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
          //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
-
-
          SPtr<D3Q27Interactor> inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter, Interactor3D::SOLID));
 
          //outflow
          SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID));
 
-
          SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B));
          InteractorsHelper intHelper(grid, metisVisitor);
          intHelper.addInteractor(cylinderInt);
@@ -202,7 +209,6 @@ void run(string configname)
          intHelper.addInteractor(outflowInt);
          intHelper.selectBlocks();
 
-
          ppblocks->process(0);
          ppblocks.reset();
 
@@ -231,17 +237,6 @@ void run(string configname)
             UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
          }
 
-         SPtr<LBMKernel> kernel;
-
-         kernel = SPtr<LBMKernel>(new IncompressibleCumulantLBMKernel());
-         //kernel = SPtr<LBMKernel>(new CompressibleCumulantLBMKernel());
-
-         //
-         SPtr<BCProcessor> bcProc(new BCProcessor());
-         //SPtr<BCProcessor> bcProc(new ThinWallBCProcessor());
-
-         kernel->setBCProcessor(bcProc);
-
          SetKernelBlockVisitor kernelVisitor(kernel, nuLB, availMem, needMem);
          grid->accept(kernelVisitor);
 
@@ -262,18 +257,6 @@ void run(string configname)
          //initVisitor.setVx1(uLB);
          grid->accept(initVisitor);
 
-         //set connectors
-         InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor());
-         //InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor());
-         SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
-         //SPtr<ConnectorFactory> factory(new Block3DConnectorFactory());
-         //ConnectorBlockVisitor setConnsVisitor(comm, nuLB, iProcessor, factory);
-         grid->accept(setConnsVisitor);
-
-         //domain decomposition for threads
-         PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads);
-         grid->accept(pqPartVisitor);
-
          //boundary conditions grid
          {
             SPtr<UbScheduler> geoSch(new UbScheduler(1));
@@ -299,23 +282,17 @@ void run(string configname)
             UBLOG(logINFO, "path = " << pathname);
          }
 
-         rcp.restart((int)restartStep);
+         migCoProcessor->restart((int)restartStep);
          grid->setTimeStep(restartStep);
 
-         SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter());
-         velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
-         //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
-         bcVisitor.addBC(velBCAdapter);
-         grid->accept(bcVisitor);
-
-         //set connectors
-         InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor());
-         //InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor());
-         SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
-         grid->accept(setConnsVisitor);
-
          if (myid == 0) UBLOG(logINFO, "Restart - end");
       }
+
+      SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor());
+      dynamicPointerCast<CompressibleOffsetMomentsInterpolationProcessor>(iProcessor)->setBulkViscosity(nuLB, bulckViscosity);
+      SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor);
+      grid->accept(setConnsVisitor);
+
       SPtr<UbScheduler> visSch(new UbScheduler(outTime));
       SPtr<CoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlASCII::getInstance(), conv, comm));
 
@@ -327,6 +304,7 @@ void run(string configname)
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
       calculator->addCoProcessor(npr);
       calculator->addCoProcessor(pp);
+      calculator->addCoProcessor(migCoProcessor);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
       calculator->calculate();
diff --git a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
index cd8e490ce..4240eec8e 100644
--- a/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
+++ b/source/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp
@@ -1752,6 +1752,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step)
       SPtr<Block3D> block = grid->getBlock(dataSetArray[n].globalID);
       //std::cout << "rank="<<rank<<", dataSetArray[n].globalID=" << dataSetArray[n].globalID << std::endl;
 
+      this->lbmKernel->setBlock(block);
       SPtr<LBMKernel> kernel = this->lbmKernel->clone();
       kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth);
       kernel->setCollisionFactor(dataSetArray[n].collFactor);
diff --git a/source/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.h b/source/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.h
index b4fc9f37b..9c47ca3e9 100644
--- a/source/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.h
+++ b/source/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.h
@@ -12,7 +12,7 @@ class BCArray3D;
 class SetUndefinedNodesBlockVisitor : public Block3DVisitor
 {
 public:
-   SetUndefinedNodesBlockVisitor(bool twoTypeOfConnectorsCheck);
+   SetUndefinedNodesBlockVisitor(bool twoTypeOfConnectorsCheck=true);
 
    virtual ~SetUndefinedNodesBlockVisitor() {}
 
-- 
GitLab