From 903bfc5093fd63f2edbd929a9b69d7675e25b4d4 Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Fri, 4 May 2018 16:28:20 +0200
Subject: [PATCH] create mesh object method in grid

---
 src/GridGenerator/grid/Grid.h                        |  3 ++-
 .../grid/GridBuilder/MultipleGridBuilder.cpp         | 10 ++++++++++
 .../grid/GridBuilder/MultipleGridBuilder.h           |  4 +++-
 src/GridGenerator/grid/GridImp.cu                    | 12 ++++++++++++
 src/GridGenerator/grid/GridImp.h                     |  2 ++
 src/GridGenerator/grid/GridMocks.h                   |  1 +
 targets/apps/HULC/main.cpp                           | 11 ++++++-----
 7 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h
index 2af4ce5f7..178c9d6c7 100644
--- a/src/GridGenerator/grid/Grid.h
+++ b/src/GridGenerator/grid/Grid.h
@@ -10,7 +10,7 @@ struct Vertex;
 struct Triangle;
 class GridStrategy;
 class GridInterface;
-
+class Object;
 
 class VF_PUBLIC Grid
 {
@@ -68,6 +68,7 @@ public:
 
     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 setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0;
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index 8ff88524a..28340b1bb 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -22,6 +22,12 @@ void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, r
     addGridToList(grid);
 }
 
+void MultipleGridBuilder::addGeometry(Object* solidObject)
+{
+    this->solidObject = solidObject;
+}
+
+
 void MultipleGridBuilder::addGrid(Object* gridShape)
 {
     if (!coarseGridExists())
@@ -232,6 +238,10 @@ void MultipleGridBuilder::buildGrids()
     for (auto grid : grids)
         grid->inital();
 
+
+     for (auto grid : grids)
+          grid->mesh(solidObject);
+
     for (size_t i = 0; i < grids.size() - 1; i++)
         grids[i]->findGridInterface(grids[i + 1]);
 
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
index a272a4b2e..666b652e2 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
@@ -26,6 +26,8 @@ public:
     VF_PUBLIC void addGrid(Object* gridShape);
     VF_PUBLIC void addGrid(Object* gridShape, uint levelFine);
 
+    VF_PUBLIC void addGeometry(Object* gridShape);
+
     VF_PUBLIC uint getNumberOfLevels() const;
     VF_PUBLIC real getDelta(uint level) const;
 
@@ -64,7 +66,7 @@ private:
     //std::vector<SPtr<Grid> > grids;
 
     SPtr<GridFactory> gridFactory;
- 
+    Object* solidObject;
 };
 
 #endif
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 13bd996ae..536c28e84 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -554,6 +554,18 @@ HOSTDEVICE void GridImp::findOverlapStopper(uint index, GridImp& finerGrid)
 // --------------------------------------------------------- //
 //                    Mesh Triangle                          //
 // --------------------------------------------------------- //
+HOST void GridImp::mesh(Object* object)
+{
+    TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object);
+    if (triangularMesh)
+        triangularMeshDiscretizationStrategy->discretize(triangularMesh, this, OUT_OF_GRID, FLUID);
+    else
+        gridStrategy->findInnerNodes(shared_from_this());
+
+    gridStrategy->findStopperNodes(shared_from_this());
+}
+
+
 HOST void GridImp::mesh(TriangularMesh &triangularMesh)
 {
     const clock_t begin = clock();
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index a07421b57..a6c3d2df0 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -166,6 +166,8 @@ private:
 public:
     HOSTDEVICE BoundingBox getBoundingBoxOnNodes(Triangle &triangle) const;
 
+    HOST void mesh(Object* object) override;
+
     HOST void mesh(TriangularMesh &geometry) override;
     HOSTDEVICE void mesh(Triangle &triangle);
     HOSTDEVICE void meshReverse(Triangle &triangle);
diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h
index 0f8c932a3..acc119c2c 100644
--- a/src/GridGenerator/grid/GridMocks.h
+++ b/src/GridGenerator/grid/GridMocks.h
@@ -66,6 +66,7 @@ public:
     virtual void findSparseIndices(SPtr<Grid> fineGrid) override {}
     virtual Vertex getMinimumOnNode(Vertex exact) const override { return Vertex(0, 0, 0); }
     virtual Vertex getMaximumOnNode(Vertex exact) const override { return Vertex(0, 0, 0); }
+    virtual void mesh(Object* object) override {}
 };
 
 class GridStub : public GridDummy
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index e43ec64f9..dfa3687d3 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -264,7 +264,7 @@ void multipleLevel(const std::string& configPath)
     //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT);
 
 
-    gridBuilder->addCoarseGrid(-10, -8, -3, 50, 20, 20, 0.25);
+    gridBuilder->addCoarseGrid(-12, -8, -3, 55, 20, 25, 0.5);
     TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl", DiscretizationMethod::RAYCASTING);
 
 
@@ -276,7 +276,8 @@ void multipleLevel(const std::string& configPath)
     //STLWriter::writeSTL(sphere->triangleVec, "D:/GRIDGENERATION/STL/GTI2.stl", false);
 
     //gridBuilder->addGrid(new Sphere(20, 20, 20, 8));
-    gridBuilder->addGrid(triangularMesh, 2);
+    //gridBuilder->addGrid(triangularMesh, 2);
+    gridBuilder->addGeometry(triangularMesh);
 
     //gridBuilder->addFineGrid(new Cuboid(15, 15, 15, 25, 25, 25), 1);
     //gridBuilder->addFineGrid(new Cuboid(17, 17, 17, 23, 23, 23), 2);
@@ -290,9 +291,9 @@ void multipleLevel(const std::string& configPath)
 
     gridBuilder->buildGrids();
 
-    gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_0", 0);
-    gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_1", 1);
-    gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_2", 2);
+    gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_0.vtk", 0);
+    //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_1", 1);
+    //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestSphere_level_2", 2);
 
     //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestCuboid_level_0", 0);
     //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestCuboid_level_1", 1);
-- 
GitLab