From b3022689e512a544e7994cf615fcc085282b180f Mon Sep 17 00:00:00 2001
From: Sven Marcus <s.marcus@outlook.de>
Date: Wed, 14 Apr 2021 15:26:15 +0200
Subject: [PATCH] Fix bug in Simulation where SetConnectorsBlockVisitor was
 called twice

---
 Python/SlurmTests/poiseuille/settings.py      |  4 +-
 .../include/simulationconfig/Simulation.h     |  6 ++
 src/cpu/simulationconfig/src/Simulation.cpp   | 82 ++++++++++---------
 3 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/Python/SlurmTests/poiseuille/settings.py b/Python/SlurmTests/poiseuille/settings.py
index 5e4371f0a..e9480eb79 100644
--- a/Python/SlurmTests/poiseuille/settings.py
+++ b/Python/SlurmTests/poiseuille/settings.py
@@ -6,8 +6,8 @@ from pyfluids.parameters import RuntimeParameters, GridParameters, PhysicalParam
 
 grid_params = GridParameters()
 grid_params.node_distance = 1
-grid_params.number_of_nodes_per_direction = [2, 2, 16]
-grid_params.blocks_per_direction = [1, 1, 16]
+grid_params.number_of_nodes_per_direction = [1, 1, 16]
+grid_params.blocks_per_direction = [1, 1, 8]
 grid_params.periodic_boundary_in_x1 = True
 grid_params.periodic_boundary_in_x2 = True
 
diff --git a/src/cpu/simulationconfig/include/simulationconfig/Simulation.h b/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
index f145cb546..4bf800c23 100644
--- a/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
+++ b/src/cpu/simulationconfig/include/simulationconfig/Simulation.h
@@ -86,6 +86,12 @@ private:
 
 
     void setKernelForcing(const std::shared_ptr<LBMKernel> &kernel, std::shared_ptr<LBMUnitConverter> &converter) const;
+
+    void setConnectors();
+
+    void initializeDistributions();
+
+    std::shared_ptr<CoProcessor> makeNupsCoProcessor() const;
 };
 
 #endif
\ No newline at end of file
diff --git a/src/cpu/simulationconfig/src/Simulation.cpp b/src/cpu/simulationconfig/src/Simulation.cpp
index 2d5bae329..2ac83701c 100644
--- a/src/cpu/simulationconfig/src/Simulation.cpp
+++ b/src/cpu/simulationconfig/src/Simulation.cpp
@@ -115,7 +115,6 @@ void Simulation::run()
     auto gridCube = makeSimulationBoundingBox();
 
     generateBlockGrid(gridCube);
-
     setKernelForcing(lbmKernel, converter);
     setBoundaryConditionProcessor(lbmKernel);
 
@@ -129,41 +128,18 @@ void Simulation::run()
 
     intHelper.selectBlocks();
 
-
     int numberOfProcesses = communicator->getNumberOfProcesses();
     SetKernelBlockVisitor kernelVisitor(lbmKernel, physicalParameters->latticeViscosity,
                                         numberOfProcesses);
     grid->accept(kernelVisitor);
     intHelper.setBC();
 
-//    double bulkViscosity = physicalParameters->latticeViscosity * physicalParameters->bulkViscosityFactor;
-    //auto iProcessor = std::make_shared<CompressibleOffsetMomentsInterpolationProcessor>();
-    //iProcessor->setBulkViscosity(physicalParameters->latticeViscosity, bulkViscosity);
-
-//    SetConnectorsBlockVisitor setConnsVisitor(communicator, true,
-//                                              lbmSystem->getNumberOfDirections(),
-//                                              physicalParameters->latticeViscosity, iProcessor);
-
-    OneDistributionSetConnectorsBlockVisitor setConnsVisitor(communicator);
-    grid->accept(setConnsVisitor);
 
-    InitDistributionsBlockVisitor initVisitor;
-    grid->accept(initVisitor);
-    grid->accept(setConnsVisitor);
+    writeBlocksToFile(); // important: run this after metis & intHelper.selectBlocks()
+    setConnectors();
+    initializeDistributions();
     grid->accept(bcVisitor);
-
     writeBoundaryConditions();
-    // important: run this after metis & intHelper.selectBlocks()
-    writeBlocksToFile();
-
-    auto visualizationScheduler = std::make_shared<UbScheduler>(simulationParameters->timeStepLogInterval);
-    auto mqCoProcessor = makeMacroscopicQuantitiesCoProcessor(converter,
-                                                              visualizationScheduler);
-
-    std::shared_ptr<UbScheduler> nupsScheduler(new UbScheduler(100, 100));
-    std::shared_ptr<CoProcessor> nupsCoProcessor(
-            new NUPSCounterCoProcessor(grid, nupsScheduler, simulationParameters->numberOfThreads, communicator));
-
 
 #ifdef _OPENMP
     omp_set_num_threads(simulationParameters->numberOfThreads);
@@ -171,6 +147,12 @@ void Simulation::run()
         UBLOG(logINFO, "OpenMP is set to run with " << simulationParameters->numberOfThreads << " threads")
 #endif
 
+    auto visualizationScheduler = std::make_shared<UbScheduler>(simulationParameters->timeStepLogInterval);
+    auto mqCoProcessor = makeMacroscopicQuantitiesCoProcessor(converter,
+                                                              visualizationScheduler);
+
+    auto nupsCoProcessor = makeNupsCoProcessor();
+
     auto calculator = std::make_shared<BasicCalculator>(grid, visualizationScheduler,
                                                         simulationParameters->numberOfTimeSteps);
     calculator->addCoProcessor(nupsCoProcessor);
@@ -234,18 +216,7 @@ Simulation::makeLBMUnitConverter()
     return std::make_shared<LBMUnitConverter>();
 }
 
-std::shared_ptr<CoProcessor>
-Simulation::makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
-                                                 const std::shared_ptr<UbScheduler> &visualizationScheduler) const
-{
-    auto mqCoProcessor = std::make_shared<WriteMacroscopicQuantitiesCoProcessor>(grid, visualizationScheduler,
-                                                                                 writerConfig.outputPath,
-                                                                                 writerConfig.getWriter(),
-                                                                                 converter,
-                                                                                 communicator);
-    mqCoProcessor->process(0);
-    return mqCoProcessor;
-}
+
 
 void Simulation::writeBoundaryConditions() const
 {
@@ -287,5 +258,38 @@ Simulation::makeSimulationBoundingBox()
     return gridCube;
 }
 
+void Simulation::setConnectors()
+{
+    OneDistributionSetConnectorsBlockVisitor setConnsVisitor(communicator);
+    grid->accept(setConnsVisitor);
+}
+
+void Simulation::initializeDistributions()
+{
+    InitDistributionsBlockVisitor initVisitor;
+    grid->accept(initVisitor);
+}
+
+std::shared_ptr<CoProcessor>
+Simulation::makeMacroscopicQuantitiesCoProcessor(const std::shared_ptr<LBMUnitConverter> &converter,
+                                                 const std::shared_ptr<UbScheduler> &visualizationScheduler) const
+{
+    auto mqCoProcessor = std::make_shared<WriteMacroscopicQuantitiesCoProcessor>(grid, visualizationScheduler,
+                                                                                 writerConfig.outputPath,
+                                                                                 writerConfig.getWriter(),
+                                                                                 converter,
+                                                                                 communicator);
+    mqCoProcessor->process(0);
+    return mqCoProcessor;
+}
+
+std::shared_ptr<CoProcessor> Simulation::makeNupsCoProcessor() const
+{
+    auto scheduler = std::make_shared<UbScheduler>(100, 100);
+    return std::make_shared<NUPSCounterCoProcessor>(grid, scheduler,
+                                                    simulationParameters->numberOfThreads,
+                                                    communicator);
+}
+
 
 Simulation::~Simulation() = default;
-- 
GitLab