diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp index 36cedd63677f13bb82bfd8d8f49b2656c324ce9b..ed4470e79e913502bf219e649b4cc08ad6734113 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp @@ -3,6 +3,7 @@ #include <filesystem> #include "ExchangeData27.h" +#include "gpu/VirtualFluids_GPU/LBM/LB.h" #include <basics/config/ConfigurationFile.h> @@ -30,7 +31,10 @@ protected: int level = 0; int numNodes = 10; std::vector<real> recvFs; - + std::vector<real> sendFs; + std::vector<ProcessNeighbor27> sendProcessNeighborHost; + std::vector<ProcessNeighbor27> recvProcessNeighborHost; + void SetUp() override { para = initParameterClass(); @@ -43,35 +47,64 @@ protected: 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); + } - SPtr<std::vector<ProcessNeighbor27>> setUpRecvProcessNeighbors(int numberOfNodesInRecv){ - SPtr<std::vector<ProcessNeighbor27>>recvProcessNeighborHost=std::make_shared<std::vector<ProcessNeighbor27>>(1); + 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)[0].f[0] = recvFs.data(); - (*recvProcessNeighborHost)[0].numberOfNodes = numberOfNodesInRecv; - return recvProcessNeighborHost; - } + recvProcessNeighborHost.resize(1); + recvProcessNeighborHost[0].f[0] = recvFs.data(); + recvProcessNeighborHost[0].numberOfNodes = numberOfNodesInRecv; + } + + void setUpSendProcessNeighbors(int numberOfNodesInSend) + { + sendFs.resize(27 * numberOfNodesInSend); + std::fill(sendFs.begin(), sendFs.end(), 0.0); + + 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); - // recvProcessNeighborHost - SPtr<std::vector<ProcessNeighbor27>>recvProcessNeighborHost = setUpRecvProcessNeighbors(numNodes); + // expected + std::vector<real> expectedFs(numNodesAfterFtoC, 0.0); + expectedFs[1] = 0.1; + expectedFs[3] = 0.1; + setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC); - // sendProcessNeighborHost - std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); - std::vector<real> sendFs(27 * numNodesAfterFtoC, 0.0); - sendProcessNeighborHost[0].f[0] = sendFs.data(); - sendProcessNeighborHost[0].numberOfNodes = 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); + + EXPECT_THAT(result, testing::Eq(expectedFs)); +} + +TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAfterFtoC_recvVectorShort) +{ + int numNodesAfterFtoC = 5; // indexInSend < 5 --> mode is in AfterFToC + setUpRecvProcessNeighbors(numNodesAfterFtoC); + setUpSendProcessNeighbors(numNodesAfterFtoC); // expected std::vector<real> expectedFs(numNodesAfterFtoC, 0.0); @@ -80,7 +113,7 @@ TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAft setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC); // act - copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, *recvProcessNeighborHost, sendProcessNeighborHost); + copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost); // convert result to std::vector std::vector<real> result; @@ -91,14 +124,8 @@ TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAft TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicateAll) { - // recvProcessNeighborHost - SPtr<std::vector<ProcessNeighbor27>>recvProcessNeighborHost = setUpRecvProcessNeighbors(numNodes); - - // sendProcessNeighborHost - std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); - std::vector<real> sendFs(27 * numNodes, 0.0); - sendProcessNeighborHost[0].f[0] = sendFs.data(); - sendProcessNeighborHost[0].numberOfNodes = numNodes; + setUpRecvProcessNeighbors(numNodes); + setUpSendProcessNeighbors(numNodes); // expected std::vector<real> expectedFs(numNodes, 0.0); @@ -109,7 +136,7 @@ TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicateAll) setUpFsByCopyingF0(expectedFs, numNodes); // act - copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, *recvProcessNeighborHost, sendProcessNeighborHost); + copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost); // convert result to std::vector std::vector<real> result;