diff --git a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu b/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu index 7c92d04c458e601324292d881b410a38bb5a00e8..258724ce77f166551e4fe8be8075622f19fa1de8 100644 --- a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu +++ b/src/GridGenerator/geometries/BoundingBox/BoundingBox.cu @@ -1,6 +1,6 @@ -#include "BoundingBox.cuh" +#include "BoundingBox.h" -#include "../Triangle/Triangle.cuh" +#include "../Triangle/Triangle.h" #include "../Vertex/Vertex.cuh" #include <GridGenerator/utilities/math/CudaMath.cuh> @@ -55,20 +55,52 @@ template <typename T> } - HOSTDEVICE BoundingBox<real> BoundingBox<real>::makeRealNodeBox(const Triangle& t, const real& delta) + HOSTDEVICE BoundingBox<real> BoundingBox<real>::makeRealNodeBox(const Triangle& t, const real& startX, const real& startY, const real& startZ, const real& delta) { BoundingBox<real> box; real minX, maxX, minY, maxY, minZ, maxZ; t.setMinMax(minX, maxX, minY, maxY, minZ, maxZ); - calculateMinMaxOnNodes(box.minX, box.maxX, minX, maxX, delta); - calculateMinMaxOnNodes(box.minY, box.maxY, minY, maxY, delta); - calculateMinMaxOnNodes(box.minZ, box.maxZ, minZ, maxZ, delta); + calculateMinMaxOnNodes(box.minX, box.maxX, minX, maxX, startX, delta); + calculateMinMaxOnNodes(box.minY, box.maxY, minY, maxY, startY, delta); + calculateMinMaxOnNodes(box.minZ, box.maxZ, minZ, maxZ, startZ, delta); return box; } + template <> + HOSTDEVICE void BoundingBox<real>::calculateMinMaxOnNodes(real &minNode, real &maxNode, const real &minExact, const real &maxExact, const real& start, const real& delta) + { + const real decimalStart = CudaMath::getDecimalPart(start); + minNode = getMinimum(minExact, decimalStart, delta); + maxNode = getMaximum(maxExact, decimalStart, delta); + } + + template <> + HOSTDEVICE real BoundingBox<real>::getMinimum(const real& minExact, const real& decimalStart, const real& delta) + { + real minNode = ceil(minExact - 1.0); + minNode += decimalStart; + while (minNode > minExact) + minNode -= delta; + + while (minNode + delta < minExact) + minNode += delta; + return minNode; + } + + template <> + HOSTDEVICE real BoundingBox<real>::getMaximum(const real& maxExact, const real& decimalStart, const real& delta) + { + real maxNode = ceil(maxExact - 1.0); + maxNode += decimalStart; + + while (maxNode < maxExact) + maxNode += delta; + return maxNode; + } + template <typename T> HOST BoundingBox<T> BoundingBox<T>::makeInvalidMinMaxBox() @@ -82,42 +114,26 @@ template <typename T> return box; } - HOSTDEVICE BoundingBox<int> BoundingBox<int>::makeNodeBox(const Triangle &t) - { - BoundingBox<int> box; - real minX, maxX, minY, maxY, minZ, maxZ; - t.setMinMax(minX, maxX, minY, maxY, minZ, maxZ); - - calculateMinMaxOnNodes(box.minX, box.maxX, minX, maxX); - calculateMinMaxOnNodes(box.minY, box.maxY, minY, maxY); - calculateMinMaxOnNodes(box.minZ, box.maxZ, minZ, maxZ); - return box; - } - - template <> - HOSTDEVICE void BoundingBox<real>::calculateMinMaxOnNodes(real &minNode, real &maxNode, const real &minExact, const real &maxExact, const real& delta) - { - minNode = ceil(minExact - 1.0); - maxNode = floor(maxExact + 1.0); - if (minNode + 0.5 < minExact) - minNode += 0.5; - if (maxNode - 0.5 > maxExact) - maxNode -= 0.5; - } - - template <> - HOSTDEVICE void BoundingBox<int>::calculateMinMaxOnNodes(int &minNode, int &maxNode, const real &minExact, const real &maxExact) - { - minNode = ceil(minExact - 1.0); - maxNode = floor(maxExact + 1.0); - } - void BoundingBox<real>::setMinMax(const Triangle& t) { + real minX, maxX, minY, maxY, minZ, maxZ; t.setMinMax(minX, maxX, minY, maxY, minZ, maxZ); + if(minX < this->minX) + this->minX = minX; + if (minY < this->minY) + this->minY = minY; + if (minZ < this->minZ) + this->minZ = minZ; + + if (maxX > this->maxX) + this->maxX = maxX; + if (maxY > this->maxY) + this->maxY = maxY; + if (maxZ > this->maxZ) + this->maxZ = maxZ; } template <typename T> diff --git a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cuh b/src/GridGenerator/geometries/BoundingBox/BoundingBox.h similarity index 80% rename from src/GridGenerator/geometries/BoundingBox/BoundingBox.cuh rename to src/GridGenerator/geometries/BoundingBox/BoundingBox.h index 72499a4348a0852c795138605daf0c9c47bf0749..c7ff8f6bd7c013a486537a872e3a94d6de3e0ca3 100644 --- a/src/GridGenerator/geometries/BoundingBox/BoundingBox.cuh +++ b/src/GridGenerator/geometries/BoundingBox/BoundingBox.h @@ -30,8 +30,7 @@ public: public: HOST static BoundingBox<real> makeExactBox(const Triangle &t); - HOSTDEVICE static BoundingBox<real> makeRealNodeBox(const Triangle &t, const real& delta); - HOSTDEVICE static BoundingBox<int> makeNodeBox(const Triangle &t); + HOSTDEVICE static BoundingBox<real> makeRealNodeBox(const Triangle &t, const real& startX, const real& startY, const real& startZ, const real& delta); HOST static BoundingBox<T> makeInvalidMinMaxBox(); void setMinMax(const Triangle& t); @@ -51,8 +50,9 @@ public: private: - HOSTDEVICE static void calculateMinMaxOnNodes(int &minNode, int &maxNode, const real &minExact, const real &maxExact); - HOSTDEVICE static void calculateMinMaxOnNodes(real &minNode, real &maxNode, const real &minExact, const real &maxExact, const real& delta); + HOSTDEVICE static void calculateMinMaxOnNodes(real &minNode, real &maxNode, const real &minExact, const real &maxExact, const real& start, const real& delta); + HOSTDEVICE static real getMinimum(const real& minExact, const real& decimalStart, const real& delta); + HOSTDEVICE static real getMaximum(const real& maxExact, const real& decimalStart, const real& delta); bool isInside(const Vertex &v) const; void getPoints(Vertex v[8]) const; @@ -60,3 +60,4 @@ private: }; #endif + diff --git a/src/GridGenerator/geometries/BoundingBox/BoundingBoxTest.cpp b/src/GridGenerator/geometries/BoundingBox/BoundingBoxTest.cpp index 0a7b3ab439b7a164dde33788cb06d95ecbbf96d5..15cdf759155bdac375fdbb5c5c50cffd12f55197 100644 --- a/src/GridGenerator/geometries/BoundingBox/BoundingBoxTest.cpp +++ b/src/GridGenerator/geometries/BoundingBox/BoundingBoxTest.cpp @@ -1,80 +1,46 @@ #include "gmock/gmock.h" -#include <GridGenerator/geometries/Triangle/Triangle.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/geometries/Vertex/Vertex.cuh> using namespace testing; -TEST(BoundingBoxTest, initWithTriangle_whenTheValueIsIntegerBoxHasToPLUS_or_MINUS_ONE) +TEST(BoundingBoxTest, initBBWithTriangleOnNodes_minimumBorder) { - real minX = 1.0f; - real minY = 23.0f; - real minZ = 1.1222f; - - real maxX = 110.0f; - real maxY = 50.0f; - real maxZ = 12122.23f; - BoundingBox<int> box = BoundingBox<int>::makeNodeBox(Triangle(Vertex(maxX, maxY - 10, minZ + 2), Vertex(minX, maxY, maxZ), Vertex(minX + 3, minY, minZ), Vertex(0.0f, 0.0f, 0.0f))); - EXPECT_THAT(box.minX, Eq(minX - 1)); - EXPECT_THAT(box.minY, Eq(minY - 1)); - EXPECT_THAT(box.minZ, Eq((int)minZ)); - - EXPECT_THAT(box.maxX, Eq(maxX + 1)); - EXPECT_THAT(box.maxY, Eq(maxY + 1)); - EXPECT_THAT(box.maxZ, Eq((int)maxZ + 1)); + Vertex v = Vertex(0.1, 0.3, 0.8); + Triangle t = Triangle(v, v, v, Vertex(0.0f, 0.0f, 0.0f)); + + const real startX = 0.2; + const real startY = 0.2; + const real startZ = 0.2; + const real delta = 0.5; + const auto sut = BoundingBox<real>::makeRealNodeBox(t, startX, startY, startZ, delta); + + EXPECT_THAT(sut.minX, RealEq(-0.3)); + EXPECT_THAT(sut.minY, RealEq(0.2)); + EXPECT_THAT(sut.minZ, RealEq(0.7)); } -TEST(BoundingBoxTest, initWithTriangle2) -{ - BoundingBox<int> box = BoundingBox<int>::makeNodeBox(Triangle(Vertex(20.0f, 1.0f, 1.0f), Vertex(1.0f, 1.0f, 1 + 1e-006f), Vertex(20.0f, 20.0f, 1.0f), Vertex(1.0f, 0.0f, 0.0f))); - - EXPECT_THAT(box.minX, Eq(0)); - EXPECT_THAT(box.minY, Eq(0)); - EXPECT_THAT(box.minZ, Eq(0)); - - EXPECT_THAT(box.maxX, Eq(21)); - EXPECT_THAT(box.maxY, Eq(21)); - EXPECT_THAT(box.maxZ, Eq(2)); -} - -TEST(BoundingBoxTest, initWithTriangle3) +TEST(BoundingBoxTest, initBBWithTriangleOnNodes_maximumBorder) { - BoundingBox<int> box = BoundingBox<int>::makeNodeBox(Triangle(Vertex(20.0f, 20.0f, 20.0f), Vertex(1.0f, 20.0f, 20.0f), Vertex(20.0f, 1.0f, 20.0f), Vertex(1.0f, 0.0f, 0.0f))); - - EXPECT_THAT(box.minX, Eq(0)); - EXPECT_THAT(box.minY, Eq(0)); - EXPECT_THAT(box.minZ, Eq(19)); - - EXPECT_THAT(box.maxX, Eq(21)); - EXPECT_THAT(box.maxY, Eq(21)); - EXPECT_THAT(box.maxZ, Eq(21)); + Vertex v = Vertex(0.1, 0.3, 0.8); + Triangle t = Triangle(v, v, v, Vertex(0.0f, 0.0f, 0.0f)); + + const real startX = 0.2; + const real startY = 0.2; + const real startZ = 0.2; + const real delta = 0.5; + const auto sut = BoundingBox<real>::makeRealNodeBox(t, startX, startY, startZ, delta); + + EXPECT_THAT(sut.maxX, RealEq(0.2)); + EXPECT_THAT(sut.maxY, RealEq(0.7)); + EXPECT_THAT(sut.maxZ, RealEq(1.2)); } -TEST(BoundingBoxTest, whenAllValueAreFloat_BoxHasToCEIL_OR_FLOOR) -{ - real minX = 1.5f; - real minY = 23.2f; - real minZ = 1.1222f; - - real maxX = 110.4f; - real maxY = 50.5f; - real maxZ = 12122.23f; - - BoundingBox<int> box = BoundingBox<int>::makeNodeBox(Triangle(Vertex(maxX, maxY - 10, minZ + 2), Vertex(minX, maxY, maxZ), Vertex(minX + 3, minY, minZ), Vertex(0.0f, 0.0f, 0.0f))); - - EXPECT_THAT(box.minX, Eq((int)minX)); - EXPECT_THAT(box.minY, Eq((int)minY)); - EXPECT_THAT(box.minZ, Eq((int)minZ)); - - EXPECT_THAT(box.maxX, Eq((int)maxX + 1)); - EXPECT_THAT(box.maxY, Eq((int)maxY + 1)); - EXPECT_THAT(box.maxZ, Eq((int)maxZ + 1)); - -} TEST(BoundingBoxExactTest, findMinMaxFromTriangle) { @@ -134,19 +100,4 @@ TEST(BoundingBoxTest, isInside_false) EXPECT_FALSE(box.isInside(t)); } -TEST(BoundingBoxTest, createNodeBoxWithFloastingPointValues) -{ - Triangle t = Triangle(Vertex(1.34, -2.01, 1.8), Vertex(2, 2, 1.9), Vertex(3.99, 2.1, 1.51), Vertex(0.0, 0.0, 0.0)); - real delta = 0.5; - - BoundingBox<real> box = BoundingBox<real>::makeRealNodeBox(t, delta); - - EXPECT_THAT(box.minX, RealEq(1.0)); - EXPECT_THAT(box.minY, RealEq(-2.5)); - EXPECT_THAT(box.minZ, RealEq(1.5)); - - EXPECT_THAT(box.maxX, RealEq(4)); - EXPECT_THAT(box.maxY, RealEq(2.5)); - EXPECT_THAT(box.maxZ, RealEq(2.0)); -} diff --git a/src/GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMementoTest.cpp b/src/GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMementoTest.cpp index 17382037899b6e4bc6d8723d768222477592dac5..9173d4977165f474001395dea144e887851a9ab1 100644 --- a/src/GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMementoTest.cpp +++ b/src/GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMementoTest.cpp @@ -4,7 +4,7 @@ #include <fstream> #include <GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMemento.h> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> diff --git a/src/GridGenerator/geometries/Triangle/Serialization/TriangleMementoTest.cpp b/src/GridGenerator/geometries/Triangle/Serialization/TriangleMementoTest.cpp index 8593a5f94d2af6c0b15d50f225b902f5637ea1c7..1c8722b9f34d7af1fff9bab64b474fed59aa6375 100644 --- a/src/GridGenerator/geometries/Triangle/Serialization/TriangleMementoTest.cpp +++ b/src/GridGenerator/geometries/Triangle/Serialization/TriangleMementoTest.cpp @@ -4,7 +4,7 @@ #include <fstream> #include <GridGenerator/geometries/Triangle/Serialization/TriangleMemento.h> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> diff --git a/src/GridGenerator/geometries/Triangle/Triangle.cu b/src/GridGenerator/geometries/Triangle/Triangle.cu index e1823d637dd208104149276bc849f0e501a99244..6dc85d29542922a79738c1807b265d87d1024675 100644 --- a/src/GridGenerator/geometries/Triangle/Triangle.cu +++ b/src/GridGenerator/geometries/Triangle/Triangle.cu @@ -1,9 +1,11 @@ -#include "Triangle.cuh" +#include "Triangle.h" #include <GridGenerator/utilities/math/CudaMath.cuh> #include "TriangleException.h" #include "Serialization/TriangleMemento.h" +#include "grid/NodeValues.h" + HOSTDEVICE Triangle::Triangle(Vertex &v1, Vertex &v2, Vertex &v3, Vertex &normal) : v1(v1), v2(v2), v3(v3), normal(normal) {} HOSTDEVICE Triangle::Triangle(Vertex &v1, Vertex &v2, Vertex &v3) : v1(v1), v2(v2), v3(v3) { calcNormal(); } HOSTDEVICE Triangle::Triangle(){} @@ -24,33 +26,39 @@ HOSTDEVICE void Triangle::calcNormal() normal.normalize(); } +HOSTDEVICE void Triangle::initalLayerThickness(real delta) +{ + this->layerThickness = delta*(abs(this->normal.x) + abs(this->normal.y) + abs(this->normal.z)); +} + + HOSTDEVICE char Triangle::isUnderFace(const Vertex &point) const { - real s, delta; - delta = abs(this->normal.x) + abs(this->normal.y) + abs(this->normal.z); //TODO: muss eigentlich nicht fuer jeden Punkt neu berechnet werden + real s; - if (this->isUnterExtendedFace(point, s, delta)) + if (this->isUnterExtendedFace(point, s)) if (this->isNotNextToFace(point)) if (this->isUnderAngleToNeighbors(point)) - if (this->isStopper(point)) - return 1; + if (this->isNegativeDirectionBorder(point)) + return NEGATIVE_DIRECTION_BORDER; else - return 99; //solid + return INSIDE; else return 4; else return 3; - else if (this->isQNode(point, s, delta)) - return 6; - else - return 2; + + + if (this->isQNode(point, s)) + return Q; + return FLUID; } -HOSTDEVICE bool Triangle::isUnterExtendedFace(const Vertex &point, real &s, real &delta) const +HOSTDEVICE bool Triangle::isUnterExtendedFace(const Vertex & point, real &s) const { s = this->getPerpedicularDistanceFrom(point); - return ((CudaMath::greaterEqual(s, 0.0f)) && s < delta); + return ((CudaMath::greaterEqual(s, 0.0f)) && s < this->layerThickness); } HOSTDEVICE real Triangle::getPerpedicularDistanceFrom(const Vertex &P) const @@ -64,15 +72,15 @@ HOSTDEVICE Vertex Triangle::getPerpedicularPointFrom(const Vertex &P) const return P + normal * getPerpedicularDistanceFrom(P); } -HOSTDEVICE bool Triangle::isQNode(const Vertex &point, const real &s, const real &delta) const +HOSTDEVICE bool Triangle::isQNode(const Vertex & point, const real &s) const { - return (s < 0 && CudaMath::lessEqual(-s, delta)); + return (s < 0 && CudaMath::lessEqual(-s, this->layerThickness)); //calculateQs(actualPoint, actualTriangle); } -HOSTDEVICE bool Triangle::isStopper(const Vertex &point) const +HOSTDEVICE bool Triangle::isNegativeDirectionBorder(const Vertex &point) const { - return (CudaMath::lessEqual(normal.x, 0.0f) || CudaMath::lessEqual(normal.y, 0.0f) || CudaMath::lessEqual(normal.z, 0.0f)); + return normal.x < 0.0f || normal.y < 0.0f || normal.z < 0.0f; //return (sVector.x < 0.0f && sVector.y < 0.0f && sVector.z < 0.0f); } diff --git a/src/GridGenerator/geometries/Triangle/Triangle.cuh b/src/GridGenerator/geometries/Triangle/Triangle.h similarity index 88% rename from src/GridGenerator/geometries/Triangle/Triangle.cuh rename to src/GridGenerator/geometries/Triangle/Triangle.h index 481bebd1f77ed57d554e0a63ff3b08fd9e5a8dd9..5d6973ed13899e5863780dd1ac383848d1f1d06c 100644 --- a/src/GridGenerator/geometries/Triangle/Triangle.cuh +++ b/src/GridGenerator/geometries/Triangle/Triangle.h @@ -3,7 +3,6 @@ #include "GridGenerator/global.h" - #include "../Vertex/Vertex.cuh" #include <memory> @@ -15,6 +14,7 @@ struct VF_PUBLIC Triangle { Vertex v1, v2, v3, normal; real alphaAngles[3]; + real layerThickness; HOSTDEVICE Triangle(Vertex &v1, Vertex &v2, Vertex &v3, Vertex &normal); HOSTDEVICE Triangle(Vertex &v1, Vertex &v2, Vertex &v3); @@ -23,6 +23,8 @@ struct VF_PUBLIC Triangle HOSTDEVICE void set(const Vertex &v1, const Vertex &v2, const Vertex &v3); HOSTDEVICE void calcNormal(); + HOSTDEVICE void initalLayerThickness(real delta); + Vertex getCenterOfMass() const; real getHalfAngleBetweenToAdjacentTriangle(const Triangle &t2) const; @@ -37,14 +39,14 @@ struct VF_PUBLIC Triangle HOSTDEVICE char isUnderFace(const Vertex &point) const; - HOSTDEVICE bool isUnterExtendedFace(const Vertex & point, real &s, real &delta) const; + HOSTDEVICE bool isUnterExtendedFace(const Vertex & point, real &s) const; HOSTDEVICE bool isNotNextToFace(const Vertex &point) const; HOSTDEVICE bool isUnderAngleToNeighbors(const Vertex &point) const; HOSTDEVICE void getClosestPointsOnEdges(Vertex arr[], const Vertex &P) const; HOSTDEVICE real getPerpedicularDistanceFrom(const Vertex &P) const; HOSTDEVICE Vertex getPerpedicularPointFrom(const Vertex &P) const; - HOSTDEVICE bool isQNode(const Vertex & point, const real &s, const real &delta) const; - HOSTDEVICE bool isStopper(const Vertex & point) const; + HOSTDEVICE bool isQNode(const Vertex & point, const real &s) const; + HOSTDEVICE bool isNegativeDirectionBorder(const Vertex & point) const; HOST bool operator==(const Triangle &t) const; diff --git a/src/GridGenerator/geometries/Triangle/TriangleTest.cpp b/src/GridGenerator/geometries/Triangle/TriangleTest.cpp index 8bbbee2e0db7bda160e7d5159c8ca3983201cf24..1de09e089141519692ba4734d3415e8772326538 100644 --- a/src/GridGenerator/geometries/Triangle/TriangleTest.cpp +++ b/src/GridGenerator/geometries/Triangle/TriangleTest.cpp @@ -2,7 +2,7 @@ #include <GridGenerator/utilities/Transformator/Transformator.h> #include "TriangleException.h" -#include "Triangle.cuh" +#include "Triangle.h" using namespace testing; diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h index df2de0612b226fd24be2eec81bfa60b3a1d452a2..2eafb51e55cd4ff2ea4def577c8ffe9156fe13ea 100644 --- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h +++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h @@ -10,21 +10,22 @@ #include <string> #include <memory> -#include "../Triangle/Triangle.cuh" +#include "../Triangle/Triangle.h" #include <GridGenerator/utilities/Transformator/Transformator.h> -#include "../BoundingBox/BoundingBox.cuh" +#include "../BoundingBox/BoundingBox.h" +#include "../Object.h" class GeometryMemento; -struct TriangularMesh +struct TriangularMesh : public Object { public: 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<int> &box, const Transformator *trafo); - VF_PUBLIC ~TriangularMesh(); + HOSTDEVICE VF_PUBLIC ~TriangularMesh(); VF_PUBLIC Transformator* getTransformator(); VF_PUBLIC void setTriangles(std::vector<Triangle> triangles); @@ -40,15 +41,31 @@ public: HOST VF_PUBLIC GeometryMemento getState() const; HOST VF_PUBLIC void setState(const GeometryMemento &memento); + VF_PUBLIC void findNeighbors(); private: Transformator* transformator; - void findNeighbors(); void initalizeDataFromTriangles(); +public: + HOSTDEVICE Object* clone() const override { return new TriangularMesh(); } + double getX1Centroid() override { throw "Not implemented in TriangularMesh"; } + double getX1Minimum() override { return minmax.minX; } + double getX1Maximum() override { return minmax.maxX; } + double getX2Centroid() override { throw "Not implemented in TriangularMesh"; } + double getX2Minimum() override { return minmax.minY; } + double getX2Maximum() override { return minmax.maxY; } + double getX3Centroid() override { throw "Not implemented in TriangularMesh"; } + double getX3Minimum() override { return minmax.minZ; } + double getX3Maximum() override { return minmax.maxZ; } + void scale(double delta) override { throw "Not implemented in TriangularMesh"; } + HOSTDEVICE bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, + const double& maxOffset) override { + return false; + } }; diff --git a/src/GridGenerator/geometries/Vertex/Vertex.cu b/src/GridGenerator/geometries/Vertex/Vertex.cu index 00b3fbbe9776513a7eb1803c1f61573c48d3b2cd..47c806d5dcb5b7b0c48704aeeebcb3cf520f0ea3 100644 --- a/src/GridGenerator/geometries/Vertex/Vertex.cu +++ b/src/GridGenerator/geometries/Vertex/Vertex.cu @@ -157,18 +157,30 @@ HOSTDEVICE void Vertex::setMinMax(real & minX, real & maxX, real & minY, real & } +HOSTDEVICE real getMinimum(const real &value1, const real &value2) +{ + return value1 < value2 ? value1 : value2; +} + +HOSTDEVICE real getMaximum(const real &value1, const real &value2) +{ + return value1 > value2 ? value1 : value2; +} + + HOSTDEVICE void Vertex::calculateMinMax(const real &value1, const real &value2, const real &value3, real &min, real &max) { - min = value1; - max = value2; - if (value1 > value2) { - min = value2; - max = value1; - } - if (min > value3) { - min = value3; - } - if (max < value3) { - max = value3; - } + + real newMinimum = value1; + newMinimum = getMinimum(value2, newMinimum); + newMinimum = getMinimum(value3, newMinimum); + + real newMaximum = value1; + newMaximum = getMaximum(value2, newMaximum); + newMaximum = getMaximum(value3, newMaximum); + + min = newMinimum; + max = newMaximum; } + + diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 06e8c5b556355f56e14cb1364f06bdf0193d575f..c2bcbfdc3b52d85a12b5bdbd5a8a9e2c128356da 100644 --- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -6,8 +6,8 @@ #include <GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h> #include <GridGenerator/grid/partition/Partition.h> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> diff --git a/src/GridGenerator/grid/GridBuilder/ParallelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/ParallelGridBuilder.cpp index 2e97af002ac6ac718a07637496ca5e5b73468809..a0e6df4a4b4ec8abe98e71753635f755f28947d2 100644 --- a/src/GridGenerator/grid/GridBuilder/ParallelGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/ParallelGridBuilder.cpp @@ -9,8 +9,8 @@ //#include <GridGenerator/grid/GridWrapper/GridWrapperGPU/GridWrapperGPU.h> //#include <GridGenerator/grid/partition/Partition.h> // -//#include <GridGenerator/geometries/Triangle/Triangle.cuh> -//#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +//#include <GridGenerator/geometries/Triangle/Triangle.h> +//#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> //#include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> // //#include <GridGenerator/utilities/Transformator/Transformator.h> diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu index 414fbbbf16f03ee7efdbf73efc8261e078f247ed..024767c062aa3440aed2a368f33da68a3c8ed82a 100644 --- a/src/GridGenerator/grid/GridImp.cu +++ b/src/GridGenerator/grid/GridImp.cu @@ -11,8 +11,9 @@ #include "distributions/Distribution.h" #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> +#include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/grid/NodeValues.h> #include <GridGenerator/grid/distributions/Distribution.h> @@ -22,6 +23,9 @@ #include "GridInterface.h" #include "geometries/Object.h" +#include "Field.h" + +#include "io/GridVTKWriter/GridVTKWriter.h" @@ -71,10 +75,69 @@ HOST void GridImp::inital() field.allocateMemory(); gridStrategy->allocateGridMemory(shared_from_this()); - gridStrategy->findInnerNodes(shared_from_this()); + gridStrategy->initalNodesToOutOfGrid(shared_from_this()); + + TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object); + if(triangularMesh) + { + gridStrategy->findInnerNodes(shared_from_this(), triangularMesh); + } + else + gridStrategy->findInnerNodes(shared_from_this()); + gridStrategy->findStopperNodes(shared_from_this()); } +HOSTDEVICE void GridImp::initalNodeToOutOfGrid(uint index) +{ + this->field.setFieldEntryToOutOfGrid(index); +} + + +HOSTDEVICE void GridImp::meshReverse(Triangle &triangle) +{ + BoundingBox<real> box = BoundingBox<real>::makeRealNodeBox(triangle, startX, startY, startZ, delta); + 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); + + const Vertex point(x, y, z); + + const char pointValue = triangle.isUnderFace(point); + + if (pointValue == NEGATIVE_DIRECTION_BORDER) + field.setFieldEntry(index, NEGATIVE_DIRECTION_BORDER); + else if (pointValue == INSIDE) + field.setFieldEntryToFluid(index); + } + } + } +} + +HOSTDEVICE void GridImp::setInsideNode(const int &index, bool &insideNodeFound) +{ + if (field.is(index, NEGATIVE_DIRECTION_BORDER)) + return; + + if (!field.isFluid(index) && this->nodeInNextCellIs(index, FLUID)) + { + field.setFieldEntryToFluid(index); + insideNodeFound = true; + } +} + +HOSTDEVICE void GridImp::setNegativeDirBorder_toFluid(const uint &index) +{ + if (field.is(index, NEGATIVE_DIRECTION_BORDER)) + field.setFieldEntryToFluid(index); +} + HOST void GridImp::freeMemory() { gridStrategy->freeMemory(shared_from_this()); @@ -100,8 +163,6 @@ HOSTDEVICE void GridImp::findInnerNode(uint index) const Cell cell = getOddCellFromIndex(index); if (isInside(cell)) this->field.setFieldEntryToFluid(index); - else - this->field.setFieldEntryToOutOfGrid(index); } bool GridImp::isInside(const Cell& cell) const @@ -432,11 +493,11 @@ HOSTDEVICE void GridImp::findOverlapStopper(uint index, GridImp& finerGrid) // --------------------------------------------------------- // // Mesh Triangle // // --------------------------------------------------------- // -HOST void GridImp::mesh(TriangularMesh &geometry) +HOST void GridImp::mesh(TriangularMesh &triangularMesh) { const clock_t begin = clock(); - gridStrategy->mesh(shared_from_this(), geometry); + gridStrategy->mesh(shared_from_this(), triangularMesh); const clock_t end = clock(); const real time = (real)(real(end - begin) / CLOCKS_PER_SEC); @@ -444,9 +505,10 @@ HOST void GridImp::mesh(TriangularMesh &geometry) *logging::out << logging::Logger::INTERMEDIATE << "time grid generation: " + SSTR(time) + "s\n"; } -HOSTDEVICE void GridImp::mesh(const Triangle &triangle) +HOSTDEVICE void GridImp::mesh(Triangle &triangle) { - BoundingBox<real> box = BoundingBox<real>::makeRealNodeBox(triangle, delta); + BoundingBox<real> box = BoundingBox<real>::makeRealNodeBox(triangle, startX, startY, startZ, delta); + triangle.initalLayerThickness(getDelta()); for (real x = box.minX; x <= box.maxX; x += delta) { @@ -506,24 +568,25 @@ HOSTDEVICE void GridImp::calculateQs(const Vertex &point, const Triangle &triang // --------------------------------------------------------- // -// find inner Solid Nodes // +// find inner nodes // // --------------------------------------------------------- // -HOSTDEVICE void GridImp::setInvalidNode(const int &index, bool &invalidNodeFound) -{ - if (field.isSolid(index)) - return; +//HOSTDEVICE void GridImp::setInvalidNode(const int &index, bool &insideNodeFound) +//{ +// if (field.isNegativeDirectionBorder(index)) +// return; +// +// if (!field.isInside(index) && this->nodeInNextCellIs(index, INSIDE)) +// { +// field.setFieldEntryToInvalid(index); +// insideNodeFound = true; +// } +//} + +//HOSTDEVICE bool GridImp::isNeighborInside(const int &index) const +//{ +// return (field.isInside(neighborIndexX[index]) || field.isInside(neighborIndexY[index]) || field.isInside(neighborIndexZ[index])); +//} - if (!field.isInvalid(index) && this->isNeighborInvalid(index)) - { - field.setFieldEntryToInvalid(index); - invalidNodeFound = true; - } -} - -HOSTDEVICE bool GridImp::isNeighborInvalid(const int &index) const -{ - return (field.isInvalid(neighborIndexX[index]) || field.isInvalid(neighborIndexY[index]) || field.isInvalid(neighborIndexZ[index])); -} // --------------------------------------------------------- // // Getter // // --------------------------------------------------------- // diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h index 572c12e065eab7e29a883a8a1279969ce0c6d78e..85dd6b271f747b032d72dff0c25f3a6f6ac2a402 100644 --- a/src/GridGenerator/grid/GridImp.h +++ b/src/GridGenerator/grid/GridImp.h @@ -77,6 +77,8 @@ public: public: Distribution distribution; + HOSTDEVICE void initalNodeToOutOfGrid(uint index); + HOSTDEVICE void findInnerNode(uint index); bool isInside(const Cell& cell) const; @@ -146,7 +148,10 @@ private: public: HOST void mesh(TriangularMesh &geometry) override; - HOSTDEVICE void mesh(const Triangle &triangle); + HOSTDEVICE void mesh(Triangle &triangle); + HOSTDEVICE void meshReverse(Triangle &triangle); + HOSTDEVICE void setInsideNode(const int &index, bool &invalidNodeFound); + HOSTDEVICE void setNegativeDirBorder_toFluid(const uint &index); private: HOSTDEVICE void setDebugPoint(uint index, int pointValue); @@ -154,9 +159,8 @@ private: public: - HOSTDEVICE void setInvalidNode(const int &index, bool &invalidNodeFound); private: - HOSTDEVICE bool isNeighborInvalid(const int &index) const; + //HOSTDEVICE bool isNeighborInside(const int &index) const; private: diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp index 00ca7ee017153ac1e0fa714fa8055a74c4b9498c..d9c6c7ee2f88ed14a600b5a2ce4b23754183795f 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp @@ -14,6 +14,7 @@ #include "grid/NodeValues.h" #include "grid/GridInterface.h" +#include "io/GridVTKWriter/GridVTKWriter.h" void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid) { @@ -33,6 +34,13 @@ void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid) grid->distribution.f = new real[distributionSize](); // automatic initialized with zeros } +void GridCpuStrategy::initalNodesToOutOfGrid(SPtr<GridImp> grid) +{ +#pragma omp parallel for + for (uint index = 0; index < grid->size; index++) + grid->initalNodeToOutOfGrid(index); +} + void GridCpuStrategy::allocateFieldMemory(Field* field) { field->field = new char[field->size]; @@ -50,6 +58,25 @@ void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid) << "nodes: " << grid->nx << " x " << grid->ny << " x " << grid->nz << " = " << grid->size << "\n"; } +void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) +{ +#pragma omp parallel for + for (int i = 0; i < triangularMesh->size; i++) + grid->meshReverse(triangularMesh->triangles[i]); + + GridVTKWriter::writeSparseGridToVTK(grid, "D:/GRIDGENERATION/gridBeforeStopper"); + + findInsideNodes(grid); + +#pragma omp parallel for + for (int i = 0; i < grid->size; i++) + grid->setNegativeDirBorder_toFluid(i); + + *logging::out << logging::Logger::INTERMEDIATE + << "Grid created: " << "from (" << grid->startX << ", " << grid->startY << ", " << grid->startZ << ") to (" << grid->endX << ", " << grid->endY << ", " << grid->endZ << ")\n" + << "nodes: " << grid->nx << " x " << grid->ny << " x " << grid->nz << " = " << grid->size << "\n"; +} + void GridCpuStrategy::findStopperNodes(SPtr<GridImp> grid) { #pragma omp parallel for @@ -136,7 +163,7 @@ void GridCpuStrategy::deleteSolidNodes(SPtr<GridImp> grid) { clock_t begin = clock(); - findInvalidNodes(grid); + findInsideNodes(grid); grid->updateSparseIndices(); findForNeighborsNewIndices(grid); @@ -145,14 +172,14 @@ void GridCpuStrategy::deleteSolidNodes(SPtr<GridImp> grid) *logging::out << logging::Logger::INTERMEDIATE << "time delete solid nodes: " + SSTR(time / 1000) + "sec\n"; } -void GridCpuStrategy::findInvalidNodes(SPtr<GridImp> grid) +void GridCpuStrategy::findInsideNodes(SPtr<GridImp> grid) { - bool foundInvalidNode = true; - while (foundInvalidNode) + bool foundInsideNode = true; + while (foundInsideNode) { - foundInvalidNode = false; + foundInsideNode = false; for (uint index = 0; index < grid->size; index++) - grid->setInvalidNode(index, foundInvalidNode); + grid->setInsideNode(index, foundInsideNode); } } diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h index 08ad7b2ae813782e6a4e8e9e949cf6f9e47b8d22..f7919a0494c407f2b7f4094a56d17a62cba14aad 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h @@ -18,7 +18,9 @@ public: void allocateGridMemory(SPtr<GridImp> grid) override; + void initalNodesToOutOfGrid(SPtr<GridImp> grid) override; void findInnerNodes(SPtr<GridImp> grid) override; + void findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) override; void findStopperNodes(SPtr<GridImp> grid) override; void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override; @@ -33,7 +35,7 @@ public: virtual void copyDataFromGPU() {}; protected: - static void findInvalidNodes(SPtr<GridImp> grid); + static void findInsideNodes(SPtr<GridImp> grid); static void findForNeighborsNewIndices(SPtr<GridImp> grid); static void findForGridInterfaceNewIndices(SPtr<GridImp> grid, SPtr<GridImp> fineGrid); diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategyTest.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategyTest.cpp index e772e45f3051c07acf5fc3e84a4786b018a63133..09ee08568d2fa34ba1f7cf256af8019f075595a1 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategyTest.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategyTest.cpp @@ -5,8 +5,8 @@ // //#include <string> // -//#include <stl/Triangle.cuh> -//#include <stl/BoundingBox.cuh> +//#include <stl/Triangle.h> +//#include <stl/BoundingBox.h> // //#include <grid/kernel/runGridKernelGPU.cuh> //#include <grid/distributions/D3Q7.h> diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp index dc04d661be0e3a0a4bd3e63ed548dc2bffcb4e8a..9ec6d40da8ea9294af3a5b0e099425a556172799 100644 --- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp @@ -6,7 +6,7 @@ #include <GridGenerator/utilities/cuda/CudaErrorCheck.cu> #include <GridGenerator/utilities/Launchparameter/LaunchParameter.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> #include <GridGenerator/grid/kernel/runGridKernelGPU.cuh> @@ -30,6 +30,16 @@ void GridGpuStrategy::allocateGridMemory(SPtr<GridImp> grid) this->allocNeighborsIndices(grid); } +void GridGpuStrategy::initalNodesToOutOfGrid(SPtr<GridImp> grid) +{ + +} + +void GridGpuStrategy::findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) +{ + +} + void GridGpuStrategy::findInnerNodes(SPtr<GridImp> grid) { diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h index 72b89faa829a774efb060986f41cafe7f23ae21a..8e6c60c9393091eda41170f4b8353ddfb37b9bfe 100644 --- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h @@ -17,6 +17,8 @@ public: void allocateGridMemory(SPtr<GridImp> grid) override; + void initalNodesToOutOfGrid(SPtr<GridImp> grid) override; + void findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) override; void findInnerNodes(SPtr<GridImp> grid) override; void findStopperNodes(SPtr<GridImp> grid) override; @@ -57,6 +59,7 @@ public: void allocateFieldMemory(Field* field) override; void freeFieldMemory(Field* field) override; void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override; + }; #endif diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategyTest.cpp b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategyTest.cpp index da1ecb59b2c7f9e93e840715385d12d11b835dcf..747378c3a3ec495538e59f7886f1d4c936f346f7 100644 --- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategyTest.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategyTest.cpp @@ -4,8 +4,8 @@ // //#include <string> // -//#include <stl/Triangle.cuh> -//#include <stl/BoundingBox.cuh> +//#include <stl/Triangle.h> +//#include <stl/BoundingBox.h> // //#include <grid/kernel/runGridKernelGPU.cuh> //#include <grid/distributions/D3Q7.h> diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategy.h b/src/GridGenerator/grid/GridStrategy/GridStrategy.h index 566162bbdb51041f3191001d608f5789bd99830d..0d244c93f29f90dda58e5d1f48386039c5c5a4e5 100644 --- a/src/GridGenerator/grid/GridStrategy/GridStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridStrategy.h @@ -18,7 +18,10 @@ public: virtual void allocateGridMemory(SPtr<GridImp> grid) = 0; + virtual void initalNodesToOutOfGrid(SPtr<GridImp> grid) = 0; + virtual void findInnerNodes(SPtr<GridImp> grid) = 0; + virtual void findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) = 0; virtual void findStopperNodes(SPtr<GridImp> grid) = 0; virtual void mesh(SPtr<GridImp> grid, TriangularMesh &geom) = 0; diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h index bdeef3126c780563ab0873dabadf481749bd0f62..e363f7295914606746b7f17dd5bc009d4fe8328b 100644 --- a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h +++ b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h @@ -16,6 +16,8 @@ public: virtual void allocateGridMemory(SPtr<GridImp> grid) override {} + virtual void initalNodesToOutOfGrid(SPtr<GridImp> grid) override {} + virtual void findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangularMesh) override {} virtual void findInnerNodes(SPtr<GridImp> grid) override {} virtual void findStopperNodes(SPtr<GridImp> grid) override {} @@ -30,7 +32,8 @@ public: virtual void freeFieldMemory(Field* field) override {} virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override {} - + + }; #endif diff --git a/src/GridGenerator/grid/GridTest.cpp b/src/GridGenerator/grid/GridTest.cpp index 5fb2f14a639f2d327d385b4b91491822407bb08c..afad036c01942cae066070d0393ace7050240c39 100644 --- a/src/GridGenerator/grid/GridTest.cpp +++ b/src/GridGenerator/grid/GridTest.cpp @@ -3,8 +3,8 @@ #include <vector> #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include "GridStrategy/GridCpuStrategy/GridCpuStrategy.h" #include "GridStrategy/GridStrategyMocks.h" // diff --git a/src/GridGenerator/grid/NodeValues.h b/src/GridGenerator/grid/NodeValues.h index 0cecb0c0c2dacad022b0a35d83581fc5ad770dab..5fda00c32487345f07baa6c76101818a51ca9204 100644 --- a/src/GridGenerator/grid/NodeValues.h +++ b/src/GridGenerator/grid/NodeValues.h @@ -20,6 +20,10 @@ #define INVALID_NODE 9 +#define INSIDE 10 +#define NEGATIVE_DIRECTION_BORDER 11 + + #define Q 6 #define NOSLIP 2 diff --git a/src/GridGenerator/grid/kernel/runGridKernelGPU.cu b/src/GridGenerator/grid/kernel/runGridKernelGPU.cu index 8724680482014ad6f082003af21013f4ac2e7c86..3ae5c605f7bdd814e1963b6f17c2216369350c78 100644 --- a/src/GridGenerator/grid/kernel/runGridKernelGPU.cu +++ b/src/GridGenerator/grid/kernel/runGridKernelGPU.cu @@ -140,7 +140,7 @@ GLOBAL void setInvalidNodes(GridImp grid, bool *foundInvalidNode) { uint index = LaunchParameter::getGlobalIdx_2D_1D(); if (index < grid.getSize()) - grid.setInvalidNode(index, *foundInvalidNode); + grid.setInsideNode(index, *foundInvalidNode); } diff --git a/src/GridGenerator/grid/partition/Partition.cpp b/src/GridGenerator/grid/partition/Partition.cpp index dc466de6429ed06691d7a4ed2a2c12e47e7c5040..e612d2402ce66c737a83ee2d8c6c0b20c8061e12 100644 --- a/src/GridGenerator/grid/partition/Partition.cpp +++ b/src/GridGenerator/grid/partition/Partition.cpp @@ -6,9 +6,9 @@ #include <GridGenerator/global.h> #include <GridGenerator/grid/Grid.h> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/io/GridVTKWriter/GridVTKWriter.h> #include <GridGenerator/io/VTKWriterWrapper/UnstructuredGridWrapper.h> #include <GridGenerator/utilities/Transformator/TransformatorImp.h> diff --git a/src/GridGenerator/io/STLReaderWriter/STLReader.cpp b/src/GridGenerator/io/STLReaderWriter/STLReader.cpp index 597fc2b2f7ed48fe95a2b21fcd34bdb6b839739f..fb3143e4afacf1eb7622533f6a5ca91ed0ef15ea 100644 --- a/src/GridGenerator/io/STLReaderWriter/STLReader.cpp +++ b/src/GridGenerator/io/STLReaderWriter/STLReader.cpp @@ -8,8 +8,8 @@ #include <GridGenerator/utilities/Transformator/TransformatorImp.h> #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> #include <utilities/logger/Logger.h> @@ -64,7 +64,7 @@ std::vector<Triangle> STLReader::readSTL(const std::string& name, const Transfor } } -TriangularMesh STLReader::getGeometry(const std::string& name, const Transformator& trans) +TriangularMesh* STLReader::makeTriangularMesh(const std::string& name) { std::ifstream file(name.c_str()); if (file.is_open()) { @@ -74,12 +74,12 @@ TriangularMesh STLReader::getGeometry(const std::string& name, const Transformat if (strcmp(line.c_str(), "solid ascii") == 0) { file.close(); *logging::out << logging::Logger::INTERMEDIATE << "start reading ascii STL file: " + name + "\n"; - return getGeometryFromASCIISTL(name, trans); + return getGeometryFromASCIISTL(name); } else { file.close(); *logging::out << logging::Logger::INTERMEDIATE << "start reading binary STL file: " + name + "\n"; - return getGeometryFromBinarySTL(name, trans); + return getGeometryFromBinarySTL(name); } } else { @@ -88,7 +88,7 @@ TriangularMesh STLReader::getGeometry(const std::string& name, const Transformat } } -TriangularMesh STLReader::getGeometryFromBinarySTL(const std::string& name, const Transformator& trans) +TriangularMesh* STLReader::getGeometryFromBinarySTL(const std::string& name) { FILE *file; std::string mode = "rb"; @@ -107,7 +107,7 @@ TriangularMesh STLReader::getGeometryFromBinarySTL(const std::string& name, cons std::vector<Triangle> triangles; char facet[50]; - TriangularMesh geometry; + TriangularMesh* geometry = new TriangularMesh(); BoundingBox<real> box = BoundingBox<real>::makeInvalidMinMaxBox(); for (unsigned int i = 0; i < nTriLong; i++) { @@ -119,22 +119,19 @@ TriangularMesh STLReader::getGeometryFromBinarySTL(const std::string& name, cons Vertex p2 = getVertexFromChar(facet + 24); Vertex p3 = getVertexFromChar(facet + 36); - trans.transformWorldToGrid(p1); - trans.transformWorldToGrid(p2); - trans.transformWorldToGrid(p3); - Triangle t(p1, p2, p3, normal); box.setMinMax(t); triangles.push_back(t); } - geometry.setTriangles(triangles); - geometry.setMinMax(box); + geometry->setTriangles(triangles); + geometry->setMinMax(box); + geometry->findNeighbors(); fclose(file); return geometry; } -TriangularMesh STLReader::getGeometryFromASCIISTL(const std::string& name, const Transformator& trans) +TriangularMesh* STLReader::getGeometryFromASCIISTL(const std::string& name) { int lines = countLinesInFile(name); int nTriangles = (lines) / 7; // seven lines per triangle @@ -147,7 +144,7 @@ TriangularMesh STLReader::getGeometryFromASCIISTL(const std::string& name, const file.open(name.c_str(), std::ifstream::in); std::getline(file, line); // solid ascii - TriangularMesh geometry; + TriangularMesh* geometry = new TriangularMesh(); BoundingBox<real> box = BoundingBox<real>::makeInvalidMinMaxBox(); for (int t = 0; t < nTriangles; t++) { @@ -158,17 +155,16 @@ TriangularMesh STLReader::getGeometryFromASCIISTL(const std::string& name, const Vertex p3 = parseLineToCoordinates(file, "%*s %f %f %f"); getline(file, line); //endloop getline(file, line); //endfacet - trans.transformWorldToGrid(p1); - trans.transformWorldToGrid(p2); - trans.transformWorldToGrid(p3); + Triangle tri = Triangle(p1, p2, p3, normal); tri.calcNormal(); triangles.push_back(tri); box.setMinMax(tri); } - geometry.setTriangles(triangles); - geometry.setMinMax(box); + geometry->setTriangles(triangles); + geometry->setMinMax(box); + geometry->findNeighbors(); file.close(); return geometry; diff --git a/src/GridGenerator/io/STLReaderWriter/STLReader.h b/src/GridGenerator/io/STLReaderWriter/STLReader.h index f1e7ab1ae0586ab97a35942502d9f99b9d462bd8..7bf6cf18c243d012050f2dbbeee08aeb8c0bea0a 100644 --- a/src/GridGenerator/io/STLReaderWriter/STLReader.h +++ b/src/GridGenerator/io/STLReaderWriter/STLReader.h @@ -23,9 +23,9 @@ public: static std::vector<Triangle> readSTL(const std::string& name, const Transformator& trans); static std::vector<Triangle> readSTL(const BoundingBox<int> &box, const std::string name, const Transformator& trans); - static TriangularMesh getGeometry(const std::string& name, const Transformator& trans); - static TriangularMesh getGeometryFromBinarySTL(const std::string& name, const Transformator& trans); - static TriangularMesh getGeometryFromASCIISTL(const std::string& name, const Transformator& trans); + static TriangularMesh* makeTriangularMesh(const std::string& name); + static TriangularMesh* getGeometryFromBinarySTL(const std::string& name); + static TriangularMesh* getGeometryFromASCIISTL(const std::string& name); static std::vector<Triangle> readBinarySTL(const std::string& name, const Transformator& trans); static std::vector<Triangle> readASCIISTL(const std::string& name, const Transformator& trans); diff --git a/src/GridGenerator/io/STLReaderWriter/STLWriter.cpp b/src/GridGenerator/io/STLReaderWriter/STLWriter.cpp index e4af8692e71e8804656024f5d834acd524243f31..e77f2fd6cbc599158fbd6cf5fb5b33a31c3ea473 100644 --- a/src/GridGenerator/io/STLReaderWriter/STLWriter.cpp +++ b/src/GridGenerator/io/STLReaderWriter/STLWriter.cpp @@ -8,7 +8,7 @@ #include <GridGenerator/utilities/Transformator/Transformator.h> #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <utilities/logger/Logger.h> diff --git a/src/GridGenerator/io/SimulationFileWriter/SimulationFileTest.cpp b/src/GridGenerator/io/SimulationFileWriter/SimulationFileTest.cpp index 611bf0090da283073c34a65eeb93dd4303bb5e29..182d9d478bc2624350d2aa7bb2c3952ca93ed11c 100644 --- a/src/GridGenerator/io/SimulationFileWriter/SimulationFileTest.cpp +++ b/src/GridGenerator/io/SimulationFileWriter/SimulationFileTest.cpp @@ -1,8 +1,8 @@ //#include "gmock/gmock.h" // //#include <GridGenerator/geometries/Vertex/Vertex.cuh> -//#include <GridGenerator/geometries/Triangle/Triangle.cuh> -//#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +//#include <GridGenerator/geometries/Triangle/Triangle.h> +//#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> //#include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> // //#include <GridGenerator/grid/kernel/GridKernelCPU.h> diff --git a/src/GridGenerator/io/VTKWriterWrapper/UnstructuredGridWrapper.cpp b/src/GridGenerator/io/VTKWriterWrapper/UnstructuredGridWrapper.cpp index 3cd4a89e99b3d2f4fe314b49d672eb628de609b8..c5c0dd1eb2fae86619571db8a523c4b0b9c19cd7 100644 --- a/src/GridGenerator/io/VTKWriterWrapper/UnstructuredGridWrapper.cpp +++ b/src/GridGenerator/io/VTKWriterWrapper/UnstructuredGridWrapper.cpp @@ -4,9 +4,9 @@ // //#include <VTKWriter/UnstructuredGridWriter/UnstructuredGridWriter.h> // -//#include <GridGenerator/geometries/Triangle/Triangle.cuh> +//#include <GridGenerator/geometries/Triangle/Triangle.h> //#include <GridGenerator/geometries/Vertex/Vertex.cuh> -//#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +//#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> //#include <GridGenerator/grid/Grid.cuh> // //UnstructuredGridWrapper::UnstructuredGridWrapper() diff --git a/src/GridGenerator/utilities/math/CudaMath.cu b/src/GridGenerator/utilities/math/CudaMath.cu index 2ef80a1024cb84421fd9c336db3c8ba3369a3ba5..23394254e19c8c25e210383f5f02f913eeda57b9 100644 --- a/src/GridGenerator/utilities/math/CudaMath.cu +++ b/src/GridGenerator/utilities/math/CudaMath.cu @@ -46,3 +46,4 @@ HOSTDEVICE real CudaMath::acosReal(const real& val) #endif } + diff --git a/src/GridGenerator/utilities/math/CudaMath.cuh b/src/GridGenerator/utilities/math/CudaMath.cuh index b725f98ac16d470efad400315bdb45df06b854d7..99986142eb7224a0a6ecb613128094a5946776ed 100644 --- a/src/GridGenerator/utilities/math/CudaMath.cuh +++ b/src/GridGenerator/utilities/math/CudaMath.cuh @@ -10,14 +10,20 @@ #define EPSILON FLT_EPSILON -struct VF_PUBLIC CudaMath +class VF_PUBLIC CudaMath { +public: HOSTDEVICE static bool equal(const real& val1, const real& val2, real maxRelDiff = EPSILON); HOSTDEVICE static bool lessEqual(const real& val1, const real& val2, real maxRelDiff = EPSILON); HOSTDEVICE static bool greaterEqual(const real& val1, const real& val2, real maxRelDiff = EPSILON); HOSTDEVICE static real sqrtReal(const real& val); HOSTDEVICE static real acosReal(const real& val); + + HOSTDEVICE static real getDecimalPart(real number) { + return number - real(int(number)); + } + }; diff --git a/src/GridGenerator/utilities/math/CudaMathTest.cpp b/src/GridGenerator/utilities/math/CudaMathTest.cpp index 9b5f155e9007348806dff28aa15df92f72c67b96..736190cf2d4c5b34831046728028ec217fdb4ec8 100644 --- a/src/GridGenerator/utilities/math/CudaMathTest.cpp +++ b/src/GridGenerator/utilities/math/CudaMathTest.cpp @@ -10,6 +10,10 @@ public: } }; +TEST_F(CudaMathTest, getDecimalPart) { + ASSERT_THAT(CudaMath::getDecimalPart(2.23232), RealEq(0.23232)); +} + TEST_F(CudaMathTest, compareBigValues) { ASSERT_TRUE(CudaMath::equal(10000000.0f, 10000001.0f)); ASSERT_TRUE(CudaMath::equal(10000001.0f, 10000000.0f)); diff --git a/src/GridGenerator/utilities/transformator/Serialization/TransformatorMementoTest.cpp b/src/GridGenerator/utilities/transformator/Serialization/TransformatorMementoTest.cpp index bba6dcf15a09f9b953ab15a1913fda8d3e15e853..9ff059e632d9b969ef99808fc0b44752ce823e81 100644 --- a/src/GridGenerator/utilities/transformator/Serialization/TransformatorMementoTest.cpp +++ b/src/GridGenerator/utilities/transformator/Serialization/TransformatorMementoTest.cpp @@ -4,7 +4,7 @@ //#include <fstream> // //#include <GridGenerator/geometries/BoundingBox/Serialization/BoundingBoxMemento.h> -//#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> +//#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> // //#include <boost/archive/text_iarchive.hpp> //#include <boost/archive/text_oarchive.hpp> diff --git a/src/GridGenerator/utilities/transformator/TransformatorImp.cpp b/src/GridGenerator/utilities/transformator/TransformatorImp.cpp index 99b284a944774a6164199609a9cbecedbfe55e0a..487a508636c654b62092ea175f0efc0720abc105 100644 --- a/src/GridGenerator/utilities/transformator/TransformatorImp.cpp +++ b/src/GridGenerator/utilities/transformator/TransformatorImp.cpp @@ -1,7 +1,7 @@ #include "TransformatorImp.h" #include <memory> -#include <GridGenerator/geometries/BoundingBox/BoundingBox.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/BoundingBox/BoundingBox.h> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> #include <GridGenerator/geometries/Vertex/Vertex.cuh> #include <GridGenerator/geometries/Arrow/Arrow.h> diff --git a/src/GridGenerator/utilities/transformator/TransformatorMocks.h b/src/GridGenerator/utilities/transformator/TransformatorMocks.h index 5135b575b38a88e270a1f638181a3fd0ee053846..8b89281f27d4075e5e83779fe1aa2eaff8d53a5b 100644 --- a/src/GridGenerator/utilities/transformator/TransformatorMocks.h +++ b/src/GridGenerator/utilities/transformator/TransformatorMocks.h @@ -9,8 +9,8 @@ #include "Transformator.h" #include <geometries/Vertex/Vertex.cuh> -#include <geometries/Triangle/Triangle.cuh> -#include <geometries/BoundingBox/BoundingBox.cuh> +#include <geometries/Triangle/Triangle.h> +#include <geometries/BoundingBox/BoundingBox.h> #include <geometries/TriangularMesh/TriangularMesh.h> class TransformatorStub : public Transformator diff --git a/src/GridGenerator/utilities/transformator/TransformatorTest.cpp b/src/GridGenerator/utilities/transformator/TransformatorTest.cpp index db1ca4f9114b9802b740612a9ae93381b9a07a96..73118d4c4c62c788577e2498263c0b5258efc0a8 100644 --- a/src/GridGenerator/utilities/transformator/TransformatorTest.cpp +++ b/src/GridGenerator/utilities/transformator/TransformatorTest.cpp @@ -5,7 +5,7 @@ using namespace testing; #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> #include <GridGenerator/geometries/Arrow/ArrowMocks.h> diff --git a/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinder.cpp b/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinder.cpp index 9fb55e3c9e22b7ea5eee8604461e0a8dec7a8a77..deb7f9787849f502d7d4a1c1aa9069588c94669c 100644 --- a/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinder.cpp +++ b/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinder.cpp @@ -1,7 +1,7 @@ #include "TriangleNeighborFinder.h" #include <omp.h> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include <GridGenerator/geometries/TriangularMesh/TriangularMesh.h> struct IDS { diff --git a/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinderTest.cpp b/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinderTest.cpp index da3f77cedeed1854d69e0a8b65920dac65b525f9..e800b913037936b424e325f431480429a400b259 100644 --- a/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinderTest.cpp +++ b/src/GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinderTest.cpp @@ -3,7 +3,7 @@ #include "gmock/gmock.h" -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include "TriangleNeighborFinder.h" #include <GridGenerator/utilities/Transformator/Transformator.h> diff --git a/src/GridGenerator/utilities/triangleRefinement/TriangleRefinement.cpp b/src/GridGenerator/utilities/triangleRefinement/TriangleRefinement.cpp index e21eb1561b6e810981100b79eff18ae7bee5c260..d979839251d3e3efc2d610c29a5323f9560a6611 100644 --- a/src/GridGenerator/utilities/triangleRefinement/TriangleRefinement.cpp +++ b/src/GridGenerator/utilities/triangleRefinement/TriangleRefinement.cpp @@ -1,6 +1,6 @@ #include "TriangleRefinement.h" -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> TriangleRefinement::TriangleRefinement(std::vector<Triangle> *triangles) { diff --git a/src/GridGenerator/utilities/triangleRefinement/TriangleRefinementTest.cpp b/src/GridGenerator/utilities/triangleRefinement/TriangleRefinementTest.cpp index 2b252d5e664c088dea0c4965d9d66e26b9f6daf5..d03aea8be369ba65bd712332fad7157bb4f6c988 100644 --- a/src/GridGenerator/utilities/triangleRefinement/TriangleRefinementTest.cpp +++ b/src/GridGenerator/utilities/triangleRefinement/TriangleRefinementTest.cpp @@ -3,7 +3,7 @@ #include "gmock/gmock.h" #include <GridGenerator/geometries/Vertex/Vertex.cuh> -#include <GridGenerator/geometries/Triangle/Triangle.cuh> +#include <GridGenerator/geometries/Triangle/Triangle.h> #include "TriangleRefinement.h" #include <GridGenerator/utilities/triangleNeighborFinder/TriangleNeighborFinder.h> #include <GridGenerator/io/GridVTKWriter/GridVTKWriter.h> diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index 6777cdb30a6460b3689ebb4a50ce704109949cc7..fdc8a65cf93c6c830a04c1a29924bbd7244099dc 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -30,6 +30,7 @@ #include "grid/GridStrategy/GridStrategyMocks.h" #include "VirtualFluidsBasics/utilities/logger/Logger.h" #include "geometries/Conglomerate/Conglomerate.h" +#include "io/STLReaderWriter/STLReader.h" std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath) @@ -247,14 +248,17 @@ void multipleLevel(const std::string& configPath) gridFactory->setGrid("grid"); //auto gridBuilderlevel = LevelGridBuilder::makeShared(Device::CPU, "D3Q27"); auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); - gridBuilder->addCoarseGrid(0.0, 0.0, 0.0, 40.0, 40.0, 40.0, 1.0); + gridBuilder->addCoarseGrid(-5.0, -5.0, -5.0, 40.0, 40.0, 40.0, 1.0); - Conglomerate* conglomerate = new Conglomerate(); - conglomerate->add(new Cuboid(10, 10, 10, 30, 30, 30)); - conglomerate->subtract(new Sphere(30, 20, 20, 4)); + //Conglomerate* conglomerate = new Conglomerate(); + //conglomerate->add(new Cuboid(10, 10, 10, 30, 30, 30)); + //conglomerate->subtract(new Sphere(30, 20, 20, 4)); + //gridBuilder->addGrid(conglomerate, 2); + + TriangularMesh* triangularMesh = STLReader::makeTriangularMesh("D:/GRIDGENERATION/STL/quadarBinaer.stl"); //gridBuilder->addGrid(new Sphere(20, 20, 20, 8)); - gridBuilder->addGrid(conglomerate, 2); + gridBuilder->addGrid(triangularMesh); //gridBuilder->addFineGrid(new Cuboid(15, 15, 15, 25, 25, 25), 1); //gridBuilder->addFineGrid(new Cuboid(17, 17, 17, 23, 23, 23), 2); @@ -270,7 +274,7 @@ void multipleLevel(const std::string& configPath) 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_2", 2); //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestCuboid_level_0", 0); //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTestCuboid_level_1", 1);