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