From f56740f8f1f2dcd14a1dacaf67605ca73a0de318 Mon Sep 17 00:00:00 2001
From: "LEGOLAS\\lenz" <lenz@irmb.tu-bs.de>
Date: Wed, 17 Oct 2018 10:55:01 +0200
Subject: [PATCH] enables Multi GPU Grid generation with solid and multiple
 levels

---
 .../grid/BoundaryConditions/Side.cpp          |   4 +-
 src/GridGenerator/grid/Grid.h                 |   2 +
 .../grid/GridBuilder/MultipleGridBuilder.cpp  |   6 +-
 src/GridGenerator/grid/GridImp.cu             |  48 ++++--
 src/GridGenerator/grid/GridImp.h              |   2 +
 src/GridGenerator/grid/GridInterface.cu       |  65 ++++++++
 src/GridGenerator/grid/GridInterface.h        |   4 +-
 src/GridGenerator/grid/GridMocks.h            |   2 +
 .../SimulationFileWriter.cpp                  |  31 ++--
 targets/apps/HULC/main.cpp                    | 153 +++++++++---------
 10 files changed, 218 insertions(+), 99 deletions(-)

diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
index 7c44a4f43..9955efbd0 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -9,9 +9,9 @@
 void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant,
                       real startInner, real endInner, real startOuter, real endOuter)
 {
-    for (real v1 = startInner; v1 <= endInner; v1 += grid->getDelta())
+    for (real v2 = startOuter; v2 <= endOuter; v2 += grid->getDelta())
     {
-        for (real v2 = startOuter; v2 <= endOuter; v2 += grid->getDelta())
+        for (real v1 = startInner; v1 <= endInner; v1 += grid->getDelta())
         {
             const uint index = getIndex(grid, coord, constant, v1, v2);
 
diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index b5e42562a..a4cc4ae78 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -81,6 +81,8 @@ public:
 
     HOST virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) = 0;
 
+    HOST virtual void repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid) = 0;
+
     HOST virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) = 0;
     
     HOST virtual void enableFindSolidBoundaryNodes() = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index 3786bcfb0..8dc882f4f 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -471,7 +471,6 @@ void MultipleGridBuilder::buildGrids( LbmOrGks lbmOrGks, bool enableThinWalls )
         *logging::out << logging::Logger::INFO_INTERMEDIATE << "Done with Q Computation\n";
     }
 
-
     for (size_t i = 0; i < grids.size() - 1; i++)
         grids[i]->findGridInterface(grids[i + 1], lbmOrGks);
 
@@ -479,6 +478,9 @@ void MultipleGridBuilder::buildGrids( LbmOrGks lbmOrGks, bool enableThinWalls )
         for (size_t i = 0; i < grids.size(); i++)
             grids[i]->limitToSubDomain( this->subDomainBox );
 
+    for (size_t i = 0; i < grids.size() - 1; i++)
+        grids[i]->repairGridInterfaceOnMultiGPU(grids[i + 1]);
+
 	if (lbmOrGks == LBM) {
 		for (size_t i = 0; i < grids.size() - 1; i++)
 			grids[i]->findSparseIndices(grids[i + 1]);
@@ -524,10 +526,12 @@ void MultipleGridBuilder::writeGridsToVtk(const std::string& path) const
         ss << path << level << ".vtk";
 
         GridVTKWriter::writeGridToVTKXML(grids[level], ss.str());
+
         //if( level != 0 )
         //    GridVTKWriter::writeInterpolationCellsToVTKXML(grids[level], grids[level-1], ss.str() + ".InterpolationCells");
         //else
         //    GridVTKWriter::writeInterpolationCellsToVTKXML(grids[level], nullptr       , ss.str() + ".InterpolationCells");
+
         //GridVTKWriter::writeSparseGridToVTK(grids[level], ss.str());
     }
 }
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 4b79998e5..57450a7ba 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -833,7 +833,7 @@ HOSTDEVICE void GridImp::setNeighborIndices(uint index)
         this->setStopperNeighborCoords(index);
         return;
     }
-
+     
     if (this->sparseIndices[index] == -1)
         return;
 
@@ -975,6 +975,11 @@ HOST void GridImp::findGridInterface(SPtr<Grid> finerGrid, LbmOrGks lbmOrGks)
     gridStrategy->findGridInterface(shared_from_this(), std::static_pointer_cast<GridImp>(finerGrid), lbmOrGks);
 }
 
+HOSTDEVICE void GridImp::repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid)
+{
+    this->gridInterface->repairGridInterfaceOnMultiGPU( shared_from_this(), std::static_pointer_cast<GridImp>(fineGrid) );
+}
+
 HOST void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox)
 {
     for( uint index = 0; index < this->size; index++ ){
@@ -982,13 +987,28 @@ HOST void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox)
         real x, y, z;
         this->transIndexToCoords( index, x, y, z );
 
-        BoundingBox tmpSubDomainBox = *subDomainBox;
+        {
+            BoundingBox tmpSubDomainBox = *subDomainBox;
+
+            // one layer for receive nodes and one for stoppers
+            tmpSubDomainBox.extend(this->delta);
+
+            if (!tmpSubDomainBox.isInside(x, y, z))
+                this->setFieldEntry(index, STOPPER_OUT_OF_GRID_BOUNDARY);
+        }
+
+        {
+            BoundingBox tmpSubDomainBox = *subDomainBox;
 
-        tmpSubDomainBox.extend(this->delta);
+            // one layer for receive nodes and one for stoppers
+            tmpSubDomainBox.extend(2.0 * this->delta);
 
-        if( !tmpSubDomainBox.isInside(x,y,z) )
-            this->setFieldEntry(index, INVALID_OUT_OF_GRID);
+            if (!tmpSubDomainBox.isInside(x, y, z))
+                this->setFieldEntry(index, INVALID_OUT_OF_GRID);
+        }
     }
+
+    //this->gridStrategy->findEndOfGridStopperNodes(shared_from_this());
 }
 
 HOSTDEVICE void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid, LbmOrGks lbmOrGks)
@@ -1343,7 +1363,11 @@ void GridImp::findCommunicationIndices(int direction, SPtr<BoundingBox> subDomai
     
         if( this->getFieldEntry(index) == INVALID_OUT_OF_GRID ||
             this->getFieldEntry(index) == INVALID_SOLID ||
-            this->getFieldEntry(index) == INVALID_COARSE_UNDER_FINE ) continue;
+            this->getFieldEntry(index) == INVALID_COARSE_UNDER_FINE ||
+            this->getFieldEntry(index) == STOPPER_SOLID ||
+            this->getFieldEntry(index) == STOPPER_OUT_OF_GRID ||
+            this->getFieldEntry(index) == STOPPER_OUT_OF_GRID_BOUNDARY ||
+            this->getFieldEntry(index) == STOPPER_COARSE_UNDER_FINE ) continue;
 
         if( direction == CommunicationDirections::MX ) findCommunicationIndex( index, x, subDomainBox->minX, direction);
         if( direction == CommunicationDirections::PX ) findCommunicationIndex( index, x, subDomainBox->maxX, direction);
@@ -1361,12 +1385,18 @@ void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, i
 
     if( vf::Math::equal( coordinate, limit + s * 0.5 * this->delta, 0.01 * this->delta ) ){
         this->communicationIndices[direction].receiveIndices.push_back(index);
-        this->setFieldEntry(index, MULTI_GPU_RECIEVE);
+        //this->setFieldEntry(index, MULTI_GPU_RECIEVE);
+        //this->setFieldEntry(index, STOPPER_OUT_OF_GRID_BOUNDARY);
     }
     if( vf::Math::equal( coordinate, limit - s * 0.5 * this->delta, 0.01 * this->delta ) ){
         this->communicationIndices[direction].sendIndices.push_back(index);
-        this->setFieldEntry(index, MULTI_GPU_SEND);
-    }  
+        //this->setFieldEntry(index, MULTI_GPU_SEND);
+    }    
+
+    //if( vf::Math::equal( coordinate, limit + s * 1.5 * this->delta, 0.01 * this->delta ) ){
+    //    //this->setFieldEntry(index, MULTI_GPU_RECIEVE);
+    //    this->setFieldEntry(index, STOPPER_OUT_OF_GRID_BOUNDARY);
+    //}
 }
 
 uint GridImp::getNumberOfSendNodes(int direction)
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index caba6d8f0..8a78aeaf3 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -107,6 +107,8 @@ public:
 
     HOST virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) override;
 
+    HOST void repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid) override;
+
     HOST virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) override;
 
     HOST void freeMemory() override;
diff --git a/src/GridGenerator/grid/GridInterface.cu b/src/GridGenerator/grid/GridInterface.cu
index a1ebb2bd3..732203eee 100644
--- a/src/GridGenerator/grid/GridInterface.cu
+++ b/src/GridGenerator/grid/GridInterface.cu
@@ -240,6 +240,71 @@ void GridInterface::findForGridInterfaceSparseIndexFC(GridImp* coarseGrid, GridI
     findSparseIndex(fc.fine, fineGrid, index);
 }
 
+HOST void VF_PUBLIC GridInterface::repairGridInterfaceOnMultiGPU(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid)
+{
+    {
+        std::vector<uint> tmpCFC;
+        std::vector<uint> tmpCFF;
+        std::vector<uint> tmpCFOffset;
+
+        for (uint index = 0; index < cf.numberOfEntries; index++) {
+
+            real x, y, z;
+            coarseGrid->transIndexToCoords(this->cf.coarse[index], x, y, z);
+            if (coarseGrid->cellContainsOnly(Cell(x, y, z, coarseGrid->getDelta()), FLUID_CFC)) {
+                tmpCFC.push_back     (this->cf.coarse[index]);
+                tmpCFF.push_back     (this->cf.fine[index]);
+                tmpCFOffset.push_back(this->cf.offset[index]);
+            }
+        }
+
+        delete[] cf.coarse;
+        delete[] cf.fine;
+        delete[] cf.offset;
+
+        cf.numberOfEntries = tmpCFC.size();
+
+        cf.coarse = new uint[cf.numberOfEntries];
+        cf.fine   = new uint[cf.numberOfEntries];
+        cf.offset = new uint[cf.numberOfEntries];
+
+        memcpy(cf.coarse, tmpCFC.data()     , sizeof(uint)*cf.numberOfEntries);
+        memcpy(cf.fine  , tmpCFF.data()     , sizeof(uint)*cf.numberOfEntries);
+        memcpy(cf.offset, tmpCFOffset.data(), sizeof(uint)*cf.numberOfEntries);
+    }
+
+    {
+        std::vector<uint> tmpFCF;
+        std::vector<uint> tmpFCC;
+        std::vector<uint> tmpFCOffset;
+
+        for (uint index = 0; index < fc.numberOfEntries; index++) {
+
+            real x, y, z;
+            fineGrid->transIndexToCoords(this->fc.fine[index], x, y, z);
+            if (fineGrid->cellContainsOnly(Cell(x, y, z, fineGrid->getDelta()), FLUID_FCF)) {
+                tmpFCF.push_back     (this->fc.fine[index]);
+                tmpFCC.push_back     (this->fc.coarse[index]);
+                tmpFCOffset.push_back(this->fc.offset[index]);
+            }
+        }
+        
+        delete[] fc.fine;
+        delete[] fc.coarse;
+        delete[] fc.offset;
+
+        fc.numberOfEntries = tmpFCC.size();
+        
+        fc.fine   = new uint[fc.numberOfEntries];
+        fc.coarse = new uint[fc.numberOfEntries];
+        fc.offset = new uint[fc.numberOfEntries];
+        
+        memcpy(fc.fine  , tmpFCF.data()     , sizeof(uint)*fc.numberOfEntries);
+        memcpy(fc.coarse, tmpFCC.data()     , sizeof(uint)*fc.numberOfEntries);
+        memcpy(fc.offset, tmpFCOffset.data(), sizeof(uint)*fc.numberOfEntries);
+    }
+}
+
 void GridInterface::findSparseIndex(uint* indices, GridImp* grid, uint index)
 {
     const uint matrixIndex = indices[index];
diff --git a/src/GridGenerator/grid/GridInterface.h b/src/GridGenerator/grid/GridInterface.h
index ad6220e08..8dfd294f6 100644
--- a/src/GridGenerator/grid/GridInterface.h
+++ b/src/GridGenerator/grid/GridInterface.h
@@ -5,7 +5,7 @@
 #include "VirtualFluidsDefinitions.h"
 #include "utilities/cuda/cudaDefines.h"
 
-
+#include "core/PointerDefinitions.h"
 
 class GridImp;
 
@@ -27,6 +27,8 @@ public:
     HOSTDEVICE void VF_PUBLIC findForGridInterfaceSparseIndexCF(GridImp* coarseGrid, GridImp* fineGrid, uint index);
     HOSTDEVICE void VF_PUBLIC findForGridInterfaceSparseIndexFC(GridImp* coarseGrid, GridImp* fineGrid, uint index);
 
+    HOST void VF_PUBLIC repairGridInterfaceOnMultiGPU(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid);
+
     HOSTDEVICE void VF_PUBLIC print() const;
 
     struct Interface
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index 0b336eaa0..0ab49bcfa 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -62,6 +62,8 @@ public:
 
     virtual void findGridInterface(SPtr<Grid> grid, LbmOrGks lbmOrGks) override {}
     
+    virtual void repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid) override {}
+
     virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) override {}
 
     virtual void enableFindSolidBoundaryNodes() override {}
diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
index 5b4481df6..a03156066 100644
--- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
+++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
@@ -492,25 +492,26 @@ void SimulationFileWriter::writeBoundaryQsFile(SPtr<GridBuilder> builder)
             
             auto bc = builder->getBoundaryCondition( sides[side], level );
 
-            if( !bc ){
-                *valueStreams[side] << "noSlip\n" << "0\n" << "0\n";
-                *qStreams[side]     <<               "0\n" << "0\n";
-                continue;
-            }
-
             if( level == 0 ){
             
-                if( bc->getType() == BC_PRESSURE ) *valueStreams[side] << "pressure\n";
-                if( bc->getType() == BC_VELOCITY ) *valueStreams[side] << "velocity\n";
-                if( bc->getType() == BC_SOLID    ) *valueStreams[side] << "noSlip\n";
-                if( bc->getType() == BC_SLIP     ) *valueStreams[side] << "slip\n";
-                if( bc->getType() == BC_OUTFLOW  ) *valueStreams[side] << "outflow\n";
+                if     ( !bc )                          *valueStreams[side] << "noSlip\n";
+                else if( bc->getType() == BC_PRESSURE ) *valueStreams[side] << "pressure\n";
+                else if( bc->getType() == BC_VELOCITY ) *valueStreams[side] << "velocity\n";
+                else if( bc->getType() == BC_SOLID    ) *valueStreams[side] << "noSlip\n";
+                else if( bc->getType() == BC_SLIP     ) *valueStreams[side] << "slip\n";
+                else if( bc->getType() == BC_OUTFLOW  ) *valueStreams[side] << "outflow\n";
 
                 *valueStreams[side] << builder->getNumberOfGridLevels() - 1 << "\n";
                 *qStreams[side]     << builder->getNumberOfGridLevels() - 1 << "\n";
             }
 
-            writeBoundaryShort( builder->getGrid(level), bc, side );
+            if( !bc ){
+                *valueStreams[side] << "0\n";
+                *qStreams[side]     << "0\n";
+            }
+            else{
+                writeBoundaryShort( builder->getGrid(level), bc, side );
+            }
         }
     }
 }
@@ -638,10 +639,12 @@ void SimulationFileWriter::writeCommunicationFiles(SPtr<GridBuilder> builder)
             receiveFiles[direction] << numberOfReceiveNodes << "\n";
 
             for( uint index = 0; index < numberOfSendNodes; index++ )
-                sendFiles[direction]    << builder->getGrid(level)->getSendIndex   (direction, index) << "\n";
+                // + 1 for numbering shift between GridGenerator and VF_GPU
+                sendFiles[direction]    << builder->getGrid(level)->getSparseIndex( builder->getGrid(level)->getSendIndex   (direction, index) ) + 1 << "\n";
 
             for( uint index = 0; index < numberOfReceiveNodes; index++ )
-                receiveFiles[direction] << builder->getGrid(level)->getReceiveIndex(direction, index) << "\n";
+                // + 1 for numbering shift between GridGenerator and VF_GPU
+                receiveFiles[direction] << builder->getGrid(level)->getSparseIndex( builder->getGrid(level)->getReceiveIndex(direction, index) ) + 1 << "\n";
 
         }
     }
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 273670aa4..f4e8a50c5 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -260,8 +260,8 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
 
 void multipleLevel(const std::string& configPath)
 {
-    //std::ofstream logFile( "C:/Users/lenz/Desktop/Work/gridGenerator/grid/gridGeneratorLog.txt" );
-    std::ofstream logFile( "grid/gridGeneratorLog.txt" );
+    std::ofstream logFile( "C:/Users/lenz/Desktop/Work/gridGenerator/grid/gridGeneratorLog.txt" );
+    //std::ofstream logFile( "grid/gridGeneratorLog.txt" );
     logging::Logger::addStream(&logFile);
 
     logging::Logger::addStream(&std::cout);
@@ -328,23 +328,25 @@ void multipleLevel(const std::string& configPath)
         // DLC - Golf
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-        //real dx = 0.2;
+        //real dx = 5.0/30.0;//0.2;
         //real vx = 0.05;
 
-        //real z0 = 0.265+0.5*dx;
+        //real z0 = 0.265;
 
         //std::vector<uint> ignorePatches = { 152, 153, 154 };
 
-        //TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches);
-        //
-        ////TriangularMesh* DrivAerRefBoxSTL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DrivAer_REF_BOX_Adrea.stl");
+        ////TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/VW370_SERIE.stl", ignorePatches);
 
-        //TriangularMesh* DLC_RefBox = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl");
+        ////TriangularMesh* DLC_RefBox = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox.stl");
 
-        //TriangularMesh* DLC_RefBox_1 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_4m.stl");
-        //TriangularMesh* DLC_RefBox_2 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_3m.stl");
-        //TriangularMesh* DLC_RefBox_3 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_2m.stl");
-        //TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.stl");
+        //////TriangularMesh* DLC_RefBox_1 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_4m.stl");
+        //////TriangularMesh* DLC_RefBox_2 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_3m.stl");
+        //////TriangularMesh* DLC_RefBox_3 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_2m.stl");
+        ////TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.stl");
+
+        //TriangularMesh* VW370_SERIE_STL = TriangularMesh::make("stl/VW370_SERIE.stl", ignorePatches);
+        //TriangularMesh* DLC_RefBox = TriangularMesh::make("stl/DLC_RefBox.lnx.stl");
+        //TriangularMesh* DLC_RefBox_4 = TriangularMesh::make("stl/DLC_RefBox_withWake/DLC_RefBox_withWake_1m.lnx.stl");
 
         //gridBuilder->addCoarseGrid(- 5.0, -5.0, 0.0 - z0,
         //                            15.0,  5.0, 5.0 - z0, dx);
@@ -366,6 +368,10 @@ void multipleLevel(const std::string& configPath)
 
         //gridBuilder->addGeometry(VW370_SERIE_STL);
 
+        //gridBuilder->setPeriodicBoundaryCondition(false, false, false);
+
+        //gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
+
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         // Wall Mounted Cube
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -488,37 +494,37 @@ void multipleLevel(const std::string& configPath)
         // Testing Multi GPU grids
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-        const uint generatePart = 2;
+        const uint generatePart = 0;
         
         std::ofstream logFile2;
         
-        //if( generatePart == 1 )
-        //    logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/gridGeneratorLog.txt" );
-        //
-        //if( generatePart == 2 )
-        //    logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/gridGeneratorLog.txt" );
+        if( generatePart == 0 )
+            logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/grid/0/gridGeneratorLog.txt" );
+        
+        if( generatePart == 1 )
+            logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/grid/1/gridGeneratorLog.txt" );
 
         logging::Logger::addStream(&logFile2);
 
         real dx = 1.0 / 10.0;
         real vx = 0.01;
 
-        //TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/ShpereNotOptimal.stl");
-        TriangularMesh* triangularMesh = TriangularMesh::make("stl/ShpereNotOptimal.lnx.stl");
+        TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/ShpereNotOptimal.stl");
+        //TriangularMesh* triangularMesh = TriangularMesh::make("stl/ShpereNotOptimal.lnx.stl");
 
         // all
-        gridBuilder->addCoarseGrid(-2, -2, -2,  
-                                    4,  2,  2, dx);
+        //gridBuilder->addCoarseGrid(-2, -2, -2,  
+        //                            4,  2,  2, dx);
 
         real overlap = 10.0 * dx;
 
-        //if( generatePart == 1 )
-        //    gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
-        //                                0.5 + overlap,  2.0,  2.0, dx);
+        if( generatePart == 0 )
+            gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
+                                        0.5 + overlap,  2.0,  2.0, dx);
 
-        //if( generatePart == 2 )
-        //    gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
-        //                                4.0          ,  2.0,  2.0, dx);
+        if( generatePart == 1 )
+            gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
+                                        4.0          ,  2.0,  2.0, dx);
 
 
         gridBuilder->setNumberOfLayers(10,8);
@@ -526,29 +532,29 @@ void multipleLevel(const std::string& configPath)
 
         gridBuilder->addGeometry(triangularMesh);
         
-        //if( generatePart == 1 )
-        //    gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
-        //                                                                 -2.0, 2.0, 
-        //                                                                 -2.0, 2.0 ) );
-        //
-        //if( generatePart == 2 )
-        //    gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
-        //                                                                 -2.0, 2.0, 
-        //                                                                 -2.0, 2.0 ) );
+        if( generatePart == 0 )
+            gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
+                                                                         -2.0, 2.0, 
+                                                                         -2.0, 2.0 ) );
+        
+        if( generatePart == 1 )
+            gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
+                                                                         -2.0, 2.0, 
+                                                                         -2.0, 2.0 ) );
 
         gridBuilder->setPeriodicBoundaryCondition(false, false, false);
 
         gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
         
-        //if( generatePart == 1 ){
-        //    gridBuilder->findCommunicationIndices(CommunicationDirections::PX);
-        //    gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
-        //}
-        //
-        //if( generatePart == 2 ){
-        //    gridBuilder->findCommunicationIndices(CommunicationDirections::MX);
-        //    gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
-        //}
+        if( generatePart == 0 ){
+            gridBuilder->findCommunicationIndices(CommunicationDirections::PX);
+            gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
+        }
+        
+        if( generatePart == 1 ){
+            gridBuilder->findCommunicationIndices(CommunicationDirections::MX);
+            gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
+        }
 
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         // other tests
@@ -575,22 +581,23 @@ void multipleLevel(const std::string& configPath)
         //BCs
         //gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.0, 0.0, 0.0);
         //gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.0, 0.0, 0.0);
+
         gridBuilder->setVelocityBoundaryCondition(SideType::PY, vx , 0.0, 0.0);
         gridBuilder->setVelocityBoundaryCondition(SideType::MY, vx , 0.0, 0.0);
         gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
         gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
 
-        gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-        gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+        //gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+        //gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
 
-        gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+        if (generatePart == 0) {
+            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+        }
+        if (generatePart == 1) {
+            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+        }
 
-        //if (generatePart == 1) {
-        //    gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-        //}
-        //if (generatePart == 2) {
-        //    gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-        //}
+        gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
 
         ////////////////////////////////////////////////////////////////////////////
 
@@ -648,22 +655,22 @@ void multipleLevel(const std::string& configPath)
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         
 
-        //if (generatePart == 1) {
-        //    gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_");
-        //    gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_Arrow");
-        //}
-        //if (generatePart == 2) {
-        //    gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_");
-        //    gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow");
-        //}
+        if (generatePart == 0) {
+            gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/0/Test_");
+            gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/grid/0/Test_Arrow");
+        }
+        if (generatePart == 1) {
+            gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/1/Test_");
+            gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/grid/1/Test_Arrow");
+        }
 
         //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/ConcaveTest_");
-        //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/Test_");
-        gridBuilder->writeGridsToVtk("grid/Test_");
 
-        //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/CylinderTest_");
+        //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/Test_");
         //gridBuilder->writeArrows("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow");
-        gridBuilder->writeArrows("grid/Test_Arrow");
+
+        //gridBuilder->writeGridsToVtk("grid/Test_");
+        //gridBuilder->writeArrows("grid/Test_Arrow");
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -761,12 +768,14 @@ void multipleLevel(const std::string& configPath)
 
         //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
         //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
-        SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
+        //SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
+
+        if (generatePart == 0)
+            SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/0/", gridBuilder, FILEFORMAT::ASCII);
+        if (generatePart == 1)
+            SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/1/", gridBuilder, FILEFORMAT::ASCII);
 
-        //if (generatePart == 1)
-        //    SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/", gridBuilder, FILEFORMAT::ASCII);
-        //if (generatePart == 2)
-        //    SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/", gridBuilder, FILEFORMAT::ASCII);
+        return;
 
         gridGenerator = GridGenerator::make(gridBuilder, para);
     }
-- 
GitLab