From 43b4cbf8c0649ea55c1b7cc015f5718db2ab8649 Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Fri, 20 Apr 2018 10:48:27 +0200
Subject: [PATCH] - remove fluid nodes in oddcells, which contains a
 out_of_grid node

---
 .gitignore                                    |  1 +
 .../TriangularMesh/TriangularMesh.cu          |  8 +---
 .../TriangularMesh/TriangularMesh.h           |  1 -
 src/GridGenerator/grid/GridImp.cu             | 43 +++++++++++++++++++
 src/GridGenerator/grid/GridImp.h              |  4 ++
 .../GridCpuStrategy/GridCpuStrategy.cpp       | 11 ++++-
 .../GridCpuStrategy/GridCpuStrategy.h         |  2 +-
 targets/apps/HULC/main.cpp                    |  3 +-
 8 files changed, 62 insertions(+), 11 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6f31401f7..d87980fd0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 build/
 .vscode/
+MSVC2017/
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
index aba9b4e7e..d2d14884a 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
@@ -32,15 +32,9 @@ TriangularMesh::TriangularMesh(const std::string& inputPath)
     this->triangleVec = STLReader::readSTL(inputPath);
     initalizeDataFromTriangles();
     this->findNeighbors();
+    this->minmax = BoundingBox::makeInvalidMinMaxBox();
 }
 
-TriangularMesh::TriangularMesh(const TriangularMesh& geo)
-{
-	this->triangleVec = geo.triangleVec;
-    this->triangles = geo.triangles;
-    this->size = geo.size;
-	this->minmax = BoundingBox(geo.minmax);
-}
 
 TriangularMesh::TriangularMesh()
 {
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
index d5e930875..06e5bfb3d 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
@@ -26,7 +26,6 @@ public:
 
     VF_PUBLIC static TriangularMesh* make(const std::string& fileName, DiscretizationMethod discretizationMethod);
 	VF_PUBLIC TriangularMesh();
-	VF_PUBLIC TriangularMesh(const TriangularMesh& geo);
     VF_PUBLIC TriangularMesh(const std::string& inputPath);
 	VF_PUBLIC TriangularMesh(const std::string& inputPath, const BoundingBox &box);
 	HOSTDEVICE VF_PUBLIC ~TriangularMesh();
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 214254e51..9426d9578 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -85,7 +85,13 @@ HOST void GridImp::inital()
     else
         gridStrategy->findInnerNodes(shared_from_this());
 
+    GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio");
+
     gridStrategy->findStopperNodes(shared_from_this());
+
+    if (triangularMesh)
+        GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio_stopper");
+
 }
 
 HOSTDEVICE void GridImp::initalNodeToOutOfGrid(uint index)
@@ -211,6 +217,42 @@ HOSTDEVICE void GridImp::findStopperNode(uint index)
         this->field.setFieldEntryToStopperEndOfGrid(index);
 }
 
+HOSTDEVICE void GridImp::removeOddBoundaryCellNode(uint index)
+{
+    Cell cell = getOddCellFromIndex(index);
+    if (isOutSideOfGrid(cell))
+        return;
+    if (contains(cell, OUT_OF_GRID))
+        setTo(cell, OUT_OF_GRID);
+}
+
+HOSTDEVICE bool GridImp::isOutSideOfGrid(Cell &cell) const
+{
+    for (const auto point : cell) {
+        if (point.x < startX || point.x > endX
+            || point.y < startY || point.y > endY
+            || point.z < startZ || point.z > endZ)
+            return true;
+    }
+    return false;
+}
+
+HOSTDEVICE bool GridImp::contains(Cell &cell, char type) const
+{
+    for (const auto point : cell) {
+        if (field.is(transCoordToIndex(point.x, point.y, point.z), type))
+            return true;
+    }
+    return false;
+}
+
+HOSTDEVICE void GridImp::setTo(Cell &cell, char type)
+{
+    for (const auto point : cell) {
+        field.setFieldEntry(transCoordToIndex(point.x, point.y, point.z), type);
+    }
+}
+
 HOSTDEVICE bool GridImp::isValidStartOfGridStopper(uint index) const
 {
     return this->field.is(index, OUT_OF_GRID) && (nodeInNextCellIs(index, FLUID) || nodeInNextCellIs(index, FLUID_CFF));
@@ -490,6 +532,7 @@ HOST void GridImp::findGridInterface(SPtr<Grid> finerGrid)
 HOSTDEVICE void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid)
 {
     gridInterface->findInterfaceCF(index, this, &finerGrid);
+
 }
 
 HOSTDEVICE void GridImp::findGridInterfaceFC(uint index, GridImp& finerGrid)
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 0b7ef13a5..7019158a9 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -34,6 +34,10 @@ private:
     HOSTDEVICE Cell getOddCellFromIndex(uint index) const;
     HOSTDEVICE bool isValidStartOfGridStopper(uint index) const;
     HOSTDEVICE bool isValidEndOfGridStopper(uint index) const;
+    HOSTDEVICE void removeOddBoundaryCellNode(uint index);
+    HOSTDEVICE bool isOutSideOfGrid(Cell &cell) const;
+    HOSTDEVICE bool contains(Cell &cell, char type) const;
+    HOSTDEVICE void setTo(Cell &cell, char type);
 
     HOSTDEVICE bool nodeInNextCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const;
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index f39d04da3..098afe419 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -20,7 +20,6 @@
 
 void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid)
 {
-
     grid->neighborIndexX = new int[grid->size];
     grid->neighborIndexY = new int[grid->size];
     grid->neighborIndexZ = new int[grid->size];
@@ -74,6 +73,7 @@ void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangu
         pointInObjectMethod(grid, triangularMesh);
     }
 
+    removeOddBoundaryCellNodes(grid);
 }
 
 void GridCpuStrategy::pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh)
@@ -267,6 +267,14 @@ void GridCpuStrategy::rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* trian
     }
 }
 
+void GridCpuStrategy::removeOddBoundaryCellNodes(SPtr<GridImp> grid)
+{
+#pragma omp parallel for
+    for (uint index = 0; index < grid->size; index++)
+        grid->removeOddBoundaryCellNode(index);
+}
+
+
 void GridCpuStrategy::findStopperNodes(SPtr<GridImp> grid)
 {
 #pragma omp parallel for
@@ -300,6 +308,7 @@ void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGr
     for (uint index = 0; index < grid->getSize(); index++)
         grid->findGridInterfaceCF(index, *fineGrid);
 
+    GridVTKWriter::writeSparseGridToVTK(fineGrid, "D:/GRIDGENERATION/CF");
 
     for (uint index = 0; index < grid->getSize(); index++)
         grid->findGridInterfaceFC(index, *fineGrid);
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
index 1e611f6ea..3297f6079 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h
@@ -41,7 +41,7 @@ protected:
     void pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
     void rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
     void pointInObjectMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh);
-
+    void removeOddBoundaryCellNodes(SPtr<GridImp> grid);
 public:
     void allocateFieldMemory(Field* field) override;
     void freeFieldMemory(Field* field) override;
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 103c82497..74aaadc3a 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -256,7 +256,8 @@ void multipleLevel(const std::string& configPath)
     //conglomerate->subtract(new Sphere(30, 20, 20, 4));
     //gridBuilder->addGrid(conglomerate, 2);
 
-    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_UNDER_TRIANGLE);
+    //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT);
+    TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/sphereBinary.stl", DiscretizationMethod::POINT_IN_OBJECT);
 
     //TriangularMesh* sphere = STLReader::makeTriangularMesh("D:/GRIDGENERATION/STL/circleBinaer.stl");
     //TransformatorImp trans(1.0, Vertex(-30, -5, 10));
-- 
GitLab