From a80e35b6a50c93372a3bb8c5a3b17dd02a488524 Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Mon, 23 Apr 2018 12:49:10 +0200
Subject: [PATCH] - creates TriangularMeshStrategy

---
 .../TriangularMesh/TriangularMesh.cu          |  19 ++
 .../TriangularMesh/TriangularMesh.h           |   6 +-
 .../TriangularMesh/TriangularMeshStrategy.h   | 297 ++++++++++++++++++
 src/GridGenerator/grid/GridFactory.h          |  39 ++-
 src/GridGenerator/grid/GridImp.cu             |  26 +-
 src/GridGenerator/grid/GridImp.h              |  16 +-
 .../GridCpuStrategy/GridCpuStrategy.cpp       |   1 -
 targets/apps/HULC/CMakeLists.txt              |   2 +-
 targets/apps/HULC/main.cpp                    |   3 +
 .../tests/GridGeneratorTest/CMakeLists.txt    |   2 +-
 10 files changed, 395 insertions(+), 16 deletions(-)
 create mode 100644 src/GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h

diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
index d2d14884a..83d69eef0 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu
@@ -9,6 +9,8 @@
 
 #include "Timer/Timer.h"
 
+#include "numerics/geometry3d/GbTriFaceMesh3D.h"
+
 
 TriangularMesh* TriangularMesh::make(const std::string& fileName, DiscretizationMethod discretizationMethod)
 {
@@ -96,4 +98,21 @@ HOST bool TriangularMesh::operator==(const TriangularMesh &geometry) const
 HOST DiscretizationMethod TriangularMesh::getDiscretizationMethod() const
 {
     return this->discretizationMethod;
+}
+
+HOSTDEVICE GbTriFaceMesh3D* TriangularMesh::getGbTriFaceMesh3D() const
+{
+    std::vector<GbTriFaceMesh3D::Vertex> *gbVertices = new std::vector<GbTriFaceMesh3D::Vertex>(this->triangleVec.size() * 3);
+    std::vector<GbTriFaceMesh3D::TriFace> *gbTriangles = new std::vector<GbTriFaceMesh3D::TriFace>(this->triangleVec.size());
+    for (int i = 0; i < this->triangleVec.size(); i++)
+    {
+        (*gbVertices)[i * 3] = GbTriFaceMesh3D::Vertex(triangles[i].v1.x, triangles[i].v1.y, triangles[i].v1.z);
+        (*gbVertices)[i * 3 + 1] = GbTriFaceMesh3D::Vertex(triangles[i].v2.x, triangles[i].v2.y, triangles[i].v2.z);
+        (*gbVertices)[i * 3 + 2] = GbTriFaceMesh3D::Vertex(triangles[i].v3.x, triangles[i].v3.y, triangles[i].v3.z);
+
+        (*gbTriangles)[i] = GbTriFaceMesh3D::TriFace(i * 3, i * 3 + 1, i * 3 + 2);
+    }
+
+    GbTriFaceMesh3D* mesh = new GbTriFaceMesh3D("stl", gbVertices, gbTriangles);
+    return mesh;
 }
\ No newline at end of file
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
index 06e5bfb3d..aa94b9678 100644
--- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
@@ -16,6 +16,7 @@
 #include "../Object.h"
 
 class GeometryMemento;
+class GbTriFaceMesh3D;
 
 enum class DiscretizationMethod { RAYCASTING, POINT_IN_OBJECT, POINT_UNDER_TRIANGLE };
 
@@ -40,12 +41,11 @@ public:
 
     HOST VF_PUBLIC bool operator==(const TriangularMesh &geometry) const;
 
-    HOST VF_PUBLIC GeometryMemento getState() const;
-    HOST VF_PUBLIC void setState(const GeometryMemento &memento);
+
     VF_PUBLIC void findNeighbors();
 
     HOST VF_PUBLIC DiscretizationMethod getDiscretizationMethod() const;
-
+    HOSTDEVICE VF_PUBLIC GbTriFaceMesh3D* getGbTriFaceMesh3D() const;
 
 private:
 	
diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h
new file mode 100644
index 000000000..7b4777704
--- /dev/null
+++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h
@@ -0,0 +1,297 @@
+#ifndef TriangularMeshStrategy_H
+#define TriangularMeshStrategy_H
+
+#include "GridGenerator/global.h"
+
+
+
+#include "../Triangle/Triangle.h"
+#include "TriangularMesh.h"
+#include "numerics/geometry3d/GbTriFaceMesh3D.h"
+#include "grid/GridImp.h"
+#include "utilities/logger/Logger.h"
+#include "grid/NodeValues.h"
+
+
+
+
+class TriangularMeshDiscretizationStrategy
+{
+public:
+    TriangularMeshDiscretizationStrategy() {}
+    virtual ~TriangularMeshDiscretizationStrategy() {}
+
+
+    void discretize(TriangularMesh* triangularMesh, GridImp* grid, char InnerType, char OuterType)
+    {  
+        this->doDiscretize(triangularMesh, grid, InnerType, OuterType);
+        this->removeOddBoundaryCellNodes(grid);
+    }
+
+private:
+    virtual void doDiscretize(TriangularMesh* triangularMesh, GridImp* grid, char InnerType, char OuterType) = 0;
+    void removeOddBoundaryCellNodes(GridImp* grid)
+    {
+#pragma omp parallel for
+        for (uint index = 0; index < grid->getSize(); index++)
+            grid->removeOddBoundaryCellNode(index);
+    }
+
+
+};
+
+
+
+class PointInObjectDiscretizationStrategy : public TriangularMeshDiscretizationStrategy
+{
+public:
+    PointInObjectDiscretizationStrategy() {}
+    virtual ~PointInObjectDiscretizationStrategy() {}
+
+    virtual void doDiscretize(TriangularMesh* triangularMesh, GridImp* grid, char InnerType, char OuterType)
+    {
+        auto mesh = triangularMesh->getGbTriFaceMesh3D();
+
+        for (int i = 0; i < grid->getSize(); i++)
+        {
+            real x, y, z;
+            grid->transIndexToCoords(i, x, y, z);
+
+            if (mesh->isPointInGbObject3D(x, y, z))
+                grid->setNodeTo(i, InnerType);
+            //else
+            //    grid->setNodeTo(i, OuterType);
+        }
+
+        delete mesh;
+    }
+};
+
+class RayCastingDiscretizationStrategy : public TriangularMeshDiscretizationStrategy
+{
+public:
+    RayCastingDiscretizationStrategy() {}
+    virtual ~RayCastingDiscretizationStrategy() {}
+
+    virtual void doDiscretize(TriangularMesh* triangularMesh, GridImp* grid, char InnerType, char OuterType)
+    {
+        auto mesh = triangularMesh->getGbTriFaceMesh3D();
+
+        const real minXExact = triangularMesh->minmax.minX;
+        const real minYExact = triangularMesh->minmax.minY;
+        const real minZExact = triangularMesh->minmax.minZ;
+
+        const real maxXExact = triangularMesh->minmax.maxX;
+        const real maxYExact = triangularMesh->minmax.maxY;
+        const real maxZExact = triangularMesh->minmax.maxZ;
+
+        const auto min = grid->getMinimumOnNode(Vertex(minXExact, minYExact, minZExact));
+
+        const real minX = min.x;
+        const real minY = min.y;
+        const real minZ = min.z;
+
+        const auto max = grid->getMaximumOnNode(Vertex(maxXExact, maxYExact, maxZExact));
+
+        const real maxX = max.x;
+        const real maxY = max.y;
+        const real maxZ = max.z;
+
+
+        for (uint i = 0; i < grid->getSize(); i++)
+            grid->setNodeTo(i, InnerType);
+
+        int counter = 0;
+
+        real x, y, z;
+        // Test line intersection
+        for (z = minZ; z <= maxZ; z += grid->getDelta())
+        {
+            for (y = minY; y <= maxY; y += grid->getDelta())
+            {
+                for (x = minX; x <= maxX; x += grid->getDelta())
+                {
+                    counter++;
+                    if (mesh->intersectLine((x - grid->getDelta()), y, z, x, y, z)) 
+                        break;
+                    grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                }
+            }
+        }
+
+        // Test line intersection from opposite direction
+        for (z = minZ; z <= maxZ; z += grid->getDelta())
+        {
+            for (y = minY; y <= maxY; y += grid->getDelta())
+            {
+                for (x = maxX; x >= minX; x -= grid->getDelta())
+                {
+                    if (!grid->isNode(grid->transCoordToIndex(x, y, z), OuterType))
+                    {
+                        counter++;
+                        if (mesh->intersectLine((x + grid->getDelta()), y, z, x, y, z))
+                            break;
+                        grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                    }
+                }
+            }
+        }
+
+        // Test line intersection
+        for (z = minZ; z <= maxZ; z += grid->getDelta())
+        {
+            for (x = minX; x <= maxX; x += grid->getDelta())
+            {
+                for (y = minY; y <= maxY; y += grid->getDelta())
+                {
+                    if (!grid->isNode(grid->transCoordToIndex(x, y, z), OuterType))
+                    {
+                        counter++;
+                        if (mesh->intersectLine(x, (y - grid->getDelta()), z, x, y, z)) 
+                            break;
+                        grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                    }
+                }
+            }
+        }
+
+        // Test line intersection from opposite direction
+        for (z = minZ; z <= maxZ; z += grid->getDelta())
+        {
+            for (x = minX; x <= maxX; x += grid->getDelta())
+            {
+                for (y = maxY; y >= minY; y -= grid->getDelta())
+                {
+                    if (!grid->isNode(grid->transCoordToIndex(x, y, z), OuterType))
+                    {
+                        counter++;
+                        if (mesh->intersectLine(x, (y + grid->getDelta()), z, x, y, z))
+                            break;
+                        grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                    }
+                }
+            }
+        }
+
+        // Test line intersection
+        for (x = minX; x <= maxX; x += grid->getDelta())
+        {
+            for (y = minY; y <= maxY; y += grid->getDelta())
+            {
+                for (z = minZ; z <= maxZ; z += grid->getDelta())
+                {
+                    if (!grid->isNode(grid->transCoordToIndex(x, y, z), OuterType))
+                    {
+                        counter++;
+                        if (mesh->intersectLine(x, y, (z - grid->getDelta()), x, y, z)) 
+                            break;
+                        grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                    }
+                }
+            }
+        }
+
+        // Test line intersection from opposite direction
+        for (x = minX; x <= maxX; x += grid->getDelta())
+        {
+            for (y = minY; y <= maxY; y += grid->getDelta())
+            {
+                for (z = maxZ; z >= minZ; z -= grid->getDelta())
+                {
+                    if (!grid->isNode(grid->transCoordToIndex(x, y, z), OuterType))
+                    {
+                        counter++;
+                        if (mesh->intersectLine(x, y, (z + grid->getDelta()), x, y, z)) 
+                            break;
+                        grid->setNodeTo(grid->transCoordToIndex(x, y, z), OuterType);
+                    }
+                }
+            }
+        }
+
+        delete mesh;
+    }
+};
+
+class PointUnderTriangleStrategy : public TriangularMeshDiscretizationStrategy
+{
+public:
+    PointUnderTriangleStrategy() {}
+    virtual ~PointUnderTriangleStrategy() {}
+    void doDiscretize(TriangularMesh* triangularMesh, GridImp* grid, char innerType, char outerType) override
+    {
+#pragma omp parallel for
+        for (uint i = 0; i < triangularMesh->size; i++)
+            this->meshReverse(triangularMesh->triangles[i], grid, innerType);
+
+        this->findInsideNodes(grid, innerType);
+
+#pragma omp parallel for
+        for (uint i = 0; i < grid->getSize(); i++)
+            this->setNegativeDirBorderTo(grid, i, innerType);
+    }
+
+private:
+    HOSTDEVICE void meshReverse(Triangle &triangle, GridImp* grid, char innerType)
+    {
+        auto box = grid->getBoundingBoxOnNodes(triangle);
+
+        const real delta = grid->getDelta();
+        triangle.initalLayerThickness(delta);
+
+        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 = grid->transCoordToIndex(x, y, z);
+
+                    const Vertex point(x, y, z);
+
+                    const char pointValue = triangle.isUnderFace(point);
+
+                    if (pointValue == NEGATIVE_DIRECTION_BORDER)
+                        grid->setNodeTo(index, NEGATIVE_DIRECTION_BORDER);
+                    else if (pointValue == INSIDE)
+                        grid->setNodeTo(index, innerType);
+                }
+            }
+        }
+    }
+
+    HOSTDEVICE void findInsideNodes(GridImp* grid, char innerType)
+    {
+        bool foundInsideNode = true;
+        while (foundInsideNode)
+        {
+            foundInsideNode = false;
+            for (uint index = 0; index < grid->getSize(); index++)
+                this->setInsideNode(grid, index, foundInsideNode, innerType);
+        }
+    }
+
+    HOSTDEVICE void setInsideNode(GridImp* grid, const uint &index, bool &insideNodeFound, char innerType)
+    {
+        if (grid->isNode(index, NEGATIVE_DIRECTION_BORDER))
+            return;
+
+        if (!grid->isNode(index, innerType) && grid->nodeInNextCellIs(index, innerType))
+        {
+            grid->setNodeTo(index, innerType);
+            insideNodeFound = true;
+        }
+    }
+
+    HOSTDEVICE void setNegativeDirBorderTo(GridImp* grid, const uint &index, char innerType)
+    {
+        if (grid->isNode(index, NEGATIVE_DIRECTION_BORDER))
+            grid->setNodeTo(index, innerType);
+    }
+
+};
+
+
+
+#endif
+
diff --git a/src/GridGenerator/grid/GridFactory.h b/src/GridGenerator/grid/GridFactory.h
index ed68f052b..dca8e2c73 100644
--- a/src/GridGenerator/grid/GridFactory.h
+++ b/src/GridGenerator/grid/GridFactory.h
@@ -11,28 +11,46 @@
 #include "GridMocks.h"
 #include "geometries/Cuboid/Cuboid.h"
 #include "geometries/Sphere/Sphere.h"
+#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
 
 enum class Device
 {
     CPU, GPU
 };
 
+enum class TriangularMeshDiscretizationMethod
+{
+    RAYCASTING, POINT_IN_OBJECT, POINT_UNDER_TRIANGLE
+};
+
+
+class TriangularMeshDiscretizationStrategyFactory
+{
+public:
+
+};
 
 class VF_PUBLIC GridFactory
 {
 public:
     SPtr<Grid> makeGrid(Object* gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, const std::string& d3Qxx = "D3Q27")
     {
+
         if (!gridStrategy)
             throw "GridStrategy has to be set before make Grid!";
 
         Distribution distribution = DistributionHelper::getDistribution(d3Qxx);
+
+
         if(this->grid == "stub")
             return GridStub::makeShared(gridShape, delta, gridStrategy, distribution);
         else if(this->grid == "spy")
-            return GridSpy::makeShared(gridShape, delta, gridStrategy, distribution);
+             return GridSpy::makeShared(gridShape, delta, gridStrategy, distribution);
 
-        return GridImp::makeShared(gridShape, startX, startY, startZ, endX, endY, endZ, delta, gridStrategy, distribution);
+        SPtr<GridImp> grid = GridImp::makeShared(gridShape, startX, startY, startZ, endX, endY, endZ, delta, gridStrategy, distribution);
+        grid->setTriangularMeshDiscretizationStrategy(this->triangularMeshDiscretizationStrategy);
+
+        return grid;
     }
 
 
@@ -57,7 +75,24 @@ public:
         this->grid = grid;
     }
 
+    void setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod triangularMeshDiscretizationMethod)
+    {
+        switch (triangularMeshDiscretizationMethod)
+        {
+        case TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE:
+            triangularMeshDiscretizationStrategy = new PointUnderTriangleStrategy();
+            break;
+        case TriangularMeshDiscretizationMethod::RAYCASTING:
+            triangularMeshDiscretizationStrategy = new RayCastingDiscretizationStrategy();
+            break;
+        case TriangularMeshDiscretizationMethod::POINT_IN_OBJECT:
+            triangularMeshDiscretizationStrategy = new PointInObjectDiscretizationStrategy();
+            break;
+        }
+    }
+
 private:
+    TriangularMeshDiscretizationStrategy* triangularMeshDiscretizationStrategy;
     SPtr<GridStrategy> gridStrategy;
     std::string grid;
 };
diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu
index 51d1ea9c9..17f132f18 100644
--- a/src/GridGenerator/grid/GridImp.cu
+++ b/src/GridGenerator/grid/GridImp.cu
@@ -13,6 +13,8 @@
 #include <GridGenerator/geometries/Vertex/Vertex.h>
 #include <GridGenerator/geometries/Triangle/Triangle.h>
 #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h>
+#include <GridGenerator/geometries/TriangularMesh/TriangularMeshStrategy.h>
+
 #include <GridGenerator/geometries/BoundingBox/BoundingBox.h>
 
 #include <GridGenerator/grid/NodeValues.h>
@@ -70,8 +72,9 @@ HOST void GridImp::inital()
     gridStrategy->initalNodesToOutOfGrid(shared_from_this());
 
     TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object);
-    if(triangularMesh)
-        gridStrategy->findInnerNodes(shared_from_this(), triangularMesh);
+    if (triangularMesh)
+        triangularMeshDiscretizationStrategy->discretize(triangularMesh, this, FLUID, OUT_OF_GRID);
+        //gridStrategy->findInnerNodes(shared_from_this(), triangularMesh);
     else
         gridStrategy->findInnerNodes(shared_from_this());
 
@@ -207,7 +210,7 @@ HOSTDEVICE void GridImp::removeOddBoundaryCellNode(uint index)
     if (isOutSideOfGrid(cell))
         return;
     if (contains(cell, OUT_OF_GRID))
-        setTo(cell, OUT_OF_GRID);
+        setNodeTo(cell, OUT_OF_GRID);
 }
 
 HOSTDEVICE bool GridImp::isOutSideOfGrid(Cell &cell) const
@@ -230,13 +233,24 @@ HOSTDEVICE bool GridImp::contains(Cell &cell, char type) const
     return false;
 }
 
-HOSTDEVICE void GridImp::setTo(Cell &cell, char type)
+HOSTDEVICE void GridImp::setNodeTo(Cell &cell, char type)
 {
     for (const auto point : cell) {
         field.setFieldEntry(transCoordToIndex(point.x, point.y, point.z), type);
     }
 }
 
+HOSTDEVICE void GridImp::setNodeTo(uint index, char type)
+{
+    field.setFieldEntry(index, type);
+}
+
+HOSTDEVICE bool GridImp::isNode(uint index, char type) const
+{
+    return field.is(index, type);
+}
+
+
 HOSTDEVICE bool GridImp::isValidStartOfGridStopper(uint index) const
 {
     return this->field.is(index, OUT_OF_GRID) && (nodeInNextCellIs(index, FLUID) || nodeInNextCellIs(index, FLUID_CFF));
@@ -385,6 +399,10 @@ HOST uint GridImp::getLevel(real startDelta) const
     return level;
 }
 
+HOST void GridImp::setTriangularMeshDiscretizationStrategy(TriangularMeshDiscretizationStrategy* triangularMeshDiscretizationStrategy)
+{
+    this->triangularMeshDiscretizationStrategy = triangularMeshDiscretizationStrategy;
+}
 
 // --------------------------------------------------------- //
 //                  Set Sparse Indices                       //
diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h
index 7019158a9..ff7615739 100644
--- a/src/GridGenerator/grid/GridImp.h
+++ b/src/GridGenerator/grid/GridImp.h
@@ -16,6 +16,7 @@ class GridStrategy;
 class GridInterface;
 class Object;
 class BoundingBox;
+class TriangularMeshDiscretizationStrategy;
 
 extern CONSTANT int DIRECTIONS[DIR_END_MAX][DIMENSION];
 
@@ -34,12 +35,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 void setNodeTo(Cell &cell, char type);
 
-    HOSTDEVICE bool nodeInNextCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const;
     HOSTDEVICE bool nodeInCellIs(Cell& cell, char type) const override;
 
@@ -64,10 +63,12 @@ private:
     int *neighborIndexX, *neighborIndexY, *neighborIndexZ;
     int *sparseIndices;
     SPtr<GridStrategy> gridStrategy;
+    TriangularMeshDiscretizationStrategy* triangularMeshDiscretizationStrategy;
 
 
 public:
     HOST void inital() override;
+    HOSTDEVICE void removeOddBoundaryCellNode(uint index);
 
     HOST void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) override;
     HOSTDEVICE void setCellTo(uint index, char type);
@@ -79,6 +80,8 @@ public:
     HOST void freeMemory() override;
 
     HOST uint getLevel(real levelNull) const;
+    HOST void setTriangularMeshDiscretizationStrategy(TriangularMeshDiscretizationStrategy* triangularMeshDiscretizationStrategy);
+    
 public:
     Distribution distribution;
 
@@ -94,6 +97,9 @@ public:
     HOSTDEVICE void findGridInterfaceFC(uint index, GridImp& finerGrid);
     HOSTDEVICE void findOverlapStopper(uint index, GridImp& finerGrid);
 
+    HOSTDEVICE void setNodeTo(uint index, char type);
+    HOSTDEVICE bool isNode(uint index, char type) const;
+    HOSTDEVICE bool nodeInNextCellIs(int index, char type) const;
 
     HOSTDEVICE Field getField() const;
     HOSTDEVICE char getFieldEntry(uint index) const override;
@@ -137,6 +143,7 @@ public:
 
     SPtr<GridStrategy> getGridStrategy() const override;
 
+
     HOSTDEVICE void print() const;
 
 
@@ -153,11 +160,12 @@ private:
     HOSTDEVICE real getFirstFluidNode(real coords[3], int direction, real startCoord) const;
     HOSTDEVICE int getSparseIndex(const real &expectedX, const real &expectedY, const real &expectedZ) const;
 
-    HOSTDEVICE BoundingBox GridImp::getBoundingBoxOnNodes(Triangle &triangle) const;
     HOSTDEVICE static real getMinimumOnNodes(const real& minExact, const real& decimalStart, const real& delta);
     HOSTDEVICE static real getMaximumOnNodes(const real& maxExact, const real& decimalStart, const real& delta);
 
 public:
+    HOSTDEVICE BoundingBox getBoundingBoxOnNodes(Triangle &triangle) const;
+
     HOST void mesh(TriangularMesh &geometry) override;
     HOSTDEVICE void mesh(Triangle &triangle);
     HOSTDEVICE void meshReverse(Triangle &triangle);
diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
index bdfbf8815..0eb72b3ab 100644
--- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
+++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp
@@ -260,7 +260,6 @@ void GridCpuStrategy::rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* trian
                     counter++;
                     if (mesh.intersectLine(x, y, (z + grid->getDelta()), x, y, z)) break;
                     else grid->field.setFieldEntryToOutOfGrid(grid->transCoordToIndex(x, y, z));
-
                 }
             }
         }
diff --git a/targets/apps/HULC/CMakeLists.txt b/targets/apps/HULC/CMakeLists.txt
index fdf315d8d..78c0c2fed 100644
--- a/targets/apps/HULC/CMakeLists.txt
+++ b/targets/apps/HULC/CMakeLists.txt
@@ -2,7 +2,7 @@ setTargetNameToFolderName(${CMAKE_CURRENT_LIST_DIR})
 
 set(linkDirectories "")
 set(libsToLink VirtualFluids_GPU GridGenerator)
-set(includeDirectories "${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/src/VirtualFluids_GPU" "${CMAKE_SOURCE_DIR}/src/GridGenerator")
+set(includeDirectories "${CMAKE_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/src/VirtualFluids_GPU" "${CMAKE_SOURCE_DIR}/src/GridGenerator" "${CMAKE_SOURCE_DIR}/src/VirtualFluidsBasics")
 
 #glob files and save in MY_SRCS
 include(CMakePackage.cmake)
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 2a637dd79..24548af61 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -32,6 +32,7 @@
 #include "geometries/Conglomerate/Conglomerate.h"
 #include "io/STLReaderWriter/STLReader.h"
 #include "io/STLReaderWriter/STLWriter.h"
+#include "geometries/TriangularMesh/TriangularMeshStrategy.h"
 
 
 std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
@@ -247,6 +248,8 @@ void multipleLevel(const std::string& configPath)
     auto gridFactory = SPtr<GridFactory>(new GridFactory());
     gridFactory->setGridStrategy(SPtr<GridStrategy>(new GridCpuStrategy()));
     gridFactory->setGrid("grid");
+    gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_IN_OBJECT);
+
     //auto gridBuilderlevel = LevelGridBuilder::makeShared(Device::CPU, "D3Q27");
     auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
     gridBuilder->addCoarseGrid(-5.0, -5.0, -5.0, 40.0, 40.0, 40.0, 1.0);
diff --git a/targets/tests/GridGeneratorTest/CMakeLists.txt b/targets/tests/GridGeneratorTest/CMakeLists.txt
index e40a48a82..5554cd516 100644
--- a/targets/tests/GridGeneratorTest/CMakeLists.txt
+++ b/targets/tests/GridGeneratorTest/CMakeLists.txt
@@ -2,7 +2,7 @@ setTargetNameToFolderName(${CMAKE_CURRENT_LIST_DIR})
 
 set(linkDirectories "")
 set(libsToLink GridGenerator)
-set(includeDirectories ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/GridGenerator)
+set(includeDirectories ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/GridGenerator "${CMAKE_SOURCE_DIR}/src/VirtualFluidsBasics")
 
 #glob files and save in MY_SRCS
 include(CMakePackage.cmake)
-- 
GitLab