From 978a49e418d590aa4cd74f1853ac971eb77bf298 Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Mon, 18 Oct 2021 14:36:03 +0200
Subject: [PATCH] Split ICellCF into border and bulk

---
 .../gpu/LBM/MusselOyster3z/MusselOyster3z.cpp |  1 -
 src/gpu/GridGenerator/grid/Grid.h             |  5 ++
 .../grid/GridBuilder/GridBuilder.h            |  6 +-
 .../grid/GridBuilder/LevelGridBuilder.cpp     | 12 ++++
 .../grid/GridBuilder/LevelGridBuilder.h       |  8 ++-
 src/gpu/GridGenerator/grid/GridImp.cu         | 59 ++++++++++++++++++-
 src/gpu/GridGenerator/grid/GridImp.h          |  7 ++-
 .../GridReaderGenerator/GridGenerator.cpp     | 21 +++++++
 .../VirtualFluids_GPU/Parameter/Parameter.h   |  2 +
 9 files changed, 115 insertions(+), 6 deletions(-)

diff --git a/apps/gpu/LBM/MusselOyster3z/MusselOyster3z.cpp b/apps/gpu/LBM/MusselOyster3z/MusselOyster3z.cpp
index 68c32a5db..c572d969e 100644
--- a/apps/gpu/LBM/MusselOyster3z/MusselOyster3z.cpp
+++ b/apps/gpu/LBM/MusselOyster3z/MusselOyster3z.cpp
@@ -139,7 +139,6 @@ void multipleLevel(const std::string& configPath)
     *logging::out << logging::Logger::INFO_HIGH << "useMultiGPU = " << useMultiGPU << "\n";
     *logging::out << logging::Logger::INFO_HIGH << "useStreams = " << useStreams << "\n";
 
-    
     para->setTOut(1000);
     para->setTEnd(10000);
 
diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index 6b179de2d..4b10743dd 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -55,6 +55,11 @@ public:
                                                                 uint *iCellFcfBorder, uint *&iCellFcfBulk,
                                                                 uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                                 int level) const = 0;
+    CUDA_HOST virtual void getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk,
+                                                               uint *iCellCffBorder, uint *&iCellCffBulk,
+                                                               uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                               uint *neighborX_SP, uint *neighborY_SP,
+                                                               uint *neighborZ_SP, int level) const = 0;
 
     CUDA_HOST virtual int *getNeighborsX() const = 0;
     CUDA_HOST virtual int *getNeighborsY() const = 0;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index 55dd90545..be42a6ab0 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -58,7 +58,11 @@ public:
     virtual void getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, uint* iCellFcc, uint* iCellFcf, int level) const = 0;
     virtual void getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                       uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                      int level) const           = 0;
+                                                      int level) const = 0;
+    virtual void getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
+                                                     uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                     uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
+                                                     int level) const = 0;
 
     virtual void getOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) = 0;
     virtual void getOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) = 0;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 04a0cf721..0bcd595c1 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -215,6 +215,18 @@ void LevelGridBuilder::getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder,
                                                              intFCBorderKfc, intFCBulkKfc, level);
 }
 
+void LevelGridBuilder::getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk,
+                                                           uint *iCellCffBorder,
+                                                  uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                  uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP, int level) const
+{
+    this->grids[level]->getGridInterfaceIndicesCFBorderBulk(iCellCfcBorder, iCellCfcBulk, 
+                                                            iCellCffBorder, iCellCffBulk,
+                                                            intCFBorderKfc, intCFBulkKfc, 
+                                                            neighborX_SP, neighborY_SP, neighborZ_SP,
+                                                            level);
+}
+
 void LevelGridBuilder::getOffsetFC(real * xOffFC, real * yOffFC, real * zOffFC, int level)
 {
     for (uint i = 0; i < getNumberOfNodesFC(level); i++)
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index ae889715a..d5fa5f538 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -140,7 +140,13 @@ public:
     GRIDGENERATOR_EXPORT void getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder, uint *&iCellFccBulk,
                                                                    uint *iCellFcfBorder, uint *&iCellFcfBulk,
                                                                    uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                                   int level) const override;
+                                                                  int level) const override;
+
+    GRIDGENERATOR_EXPORT void getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk,
+                                                                  uint *iCellCffBorder, uint *&iCellCffBulk,
+                                                                  uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                                  uint *neighborX_SP, uint *neighborY_SP,
+                                                                  uint *neighborZ_SP, int level) const override;
 
     GRIDGENERATOR_EXPORT void getOffsetFC(real* xOffCf, real* yOffCf, real* zOffCf, int level) override;
     GRIDGENERATOR_EXPORT void getOffsetCF(real* xOffFc, real* yOffFc, real* zOffFc, int level) override;
diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu
index 766b134ef..2a2159188 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -1958,8 +1958,7 @@ void GridImp::getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder, uint *&i
     std::vector<uint> iCellFcfBulkVector;
 
     for (uint i = 0; i < intFCKfcAll; i++)
-        if (std::find(this->fluidNodeIndicesBorder.begin(), this->fluidNodeIndicesBorder.end(), iCellFccAll[i]) !=
-            this->fluidNodeIndicesBorder.end()) {
+        if (isSparseIndexInFluidNodeIndicesBorder(iCellFccAll[i])) {
             iCellFccBorderVector.push_back(iCellFccAll[i]);
             iCellFcfBorderVector.push_back(iCellFcfAll[i]);
         } else {
@@ -1982,6 +1981,62 @@ void GridImp::getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder, uint *&i
     }
 }
 
+void GridImp::getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
+                                                  uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                  uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
+                                                  int level) const
+{
+    // reorder the array of CFC/CFF indices and return pointers and sizes of the new subarrays
+    uint *iCellCfcAll = iCellCfcBorder;
+    uint *iCellCffAll = iCellCffBorder;
+    uint intCFKfcAll  = this->gridInterface->fc.numberOfEntries;
+    std::vector<uint> iCellCfcBorderVector;
+    std::vector<uint> iCellCfcBulkVector;
+    std::vector<uint> iCellCffBorderVector;
+    std::vector<uint> iCellCffBulkVector;
+
+    uint sparseIndexOfICellBSW;
+    for (uint i = 0; i < intCFKfcAll; i++) {
+        sparseIndexOfICellBSW = iCellCfcAll[i];
+
+        if (isSparseIndexInFluidNodeIndicesBorder(sparseIndexOfICellBSW) 
+            || isSparseIndexInFluidNodeIndicesBorder(neighborX_SP[sparseIndexOfICellBSW])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[sparseIndexOfICellBSW])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[sparseIndexOfICellBSW])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborX_SP[sparseIndexOfICellBSW]])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[sparseIndexOfICellBSW]])
+            || isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]]])) {
+
+            iCellCfcBorderVector.push_back(iCellCfcAll[i]);
+            iCellCffBorderVector.push_back(iCellCffAll[i]);
+        } else {
+            iCellCfcBulkVector.push_back(iCellCfcAll[i]);
+            iCellCffBulkVector.push_back(iCellCffAll[i]);
+        }
+    }
+
+    intCFBorderKfc = (uint)iCellCfcBorderVector.size();
+    intCFBulkKfc   = (uint)iCellCfcBulkVector.size();
+    iCellCfcBulk   = iCellCfcBorder + intCFBorderKfc;
+    iCellCffBulk   = iCellCffBorder + intCFBorderKfc;
+
+    for (uint i = 0; i < (uint)iCellCfcBorderVector.size(); i++) {
+        iCellCfcBorder[i] = iCellCfcBorderVector[i];
+        iCellCffBorder[i] = iCellCffBorderVector[i];
+    }
+    for (uint i = 0; i < (uint)iCellCfcBulkVector.size(); i++) {
+        iCellCfcBulk[i] = iCellCfcBulkVector[i];
+        iCellCffBulk[i] = iCellCffBulkVector[i];
+    }
+}
+
+bool GridImp::isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const
+{
+    return std::find(this->fluidNodeIndicesBorder.begin(), this->fluidNodeIndicesBorder.end(), sparseIndex) !=
+           this->fluidNodeIndicesBorder.end();
+}
+
 #define GEOFLUID 19
 #define GEOSOLID 16
 
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index d9daa415c..78596952b 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -57,6 +57,7 @@ private:
     HOSTDEVICE bool isOutSideOfGrid(Cell &cell) const;
     HOSTDEVICE bool contains(Cell &cell, char type) const;
     HOSTDEVICE void setNodeTo(Cell &cell, char type);
+    CUDA_HOST bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const;
 
     HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInCellIs(Cell& cell, char type) const override;
@@ -221,7 +222,11 @@ public:
     CUDA_HOST static void getGridInterface(uint* gridInterfaceList, const uint* oldGridInterfaceList, uint size);
     CUDA_HOST void getGridInterfaceIndicesFCBorderBulk(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                         uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                        int level) const override;
+                                                       int level) const override;
+    CUDA_HOST void getGridInterfaceIndicesCFBorderBulk(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
+                                                       uint *&iCellCffBulk, uint &intCFBorderKfc, uint &intCFBulkKfc,
+                                                       uint *neighborX_SP, uint *neighborY_SP, uint *neighborZ_SP,
+                                                       int level) const override;
 
     int* getNeighborsX() const override;
     int* getNeighborsY() const override;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index 4096ddab5..4c0736bef 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -1392,6 +1392,27 @@ void GridGenerator::allocArrays_OffsetScale()
             para->getParD(level)->intFCBulk.ICellFCC = para->getParD(level)->intFCBorder.ICellFCC + para->getParD(level)->intFCBorder.kFC;
             para->getParD(level)->intFCBorder.ICellFCF = para->getParD(level)->intFC.ICellFCF;
             para->getParD(level)->intFCBulk.ICellFCF = para->getParD(level)->intFCBorder.ICellFCF + para->getParD(level)->intFCBorder.kFC;
+
+            // split coarse-to-fine indices into border and bulk
+            para->getParH(level)->intCFBorder.ICellCFC = para->getParH(level)->intCF.ICellCFC;
+            para->getParH(level)->intCFBorder.ICellCFF = para->getParH(level)->intCF.ICellCFF;
+
+            builder->getGridInterfaceIndicesCFBorderBulk(
+                para->getParH(level)->intCFBorder.ICellCFC, para->getParH(level)->intCFBulk.ICellCFC,
+                para->getParH(level)->intCFBorder.ICellCFF, para->getParH(level)->intCFBulk.ICellCFF,
+                para->getParH(level)->intCFBorder.kCF, para->getParH(level)->intCFBulk.kCF,
+                this->para->getParH(level)->neighborX_SP, this->para->getParH(level)->neighborY_SP,
+                this->para->getParH(level)->neighborZ_SP, level);
+            
+            para->getParD(level)->intCFBorder.kCF = para->getParH(level)->intCFBorder.kCF;
+            para->getParD(level)->intCFBulk.kCF = para->getParH(level)->intCFBulk.kCF;
+            para->getParD(level)->intCFBorder.ICellCFC = para->getParD(level)->intCF.ICellCFC;
+            para->getParD(level)->intCFBulk.ICellCFC = para->getParD(level)->intCFBorder.ICellCFC + para->getParD(level)->intCFBorder.kCF;
+            para->getParD(level)->intCFBorder.ICellCFF = para->getParD(level)->intCF.ICellCFF;
+            para->getParD(level)->intCFBulk.ICellCFF = para->getParD(level)->intCFBorder.ICellCFF + para->getParD(level)->intCFBorder.kCF;
+
+            
+
         }
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         //copy
diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
index d05da93f3..e468fe15b 100644
--- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h
@@ -183,6 +183,8 @@ struct LBMSimulationParameter
 
     InterpolationCellFC intFCBorder;
     InterpolationCellFC intFCBulk;
+    InterpolationCellCF intCFBorder;
+    InterpolationCellCF intCFBulk;
 
     // offset//////////////////
     OffsetCF offCF;
-- 
GitLab