diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h index 52918af73cfcd6ba9674cb8788e95cb9fa3d2dd4..78a4fa174e07df992f8e8566711fbc9e69c4c17f 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h @@ -88,10 +88,17 @@ public: virtual void getReceiveIndices( int* sendIndices, int direction, int level ) = 0; virtual void reorderSendIndexForCommAfterFtoC(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, - int level) = 0; + int level) = 0; virtual void reorderRecvIndexForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, - int level) = 0; + int level) = 0; + virtual void getAndReorderSendIndices(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCCBorder, + uint sizeOfICellFCCBorder, int direction, int level, + bool sendIndicesNeedToBeReordered) = 0; + virtual void getAndReorderReceiveIndices(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, + uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, int level, + bool receiveIndicesNeedToBeReordered) = 0; + virtual uint getNumberOfFluidNodes(unsigned int level) const = 0; virtual void getFluidNodeIndices(uint *fluidNodeIndices, const int level) const = 0; diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 59b304d5a1623fafccadfb3ebfdd9550b50ed4c2..acc2f872bcd40e1b7ea16d6e0541589f59b61831 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -265,19 +265,47 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::getReceiveIndices(int * receiveIndic receiveIndices[i] = grid->getSparseIndex( grid->getReceiveIndex(direction, i) ) + 1; } } +GRIDGENERATOR_EXPORT void LevelGridBuilder::getAndReorderSendIndices(int *sendIndices, + int &numberOfSendNeighborsAfterFtoC, + uint *iCellFCCBorder, uint sizeOfICellFCCBorder, + int direction, int level, + bool sendIndicesNeedToBeReordered) +{ + getSendIndices(sendIndices, direction, level); + if (sendIndicesNeedToBeReordered) + reorderSendIndexForCommAfterFtoC(sendIndices, numberOfSendNeighborsAfterFtoC, iCellFCCBorder, + sizeOfICellFCCBorder, direction, level); +} +GRIDGENERATOR_EXPORT void LevelGridBuilder::getAndReorderReceiveIndices(int *recvIndices, + int &numberOfRecvNeighborsAfterFtoC, + uint *iCellFCCBorder, uint sizeOfICellFCCBorder, + int direction, int level, + bool receiveIndicesNeedToBeReordered) +{ + getReceiveIndices(recvIndices, direction, level); + if (receiveIndicesNeedToBeReordered) + reorderRecvIndexForCommAfterFtoC(recvIndices, numberOfRecvNeighborsAfterFtoC, iCellFCCBorder, + sizeOfICellFCCBorder, direction, level); +} GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderSendIndexForCommAfterFtoC(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint* iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, int level) { - *logging::out << logging::Logger::INFO_INTERMEDIATE << "reorder send indices for communication after fine to coarse " << "\n"; + *logging::out << logging::Logger::INFO_INTERMEDIATE + << "reorder send indices for communication after fine to coarse: level: " << level + << " direction: " << direction; if (sizeOfICellFCCBorder == 0) *logging::out << logging::Logger::LOGGER_ERROR << "reorderSendIndexForCommAfterFtoC(): iCellFCCBorder needs to be inititalized before calling " "this function " << "\n"; - uint numberOfIndices = getNumberOfSendIndices(direction, level); + if (numberOfIndices == 0) { + numberOfSendNeighborsAfterFtoC = 0; + return; + } + int sparseIndexSend; bool isInICellFCCBorder; std::vector<int> sendIndicesAfterFtoC; @@ -288,12 +316,11 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderSendIndexForCommAfterFtoC(int // check if sparse index is in ICellFCC border isInICellFCCBorder = false; - for (uint j = 0; j < sizeOfICellFCCBorder; j++) { + for (uint j = 0; j < sizeOfICellFCCBorder; j++) if (iCellFCCBorder[j] == sparseIndexSend) { isInICellFCCBorder = true; break; } - } // add index to corresponding vector if (isInICellFCCBorder) @@ -302,21 +329,29 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderSendIndexForCommAfterFtoC(int sendIndicesOther.push_back(sparseIndexSend); } - numberOfSendNeighborsAfterFtoC = sendIndicesAfterFtoC.size(); + numberOfSendNeighborsAfterFtoC = (uint) sendIndicesAfterFtoC.size(); // copy new vectors back to sendIndices array for (uint i = 0; i < numberOfSendNeighborsAfterFtoC; i++) sendIndices[i] = sendIndicesAfterFtoC[i]; - for (uint i = 0; i < sendIndicesOther.size(); i++) { + for (uint i = 0; i < sendIndicesOther.size(); i++) sendIndices[i + numberOfSendNeighborsAfterFtoC] = sendIndicesOther[i]; - } + + *logging::out << logging::Logger::INFO_INTERMEDIATE + << "... numberOfSendNeighborsAfterFtoC: " << numberOfSendNeighborsAfterFtoC << "\n"; + + bool numberOfNodesIsCorrect = numberOfSendNeighborsAfterFtoC + sendIndicesOther.size() == numberOfIndices; + std::cout << "correct number of nodes?: " << numberOfNodesIsCorrect << std::endl; } GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndexForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, int level) { - *logging::out << logging::Logger::INFO_INTERMEDIATE << "reorder receive indices for communication after fine to coarse " << "\n"; + *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 << " sizeOfICellFCCBorder: " << sizeOfICellFCCBorder; if (sizeOfICellFCCBorder == 0) *logging::out << logging::Logger::LOGGER_ERROR << "reorderRecvIndexForCommAfterFtoC(): iCellFCCBorder needs to be inititalized before calling " @@ -324,6 +359,11 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndexForCommAfterFtoC(int << "\n"; uint numberOfIndices = getNumberOfReceiveIndices(direction, level); + if (numberOfIndices == 0) { + numberOfRecvNeighborsAfterFtoC = 0; + return; + } + int sparseIndexRecv; bool isInICellFCCBorder; std::vector<int> recvIndicesAfterFtoC; @@ -334,12 +374,11 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndexForCommAfterFtoC(int // check if sparse index is in ICellFCC border isInICellFCCBorder = false; - for (uint j = 0; j < sizeOfICellFCCBorder; j++) { + for (uint j = 0; j < sizeOfICellFCCBorder; j++) if (iCellFCCBorder[j] == sparseIndexRecv) { isInICellFCCBorder = true; break; } - } // add index to corresponding vector if (isInICellFCCBorder) @@ -348,13 +387,19 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndexForCommAfterFtoC(int recvIndicesOther.push_back(sparseIndexRecv); } - numberOfRecvNeighborsAfterFtoC = recvIndicesAfterFtoC.size(); + numberOfRecvNeighborsAfterFtoC = (uint) recvIndicesAfterFtoC.size(); // copy new vectors back to receiveIndices array for (uint i = 0; i < numberOfRecvNeighborsAfterFtoC; i++) recvIndices[i] = recvIndicesAfterFtoC[i]; for (uint i = 0; i < recvIndicesOther.size(); i++) recvIndices[i + numberOfRecvNeighborsAfterFtoC] = recvIndicesOther[i]; + + *logging::out << logging::Logger::INFO_INTERMEDIATE + << "... numberOfRecvNeighborsAfterFtoC: " << numberOfRecvNeighborsAfterFtoC << "\n"; + + bool numberOfNodesIsCorrect = numberOfRecvNeighborsAfterFtoC + recvIndicesOther.size() == numberOfIndices; + std::cout << "correct number of nodes?: " << numberOfNodesIsCorrect << std::endl; } uint LevelGridBuilder::getNumberOfNodes(unsigned int level) const diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index 704067e2f685050215d65d800fb47308db9e7c4f..8c3fe9256ee6a4ca24450431fbd0869f605010ce 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -149,6 +149,13 @@ public: GRIDGENERATOR_EXPORT uint getNumberOfReceiveIndices( int direction, uint level ) override; GRIDGENERATOR_EXPORT void getSendIndices( int* sendIndices, int direction, int level ) override; GRIDGENERATOR_EXPORT void getReceiveIndices( int* sendIndices, int direction, int level ) override; + GRIDGENERATOR_EXPORT void getAndReorderSendIndices(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, + uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, + int level, bool sendIndicesNeedToBeReordered) override; + GRIDGENERATOR_EXPORT void getAndReorderReceiveIndices(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, + uint *iCellFCCBorder, uint sizeOfICellFCCBorder, + int direction, int level, + bool receiveIndicesNeedToBeReordered) override; GRIDGENERATOR_EXPORT void reorderSendIndexForCommAfterFtoC(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCCBorder, uint sizeOfICellFCCBorder, int direction, int level) override; diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp index 0debc795de1f51e6289d05e73d241bca86a89602..edd9d4eb63085d915136132412b57e7c78aefe89 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp @@ -321,8 +321,21 @@ void GridGenerator::allocArrays_BoundaryValues() cudaMemoryManager->cudaAllocProcessNeighborX(level, j); //////////////////////////////////////////////////////////////////////////////////////// //init index arrays - builder->getSendIndices (para->getParH(level)->sendProcessNeighborX[j].index, direction, level); - builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborX[j].index, direction, level); + para->initNumberOfProcessNeighborsAfterFtoCX(level); + builder->getAndReorderSendIndices( + para->getParH(level)->sendProcessNeighborX[j].index, + para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j], + para->getParH(level)->intFCBorder.ICellFCC, para->getParH(level)->intFCBorder.kFC, + 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]; //////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopyProcessNeighborXIndex(level, j); //////////////////////////////////////////////////////////////////////////////////////// @@ -381,8 +394,21 @@ void GridGenerator::allocArrays_BoundaryValues() cudaMemoryManager->cudaAllocProcessNeighborY(level, j); //////////////////////////////////////////////////////////////////////////////////////// //init index arrays - builder->getSendIndices (para->getParH(level)->sendProcessNeighborY[j].index, direction, level); - builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborY[j].index, direction, level); + para->initNumberOfProcessNeighborsAfterFtoCY(level); + builder->getAndReorderSendIndices( + para->getParH(level)->sendProcessNeighborY[j].index, + para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j], + para->getParH(level)->intFCBorder.ICellFCC, para->getParH(level)->intFCBorder.kFC, + 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]; //////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopyProcessNeighborYIndex(level, j); //////////////////////////////////////////////////////////////////////////////////////// @@ -441,8 +467,21 @@ void GridGenerator::allocArrays_BoundaryValues() cudaMemoryManager->cudaAllocProcessNeighborZ(level, j); //////////////////////////////////////////////////////////////////////////////////////// //init index arrays - builder->getSendIndices (para->getParH(level)->sendProcessNeighborZ[j].index, direction, level); - builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborZ[j].index, direction, level); + para->initNumberOfProcessNeighborsAfterFtoCZ(level); + builder->getAndReorderSendIndices( + para->getParH(level)->sendProcessNeighborZ[j].index, + para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j], + para->getParH(level)->intFCBorder.ICellFCC, para->getParH(level)->intFCBorder.kFC, + 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]; //////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopyProcessNeighborZIndex(level, j); ////////////////////////////////////////////////////////////////////////////////////////