From ae4ab5c26e40e0c230057c16a859ea783251ac25 Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-bs.de> Date: Thu, 19 Jan 2023 15:25:51 +0000 Subject: [PATCH] Fix bug and add some tests in NeighborDebugWriter --- .../Output/NeighborDebugWriter.hpp | 22 ++--- .../Output/NeighborDebugWriterTest.cpp | 89 +++++++++++++++++++ 2 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriterTest.cpp diff --git a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp index d325a0c97..ea83ac1ac 100644 --- a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp +++ b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriter.hpp @@ -5,25 +5,27 @@ #include "Logger.h" #include "Parameter/Parameter.h" #include "basics/utilities/UbSystem.h" -#include "grid/NodeValues.h" +#include "gpu/GridGenerator/grid/NodeValues.h" #include "lbm/constants/D3Q27.h" #include <basics/writer/WbWriterVtkXmlBinary.h> -#include "Utilities/FindNeighbors.h" -#include "VirtualFluids_GPU/Communication/Communicator.h" #include "Core/StringUtilities/StringUtil.h" +#include "Utilities/FindNeighbors.h" +#include "gpu/VirtualFluids_GPU/Communication/Communicator.h" namespace NeighborDebugWriter { -inline void writeNeighborLinkLines(Parameter *para, const int level, const unsigned long long numberOfNodes, const int direction, - const std::string &name) +inline void writeNeighborLinkLines(Parameter *para, int level, int direction, const std::string &name, + WbWriter *writer) { VF_LOG_INFO("Write node links in direction {}.", direction); - std::vector<UbTupleFloat3> nodes(numberOfNodes * 2); - std::vector<UbTupleInt2> cells(numberOfNodes); + std::vector<UbTupleFloat3> nodes; + nodes.reserve(para->getParH(level)->numberOfNodes); + std::vector<UbTupleInt2> cells; + cells.reserve(para->getParH(level)->numberOfNodes/2); - for (size_t position = 0; position < numberOfNodes; position++) { + for (size_t position = 0; position < para->getParH(level)->numberOfNodes; position++) { if (para->getParH(level)->typeOfGridNode[position] != GEO_FLUID) continue; @@ -42,7 +44,7 @@ inline void writeNeighborLinkLines(Parameter *para, const int level, const unsig cells.emplace_back((int)nodes.size() - 2, (int)nodes.size() - 1); } - WbWriterVtkXmlBinary::getInstance()->writeLines(name, nodes, cells); + writer->writeLines(name, nodes, cells); } inline void writeNeighborLinkLinesDebug(Parameter *para) @@ -51,7 +53,7 @@ inline void writeNeighborLinkLinesDebug(Parameter *para) for (size_t direction = vf::lbm::dir::STARTDIR; direction <= vf::lbm::dir::ENDDIR; direction++) { const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_Link_" + std::to_string(direction) + "_Debug.vtk"; - writeNeighborLinkLines(para, level, para->getParH(level)->numberOfNodes, (int)direction, fileName); + writeNeighborLinkLines(para, level, (int)direction, fileName, WbWriterVtkXmlBinary::getInstance()); } } } diff --git a/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriterTest.cpp b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriterTest.cpp new file mode 100644 index 000000000..acc721aa2 --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/Output/NeighborDebugWriterTest.cpp @@ -0,0 +1,89 @@ +#include "NeighborDebugWriter.hpp" +#include "LBM/LB.h" +#include "PreCollisionInteractor/PreCollisionInteractor.h" +#include "UbTuple.h" +#include "gpu/VirtualFluids_GPU/Utilities/testUtilitiesGPU.h" +#include "lbm/constants/D3Q27.h" +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <iostream> +#include <iterator> +#include <memory> +#include <vector> + +class WbWriterSpy : public WbWriter +{ +public: + std::string writeLines(const std::string & /*filename*/, std::vector<UbTupleFloat3> &nodes, + std::vector<UbTupleInt2> &lines) override + { + this->nodes = nodes; + this->lines = lines; + return ""; + } + std::vector<UbTupleFloat3> nodes; + std::vector<UbTupleInt2> lines; + + std::string getFileExtension() override { return ""; } +}; + +class NeighborDebugWriterTest : public testing::Test +{ +protected: + void SetUp() override + { + typeOfGridNode = std::vector<uint>(numberOfNodes, GEO_FLUID); + neighbors = std::vector<uint>(numberOfNodes, 2); + coordinates = std::vector<real>(numberOfNodes, 1.0); + coordinates[2] = 3.0; + + para = testingVF::createParameterForLevel(0); + para->getParH(level)->numberOfNodes = numberOfNodes; + para->getParH(level)->coordinateX = coordinates.data(); + para->getParH(level)->coordinateY = coordinates.data(); + para->getParH(level)->coordinateZ = coordinates.data(); + para->getParH(level)->neighborX = neighbors.data(); + para->getParH(level)->typeOfGridNode = typeOfGridNode.data(); + } + + const int level = 0; + const unsigned long long numberOfNodes = 3; + const uint direction = vf::lbm::dir::DIR_P00; // x + std::shared_ptr<Parameter> para; + WbWriterSpy writerSpy; + std::vector<uint> typeOfGridNode; + std::vector<uint> neighbors; + std::vector<real> coordinates; +}; + +TEST_F(NeighborDebugWriterTest, writeNeighborLinkLinesOnlyFLuidNodes) +{ + UbTupleFloat3 oneCoord(1.0, 1.0, 1.0); + UbTupleFloat3 threeCoord(3.0, 3.0, 3.0); + std::vector<UbTupleFloat3> expectedNodes = { oneCoord, threeCoord, oneCoord, threeCoord, threeCoord, threeCoord }; + std::vector<UbTupleInt2> expectedLines = { UbTupleInt2(0, 1), UbTupleInt2(2, 3), UbTupleInt2(4, 5) }; + + NeighborDebugWriter::writeNeighborLinkLines(para.get(), level, direction, "name", &writerSpy); + + EXPECT_THAT(writerSpy.nodes.size(), testing::Eq(numberOfNodes * 2)); + EXPECT_THAT(writerSpy.lines.size(), testing::Eq(numberOfNodes)); + EXPECT_THAT(writerSpy.nodes, testing::Eq(expectedNodes)); + EXPECT_THAT(writerSpy.lines, testing::Eq(expectedLines)); +} + +TEST_F(NeighborDebugWriterTest, writeNeighborLinkLinesOneSolidNode) +{ + typeOfGridNode[2] = GEO_SOLID; + + UbTupleFloat3 oneCoord(1.0, 1.0, 1.0); + UbTupleFloat3 threeCoord(3.0, 3.0, 3.0); + std::vector<UbTupleFloat3> expectedNodes = { oneCoord, threeCoord, oneCoord, threeCoord}; + std::vector<UbTupleInt2> expectedLines = { UbTupleInt2(0, 1), UbTupleInt2(2, 3)}; + + NeighborDebugWriter::writeNeighborLinkLines(para.get(), level, direction, "name", &writerSpy); + + EXPECT_THAT(writerSpy.nodes.size(), testing::Eq((numberOfNodes-1) * 2)); + EXPECT_THAT(writerSpy.lines.size(), testing::Eq(numberOfNodes-1)); + EXPECT_THAT(writerSpy.nodes, testing::Eq(expectedNodes)); + EXPECT_THAT(writerSpy.lines, testing::Eq(expectedLines)); +} -- GitLab