diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h index 338168e0f8250142f5e31582557ff2fc2ef5a860..21cfea189e58067fabc753d27fb13803abdcb9aa 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 97d36c700a87be7f168efe2d320902bf317a6424..9ff99fad4e2577536f50ce112acdc0e2e6bf40d5 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 b269dd33e5ec00218eb6943b2edb57e246373bf4..13d9d22134ee1731e317a76c3e5d0a561c580547 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 6b84863c0c50c610acc06056f1b977f6cf4acc85..f212f2c02ee21ab8d1f944863b6e1b59f0615f47 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 adf6781d93a9520e1a2d09af1ee079ab87541c2b..ea74df26ba96eadf15121cc393665f24b24a6d72 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 50fa16b8fd9996b535de796a73433380c19a0087..09f278a4d41bba346fd9ca3b38d028ef5d9fca4d 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 07bdb361412b55713a3e05bad1533fcc5fa6166d..60cef53ba62ab2427c19fe1c9c6d3b3cc8a9d43b 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 ee3542bfc0d26f50af58af1743a60c236d9514c8..70155b1990def791572992187ae068d15e90e053 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