From a795bead7c7ae6fcee0936a2115d9e7dda19f9c0 Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Tue, 29 May 2018 11:03:56 +0200
Subject: [PATCH] - build infrastrcuture for providing qs: not working!

---
 .../grid/BoundaryConditions/Side.cpp          |  3 +-
 .../grid/BoundaryConditions/Side.h            |  2 +
 src/GridGenerator/grid/Field.cu               |  2 +-
 src/GridGenerator/grid/Grid.h                 |  2 +
 .../grid/GridBuilder/LevelGridBuilder.cpp     |  2 +-
 .../grid/GridBuilder/MultipleGridBuilder.cpp  |  8 ++-
 src/GridGenerator/grid/GridImp.cu             | 53 ++++++++++++++++++-
 src/GridGenerator/grid/GridImp.h              |  4 ++
 src/GridGenerator/grid/GridMocks.h            |  1 +
 .../GridCpuStrategy/GridCpuStrategy.cpp       |  8 +++
 .../GridCpuStrategy/GridCpuStrategy.h         |  1 +
 .../GridGpuStrategy/GridGpuStrategy.cpp       |  7 +++
 .../GridGpuStrategy/GridGpuStrategy.h         |  3 ++
 .../grid/GridStrategy/GridStrategy.h          |  2 +
 .../grid/GridStrategy/GridStrategyMocks.h     |  1 +
 src/GridGenerator/grid/NodeValues.h           | 17 +-----
 src/VirtualFluids_GPU/LBM/Simulation.cpp      | 12 ++---
 targets/apps/HULC/main.cpp                    | 11 ++--
 18 files changed, 108 insertions(+), 31 deletions(-)

diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
index 093262f6a..413f5cb58 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -81,7 +81,8 @@ void Geometry::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondi
 
         if (qFound)
         {
-            geometryBoundaryCondition->indices.push_back(i);
+            const int sparseIndex = grid->getSparseIndex(i);
+            geometryBoundaryCondition->indices.push_back(sparseIndex);
             geometryBoundaryCondition->qs.push_back(qNode);
         }
 
diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.h b/src/GridGenerator/grid/BoundaryConditions/Side.h
index 486e04ebe..0bda143c0 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.h
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.h
@@ -180,6 +180,8 @@ public:
             return SPtr<Side>(new MZ());
         case SideType::PZ:
             return SPtr<Side>(new PZ());
+        case SideType::GEOMETRY:
+            return SPtr<Side>(new Geometry());
         }
     }
 };
diff --git a/src/GridGenerator/grid/Field.cu b/src/GridGenerator/grid/Field.cu
index 279148356..9d95db80b 100644
--- a/src/GridGenerator/grid/Field.cu
+++ b/src/GridGenerator/grid/Field.cu
@@ -103,7 +103,7 @@ HOSTDEVICE bool Field::isQ(uint index) const
 
 HOSTDEVICE bool Field::isRb(uint index) const
 {
-    return field[index] == VELOCITY || field[index] == PRESSURE || field[index] == NOSLIP || field[index] == SOLID;
+    return  field[index] == SOLID;
 }
 
 // --------------------------------------------------------- //
diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index c3d05b330..bf41f6b01 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -67,9 +67,11 @@ public:
     HOST virtual void inital() = 0;
 
     HOST virtual void findGridInterface(SPtr<Grid> grid) = 0;
+
     HOST virtual void mesh(TriangularMesh& geometry) = 0;
     HOST virtual void mesh(Object* object) = 0;
 
+    HOST virtual void findQs(Object* object) = 0;
 
     HOST virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0;
     HOST virtual void setPeriodicityX(bool periodicity) = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 41f5b91d4..9d9558077 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -362,7 +362,7 @@ void LevelGridBuilder::getGeometryQs(real* qs[27], int level) const
 {
     for (int i = 0; i < geometryBoundaryCondition->indices.size(); i++)
     {
-        for (int dir = 0; dir < grids[level]->getEndDirection(); dir++)
+        for (int dir = 0; dir <= grids[level]->getEndDirection(); dir++)
         {
             qs[dir][i] = geometryBoundaryCondition->qs[i][dir];
         }
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index abe7a26b6..a035c655f 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -32,6 +32,8 @@ void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, r
 void MultipleGridBuilder::addGeometry(Object* solidObject)
 {
     this->solidObject = solidObject;
+    this->geometryBoundaryCondition = GeometryBoundaryCondition::make();
+    this->geometryBoundaryCondition->side = SideFactory::make(SideType::GEOMETRY);
 }
 
 void MultipleGridBuilder::addGeometry(Object* solidObject, uint level)
@@ -253,7 +255,11 @@ void MultipleGridBuilder::buildGrids()
     for (auto grid : grids)
         grid->inital();
 
-    //grids[grids.size()-1]->mesh(solidObject);
+    if (geometryBoundaryCondition)
+    {
+        grids[grids.size() - 1]->mesh(solidObject);
+        grids[grids.size() - 1]->findQs(solidObject);
+    }
 
     for (size_t i = 0; i < grids.size() - 1; i++)
         grids[i]->findGridInterface(grids[i + 1]);
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index e660e1170..c2fffa281 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -559,6 +559,56 @@ HOSTDEVICE void GridImp::mesh(Triangle &triangle)
     }
 }
 
+
+
+HOST void GridImp::findQs(Object* object)
+{
+    TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object);
+    if (triangularMesh)
+        findQs(*triangularMesh);
+}
+
+HOST void GridImp::findQs(TriangularMesh &triangularMesh)
+{
+    const clock_t begin = clock();
+
+    gridStrategy->findQs(shared_from_this(), triangularMesh);
+
+    const clock_t end = clock();
+    const real time = (real)(real(end - begin) / CLOCKS_PER_SEC);
+
+    *logging::out << logging::Logger::INFO_INTERMEDIATE << "time finding qs: " << time << "s\n";
+}
+
+HOSTDEVICE void GridImp::findQs(Triangle &triangle)
+{
+    auto box = this->getBoundingBoxOnNodes(triangle);
+    triangle.initalLayerThickness(getDelta());
+
+    for (real x = box.minX; x <= box.maxX; x += delta)
+    {
+        for (real y = box.minY; y <= box.maxY; y += delta)
+        {
+            for (real z = box.minZ; z <= box.maxZ; z += delta)
+            {
+                const uint index = this->transCoordToIndex(x, y, z);
+                if (!field.isFluid(index))
+                    continue;
+
+                const Vertex point(x, y, z);
+                const int value = triangle.isUnderFace(point);
+
+                if (value == Q)
+                {
+                    field.setFieldEntry(index, Q);
+                    calculateQs(point, triangle);
+
+                }
+            }
+        }
+    }
+}
+
 HOSTDEVICE void GridImp::setDebugPoint(uint index, int pointValue)
 {
     if (field.isInvalid(index) && pointValue == SOLID)
@@ -590,7 +640,8 @@ HOSTDEVICE void GridImp::calculateQs(const Vertex &point, const Triangle &triang
             //solid_node = VertexInteger(actualPoint.x + direction.x, actualPoint.y + direction.y, actualPoint.z + direction.z);
             distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = subdistance;
             //printf("Q%d %d: %2.8f \n", i, grid.transCoordToIndex(actualPoint), grid.d.f[index]);
-        }
+        } else
+            distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = -1.0;
     }
 }
 
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 54c35239a..f5aa081de 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -175,6 +175,10 @@ public:
     HOST void mesh(TriangularMesh &geometry) override;
     HOSTDEVICE void mesh(Triangle &triangle);
 
+
+    HOST void findQs(Object* object) override;
+    HOST void findQs(TriangularMesh &triangularMesh);
+    HOSTDEVICE void findQs(Triangle &triangle);
 private:
     HOSTDEVICE void setDebugPoint(uint index, int pointValue);
 	HOSTDEVICE void calculateQs(const Vertex &point, const Triangle &actualTriangle) const;
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index c87bd2363..badb10cb1 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -70,6 +70,7 @@ public:
     void setPeriodicityX(bool periodicity) override {}
     void setPeriodicityY(bool periodicity) override {}
     void setPeriodicityZ(bool periodicity) override {}
+    void findQs(Object* object) override {}
 };
 
 class GridStub : public GridDummy
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index 8d55383fa..62bb2af88 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -76,6 +76,14 @@ void GridCpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom)
         grid->mesh(geom.triangles[i]);
 }
 
+void GridCpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom)
+{
+#pragma omp parallel for
+    for (int i = 0; i < geom.size; i++)
+        grid->findQs(geom.triangles[i]);
+}
+
+
 void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid)
 {
     const auto coarseLevel = grid->getLevel(1.0);
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
index 481c42ba2..c60aab8b2 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
@@ -23,6 +23,7 @@ public:
     void findStopperNodes(SPtr<GridImp> grid) override;
 
     void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override;
+    void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override;
 
     void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override;
 
diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
index 6b7ee15e9..051b45a48 100644
--- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp
@@ -62,6 +62,13 @@ void GridGpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom)
 
 }
 
+
+void GridGpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom)
+{
+    
+}
+
+
 void GridGpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid)
 {
     copyAndFreeFieldFromGPU(grid->getField());
diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
index 7925b2be8..0850c191a 100644
--- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h
@@ -21,6 +21,9 @@ public:
     void findStopperNodes(SPtr<GridImp> grid) override;
 
     void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override;
+    void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override;
+
+
     void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override;
 
     void freeMemory(SPtr<GridImp> grid) override;
diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategy.h b/src/GridGenerator/grid/GridStrategy/GridStrategy.h
index 6855eb6ea..0571a516d 100644
--- a/src/GridGenerator/grid/GridStrategy/GridStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridStrategy.h
@@ -25,6 +25,8 @@ public:
 
     virtual void mesh(SPtr<GridImp> grid, TriangularMesh &geom) = 0;
 
+    virtual void findQs(SPtr<GridImp> grid, TriangularMesh &geom) = 0;
+
     virtual void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> finerGrid) = 0;
 
     virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) = 0;
diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
index e494f816f..8852c7810 100644
--- a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
+++ b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h
@@ -32,6 +32,7 @@ public:
     virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override {}
 
 
+    void findQs(SPtr<GridImp> grid, TriangularMesh& geom) override {};
 };
 
 #endif
diff --git a/src/GridGenerator/grid/NodeValues.h b/src/GridGenerator/grid/NodeValues.h
index 5fda00c32..7c935abc6 100644
--- a/src/GridGenerator/grid/NodeValues.h
+++ b/src/GridGenerator/grid/NodeValues.h
@@ -25,22 +25,7 @@
 
 
 
-#define Q 6
-#define NOSLIP 2
-#define PRESSURE 3
-#define VELOCITY 4
-
-
-
-
-#define RB_INLET PRESSURE
-#define RB_OUTLET PRESSURE
-
-#define RB_FRONT NOSLIP
-#define RB_BACK NOSLIP
-
-#define RB_BOTTOM NOSLIP
-#define RB_TOP NOSLIP
+#define Q 12
 
 
 #endif
diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp
index 928fd1f21..de5168530 100644
--- a/src/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -1429,12 +1429,12 @@ void Simulation::run()
 			//		para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
 			//		para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
 			//getLastCudaError("QDev27 execution failed");
-			//QDevComp27( para->getParD(0)->numberofthreads,       para->getParD(0)->nx,           para->getParD(0)->ny,
-			//			para->getParD(0)->d0SP.f[0],             para->getParD(0)->QGeom.k,		 para->getParD(0)->QGeom.q27[0], 
-			//			para->getParD(0)->QGeom.kQ,              para->getParD(0)->QGeom.kQ,     para->getParD(0)->omega,
-			//			para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
-			//			para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
-			//getLastCudaError("QDevComp27 (Geom) execution failed");
+			QDevComp27( para->getParD(0)->numberofthreads,       para->getParD(0)->nx,           para->getParD(0)->ny,
+						para->getParD(0)->d0SP.f[0],             para->getParD(0)->QGeom.k,		 para->getParD(0)->QGeom.q27[0], 
+						para->getParD(0)->QGeom.kQ,              para->getParD(0)->QGeom.kQ,     para->getParD(0)->omega,
+						para->getParD(0)->neighborX_SP,          para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
+						para->getParD(0)->size_Mat_SP,           para->getParD(0)->evenOrOdd);
+			getLastCudaError("QDevComp27 (Geom) execution failed");
 
 
 		//QPressDevOld27( para->getParD(0)->numberofthreads, para->getParD(0)->QPress.RhoBC, 
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index da032a498..2047c39e2 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -270,13 +270,16 @@ void multipleLevel(const std::string& configPath)
     ////TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT);
 
 
-    gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0);
 
     //gridBuilder->addGrid(new Cuboid(-10, -8, -8, 50, 22, 22), 1);
 
-    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
+    //gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0);
+    //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
 
-    //gridBuilder->addGeometry(triangularMesh);
+    gridBuilder->addCoarseGrid(-10, -10, -10, 10, 10, 10, 0.25);
+    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/cubeBinaer1x1.stl");
+
+    gridBuilder->addGeometry(triangularMesh);
 
     gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.001, 0.0, 0.0);
     gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.001);
@@ -315,7 +318,7 @@ void multipleLevel(const std::string& configPath)
     gridBuilder->buildGrids();
     //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
 
-    //gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");
+    gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");
 
 
 
-- 
GitLab