From 763a9f1d66447dafd4d6e66de541b16d0854d88a Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Fri, 29 Oct 2021 16:03:02 +0200
Subject: [PATCH] Move function to split c to f cells to new class

and refactoring this function for better readability
---
 src/gpu/GridGenerator/grid/Grid.h             |  6 +-
 .../grid/GridBuilder/GridBuilder.h            |  4 --
 .../grid/GridBuilder/LevelGridBuilder.cpp     | 12 ----
 .../grid/GridBuilder/LevelGridBuilder.h       |  6 --
 src/gpu/GridGenerator/grid/GridImp.cu         | 49 -------------
 src/gpu/GridGenerator/grid/GridImp.h          |  6 +-
 .../IndexRearrangementForStreams.cpp          | 69 ++++++++++++++++---
 .../IndexRearrangementForStreams.h            |  2 +
 8 files changed, 64 insertions(+), 90 deletions(-)

diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index 2674257d1..338168e0f 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -55,11 +55,7 @@ public:
                                                                 uint *iCellFcfBorder, uint *&iCellFcfBulk,
                                                                 uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                                 int level) const = 0;
-    CUDA_HOST virtual void getGridInterfaceIndicesBorderBulkCF(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 bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) 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 dbe376356..97d36c700 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -59,10 +59,6 @@ public:
     virtual void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                       uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                       int level) const = 0;
-    virtual void getGridInterfaceIndicesBorderBulkCF(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 b5bcae981..b269dd33e 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -215,18 +215,6 @@ void LevelGridBuilder::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder,
                                                              intFCBorderKfc, intFCBulkKfc, level);
 }
 
-void LevelGridBuilder::getGridInterfaceIndicesBorderBulkCF(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]->getGridInterfaceIndicesBorderBulkCF(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 b75719fa6..6b84863c0 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -142,12 +142,6 @@ public:
                                                                    uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                                   int level) const override;
 
-    GRIDGENERATOR_EXPORT void getGridInterfaceIndicesBorderBulkCF(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 e2b307186..adf6781d9 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -1980,55 +1980,6 @@ void GridImp::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&i
     }
 }
 
-void GridImp::getGridInterfaceIndicesBorderBulkCF(uint *iCellCfcBorder, uint *&iCellCfcBulk, uint *iCellCffBorder,
-                                                  uint *&iCellCffBulk, uint &intCFBorderKcf, uint &intCFBulkKcf,
-                                                  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;
-    std::vector<uint> iCellCfcBorderVector;
-    std::vector<uint> iCellCfcBulkVector;
-    std::vector<uint> iCellCffBorderVector;
-    std::vector<uint> iCellCffBulkVector;
-
-    uint sparseIndexOfICellBSW;
-    for (uint i = 0; i < this->gridInterface->cf.numberOfEntries; 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]);
-        }
-    }
-
-    intCFBorderKcf = (uint)iCellCfcBorderVector.size();
-    intCFBulkKcf   = (uint)iCellCfcBulkVector.size();
-    iCellCfcBulk   = iCellCfcBorder + intCFBorderKcf;
-    iCellCffBulk   = iCellCffBorder + intCFBorderKcf;
-
-    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) !=
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index e2f32b677..50fa16b8f 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -57,7 +57,6 @@ 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;
@@ -223,10 +222,7 @@ public:
     CUDA_HOST void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
                                                         uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
                                                        int level) const override;
-    CUDA_HOST void getGridInterfaceIndicesBorderBulkCF(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;
+    CUDA_HOST bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const override;
 
     int* getNeighborsX() const override;
     int* getNeighborsY() const override;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
index 29a8865fa..07bdb3614 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
@@ -2,6 +2,7 @@
 
 #include "Parameter/Parameter.h"
 #include <GridGenerator/grid/GridBuilder/GridBuilder.h>
+#include <GridGenerator/grid/Grid.h>
 #include "Communication/Communicator.h"
 
 #include <iostream>
@@ -408,15 +409,7 @@ void IndexRearrangementForStreams::reorderRecvIndicesForCommAfterFtoC(int *recvI
 
 void IndexRearrangementForStreams::splitCoarseToFineIntoBorderAndBulk(const uint &level)
 {
-    para->getParH(level)->intCFBorder.ICellCFC = para->getParH(level)->intCF.ICellCFC;
-    para->getParH(level)->intCFBorder.ICellCFF = para->getParH(level)->intCF.ICellCFF;
-
-    builder->getGridInterfaceIndicesBorderBulkCF(
-        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);
+    this->getGridInterfaceIndicesBorderBulkCF(level);
 
     para->getParD(level)->intCFBorder.kCF      = para->getParH(level)->intCFBorder.kCF;
     para->getParD(level)->intCFBulk.kCF        = para->getParH(level)->intCFBulk.kCF;
@@ -428,6 +421,64 @@ void IndexRearrangementForStreams::splitCoarseToFineIntoBorderAndBulk(const uint
         para->getParD(level)->intCFBorder.ICellCFF + para->getParD(level)->intCFBorder.kCF;
 }
 
+void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkCF(int level) 
+{ 
+    // this function reorders the array of CFC/CFF indices and sets pointers and sizes of the new subarrays
+     
+    // create some local variables for better readability
+    uint *iCellCfcAll = para->getParH(level)->intCF.ICellCFC;
+    uint *iCellCffAll    = para->getParH(level)->intCF.ICellCFF;
+    uint *neighborX_SP   = this->para->getParH(level)->neighborX_SP;
+    uint *neighborY_SP   = this->para->getParH(level)->neighborY_SP;
+    uint *neighborZ_SP   = this->para->getParH(level)->neighborZ_SP;
+    auto grid = this->builder->getGrid((uint) level);   
+
+    std::vector<uint> iCellCfcBorderVector;
+    std::vector<uint> iCellCfcBulkVector;
+    std::vector<uint> iCellCffBorderVector;
+    std::vector<uint> iCellCffBulkVector;
+    uint sparseIndexOfICellBSW;
+
+    // fill border and bulk vectors with iCellCFs
+    for (uint i = 0; i < para->getParH(level)->intCF.kCF; i++) {
+        sparseIndexOfICellBSW = iCellCfcAll[i];
+
+        if (grid->isSparseIndexInFluidNodeIndicesBorder(sparseIndexOfICellBSW) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborX_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[sparseIndexOfICellBSW]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborY_SP[neighborX_SP[sparseIndexOfICellBSW]]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborX_SP[sparseIndexOfICellBSW]]) ||
+            grid->isSparseIndexInFluidNodeIndicesBorder(neighborZ_SP[neighborY_SP[sparseIndexOfICellBSW]]) ||
+            grid->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]);
+        }
+    }
+
+    // set new sizes and pointers
+    para->getParH(level)->intCFBorder.ICellCFC = iCellCfcAll;
+    para->getParH(level)->intCFBorder.ICellCFC  = iCellCffAll;
+    para->getParH(level)->intCFBorder.kCF = (uint)iCellCfcBorderVector.size();
+    para->getParH(level)->intCFBulk.kCF = (uint)iCellCfcBulkVector.size();
+    para->getParH(level)->intCFBulk.ICellCFC = iCellCfcAll + para->getParH(level)->intCFBorder.kCF;
+    para->getParH(level)->intCFBulk.ICellCFF = iCellCffAll + para->getParH(level)->intCFBorder.kCF;
+
+    // copy the created vectors to the memory addresses of the old arrays
+    for (uint i = 0; i < (uint)iCellCfcBorderVector.size(); i++) {
+        iCellCfcAll[i] = iCellCfcBorderVector[i];
+        iCellCffAll[i] = iCellCffBorderVector[i];
+    }
+    for (uint i = 0; i < (uint)iCellCfcBulkVector.size(); i++) {
+        para->getParH(level)->intCFBulk.ICellCFC[i] = iCellCfcBulkVector[i];
+        para->getParH(level)->intCFBulk.ICellCFF[i] = iCellCffBulkVector[i];
+    }
+}
+
 void IndexRearrangementForStreams::splitFineToCoarseIntoBorderAndBulk(const uint &level)
 {
     para->getParH(level)->intFCBorder.ICellFCC = para->getParH(level)->intFC.ICellFCC;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
index 1d9c5f8fe..ee3542bfc 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
@@ -70,6 +70,8 @@ private:
                                              std::vector<uint> &sendIndicesForCommAfterFtoCPositions);
     void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, int direction,
                                             int level, int j, std::vector<uint> &sendIndicesForCommAfterFtoCPositions);
+    // split interpolation cells
+    void getGridInterfaceIndicesBorderBulkCF(int level);
 };
 
 #endif
-- 
GitLab