From 5fd0a12ce6f5e186d787651b81ebec06566a449d Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-bs.de> Date: Mon, 25 Apr 2022 17:15:16 +0200 Subject: [PATCH] Add tests for copyEdgeNodes_XZ --- src/gpu/VirtualFluids_GPU/CMakeLists.txt | 1 + .../Communication/ExchangeData27Test.cfg | 3 + .../Communication/ExchangeData27Test.cpp | 120 ++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cfg create mode 100644 src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt index 5c9359944..f63822095 100644 --- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt +++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt @@ -20,4 +20,5 @@ vf_add_tests() if(BUILD_VF_UNIT_TESTS) set_target_properties(VirtualFluids_GPUTests PROPERTIES CUDA_SEPARABLE_COMPILATION ON) set_source_files_properties(Kernel/Utilities/DistributionHelperTests.cpp PROPERTIES LANGUAGE CUDA) + target_include_directories(VirtualFluids_GPUTests PRIVATE "${VF_THIRD_DIR}/cuda_samples/") endif() diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cfg b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cfg new file mode 100644 index 000000000..e414d4f31 --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cfg @@ -0,0 +1,3 @@ +# these two parameters need to be defined in each config file +Path = /output/path +GridPath = /path/to/grid \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp new file mode 100644 index 000000000..77dd7e345 --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp @@ -0,0 +1,120 @@ +#include <gmock/gmock.h> + +#include <filesystem> + +#include "ExchangeData27.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> ¶) +{ + std::filesystem::path filePath = __FILE__; // assuming that the config file is stored parallel to this file. + filePath.replace_filename("ExchangeData27Test.cfg"); + vf::basics::ConfigurationFile config; + config.load(filePath.string()); + return std::make_shared<Parameter>(config, 1, 0); +} + +TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC) +{ + 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,2,0,3); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8); + + int numNodes = 10; + + std::vector<ProcessNeighbor27> recvProcessNeighborHostAllNodes(1); + std::vector<real> recvFs(numNodes*27, 0.1); + recvProcessNeighborHostAllNodes[0].f[0] = recvFs.data(); + recvProcessNeighborHostAllNodes[0].numberOfNodes = numNodes; + + std::vector<ProcessNeighbor27> sendProcessNeighborHostAllNodes(1); + std::vector<real> sendFs(numNodes*27, 0.0); + sendProcessNeighborHostAllNodes[0].f[0] = sendFs.data(); + sendProcessNeighborHostAllNodes[0].numberOfNodes = numNodes; + + std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); + sendProcessNeighborHost[0].numberOfNodes = 5; + + // expected + std::vector<real> expectedFs(numNodes, 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()); + } + + // act + copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHostAllNodes, sendProcessNeighborHostAllNodes, sendProcessNeighborHost); + + // convert result to std::vector + std::vector<real> result; + result.assign(sendProcessNeighborHostAllNodes[0].f[0], sendProcessNeighborHostAllNodes[0].f[0] + 27*numNodes); + + EXPECT_THAT(result, testing::Eq(expectedFsAllDirections)); +} + +TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicateAll) +{ + int level = 0; + SPtr<Parameter> para = initParameterClass(para); + 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,2,0,3); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6); + para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8); + + int numNodes = 10; + + std::vector<ProcessNeighbor27> recvProcessNeighborHostAllNodes(1); + std::vector<real> recvFs(numNodes*27, 0.1); + recvProcessNeighborHostAllNodes[0].f[0] = recvFs.data(); + recvProcessNeighborHostAllNodes[0].numberOfNodes = numNodes; + + std::vector<ProcessNeighbor27> sendProcessNeighborHostAllNodes(1); + std::vector<real> sendFs(numNodes*27, 0.0); + sendProcessNeighborHostAllNodes[0].f[0] = sendFs.data(); + sendProcessNeighborHostAllNodes[0].numberOfNodes = numNodes; + + std::vector<ProcessNeighbor27> sendProcessNeighborHost(1); + sendProcessNeighborHost[0].numberOfNodes = numNodes; + + // expected + std::vector<real> expectedFs(numNodes, 0.0); + expectedFs[1] = 0.1; + 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()); + } + + // act + copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHostAllNodes, sendProcessNeighborHostAllNodes, sendProcessNeighborHost); + + // convert result to std::vector + std::vector<real> result; + result.assign(sendProcessNeighborHostAllNodes[0].f[0], sendProcessNeighborHostAllNodes[0].f[0] + 27*numNodes); + + EXPECT_THAT(result, testing::Eq(expectedFsAllDirections)); +} \ No newline at end of file -- GitLab