From e4fc10746e18fefbfb9280cc8bb654c9799fb45a Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-bs.de>
Date: Mon, 25 Apr 2022 09:21:35 +0200
Subject: [PATCH] Add debug writer for edge nodes send

---
 src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp  |  4 +-
 .../Output/EdgeNodeDebugWriter.hpp            | 66 +++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100644 src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp

diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index 4abc071a8..c3b12b79b 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -17,6 +17,7 @@
 #include "Output/MeasurePointWriter.hpp"
 #include "Output/AnalysisData.hpp"
 #include "Output/InterfaceDebugWriter.hpp"
+#include "Output/EdgeNodeDebugWriter.hpp"
 #include "Output/VeloASCIIWriter.hpp"
 //////////////////////////////////////////////////////////////////////////
 #include "Utilities/Buffer2D.hpp"
@@ -389,12 +390,13 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std
    //InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get());
    //InterfaceDebugWriter::writeInterfaceLinesDebugFC(para.get());
 
-   // writers for Version with communication hiding
+   // writers for version with communication hiding
    if(para->getNumprocs() > 1 && para->getUseStreams()){
    	InterfaceDebugWriter::writeInterfaceFCC_Send(para.get());
     InterfaceDebugWriter::writeInterfaceCFC_Recv(para.get());
    	InterfaceDebugWriter::writeSendNodesStream(para.get());
    	InterfaceDebugWriter::writeRecvNodesStream(para.get());
+	EdgeNodeDebugWriter::writeEdgeNodesXZ_Send(para.get());
    }
 }
 
diff --git a/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp
new file mode 100644
index 000000000..82084103e
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Output/EdgeNodeDebugWriter.hpp
@@ -0,0 +1,66 @@
+#ifndef EDGENODEDEBUG_HPP
+#define EDGENODEDEBUG_HPP
+
+#include <fstream>
+#include <sstream>
+#include <stdio.h>
+// #include <math.h>
+#include "Core/StringUtilities/StringUtil.h"
+#include "LBM/D3Q27.h"
+#include "LBM/LB.h"
+#include "Parameter/Parameter.h"
+#include "basics/utilities/UbSystem.h"
+#include <basics/writer/WbWriterVtkXmlBinary.h>
+#include <cmath>
+
+#include "VirtualFluids_GPU/Communication/Communicator.h"
+
+namespace EdgeNodeDebugWriter
+{
+
+void writeEdgeNodesXZ_Send(Parameter *para)
+{
+    std::vector<UbTupleFloat3> nodesVec;
+
+    // nodedata
+    std::vector<std::string> datanames = { "SparseIndex", "ProcessNeighbor", "IndexInSendVector", "AfterFtoC" };
+    std::vector<std::vector<double>> nodedata;
+
+    int numberOfNodes = 0;
+    for (int level = 0; level < para->getMaxLevel(); level++){
+        numberOfNodes += (int) para->getParH(level)->edgeNodesXtoZ.size();
+    }
+
+    nodesVec.resize(numberOfNodes);
+    nodedata.resize(datanames.size(), std::vector<double>(numberOfNodes));
+
+    int nodeCount = 0;
+    for (int level = 0; level < para->getMaxLevel(); level++) {
+        for (int u = 0; u < numberOfNodes; u++) {
+            // node data section
+            int indexOfProcessNeighborSend = para->getParH(level)->edgeNodesXtoZ[u].indexOfProcessNeighborSend;
+            int indexInSendBuffer = para->getParH(level)->edgeNodesXtoZ[u].indexInSendBuffer;
+            int sparseIndex = para->getParH(level)->sendProcessNeighborZ[indexOfProcessNeighborSend].index[indexInSendBuffer];
+            nodedata[0][nodeCount] = sparseIndex;
+            nodedata[1][nodeCount] = indexOfProcessNeighborSend;
+            nodedata[2][nodeCount] = indexInSendBuffer;
+            nodedata[3][nodeCount] = indexInSendBuffer < para->getParH(level)->sendProcessNeighborsAfterFtoCZ[indexOfProcessNeighborSend].numberOfNodes;
+
+            // coordinate section
+            double x1           = para->getParH(level)->coordX_SP[sparseIndex];
+            double x2           = para->getParH(level)->coordY_SP[sparseIndex];
+            double x3           = para->getParH(level)->coordZ_SP[sparseIndex];
+            nodesVec[nodeCount] = (makeUbTuple((float)(x1), (float)(x2), (float)(x3)));
+
+            nodeCount++;
+        }
+        std::string filenameVec = para->getFName() + "_writeEdgeNodesXZ_Send_PID_" +
+                                  std::to_string(vf::gpu::Communicator::getInstanz()->getPID()) + "_" +
+                                  StringUtil::toString<int>(level);
+
+        WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
+    }
+}
+} // namespace EdgeNodeDebugWriter
+
+#endif
-- 
GitLab