From 068842799ac3ebb6d6ecce52be067550e969d302 Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Mon, 1 Nov 2021 17:29:05 +0100
Subject: [PATCH] Move function to split f to c cells to new class

and refactore this function for better readability
---
 src/gpu/GridGenerator/grid/Grid.h             |  5 --
 .../grid/GridBuilder/GridBuilder.h            |  3 -
 .../grid/GridBuilder/LevelGridBuilder.cpp     |  8 ---
 .../grid/GridBuilder/LevelGridBuilder.h       |  4 --
 src/gpu/GridGenerator/grid/GridImp.cu         | 37 ----------
 src/gpu/GridGenerator/grid/GridImp.h          |  3 -
 .../IndexRearrangementForStreams.cpp          | 68 +++++++++++++++----
 .../IndexRearrangementForStreams.h            |  2 +
 8 files changed, 55 insertions(+), 75 deletions(-)

diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index 338168e0f..21cfea189 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -51,10 +51,6 @@ public:
     HOSTDEVICE virtual void setFieldEntry(uint matrixIndex, char type) = 0;
 
     CUDA_HOST virtual void getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, uint* iCellFcc, uint* iCellFcf) const = 0;
-    CUDA_HOST virtual void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk,
-                                                                uint *iCellFcfBorder, uint *&iCellFcfBulk,
-                                                                uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                                int level) const = 0;
     CUDA_HOST virtual bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const = 0;
 
     CUDA_HOST virtual int *getNeighborsX() const = 0;
@@ -152,7 +148,6 @@ public:
     virtual void getFluidNodeIndices(uint *fluidNodeIndices) const = 0;
 
     virtual void findFluidNodeIndicesBorder() = 0;
-
     virtual uint getNumberOfFluidNodesBorder() const = 0;
     virtual void getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const = 0;
 };
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index 97d36c700..9ff99fad4 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -56,9 +56,6 @@ public:
     virtual uint getNumberOfNodesCF(int level) = 0;
     virtual uint getNumberOfNodesFC(int level) = 0;
     virtual void getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, uint* iCellFcc, uint* iCellFcf, int level) const = 0;
-    virtual void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
-                                                      uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                      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 b269dd33e..13d9d2213 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -207,14 +207,6 @@ void LevelGridBuilder::getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, u
     this->grids[level]->getGridInterfaceIndices(iCellCfc, iCellCff, iCellFcc, iCellFcf);
 }
 
-void LevelGridBuilder::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder, uint *&iCellFcfBulk,
-                                                            uint &intFCBorderKfc, uint &intFCBulkKfc, int level) const
-{
-    this->grids[level]->getGridInterfaceIndicesBorderBulkFC(iCellFccBorder, iCellFccBulk,
-                                                             iCellFcfBorder, iCellFcfBulk,
-                                                             intFCBorderKfc, intFCBulkKfc, 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 6b84863c0..f212f2c02 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -137,10 +137,6 @@ public:
     GRIDGENERATOR_EXPORT uint getNumberOfNodesFC(int level) override;
 
     GRIDGENERATOR_EXPORT void getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, uint* iCellFcc, uint* iCellFcf, int level) const override;
-    GRIDGENERATOR_EXPORT void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk,
-                                                                   uint *iCellFcfBorder, uint *&iCellFcfBulk,
-                                                                   uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                                  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 adf6781d9..ea74df26b 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -1943,43 +1943,6 @@ void GridImp::getGridInterface(uint* gridInterfaceList, const uint* oldGridInter
         gridInterfaceList[i] = oldGridInterfaceList[i] + 1; // + 1 for numbering shift between GridGenerator and VF_GPU
 }
 
-void GridImp::getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
-                                                   uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                   int level) const
-{
-    // reorder the array of FCC/FCF indices and return pointers and sizes of the new subarrays
-
-    uint *iCellFccAll = iCellFccBorder;
-    uint *iCellFcfAll = iCellFcfBorder;
-    std::vector<uint> iCellFccBorderVector;
-    std::vector<uint> iCellFccBulkVector;
-    std::vector<uint> iCellFcfBorderVector;
-    std::vector<uint> iCellFcfBulkVector;
-
-    for (uint i = 0; i < this->gridInterface->fc.numberOfEntries; i++)
-        if (isSparseIndexInFluidNodeIndicesBorder(iCellFccAll[i])) {
-            iCellFccBorderVector.push_back(iCellFccAll[i]);
-            iCellFcfBorderVector.push_back(iCellFcfAll[i]);
-        } else {
-            iCellFccBulkVector.push_back(iCellFccAll[i]);
-            iCellFcfBulkVector.push_back(iCellFcfAll[i]);
-        }
-
-    intFCBorderKfc = (uint)iCellFccBorderVector.size();
-    intFCBulkKfc   = (uint)iCellFccBulkVector.size();
-    iCellFccBulk   = iCellFccBorder + intFCBorderKfc; 
-    iCellFcfBulk   = iCellFcfBorder + intFCBorderKfc; 
-
-    for (uint i = 0; i < (uint)iCellFccBorderVector.size(); i++) {
-        iCellFccBorder[i] = iCellFccBorderVector[i];
-        iCellFcfBorder[i] = iCellFcfBorderVector[i];
-    }
-    for (uint i = 0; i < (uint)iCellFccBulkVector.size(); i++) {
-        iCellFccBulk[i] = iCellFccBulkVector[i];
-        iCellFcfBulk[i] = iCellFcfBulkVector[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 50fa16b8f..09f278a4d 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -219,9 +219,6 @@ public:
     HOSTDEVICE uint getNumberOfNodesFC() const override;
     CUDA_HOST void getGridInterfaceIndices(uint* iCellCfc, uint* iCellCff, uint* iCellFcc, uint* iCellFcf) const override;
     CUDA_HOST static void getGridInterface(uint* gridInterfaceList, const uint* oldGridInterfaceList, uint size);
-    CUDA_HOST void getGridInterfaceIndicesBorderBulkFC(uint *iCellFccBorder, uint *&iCellFccBulk, uint *iCellFcfBorder,
-                                                        uint *&iCellFcfBulk, uint &intFCBorderKfc, uint &intFCBulkKfc,
-                                                       int level) const override;
     CUDA_HOST bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const override;
 
     int* getNeighborsX() const override;
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
index 07bdb3614..60cef53ba 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.cpp
@@ -35,6 +35,7 @@ void IndexRearrangementForStreams::initCommunicationArraysForCommAfterFinetoCoar
                           para->getParH(level)->recvProcessNeighborX[j].rankNeighbor,
                           sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
                           para->getParH(level)->sendProcessNeighborX[j].rankNeighbor);
+    
     // resize receiving vector to correct size
     auto it = std::unique(recvIndicesForCommAfterFtoCPositions.begin(), recvIndicesForCommAfterFtoCPositions.end());
     recvIndicesForCommAfterFtoCPositions.erase(std::prev(it, 1), recvIndicesForCommAfterFtoCPositions.end());
@@ -69,6 +70,7 @@ void IndexRearrangementForStreams::initCommunicationArraysForCommAfterFinetoCoar
                           para->getParH(level)->recvProcessNeighborY[j].rankNeighbor,
                           sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
                           para->getParH(level)->sendProcessNeighborY[j].rankNeighbor);
+    
     // resize receiving vector to correct size
     auto it = std::unique(recvIndicesForCommAfterFtoCPositions.begin(), recvIndicesForCommAfterFtoCPositions.end());
     recvIndicesForCommAfterFtoCPositions.erase(std::prev(it, 1), recvIndicesForCommAfterFtoCPositions.end());
@@ -104,6 +106,7 @@ void IndexRearrangementForStreams::initCommunicationArraysForCommAfterFinetoCoar
                           para->getParH(level)->recvProcessNeighborZ[j].rankNeighbor,
                           sendIndicesForCommAfterFtoCPositions.data(), (int)sendIndicesForCommAfterFtoCPositions.size(),
                           para->getParH(level)->sendProcessNeighborZ[j].rankNeighbor);
+    
     // resize receiving vector to correct size
     auto it = std::unique(recvIndicesForCommAfterFtoCPositions.begin(), recvIndicesForCommAfterFtoCPositions.end());
     recvIndicesForCommAfterFtoCPositions.erase(std::prev(it, 1), recvIndicesForCommAfterFtoCPositions.end());
@@ -423,15 +426,15 @@ void IndexRearrangementForStreams::splitCoarseToFineIntoBorderAndBulk(const uint
 
 void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkCF(int level) 
 { 
-    // this function reorders the array of CFC/CFF indices and sets pointers and sizes of the new subarrays
+    // this function reorders the arrays 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 *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);   
+    auto grid            = this->builder->getGrid((uint)level);
 
     std::vector<uint> iCellCfcBorderVector;
     std::vector<uint> iCellCfcBulkVector;
@@ -462,11 +465,11 @@ void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkCF(int level
 
     // 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;
+    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++) {
@@ -481,13 +484,7 @@ void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkCF(int level
 
 void IndexRearrangementForStreams::splitFineToCoarseIntoBorderAndBulk(const uint &level)
 {
-    para->getParH(level)->intFCBorder.ICellFCC = para->getParH(level)->intFC.ICellFCC;
-    para->getParH(level)->intFCBorder.ICellFCF = para->getParH(level)->intFC.ICellFCF;
-
-    builder->getGridInterfaceIndicesBorderBulkFC(
-        para->getParH(level)->intFCBorder.ICellFCC, para->getParH(level)->intFCBulk.ICellFCC,
-        para->getParH(level)->intFCBorder.ICellFCF, para->getParH(level)->intFCBulk.ICellFCF,
-        para->getParH(level)->intFCBorder.kFC, para->getParH(level)->intFCBulk.kFC, level);
+    this->getGridInterfaceIndicesBorderBulkFC(level);
 
     para->getParD(level)->intFCBorder.kFC      = para->getParH(level)->intFCBorder.kFC;
     para->getParD(level)->intFCBulk.kFC        = para->getParH(level)->intFCBulk.kFC;
@@ -499,3 +496,44 @@ void IndexRearrangementForStreams::splitFineToCoarseIntoBorderAndBulk(const uint
         para->getParD(level)->intFCBorder.ICellFCF + para->getParD(level)->intFCBorder.kFC;
 }
 
+void IndexRearrangementForStreams::getGridInterfaceIndicesBorderBulkFC(int level) {
+    // this function reorders the arrays of FCC/FCF indices and return pointers and sizes of the new subarrays
+
+    // create some local variables for better readability
+    uint *iCellFccAll = para->getParH(level)->intFC.ICellFCC;
+    uint *iCellFcfAll = para->getParH(level)->intFC.ICellFCF;
+    auto grid         = this->builder->getGrid((uint)level); 
+
+    std::vector<uint> iCellFccBorderVector;
+    std::vector<uint> iCellFccBulkVector;
+    std::vector<uint> iCellFcfBorderVector;
+    std::vector<uint> iCellFcfBulkVector;
+
+    // fill border and bulk vectors with iCellFCs
+    for (uint i = 0; i < para->getParH(level)->intFC.kFC; i++)
+        if (grid->isSparseIndexInFluidNodeIndicesBorder(iCellFccAll[i])) {
+            iCellFccBorderVector.push_back(iCellFccAll[i]);
+            iCellFcfBorderVector.push_back(iCellFcfAll[i]);
+        } else {
+            iCellFccBulkVector.push_back(iCellFccAll[i]);
+            iCellFcfBulkVector.push_back(iCellFcfAll[i]);
+        }
+
+    // set new sizes and pointers
+    para->getParH(level)->intFCBorder.ICellFCC = iCellFccAll;
+    para->getParH(level)->intFCBorder.ICellFCF = iCellFcfAll;
+    para->getParH(level)->intFCBorder.kFC      = (uint)iCellFccBorderVector.size();
+    para->getParH(level)->intFCBulk.kFC        = (uint)iCellFccBulkVector.size();
+    para->getParH(level)->intFCBulk.ICellFCC   = iCellFccAll + para->getParH(level)->intFCBorder.kFC;
+    para->getParH(level)->intFCBulk.ICellFCF   = iCellFcfAll + para->getParH(level)->intFCBorder.kFC;
+
+    // copy the created vectors to the memory addresses of the old arrays
+    for (uint i = 0; i < (uint)iCellFccBorderVector.size(); i++) {
+        iCellFccAll[i] = iCellFccBorderVector[i];
+        iCellFcfAll[i] = iCellFcfBorderVector[i];
+    }
+    for (uint i = 0; i < (uint)iCellFccBulkVector.size(); i++) {
+        para->getParH(level)->intFCBulk.ICellFCC[i] = iCellFccBulkVector[i];
+        para->getParH(level)->intFCBulk.ICellFCF[i] = iCellFcfBulkVector[i];
+    }
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
index ee3542bfc..70155b199 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/IndexRearrangementForStreams.h
@@ -70,8 +70,10 @@ 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);
+    void getGridInterfaceIndicesBorderBulkFC(int level);
 };
 
 #endif
-- 
GitLab