From dbde36ce6df87ea17fc5aee6f54ed31a708eb65e Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Tue, 28 Sep 2021 16:34:55 +0200
Subject: [PATCH] Restructure calls to getAndReorderSendIndices() in
 GridGenerator

---
 .../grid/GridBuilder/GridBuilder.h            |   3 +-
 .../grid/GridBuilder/LevelGridBuilder.cpp     |  14 +-
 .../grid/GridBuilder/LevelGridBuilder.h       |   2 +-
 .../GridReaderGenerator/GridGenerator.cpp     | 128 ++++++++++--------
 4 files changed, 81 insertions(+), 66 deletions(-)

diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
index d5d629e34..e1fb6e5cd 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -89,8 +89,7 @@ public:
     virtual std::vector<uint> getAndReorderSendIndices(int *sendIndices, uint &numberOfSendNeighborsAfterFtoC,
                                                        uint *iCellFCC, uint sizeOfICellFCCBorder, uint *iCellCFC,
                                                        uint sizeOfICellCFC, uint *neighborX, uint *neighborY,
-                                                       uint *neighborZ, int direction, int level,
-                                                       bool sendIndicesNeedToBeReordered) = 0;
+                                                       uint *neighborZ, int direction, int level) = 0;
     virtual void getAndReorderReceiveIndices(int *recvIndices, uint &numberOfRecvNeighborsAfterFtoC,
                                              uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, int level,
                                              bool receiveIndicesNeedToBeReordered) = 0;
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 190ea9edf..2ac33ff0d 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -270,15 +270,13 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::getReceiveIndices(int * receiveIndic
 GRIDGENERATOR_EXPORT std::vector<uint>
 LevelGridBuilder::getAndReorderSendIndices(int *sendIndices, uint &numberOfSendNeighborsAfterFtoC, uint *iCellFCC,
                                            uint sizeOfICellFCCBorder, uint *iCellCFC, uint sizeOfICellCFC,
-                                           uint *neighborX, uint *neighborY, uint *neighborZ, int direction, int level,
-                                           bool sendIndicesNeedToBeReordered)
+                                           uint *neighborX, uint *neighborY, uint *neighborZ, int direction, int level)
 {
     std::vector<uint> sendIndicesForCommAfterFtoCPositions;
     getSendIndices(sendIndices, direction, level);
-    if (sendIndicesNeedToBeReordered)
-        reorderSendIndecesForCommAfterFtoC(sendIndices, numberOfSendNeighborsAfterFtoC, iCellFCC, sizeOfICellCFC,
-                                         iCellCFC, sizeOfICellCFC, neighborX, neighborY, neighborZ, direction, level,
-                                         sendIndicesForCommAfterFtoCPositions);
+    reorderSendIndecesForCommAfterFtoC(sendIndices, numberOfSendNeighborsAfterFtoC, iCellFCC, sizeOfICellCFC, iCellCFC,
+                                       sizeOfICellCFC, neighborX, neighborY, neighborZ, direction, level,
+                                       sendIndicesForCommAfterFtoCPositions);
     return sendIndicesForCommAfterFtoCPositions;
 }
 
@@ -340,8 +338,7 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderSendIndecesForCommAfterFtoC(
                 if (sparseIndexSend < 0)
                     continue;
                 if (iCellCFC[j] == (uint)sparseIndexSend) {
-                    isInICells = true;
-                    std::cout << "found sparse index in ICellCF" << std::endl;
+                    isInICells = true;                   
                     // also find neighbors
                     if (direction != 1)
                         neighborToAddX = neighborX[sparseIndexSend];
@@ -417,7 +414,6 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndexForCommAfterFtoC(int
     *logging::out << logging::Logger::INFO_INTERMEDIATE
                   << "reorder receive indices for communication after fine to coarse: level: " << level
                   << " direction: " << direction;
-    *logging::out << logging::Logger::INFO_INTERMEDIATE << "   sizeOfICellFCC: " << sizeOfICellFCCBorder;
     if (sizeOfICellFCCBorder == 0)
         *logging::out << logging::Logger::LOGGER_ERROR
                       << "reorderRecvIndexForCommAfterFtoC(): iCellFCC needs to be inititalized before calling "
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 4e71e6487..d3ff87999 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -152,7 +152,7 @@ public:
     GRIDGENERATOR_EXPORT std::vector<uint> GRIDGENERATOR_EXPORT getAndReorderSendIndices(
         int *sendIndices, uint &numberOfSendNeighborsAfterFtoC, uint *iCellFCC, uint sizeOfICellFCCBorder,
         uint *iCellCFC, uint sizeOfICellCFC, uint *neighborX, uint *neighborY, uint *neighborZ, int direction,
-        int level, bool sendIndicesNeedToBeReordered) override;
+        int level) override;
     GRIDGENERATOR_EXPORT void getAndReorderReceiveIndices(int *recvIndices, uint &numberOfRecvNeighborsAfterFtoC,
                                                           uint *iCellFCCBorder, uint sizeOfICellFCCBorder,
                                                           int direction, int level,
diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index 1640cf1d6..ed7ec278e 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -321,24 +321,30 @@ void GridGenerator::allocArrays_BoundaryValues()
                         cudaMemoryManager->cudaAllocProcessNeighborX(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
 					    //init index arrays
-                        para->initNumberOfProcessNeighborsAfterFtoCX(level);
-                        std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
-                            para->getParH(level)->sendProcessNeighborX[j].index,
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
-                            para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
-                            para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
-                            para->getParH(level)->neighborZ_SP,
-                            direction, level, level != builder->getNumberOfGridLevels() - 1);
-                        builder->getAndReorderReceiveIndices(
-                            para->getParH(level)->recvProcessNeighborX[j].index,
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.kFC, direction, level,
-                            level != builder->getNumberOfGridLevels() - 1);
-                        para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCX[j] =
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j];
-                        para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCX[j] =
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j];
+                        if (level == builder->getNumberOfGridLevels() - 1) {
+                            builder->getSendIndices(para->getParH(level)->sendProcessNeighborX[j].index, direction,
+                                                    level);
+                            builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborX[j].index, direction,
+                                                       level);
+                        } else {
+                            para->initNumberOfProcessNeighborsAfterFtoCX(level);
+                            std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
+                                para->getParH(level)->sendProcessNeighborX[j].index,
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
+                                para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
+                                para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
+                                para->getParH(level)->neighborZ_SP, direction, level);
+                            builder->getAndReorderReceiveIndices(
+                                para->getParH(level)->recvProcessNeighborX[j].index,
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.kFC, direction, level,
+                                level != builder->getNumberOfGridLevels() - 1);
+                            para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCX[j] =
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j];
+                            para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCX[j] =
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j];
+                        }
 					    ////////////////////////////////////////////////////////////////////////////////////////
                         cudaMemoryManager->cudaCopyProcessNeighborXIndex(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
@@ -397,24 +403,31 @@ void GridGenerator::allocArrays_BoundaryValues()
                         cudaMemoryManager->cudaAllocProcessNeighborY(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
 					    //init index arrays
-                        para->initNumberOfProcessNeighborsAfterFtoCY(level);
-                        std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
-                            para->getParH(level)->sendProcessNeighborY[j].index,
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
-                            para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
-                            para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
-                            para->getParH(level)->neighborZ_SP,
-                            direction, level, level != builder->getNumberOfGridLevels() - 1);
-                        builder->getAndReorderReceiveIndices(
-                            para->getParH(level)->recvProcessNeighborY[j].index,
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF, direction, level,
-                            level != builder->getNumberOfGridLevels() - 1);
-                        para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCY[j] =
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j];
-                        para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCY[j] =
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j];
+                        if (level == builder->getNumberOfGridLevels() - 1) {
+                            builder->getSendIndices(para->getParH(level)->sendProcessNeighborY[j].index, direction,
+                                                    level);
+                            builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborY[j].index, direction,
+                                                       level);
+                        } else {
+                            para->initNumberOfProcessNeighborsAfterFtoCY(level);
+                            std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
+                                para->getParH(level)->sendProcessNeighborY[j].index,
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
+                                para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
+                                para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
+                                para->getParH(level)->neighborZ_SP,
+                                direction, level);
+                            builder->getAndReorderReceiveIndices(
+                                para->getParH(level)->recvProcessNeighborY[j].index,
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF, direction, level,
+                                level != builder->getNumberOfGridLevels() - 1);
+                            para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCY[j] =
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j];
+                            para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCY[j] =
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j];
+                        }
 					    ////////////////////////////////////////////////////////////////////////////////////////
                         cudaMemoryManager->cudaCopyProcessNeighborYIndex(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
@@ -473,24 +486,31 @@ void GridGenerator::allocArrays_BoundaryValues()
                         cudaMemoryManager->cudaAllocProcessNeighborZ(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
 					    //init index arrays
-                        para->initNumberOfProcessNeighborsAfterFtoCZ(level);
-                        std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
-                            para->getParH(level)->sendProcessNeighborZ[j].index,
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
-                            para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
-                            para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
-                            para->getParH(level)->neighborZ_SP,
-                            direction, level, level != builder->getNumberOfGridLevels() - 1);
-                        builder->getAndReorderReceiveIndices(
-                            para->getParH(level)->recvProcessNeighborZ[j].index,
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j],
-                            para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.kFC, direction, level,
-                            level != builder->getNumberOfGridLevels() - 1);
-                        para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCZ[j] =
-                            para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j];
-                        para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j] =
-                            para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j];
+                        if (level == builder->getNumberOfGridLevels() - 1) {
+                            builder->getSendIndices(para->getParH(level)->sendProcessNeighborZ[j].index, direction,
+                                                    level);
+                            builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborZ[j].index, direction,
+                                                       level);
+                        } else {
+                            para->initNumberOfProcessNeighborsAfterFtoCZ(level);
+                            std::vector<uint> sendIndicesForCommAfterFtoCPositions = builder->getAndReorderSendIndices(
+                                para->getParH(level)->sendProcessNeighborZ[j].index,
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->K_CF,
+                                para->getParH(level)->intCF.ICellCFC, para->getParH(level)->K_FC,
+                                para->getParH(level)->neighborX_SP, para->getParH(level)->neighborY_SP,
+                                para->getParH(level)->neighborZ_SP,
+                                direction, level);
+                            builder->getAndReorderReceiveIndices(
+                                para->getParH(level)->recvProcessNeighborZ[j].index,
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j],
+                                para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.kFC, direction, level,
+                                level != builder->getNumberOfGridLevels() - 1);
+                            para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCZ[j] =
+                                para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j];
+                            para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j] =
+                                para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j];
+                        }
 					    ////////////////////////////////////////////////////////////////////////////////////////
                         cudaMemoryManager->cudaCopyProcessNeighborZIndex(level, j);
 					    ////////////////////////////////////////////////////////////////////////////////////////
-- 
GitLab