From 9720b7e26ec2f3346452d43dceedaf7f4456c63e Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-braunschweig.de> Date: Thu, 10 Mar 2022 10:27:52 +0100 Subject: [PATCH] Add tests for findEdgeNodesCommMultiGPU --- .../Parameter/ParameterTest.cpp | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) diff --git a/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp b/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp index aa0551632..df77d0fd4 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/ParameterTest.cpp @@ -155,4 +155,221 @@ TEST(ParameterTest, check_all_Parameter_CanBePassedToConstructor) } +TEST(ParameterTest, findEdgeNodesXY_shouldReturnCorrectVector) +{ + + std::filesystem::path filePath = __FILE__; + filePath.replace_filename("parameterTest.cfg"); + vf::basics::ConfigurationFile config; + config.load(filePath.string()); + Parameter para(config, 1, 0); + + para.initLBMSimulationParameter(); + + int level = 0; + para.parH[level]->recvProcessNeighborX.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborY.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborY.push_back(ProcessNeighbor27()); + + int numRecvNeighbor = (int)para.parH[level]->recvProcessNeighborX.size() - 1; + int numSendNeighbor = (int)para.parH[level]->sendProcessNeighborY.size() - 1; + + const int sizeRecv = 6; + const int sizeSend = 10; + para.parH[level]->recvProcessNeighborX[numRecvNeighbor].numberOfNodes = sizeRecv; + para.parH[level]->sendProcessNeighborY[numSendNeighbor].numberOfNodes = sizeSend; + + int recvNeighbors[sizeRecv] = { 1, 2, 3, 4, 5, 6 }; + para.parH[level]->recvProcessNeighborX[numRecvNeighbor].index = recvNeighbors; + + int sendNeighbors[sizeSend] = { 20, 1, 21, 22, 6, 23, 5, 24, 25, 26 }; + para.parH[level]->sendProcessNeighborY[numSendNeighbor].index = sendNeighbors; + + + para.findEdgeNodesCommMultiGPU(); + + + std::vector<std::pair<int, int>> expectedEdgeNodesXtoYRecv = { std::pair(numRecvNeighbor, 0), + std::pair(numRecvNeighbor, 4), + std::pair(numRecvNeighbor, 5) }; + + std::vector<std::pair<int, int>> expectedEdgeNodesXtoYSend = { std::pair(numSendNeighbor, 1), + std::pair(numSendNeighbor, 6), + std::pair(numSendNeighbor, 4) }; + + EXPECT_THAT(para.parH[level]->edgeNodesXtoY.size(), testing::Eq(expectedEdgeNodesXtoYRecv.size())); + + bool vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoYRecv.size(); i++) { + if (para.parH[level]->edgeNodesXtoY[i].indexOfProcessNeighborRecv != expectedEdgeNodesXtoYRecv[i].first) { + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesXtoY[i].indexInRecvBuffer != expectedEdgeNodesXtoYRecv[i].second) { + vectorsAreIdentical = false; + break; + } + } + + EXPECT_TRUE(vectorsAreIdentical); + + vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoYSend.size(); i++) { + if (para.parH[level]->edgeNodesXtoY[i].indexOfProcessNeighborSend != expectedEdgeNodesXtoYSend[i].first) { + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesXtoY[i].indexInSendBuffer != expectedEdgeNodesXtoYSend[i].second) { + vectorsAreIdentical = false; + break; + } + } + + EXPECT_TRUE(vectorsAreIdentical); +} + +TEST(ParameterTest, findEdgeNodesXZ_shouldReturnCorrectVector) +{ + + std::filesystem::path filePath = __FILE__; + filePath.replace_filename("parameterTest.cfg"); + vf::basics::ConfigurationFile config; + config.load(filePath.string()); + Parameter para(config, 1, 0); + + para.initLBMSimulationParameter(); + + int level = 0; + para.parH[level]->recvProcessNeighborX.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborZ.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborZ.push_back(ProcessNeighbor27()); + + int numRecvNeighbor = (int)para.parH[level]->recvProcessNeighborX.size() - 1; + int numSendNeighbor = (int)para.parH[level]->sendProcessNeighborZ.size() - 1; + + const int sizeRecv = 10; + const int sizeSend = 6; + + para.parH[level]->recvProcessNeighborX[numRecvNeighbor].numberOfNodes = sizeRecv; + para.parH[level]->sendProcessNeighborZ[numSendNeighbor].numberOfNodes = sizeSend; + + int recvNeighbors[sizeRecv] = { 20, 1, 21, 22, 6, 23, 5, 24, 25, 26 }; + para.parH[level]->recvProcessNeighborX[numRecvNeighbor].index = recvNeighbors; + + int sendNeighbors[sizeSend] = { 1, 2, 3, 4, 5, 6 }; + para.parH[level]->sendProcessNeighborZ[numSendNeighbor].index = sendNeighbors; + + + para.findEdgeNodesCommMultiGPU(); + + + std::vector<std::pair<int, int>> expectedEdgeNodesXtoZRecv = { std::pair(numRecvNeighbor, 1), + std::pair(numRecvNeighbor, 4), + std::pair(numRecvNeighbor, 6) }; + std::vector<std::pair<int, int>> expectedEdgeNodesXtoZSend = { std::pair(numSendNeighbor, 0), + std::pair(numSendNeighbor, 5), + std::pair(numSendNeighbor, 4) }; + + EXPECT_THAT(para.parH[level]->edgeNodesXtoZ.size(), testing::Eq(expectedEdgeNodesXtoZRecv.size())); + + bool vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoZRecv.size(); i++) { + if (para.parH[level]->edgeNodesXtoZ[i].indexOfProcessNeighborRecv != expectedEdgeNodesXtoZRecv[i].first) { + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesXtoZ[i].indexInRecvBuffer != expectedEdgeNodesXtoZRecv[i].second) { + vectorsAreIdentical = false; + break; + } + } + + EXPECT_TRUE(vectorsAreIdentical); + + vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoZRecv.size(); i++) { + if (para.parH[level]->edgeNodesXtoZ[i].indexOfProcessNeighborSend != expectedEdgeNodesXtoZSend[i].first){ + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesXtoZ[i].indexInSendBuffer != expectedEdgeNodesXtoZSend[i].second) { + vectorsAreIdentical = false; + break; + } + } + + EXPECT_TRUE(vectorsAreIdentical); +} + +TEST(ParameterTest, findEdgeNodesYZ_shouldReturnCorrectVector) +{ + + std::filesystem::path filePath = __FILE__; + filePath.replace_filename("parameterTest.cfg"); + vf::basics::ConfigurationFile config; + config.load(filePath.string()); + Parameter para(config, 1, 0); + + para.initLBMSimulationParameter(); + + int level = 0; + + para.parH[level]->recvProcessNeighborY.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborZ.push_back(ProcessNeighbor27()); + para.parH[level]->sendProcessNeighborZ.push_back(ProcessNeighbor27()); + + const int sizeRecv = 10; + const int sizeSend1 = 6; + const int sizeSend2 = 5; + + para.parH[level]->recvProcessNeighborY[0].numberOfNodes = sizeRecv; + para.parH[level]->sendProcessNeighborZ[0].numberOfNodes = sizeSend1; + para.parH[level]->sendProcessNeighborZ[1].numberOfNodes = sizeSend2; + + int recvNeighbors[sizeRecv] = { 20, 1, 9, 22, 6, 23, 5, 24, 11, 26 }; + para.parH[level]->recvProcessNeighborY[0].index = recvNeighbors; + + int sendNeighbors1[sizeSend1] = { 1, 2, 3, 4, 5, 6 }; + int sendNeighbors2[sizeSend2] = { 7, 8, 9, 10, 11 }; + para.parH[level]->sendProcessNeighborZ[0].index = sendNeighbors1; + para.parH[level]->sendProcessNeighborZ[1].index = sendNeighbors2; + + + para.findEdgeNodesCommMultiGPU(); + + + std::vector<std::pair<int, int>> expectedEdgeNodesXtoZRecv = { std::pair(0, 1), std::pair(0, 2), std::pair(0, 4), + std::pair(0, 6), std::pair(0, 8) }; + std::vector<std::pair<int, int>> expectedEdgeNodesXtoZSend = { std::pair(0, 0), std::pair(1, 2), std::pair(0, 5), + std::pair(0, 4), std::pair(1, 4) }; + + EXPECT_THAT(para.parH[level]->edgeNodesYtoZ.size(), testing::Eq(expectedEdgeNodesXtoZRecv.size())); + + bool vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoZRecv.size(); i++) { + if (para.parH[level]->edgeNodesYtoZ[i].indexOfProcessNeighborRecv != expectedEdgeNodesXtoZRecv[i].first) { + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesYtoZ[i].indexInRecvBuffer != expectedEdgeNodesXtoZRecv[i].second) { + vectorsAreIdentical = false; + break; + } + } + + EXPECT_TRUE(vectorsAreIdentical); + + vectorsAreIdentical = true; + for (int i = 0; i < (int)expectedEdgeNodesXtoZRecv.size(); i++) { + if (para.parH[level]->edgeNodesYtoZ[i].indexOfProcessNeighborSend != expectedEdgeNodesXtoZSend[i].first) { + vectorsAreIdentical = false; + break; + } + if (para.parH[level]->edgeNodesYtoZ[i].indexInSendBuffer != expectedEdgeNodesXtoZSend[i].second) { + vectorsAreIdentical = false; + break; + } + } + EXPECT_TRUE(vectorsAreIdentical); +} \ No newline at end of file -- GitLab