diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h index da4ab7e5d40ac4eeeae998008745e9c7f4d9d032..025fffaf7290ad0f11313e3e44b79f0098a68816 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h @@ -86,10 +86,10 @@ public: virtual uint getNumberOfReceiveIndices( int direction, uint level ) = 0; virtual void getSendIndices( int* sendIndices, int direction, int level ) = 0; virtual void getReceiveIndices( int* sendIndices, int direction, int level ) = 0; - virtual void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, uint &numberOfRecvNeighborsAfterFtoC, + virtual void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, std::vector<uint> &sendIndicesForCommAfterFtoCPositions, int direction, int level) = 0; - virtual void reorderSendIndicesForCommAfterFtoC(int *sendIndices, uint &numberOfSendNeighborsAfterFtoC, + virtual void reorderSendIndicesForCommAfterFtoC(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCC, uint sizeOfICellFCC, uint *iCellCFC, uint sizeOfICellCFC, uint *neighborX, uint *neighborY, uint *neighborZ, int direction, int level, diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 026c4baad1ffd2779a7dde16e35699e59d459ac6..4011945313103c49596d727d12721c127dc2c6ae 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -268,7 +268,7 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::getReceiveIndices(int * receiveIndic } GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderSendIndicesForCommAfterFtoC( - int *sendIndices, uint &numberOfSendNeighborsAfterFtoC, uint *iCellFCC, uint sizeOfICellFCC, uint *iCellCFC, + int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCC, uint sizeOfICellFCC, uint *iCellCFC, uint sizeOfICellCFC, uint *neighborX, uint *neighborY, uint *neighborZ, int direction, int level, std::vector<uint> &sendIndicesForCommAfterFtoCPositions) { @@ -389,7 +389,7 @@ void LevelGridBuilder::findIfSparseIndexIsInSendIndicesAndAddToVectors( } } -GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndicesForCommAfterFtoC(int *recvIndices, uint &numberOfRecvNeighborsAfterFtoC, +GRIDGENERATOR_EXPORT void LevelGridBuilder::reorderRecvIndicesForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, std::vector<uint> &sendIndicesForCommAfterFtoCPositions, int direction, int level) { diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index ebb96bf0bf6a4209643b572e30a4782a1fdacd64..2dcaf5b5b789eefed8a5c0fc68f2303b8de0448c 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -149,7 +149,7 @@ 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 reorderSendIndicesForCommAfterFtoC(int *sendIndices, uint &numberOfSendNeighborsAfterFtoC, + GRIDGENERATOR_EXPORT void reorderSendIndicesForCommAfterFtoC(int *sendIndices, int &numberOfSendNeighborsAfterFtoC, uint *iCellFCC, uint sizeOfICellFCC, uint *iCellCFC, uint sizeOfICellCFC, uint *neighborX, uint *neighborY, uint *neighborZ, int direction, int level, @@ -157,7 +157,7 @@ public: void findIfSparseIndexIsInSendIndicesAndAddToVectors(int sparseIndex, int *sendIndices, uint numberOfSendIndices, std::vector<int> &sendIndicesAfterFtoC, std::vector<uint> &sendIndicesForCommAfterFtoCPositions) const; - GRIDGENERATOR_EXPORT void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, uint &numberOfRecvNeighborsAfterFtoC, + GRIDGENERATOR_EXPORT void reorderRecvIndicesForCommAfterFtoC(int *recvIndices, int &numberOfRecvNeighborsAfterFtoC, std::vector<uint> &sendIndicesForCommAfterFtoCPositions, 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 c7b7a983c6e6076c165b887825ac2ff45f755bc2..ed1db24c54a312b7884efa00a3445e75eaf50d9b 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp @@ -700,17 +700,17 @@ void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseZ(const uint std::vector<uint> sendIndicesForCommAfterFtoCPositions; builder->reorderSendIndicesForCommAfterFtoC( para->getParH(level)->sendProcessNeighborZ[j].index, - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j], para->getParH(level)->intFC.ICellFCC, + para->getParH(level)->sendProcessNeighborsAfterFtoCZ[j].numberOfNodes, 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, sendIndicesForCommAfterFtoCPositions); builder->reorderRecvIndicesForCommAfterFtoC(para->getParH(level)->recvProcessNeighborZ[j].index, - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j], + para->getParH(level)->recvProcessNeighborsAfterFtoCZ[j].numberOfNodes, sendIndicesForCommAfterFtoCPositions, direction, level); - para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCZ[j] = - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ[j]; - para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j] = - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ[j]; + para->getParD(level)->sendProcessNeighborsAfterFtoCZ[j].numberOfNodes = + para->getParH(level)->sendProcessNeighborsAfterFtoCZ[j].numberOfNodes; + para->getParD(level)->recvProcessNeighborsAfterFtoCZ[j].numberOfNodes = + para->getParH(level)->recvProcessNeighborsAfterFtoCZ[j].numberOfNodes; } void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseY(const uint &level, int j, int direction) @@ -720,17 +720,18 @@ void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseY(const uint std::vector<uint> sendIndicesForCommAfterFtoCPositions; builder->reorderSendIndicesForCommAfterFtoC( para->getParH(level)->sendProcessNeighborY[j].index, - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j], para->getParH(level)->intFC.ICellFCC, + para->getParH(level)->sendProcessNeighborsAfterFtoCY[j].numberOfNodes, 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, sendIndicesForCommAfterFtoCPositions); - para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCY[j] = - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j]; + para->getParD(level)->sendProcessNeighborsAfterFtoCY[j].numberOfNodes = + para->getParH(level)->sendProcessNeighborsAfterFtoCY[j].numberOfNodes; // send sendIndicesForCommAfterFtoCPositions to receiving process std::vector<uint> recvIndicesForCommAfterFtoCPositions; - recvIndicesForCommAfterFtoCPositions.resize(para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY[j] * 2); // give vector an arbitraty size (larger than needed) + recvIndicesForCommAfterFtoCPositions.resize(para->getParH(level)->sendProcessNeighborsAfterFtoCY[j].numberOfNodes * + 2); // give vector an arbitraty size (larger than needed) auto comm = vf::gpu::Communicator::getInstanz(); comm->exchangeIndices(recvIndicesForCommAfterFtoCPositions.data(), recvIndicesForCommAfterFtoCPositions.size(), para->getParH(level)->recvProcessNeighborY[j].rankNeighbor, @@ -742,10 +743,10 @@ void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseY(const uint // init receive indices builder->reorderRecvIndicesForCommAfterFtoC(para->getParH(level)->recvProcessNeighborY[j].index, - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j], + para->getParH(level)->recvProcessNeighborsAfterFtoCY[j].numberOfNodes, recvIndicesForCommAfterFtoCPositions, direction, level); - para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCY[j] = - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY[j]; + para->getParD(level)->recvProcessNeighborsAfterFtoCY[j].numberOfNodes = + para->getParH(level)->recvProcessNeighborsAfterFtoCY[j].numberOfNodes; } void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseX(const uint &level, int j, int direction) @@ -754,17 +755,17 @@ void GridGenerator::initCommunicationArraysForCommAfterFinetoCoarseX(const uint std::vector<uint> sendIndicesForCommAfterFtoCPositions; builder->reorderSendIndicesForCommAfterFtoC( para->getParH(level)->sendProcessNeighborX[j].index, - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j], para->getParH(level)->intFC.ICellFCC, + para->getParH(level)->sendProcessNeighborsAfterFtoCX[j].numberOfNodes, 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, sendIndicesForCommAfterFtoCPositions); builder->reorderRecvIndicesForCommAfterFtoC(para->getParH(level)->recvProcessNeighborX[j].index, - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j], + para->getParH(level)->recvProcessNeighborsAfterFtoCX[j].numberOfNodes, sendIndicesForCommAfterFtoCPositions, direction, level); - para->getParD(level)->numberOfSendProcessNeighborsAfterFtoCX[j] = - para->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX[j]; - para->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCX[j] = - para->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX[j]; + para->getParD(level)->sendProcessNeighborsAfterFtoCX[j].numberOfNodes = + para->getParH(level)->sendProcessNeighborsAfterFtoCX[j].numberOfNodes; + para->getParD(level)->recvProcessNeighborsAfterFtoCX[j].numberOfNodes = + para->getParH(level)->recvProcessNeighborsAfterFtoCX[j].numberOfNodes; } diff --git a/src/gpu/VirtualFluids_GPU/LBM/LB.h b/src/gpu/VirtualFluids_GPU/LBM/LB.h index a33b3b792cd451307825fd0b2c8716e942440582..b60de6a0910211f672e5a5dabc963501422936eb 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/LB.h +++ b/src/gpu/VirtualFluids_GPU/LBM/LB.h @@ -235,6 +235,12 @@ typedef struct PN27{ int numberOfFs; }ProcessNeighbor27; +typedef struct PN27AfterFtoC { + uint memsizeFs; + uint memsizeIndex; + int numberOfNodes; +} ProcessNeighbor27AfterFtoC; + typedef struct PN_F3 { real* g[6]; uint memsizeGs; diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index 7fceddba58dfff7c3d821a754c5a260c825fbf9b..b7b8dd7ae16f067923fcf5f72b20fd9c5300d033 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -2505,7 +2505,8 @@ bool Parameter::getKernelNeedsFluidNodeIndicesToRun() { return this->kernelNeeds void Parameter::findCornerNodesCommMultiGPU() { for (uint level = 0; level < parH.size(); level++) { findCornerNodesXY(level); - findCornerNodesXY(level); + findCornerNodesXZ(level); + findCornerNodesYZ(level); } } @@ -2577,37 +2578,37 @@ bool Parameter::findIndexInSendNodesYZ(int level, int index) void Parameter::initNumberOfProcessNeighborsAfterFtoCX(int level) { - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCX.resize( this->getParH(level)->sendProcessNeighborX.size()); - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCX.resize( this->getParH(level)->recvProcessNeighborX.size()); - this->getParD(level)->numberOfSendProcessNeighborsAfterFtoCX.resize( - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCX.size()); - this->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCX.resize( - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCX.size()); + this->getParD(level)->sendProcessNeighborsAfterFtoCX.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCX.size()); + this->getParD(level)->recvProcessNeighborsAfterFtoCX.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCX.size()); } void Parameter::initNumberOfProcessNeighborsAfterFtoCY(int level) { - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCY.resize( this->getParH(level)->sendProcessNeighborY.size()); - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCY.resize( this->getParH(level)->recvProcessNeighborY.size()); - this->getParD(level)->numberOfSendProcessNeighborsAfterFtoCY.resize( - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCY.size()); - this->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCY.resize( - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCY.size()); + this->getParD(level)->sendProcessNeighborsAfterFtoCY.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCY.size()); + this->getParD(level)->recvProcessNeighborsAfterFtoCY.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCY.size()); } void Parameter::initNumberOfProcessNeighborsAfterFtoCZ(int level) { - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCZ.resize( this->getParH(level)->sendProcessNeighborZ.size()); - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCZ.resize( this->getParH(level)->recvProcessNeighborZ.size()); - this->getParD(level)->numberOfSendProcessNeighborsAfterFtoCZ.resize( - this->getParH(level)->numberOfSendProcessNeighborsAfterFtoCZ.size()); - this->getParD(level)->numberOfRecvProcessNeighborsAfterFtoCZ.resize( - this->getParH(level)->numberOfRecvProcessNeighborsAfterFtoCZ.size()); + this->getParD(level)->sendProcessNeighborsAfterFtoCZ.resize( + this->getParH(level)->sendProcessNeighborsAfterFtoCZ.size()); + this->getParD(level)->recvProcessNeighborsAfterFtoCZ.resize( + this->getParH(level)->recvProcessNeighborsAfterFtoCZ.size()); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index d5583df04b104d9c6e71e3d70f4fd8d43f05a966..0592ba9455a3498fb74e613a4e4c46ef302e90ff 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -294,12 +294,12 @@ struct LBMSimulationParameter std::vector<ProcessNeighbor27> recvProcessNeighborY; std::vector<ProcessNeighbor27> recvProcessNeighborZ; - std::vector<uint> numberOfSendProcessNeighborsAfterFtoCX; - std::vector<uint> numberOfSendProcessNeighborsAfterFtoCY; - std::vector<uint> numberOfSendProcessNeighborsAfterFtoCZ; - std::vector<uint> numberOfRecvProcessNeighborsAfterFtoCX; - std::vector<uint> numberOfRecvProcessNeighborsAfterFtoCY; - std::vector<uint> numberOfRecvProcessNeighborsAfterFtoCZ; + std::vector<ProcessNeighbor27AfterFtoC> sendProcessNeighborsAfterFtoCX; + std::vector<ProcessNeighbor27AfterFtoC> sendProcessNeighborsAfterFtoCY; + std::vector<ProcessNeighbor27AfterFtoC> sendProcessNeighborsAfterFtoCZ; + std::vector<ProcessNeighbor27AfterFtoC> recvProcessNeighborsAfterFtoCX; + std::vector<ProcessNeighbor27AfterFtoC> recvProcessNeighborsAfterFtoCY; + std::vector<ProcessNeighbor27AfterFtoC> recvProcessNeighborsAfterFtoCZ; /////////////////////////////////////////////////////// // 3D domain decomposition convection diffusion std::vector<ProcessNeighbor27> sendProcessNeighborADX;