From ba5db3f2010ed6f7a839ef26244b623521bea84c Mon Sep 17 00:00:00 2001
From: "LEGOLAS\\lenz" <lenz@irmb.tu-bs.de>
Date: Thu, 11 Oct 2018 14:43:45 +0200
Subject: [PATCH] implements file output for comuunication nodes

---
 src/GridGenerator/grid/Grid.h                 |   6 +
 .../grid/GridBuilder/GridBuilder.h            |   2 +
 .../grid/GridBuilder/LevelGridBuilder.cpp     |  18 +++
 .../grid/GridBuilder/LevelGridBuilder.h       |   7 +-
 .../grid/GridBuilder/MultipleGridBuilder.cpp  |   4 +
 src/GridGenerator/grid/GridImp.cu             |  35 +++--
 src/GridGenerator/grid/GridImp.h              |  18 +--
 src/GridGenerator/grid/GridMocks.h            |   6 +
 .../SimulationFileWriter.cpp                  |  89 ++++++++++--
 .../SimulationFileWriter.h                    |   9 +-
 src/GridGenerator/utilities/communication.h   |  15 ++
 src/GridGenerator/utilities/package.include   |   0
 targets/apps/HULC/main.cpp                    | 135 +++++++++++-------
 13 files changed, 256 insertions(+), 88 deletions(-)
 create mode 100644 src/GridGenerator/utilities/communication.h
 create mode 100644 src/GridGenerator/utilities/package.include

diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index 5e3ac90db..b5e42562a 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -124,6 +124,12 @@ public:
     HOST virtual void setNumberOfLayers( uint numberOfLayers ) = 0;
 
     virtual void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox) = 0;
+
+    virtual uint getNumberOfSendNodes(int direction) = 0;
+    virtual uint getNumberOfReceiveNodes(int direction)  = 0;
+
+    virtual uint getSendIndex(int direction, uint index)  = 0;
+    virtual uint getReceiveIndex(int direction, uint index)  = 0;
 };
 
 #endif
diff --git a/src/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
index a24139138..3dc8d7687 100644
--- a/src/GridGenerator/grid/GridBuilder/GridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/GridBuilder.h
@@ -75,6 +75,8 @@ public:
     virtual bool hasGeometryValues() const = 0;
     virtual void getGeometryValues(real* vx, real* vy, real* vz, int level) const = 0;
 
+    virtual uint getCommunicationProcess(int direction) = 0;
+
     virtual SPtr<BoundaryCondition> getBoundaryCondition( SideType side, uint level ) const = 0;
 
     virtual SPtr<GeometryBoundaryCondition> getGeometryBoundaryCondition( uint level ) const = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index e9a5da532..96836863e 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -32,12 +32,20 @@
 
 #include <GridGenerator/io/QLineWriter.h>
 
+#include "utilities/communication.h"
+
 
 #define GEOFLUID 19
 #define GEOSOLID 16
 
 LevelGridBuilder::LevelGridBuilder(Device device, const std::string& d3qxx) : device(device), d3qxx(d3qxx)
 {
+    this->communicationProcesses[CommunicationDirections::MX] = INVALID_INDEX;
+    this->communicationProcesses[CommunicationDirections::PX] = INVALID_INDEX;
+    this->communicationProcesses[CommunicationDirections::MY] = INVALID_INDEX;
+    this->communicationProcesses[CommunicationDirections::PY] = INVALID_INDEX;
+    this->communicationProcesses[CommunicationDirections::MZ] = INVALID_INDEX;
+    this->communicationProcesses[CommunicationDirections::PZ] = INVALID_INDEX;
 }
 
 std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, const std::string& d3qxx)
@@ -126,6 +134,16 @@ void LevelGridBuilder::setNoSlipBoundaryCondition(SideType sideType)
     }
 }
 
+VF_PUBLIC void LevelGridBuilder::setCommunicationProcess(int direction, uint process)
+{
+    this->communicationProcesses[direction] = process;
+}
+
+VF_PUBLIC uint LevelGridBuilder::getCommunicationProcess(int direction)
+{
+    return this->communicationProcesses[direction];
+}
+
 
 
 void LevelGridBuilder::copyDataFromGpu()
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index 0e895abb6..715f7e113 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -6,7 +6,7 @@
 #include <vector>
 #include <string>
 #include <memory>
-#include <map>
+#include <array>
 
 #include "GridBuilder.h"
 #include "grid/GridInterface.h"
@@ -48,6 +48,9 @@ public:
     VF_PUBLIC void setPeriodicBoundaryCondition(bool periodic_X, bool periodic_Y, bool periodic_Z);
     VF_PUBLIC void setNoSlipBoundaryCondition(SideType sideType);
 
+    VF_PUBLIC void setCommunicationProcess(int direction, uint process);
+
+    VF_PUBLIC uint getCommunicationProcess(int direction) override;
 
     VF_PUBLIC virtual std::shared_ptr<Grid> getGrid(int level, int box);
 
@@ -99,6 +102,8 @@ protected:
     std::vector<std::shared_ptr<Grid> > grids;
     std::vector<SPtr<BoundaryConditions> > boundaryConditions;
 
+    std::array<uint, 6> communicationProcesses;
+
     void checkLevel(int level);
 
 protected:
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index d48473539..3786bcfb0 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -507,9 +507,13 @@ void MultipleGridBuilder::emitGridIsNotInCoarseGridWarning()
 
 void MultipleGridBuilder::findCommunicationIndices(int direction)
 {
+    *logging::out << logging::Logger::INFO_HIGH << "Start findCommunicationIndices()\n";
+
     if( this->subDomainBox )
         for (size_t i = 0; i < grids.size(); i++)
             grids[i]->findCommunicationIndices(direction, this->subDomainBox);
+
+    *logging::out << logging::Logger::INFO_HIGH << "Done with findCommunicationIndices()\n";
 }
 
 void MultipleGridBuilder::writeGridsToVtk(const std::string& path) const
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 738205c59..4b79998e5 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -30,7 +30,7 @@
 
 #include "io/GridVTKWriter/GridVTKWriter.h"
 
-
+#include "utilities/communication.h"
 
 CONSTANT int DIRECTIONS[DIR_END_MAX][DIMENSION];
 
@@ -1357,16 +1357,7 @@ void GridImp::findCommunicationIndices(int direction, SPtr<BoundingBox> subDomai
 void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, int direction ){
         
     // negative direction get a negative sign
-    real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 );
-
-    //if( vf::Math::equal( coordinate, limit + s * 0.5 * this->delta ) ){
-    //    this->communicationIndices[direction].receiveIndices.push_back(index);
-    //    this->setFieldEntry(index, MULTI_GPU_RECIEVE);
-    //}
-    //if( vf::Math::equal( coordinate, limit - s * 0.5 * this->delta ) ){
-    //    this->communicationIndices[direction].sendIndices.push_back(index);
-    //    this->setFieldEntry(index, MULTI_GPU_SEND);
-    //}    
+    real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 );  
 
     if( vf::Math::equal( coordinate, limit + s * 0.5 * this->delta, 0.01 * this->delta ) ){
         this->communicationIndices[direction].receiveIndices.push_back(index);
@@ -1376,7 +1367,27 @@ void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, i
         this->communicationIndices[direction].sendIndices.push_back(index);
         this->setFieldEntry(index, MULTI_GPU_SEND);
     }  
-} 
+}
+
+uint GridImp::getNumberOfSendNodes(int direction)
+{
+    return this->communicationIndices[direction].sendIndices.size();
+}
+
+uint GridImp::getNumberOfReceiveNodes(int direction)
+{
+    return this->communicationIndices[direction].receiveIndices.size();
+}
+
+uint GridImp::getSendIndex(int direction, uint index)
+{
+    return this->communicationIndices[direction].sendIndices[ index ];
+}
+
+uint GridImp::getReceiveIndex(int direction, uint index)
+{
+    return this->communicationIndices[direction].receiveIndices[ index ];
+}
 
 
 // --------------------------------------------------------- //
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 40f66e715..caba6d8f0 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -12,7 +12,6 @@
 #include "Cell.h"
 #include "Field.h" 
 
-
 class TriangularMesh;
 struct Vertex;
 struct Triangle;
@@ -24,17 +23,6 @@ class TriangularMeshDiscretizationStrategy;
 
 extern CONSTANT int DIRECTIONS[DIR_END_MAX][DIMENSION];
 
-namespace CommunicationDirections {
-    enum {
-        MX = 0,
-        PX = 1,
-        MY = 2,
-        PY = 3,
-        MZ = 4,
-        PZ = 5
-    };
-}
-
 class VF_PUBLIC GridImp : public enableSharedFromThis<GridImp>, public Grid
 {
 private:
@@ -285,6 +273,12 @@ public:
     void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox);
     void findCommunicationIndex( uint index, real coordinate, real limit, int direction );
 
+    uint getNumberOfSendNodes(int direction) override;
+    uint getNumberOfReceiveNodes(int direction) override;
+
+    uint getSendIndex(int direction, uint index) override;
+    uint getReceiveIndex(int direction, uint index) override;
+
 private:
 
     struct CommunicationIndices
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index 7668e9295..0b336eaa0 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -106,6 +106,12 @@ public:
 
     void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox) override {}
 
+    uint getNumberOfSendNodes(int direction) override { return INVALID_INDEX; }
+    uint getNumberOfReceiveNodes(int direction) override { return INVALID_INDEX; }
+
+    uint getSendIndex(int direction, uint index) override { return INVALID_INDEX; }
+    uint getReceiveIndex(int direction, uint index) override { return INVALID_INDEX; }
+
 };
 
 class GridStub : public GridDummy
diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
index 6b41580d4..5b4481df6 100644
--- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
+++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.cpp
@@ -19,6 +19,10 @@
 #include <GridGenerator/grid/BoundaryConditions/Side.h>
 #include <GridGenerator/grid/BoundaryConditions/BoundaryCondition.h>
 
+#include "utilities/communication.h"
+
+#include "core/Timer/Timer.h"
+
 /*#################################################################################*/
 /*---------------------------------public methods----------------------------------*/
 /*---------------------------------------------------------------------------------*/
@@ -26,15 +30,14 @@ void SimulationFileWriter::write(std::string folder, SPtr<GridBuilder> builder,
 {
     SimulationFileWriter::folder = folder;
 
-    std::cout << "Write Simulation Files ... \n";
-    clock_t  begin = clock();
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start writing simulation files to " << folder << ":\n";
+    Timer timer;
+    timer.start();
 
     write(builder, format);
 
-    clock_t  end = clock();
-    real time = real(end - begin) / CLOCKS_PER_SEC;
-    std::cout << "time write files: " << time << " sec" << std::endl;
-    std::cout << "... finish writing Simulation Files!\n";
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "    Time writing files: " << timer.getCurrentRuntimeInSeconds() << " sec\n";
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "Done writing simulation Files!\n";
 }
 
 
@@ -44,10 +47,11 @@ void SimulationFileWriter::write(std::string folder, SPtr<GridBuilder> builder,
 void SimulationFileWriter::write(SPtr<GridBuilder> builder, FILEFORMAT format)
 {
     const uint numberOfLevel = builder->getNumberOfGridLevels();
-    openFiles();
+    openFiles(builder);
     writeLevel(numberOfLevel);
     //auto qs = createBCVectors(builder->getGrid(0));
 
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "    Coordinate and neighbor files:\n";
     for (uint level = 0; level < numberOfLevel; level++)
     {
         writeNumberNodes(builder, level);
@@ -62,13 +66,17 @@ void SimulationFileWriter::write(SPtr<GridBuilder> builder, FILEFORMAT format)
             writeGridInterfaceToFile(builder, level);
         }
     }
-
+    
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "    Boundary Condition files:\n";
     writeBoundaryQsFile(builder);
+    
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "    Communication files:\n";
+    writeCommunicationFiles(builder);
 
     closeFiles();
 }
 
-void SimulationFileWriter::openFiles()
+void SimulationFileWriter::openFiles(SPtr<GridBuilder> builder)
 {
     std::string path = folder;
     xCoordFile.open((      path + simulationFileNames::coordX).c_str(),      std::ios::out | std::ios::binary);
@@ -117,6 +125,20 @@ void SimulationFileWriter::openFiles()
         valueStreams.push_back(outV);
     }
 
+    if(builder->getCommunicationProcess(CommunicationDirections::MX) != INVALID_INDEX) sendFiles   [CommunicationDirections::MX].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MX)) + "Xs.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PX) != INVALID_INDEX) sendFiles   [CommunicationDirections::PX].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PX)) + "Xs.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::MY) != INVALID_INDEX) sendFiles   [CommunicationDirections::MY].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MY)) + "Ys.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PY) != INVALID_INDEX) sendFiles   [CommunicationDirections::PY].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PY)) + "Ys.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::MZ) != INVALID_INDEX) sendFiles   [CommunicationDirections::MZ].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MZ)) + "Zs.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PZ) != INVALID_INDEX) sendFiles   [CommunicationDirections::PZ].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PZ)) + "Zs.dat").c_str() );
+
+    if(builder->getCommunicationProcess(CommunicationDirections::MX) != INVALID_INDEX) receiveFiles[CommunicationDirections::MX].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MX)) + "Xr.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PX) != INVALID_INDEX) receiveFiles[CommunicationDirections::PX].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PX)) + "Xr.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::MY) != INVALID_INDEX) receiveFiles[CommunicationDirections::MY].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MY)) + "Yr.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PY) != INVALID_INDEX) receiveFiles[CommunicationDirections::PY].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PY)) + "Yr.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::MZ) != INVALID_INDEX) receiveFiles[CommunicationDirections::MZ].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::MZ)) + "Zr.dat").c_str() );
+    if(builder->getCommunicationProcess(CommunicationDirections::PZ) != INVALID_INDEX) receiveFiles[CommunicationDirections::PZ].open( (path + std::to_string(builder->getCommunicationProcess(CommunicationDirections::PZ)) + "Zr.dat").c_str() );
+
     numberNodes_File.open((path + simulationFileNames::numberNodes).c_str(), std::ios::out | std::ios::binary);
     LBMvsSI_File.open((path + simulationFileNames::LBMvsSI).c_str(), std::ios::out | std::ios::binary);
 }
@@ -593,6 +615,38 @@ void SimulationFileWriter::writeBoundaryShort(SPtr<Grid> grid, SPtr<BoundaryCond
     
 }
 
+void SimulationFileWriter::writeCommunicationFiles(SPtr<GridBuilder> builder)
+{
+    const uint numberOfLevel = builder->getNumberOfGridLevels();
+    
+    for( uint direction = 0; direction < 6; direction++ ){
+        
+        if(builder->getCommunicationProcess(direction) == INVALID_INDEX) continue;
+
+        sendFiles[direction] << "processor\n";
+        sendFiles[direction] << builder->getNumberOfGridLevels() - 1 << "\n";
+
+        receiveFiles[direction] << "processor\n";
+        receiveFiles[direction] << builder->getNumberOfGridLevels() - 1 << "\n";
+
+        for (uint level = 0; level < numberOfLevel; level++){
+        
+            uint numberOfSendNodes    = builder->getGrid(level)->getNumberOfSendNodes(direction);
+            uint numberOfReceiveNodes = builder->getGrid(level)->getNumberOfReceiveNodes(direction);
+        
+            sendFiles[direction] <<    numberOfSendNodes    << "\n";
+            receiveFiles[direction] << numberOfReceiveNodes << "\n";
+
+            for( uint index = 0; index < numberOfSendNodes; index++ )
+                sendFiles[direction]    << builder->getGrid(level)->getSendIndex   (direction, index) << "\n";
+
+            for( uint index = 0; index < numberOfReceiveNodes; index++ )
+                receiveFiles[direction] << builder->getGrid(level)->getReceiveIndex(direction, index) << "\n";
+
+        }
+    }
+}
+
 void SimulationFileWriter::closeFiles()
 {
     xCoordFile.close();
@@ -617,6 +671,20 @@ void SimulationFileWriter::closeFiles()
         valueStreams[rb]->close();
     }
 
+    sendFiles[CommunicationDirections::MX].close();
+    sendFiles[CommunicationDirections::PX].close();
+    sendFiles[CommunicationDirections::MY].close();
+    sendFiles[CommunicationDirections::PY].close();
+    sendFiles[CommunicationDirections::MZ].close();
+    sendFiles[CommunicationDirections::PZ].close();
+    
+    receiveFiles[CommunicationDirections::MX].close();
+    receiveFiles[CommunicationDirections::PX].close();
+    receiveFiles[CommunicationDirections::MY].close();
+    receiveFiles[CommunicationDirections::PY].close();
+    receiveFiles[CommunicationDirections::MZ].close();
+    receiveFiles[CommunicationDirections::PZ].close();
+
     numberNodes_File.close();
     LBMvsSI_File.close();
 }
@@ -648,3 +716,6 @@ std::ofstream SimulationFileWriter::offsetVecFC_File;
 
 std::ofstream SimulationFileWriter::numberNodes_File;
 std::ofstream SimulationFileWriter::LBMvsSI_File;
+
+std::array<std::ofstream, 6> SimulationFileWriter::sendFiles;
+std::array<std::ofstream, 6> SimulationFileWriter::receiveFiles;
\ No newline at end of file
diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h
index 82b948ecc..4308ff8ec 100644
--- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h
+++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h
@@ -6,6 +6,7 @@
 #include <fstream>
 #include <memory>
 #include <vector>
+#include <array>
 
 #include <GridGenerator/global.h>
 #include <core/PointerDefinitions.h>
@@ -29,7 +30,7 @@ public:
 
 private:
     static void write(SPtr<GridBuilder> builder, FILEFORMAT format);
-    static void openFiles();
+    static void openFiles(SPtr<GridBuilder> builder);
 
     static void writeNumberNodes(SPtr<GridBuilder> builder, uint level);
     static void writeLBMvsSI(SPtr<GridBuilder> builder, uint level);
@@ -52,6 +53,9 @@ private:
     static void writeBoundary(std::vector<real> boundary, int rb);
 	static void writeBoundaryShort(std::vector<real> boundary, int rb);
 	static void writeBoundaryShort(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uint side);
+
+    static void writeCommunicationFiles(SPtr<GridBuilder> builder);
+
 	static void closeFiles();
 
 
@@ -78,6 +82,9 @@ private:
     static std::vector<std::ofstream> qFiles;
     static std::vector<std::ofstream> valueFiles;
 
+    static std::array<std::ofstream, 6> sendFiles;
+    static std::array<std::ofstream, 6> receiveFiles;
+
     static std::ofstream numberNodes_File;
     static std::ofstream LBMvsSI_File;
 
diff --git a/src/GridGenerator/utilities/communication.h b/src/GridGenerator/utilities/communication.h
new file mode 100644
index 000000000..23dbd0832
--- /dev/null
+++ b/src/GridGenerator/utilities/communication.h
@@ -0,0 +1,15 @@
+#ifndef Communication_H
+#define Communication_H
+
+namespace CommunicationDirections {
+    enum {
+        MX = 0,
+        PX = 1,
+        MY = 2,
+        PY = 3,
+        MZ = 4,
+        PZ = 5
+    };
+}
+
+#endif // Communication_H
\ No newline at end of file
diff --git a/src/GridGenerator/utilities/package.include b/src/GridGenerator/utilities/package.include
new file mode 100644
index 000000000..e69de29bb
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index ae145505f..273670aa4 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -9,6 +9,7 @@
 #include <string>
 #include <iostream>
 #include <stdexcept>
+#include <fstream>
 
 #include "core/LbmOrGks.h"
 
@@ -37,8 +38,8 @@
 
 #include "grid/GridFactory.h"
 #include "grid/GridBuilder/MultipleGridBuilder.h"
-#include <grid/GridMocks.h>
-#include "grid/GridStrategy/GridStrategyMocks.h"
+//#include "grid/GridMocks.h"
+//#include "grid/GridStrategy/GridStrategyMocks.h"
 #include "VirtualFluidsBasics/utilities/logger/Logger.h"
 //#include "VirtualFluidsBasics/basics/utilities/UbLogger.h"
 #include "io/STLReaderWriter/STLReader.h"
@@ -51,6 +52,8 @@
 #include "grid/BoundaryConditions/Side.h"
 #include "grid/BoundaryConditions/BoundaryCondition.h"
 
+#include "utilities/communication.h"
+
 std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
 {
     if (para->getNumprocs() == 1)
@@ -257,7 +260,11 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
 
 void multipleLevel(const std::string& configPath)
 {
-    logging::Logger::setStream(&std::cout);
+    //std::ofstream logFile( "C:/Users/lenz/Desktop/Work/gridGenerator/grid/gridGeneratorLog.txt" );
+    std::ofstream logFile( "grid/gridGeneratorLog.txt" );
+    logging::Logger::addStream(&logFile);
+
+    logging::Logger::addStream(&std::cout);
     logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
     logging::Logger::timeStamp(logging::Logger::ENABLE);
 
@@ -482,25 +489,36 @@ void multipleLevel(const std::string& configPath)
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
         const uint generatePart = 2;
+        
+        std::ofstream logFile2;
+        
+        //if( generatePart == 1 )
+        //    logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/gridGeneratorLog.txt" );
+        //
+        //if( generatePart == 2 )
+        //    logFile2.open( "C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/gridGeneratorLog.txt" );
+
+        logging::Logger::addStream(&logFile2);
 
         real dx = 1.0 / 10.0;
         real vx = 0.01;
 
-        TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/ShpereNotOptimal.stl");
+        //TriangularMesh* triangularMesh = TriangularMesh::make("C:/Users/lenz/Desktop/Work/gridGenerator/stl/ShpereNotOptimal.stl");
+        TriangularMesh* triangularMesh = TriangularMesh::make("stl/ShpereNotOptimal.lnx.stl");
 
         // all
-        //gridBuilder->addCoarseGrid(-2, -2, -2,  
-        //                            4,  2,  2, dx);
+        gridBuilder->addCoarseGrid(-2, -2, -2,  
+                                    4,  2,  2, dx);
 
         real overlap = 10.0 * dx;
 
-        if( generatePart == 1 )
-            gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
-                                        0.5 + overlap,  2.0,  2.0, dx);
+        //if( generatePart == 1 )
+        //    gridBuilder->addCoarseGrid(-2.0          , -2.0, -2.0,  
+        //                                0.5 + overlap,  2.0,  2.0, dx);
 
-        if( generatePart == 2 )
-            gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
-                                        4.0          ,  2.0,  2.0, dx);
+        //if( generatePart == 2 )
+        //    gridBuilder->addCoarseGrid( 0.5 - overlap, -2.0, -2.0,  
+        //                                4.0          ,  2.0,  2.0, dx);
 
 
         gridBuilder->setNumberOfLayers(10,8);
@@ -508,26 +526,29 @@ void multipleLevel(const std::string& configPath)
 
         gridBuilder->addGeometry(triangularMesh);
         
-        if( generatePart == 1 )
-            gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
-                                                                         -2.0, 2.0, 
-                                                                         -2.0, 2.0 ) );
-        
-        if( generatePart == 2 )
-            gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
-                                                                         -2.0, 2.0, 
-                                                                         -2.0, 2.0 ) );
-
+        //if( generatePart == 1 )
+        //    gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>( -2.0, 0.5, 
+        //                                                                 -2.0, 2.0, 
+        //                                                                 -2.0, 2.0 ) );
+        //
+        //if( generatePart == 2 )
+        //    gridBuilder->setSubDomainBox( std::make_shared<BoundingBox>(  0.5, 4.0, 
+        //                                                                 -2.0, 2.0, 
+        //                                                                 -2.0, 2.0 ) );
 
         gridBuilder->setPeriodicBoundaryCondition(false, false, false);
 
         gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
         
-        if( generatePart == 1 )
-            gridBuilder->findCommunicationIndices(CommunicationDirections::PX);
-        
-        if( generatePart == 2 )
-            gridBuilder->findCommunicationIndices(CommunicationDirections::MX);
+        //if( generatePart == 1 ){
+        //    gridBuilder->findCommunicationIndices(CommunicationDirections::PX);
+        //    gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 1);
+        //}
+        //
+        //if( generatePart == 2 ){
+        //    gridBuilder->findCommunicationIndices(CommunicationDirections::MX);
+        //    gridBuilder->setCommunicationProcess(CommunicationDirections::MX, 0);
+        //}
 
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         // other tests
@@ -559,19 +580,17 @@ void multipleLevel(const std::string& configPath)
         gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx , 0.0, 0.0);
         gridBuilder->setVelocityBoundaryCondition(SideType::MZ, vx , 0.0, 0.0);
 
-        //gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-        //gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+        gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+        gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
 
         gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
 
-        if (generatePart == 1) {
-            gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
-            //gridBuilder->setDomainDecompositionBoundaryCondition(SideType::PX);
-        }
-        if (generatePart == 2) {
-            gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
-            //gridBuilder->setDomainDecompositionBoundaryCondition(SideType::MX);
-        }
+        //if (generatePart == 1) {
+        //    gridBuilder->setVelocityBoundaryCondition(SideType::MX, vx, 0.0, 0.0);
+        //}
+        //if (generatePart == 2) {
+        //    gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+        //}
 
         ////////////////////////////////////////////////////////////////////////////
 
@@ -629,20 +648,22 @@ void multipleLevel(const std::string& configPath)
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         
 
-        if (generatePart == 1) {
-            gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_");
-            gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_Arrow");
-        }
-        if (generatePart == 2) {
-            gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_");
-            gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow");
-        }
+        //if (generatePart == 1) {
+        //    gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_");
+        //    gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/Test_Arrow");
+        //}
+        //if (generatePart == 2) {
+        //    gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_");
+        //    gridBuilder->writeArrows    ("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow");
+        //}
 
         //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/ConcaveTest_");
-        //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_");
+        //gridBuilder->writeGridsToVtk("C:/Users/lenz/Desktop/Work/gridGenerator/grid/Test_");
+        gridBuilder->writeGridsToVtk("grid/Test_");
 
         //gridBuilder->writeGridsToVtk("M:/TestGridGeneration/results/CylinderTest_");
         //gridBuilder->writeArrows("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/Test_Arrow");
+        gridBuilder->writeArrows("grid/Test_Arrow");
 
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -740,10 +761,14 @@ void multipleLevel(const std::string& configPath)
 
         //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
         //SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/grid/", gridBuilder, FILEFORMAT::ASCII);
+        SimulationFileWriter::write("grid/", gridBuilder, FILEFORMAT::ASCII);
 
-        //gridGenerator = GridGenerator::make(gridBuilder, para);
+        //if (generatePart == 1)
+        //    SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_1/", gridBuilder, FILEFORMAT::ASCII);
+        //if (generatePart == 2)
+        //    SimulationFileWriter::write("C:/Users/lenz/Desktop/Work/gridGenerator/gridMultiGPU_Part_2/", gridBuilder, FILEFORMAT::ASCII);
 
-        return;
+        gridGenerator = GridGenerator::make(gridBuilder, para);
     }
     else
     {
@@ -751,6 +776,10 @@ void multipleLevel(const std::string& configPath)
         gridGenerator = GridReader::make(FileFormat::ASCII, para);
     }
 
+    logFile.close();
+
+    //return;
+
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -786,9 +815,9 @@ int main( int argc, char* argv[])
             {
                 multipleLevel(str2);
             }
-            catch (const std::exception e)
+            catch (const std::exception& e)
             {
-                std::cout << e.what() << std::flush;
+                *logging::out << logging::Logger::ERROR << e.what() << "\n";
                 //MPI_Abort(MPI_COMM_WORLD, -1);
             }
             catch (...)
@@ -802,17 +831,17 @@ int main( int argc, char* argv[])
             {
                 multipleLevel("C:/Users/lenz/Desktop/Work/gridGenerator/inp/configTest.txt");
             }
-            catch (const std::exception e)
+            catch (const std::exception& e)
             {
                 
-                *logging::out << logging::Logger::ERROR << e.what() << '\n';
+                *logging::out << logging::Logger::ERROR << e.what() << "\n";
                 //std::cout << e.what() << std::flush;
                 //MPI_Abort(MPI_COMM_WORLD, -1);
             }
             catch (const std::bad_alloc e)
             {
                 
-                *logging::out << logging::Logger::ERROR << "Bad Alloc:" << e.what() << '\n';
+                *logging::out << logging::Logger::ERROR << "Bad Alloc:" << e.what() << "\n";
                 //std::cout << e.what() << std::flush;
                 //MPI_Abort(MPI_COMM_WORLD, -1);
             }
-- 
GitLab