diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp index 5eceb4beb3d896cd37cecec5d505b8f522f29d6e..2f2e57bf4f97600012d1dad835956e89c5722b91 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp @@ -252,7 +252,7 @@ void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator *comm, CudaMe if (para->getUseStreams() && para->getNumberOfProcessNeighborsX(level, "recv") > 0 && para->getParH(level)->sendProcessNeighborY.size() != 0) { if( para->getParH(level)->sendProcessNeighborY[0].numberOfNodes == (*sendProcessNeighborHost)[0].numberOfNodes){ // check if in communication of all nodes (as opposed to reduced communication after fine to coarse) - copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborX, *sendProcessNeighborHost); + copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborX, *sendProcessNeighborHost); } else{ copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborsAfterFtoCX, *sendProcessNeighborHost); } diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp index 0da86e64d4a477155e8897ca180018f1326604e7..ed4470e79e913502bf219e649b4cc08ad6734113 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp @@ -3,19 +3,11 @@ #include <filesystem> #include "ExchangeData27.h" +#include "gpu/VirtualFluids_GPU/LBM/LB.h" #include <basics/config/ConfigurationFile.h> -auto RealEq = [](auto value) { -#ifdef VF_DOUBLE_ACCURACY - return testing::DoubleEq(value); -#else - return testing::FloatEq(value); -#endif -}; - - -SPtr<Parameter> initParameterClass(std::shared_ptr<Parameter> ¶) +SPtr<Parameter> initParameterClass() { std::filesystem::path filePath = __FILE__; // assuming that the config file is stored parallel to this file. filePath.replace_filename("ExchangeData27Test.cfg"); @@ -24,84 +16,116 @@ SPtr<Parameter> initParameterClass(std::shared_ptr<Parameter> ¶) return std::make_shared<Parameter>(config, 1, 0); } -TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC) +void setUpFsByCopyingF0(std::vector<real> &distributionVector, int numberOfNodes) { - int level = 0; - SPtr<Parameter> para = initParameterClass(para); - para->setMaxLevel(level + 1); // setMaxLevel resizes parH - para->initLBMSimulationParameter(); // init parH - - // indexInSend < 5 --> in AfterFToC - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,1,0,1); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,2,0,3); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8); + for (uint direction = 0; direction < dirEND; direction++) { + distributionVector.insert(distributionVector.end(), distributionVector.begin(), + distributionVector.begin() + numberOfNodes); + } +} +class ExchangeData27Test_CopyEdgeNodesXZTest : public testing::Test +{ +protected: + SPtr<Parameter> para; + int level = 0; int numNodes = 10; - int numNodesAfterFtoC = 5; - - - std::vector<ProcessNeighbor27> recvProcessNeighborHost(1); - std::vector<real> recvFs(numNodes, 0.5); - for (LBMSimulationParameter::EdgeNodePositions edgeNode : para->getParH(level)->edgeNodesXtoZ){ - recvFs[edgeNode.indexInRecvBuffer] = 0.1; + std::vector<real> recvFs; + std::vector<real> sendFs; + std::vector<ProcessNeighbor27> sendProcessNeighborHost; + std::vector<ProcessNeighbor27> recvProcessNeighborHost; + + void SetUp() override + { + para = initParameterClass(); + para->setMaxLevel(level + 1); // setMaxLevel resizes parH + para->initLBMSimulationParameter(); // init parH + + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 1, 0, 1); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 6, 0, 6); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 2, 0, 3); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 7, 0, 8); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 7, 0, 8); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0, 7, 0, 8); + } - for (uint direction = 0; direction <= dirEND; direction ++){ - recvFs.insert(recvFs.end(), recvFs.begin(), recvFs.begin()+10); + + void setUpRecvProcessNeighbors(int numberOfNodesInRecv) + { + recvFs.resize(numberOfNodesInRecv); + std::fill(recvFs.begin(), recvFs.end(), 0.5); // 0.5s should not be copied + for (LBMSimulationParameter::EdgeNodePositions edgeNode : para->getParH(level)->edgeNodesXtoZ) { + if(edgeNode.indexInRecvBuffer>numberOfNodesInRecv){ + continue; + } + recvFs[edgeNode.indexInRecvBuffer] = 0.1; // 0.1s should be copied + } + setUpFsByCopyingF0(recvFs, numberOfNodesInRecv); + + recvProcessNeighborHost.resize(1); + recvProcessNeighborHost[0].f[0] = recvFs.data(); + recvProcessNeighborHost[0].numberOfNodes = numberOfNodesInRecv; } - recvProcessNeighborHost[0].f[0] = recvFs.data(); - recvProcessNeighborHost[0].numberOfNodes = numNodes; + void setUpSendProcessNeighbors(int numberOfNodesInSend) + { + sendFs.resize(27 * numberOfNodesInSend); + std::fill(sendFs.begin(), sendFs.end(), 0.0); - - std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); - std::vector<real> sendFs(27*numNodesAfterFtoC, 0.0); - sendProcessNeighborHost[0].f[0] = sendFs.data(); - sendProcessNeighborHost[0].numberOfNodes = numNodesAfterFtoC; + sendProcessNeighborHost.resize(1); + sendProcessNeighborHost[0].f[0] = sendFs.data(); + sendProcessNeighborHost[0].numberOfNodes = numberOfNodesInSend; + } +}; + +TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAfterFtoC_recvVectorFullSize) +{ + int numNodesAfterFtoC = 5; // indexInSend < 5 --> mode is in AfterFToC + setUpRecvProcessNeighbors(numNodes); + setUpSendProcessNeighbors(numNodesAfterFtoC); // expected std::vector<real> expectedFs(numNodesAfterFtoC, 0.0); expectedFs[1] = 0.1; expectedFs[3] = 0.1; - std::vector<real> expectedFsAllDirections; - for (uint direction = 0; direction <= dirEND; direction ++){ - expectedFsAllDirections.insert(expectedFsAllDirections.end(), expectedFs.begin(), expectedFs.end()); - } - + setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC); + // act copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost); // convert result to std::vector std::vector<real> result; - result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27*numNodesAfterFtoC); + result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27 * numNodesAfterFtoC); - EXPECT_THAT(result, testing::Eq(expectedFsAllDirections)); + EXPECT_THAT(result, testing::Eq(expectedFs)); } -TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicateAll) +TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAfterFtoC_recvVectorShort) { - int level = 0; - SPtr<Parameter> para = initParameterClass(para); - para->setMaxLevel(level + 1); // setMaxLevel resizes parH - para->initLBMSimulationParameter(); // init parH + int numNodesAfterFtoC = 5; // indexInSend < 5 --> mode is in AfterFToC + setUpRecvProcessNeighbors(numNodesAfterFtoC); + setUpSendProcessNeighbors(numNodesAfterFtoC); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,1,0,1); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,2,0,3); - para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8); + // expected + std::vector<real> expectedFs(numNodesAfterFtoC, 0.0); + expectedFs[1] = 0.1; + expectedFs[3] = 0.1; + setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC); - int numNodes = 10; + // act + copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost); - std::vector<ProcessNeighbor27> recvProcessNeighborHost(1); - std::vector<real> recvFs(27*numNodes, 0.1); - recvProcessNeighborHost[0].f[0] = recvFs.data(); - recvProcessNeighborHost[0].numberOfNodes = numNodes; - - std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); - std::vector<real> sendFs(27*numNodes, 0.0); - sendProcessNeighborHost[0].f[0] = sendFs.data(); - sendProcessNeighborHost[0].numberOfNodes = numNodes; + // convert result to std::vector + std::vector<real> result; + result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27 * numNodesAfterFtoC); + EXPECT_THAT(result, testing::Eq(expectedFs)); +} + +TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicateAll) +{ + setUpRecvProcessNeighbors(numNodes); + setUpSendProcessNeighbors(numNodes); // expected std::vector<real> expectedFs(numNodes, 0.0); @@ -109,17 +133,14 @@ TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicateAll) expectedFs[3] = 0.1; expectedFs[6] = 0.1; expectedFs[8] = 0.1; - std::vector<real> expectedFsAllDirections; - for (uint direction = 0; direction <= dirEND; direction ++){ - expectedFsAllDirections.insert(expectedFsAllDirections.end(), expectedFs.begin(), expectedFs.end()); - } - + setUpFsByCopyingF0(expectedFs, numNodes); + // act copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost); // convert result to std::vector std::vector<real> result; - result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27*numNodes); + result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27 * numNodes); - EXPECT_THAT(result, testing::Eq(expectedFsAllDirections)); + EXPECT_THAT(result, testing::Eq(expectedFs)); } \ No newline at end of file