From c95238a1424fcce71a0b566caf66abc0acd0a96b Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-braunschweig.de> Date: Mon, 20 Nov 2023 12:20:29 +0000 Subject: [PATCH] Refactor geometries --- .../geometries/Conglomerate/Conglomerate.cpp | 24 ++++---- .../geometries/Conglomerate/Conglomerate.h | 22 +++---- .../geometries/Cuboid/Cuboid.cpp | 22 +++---- .../GridGenerator/geometries/Cuboid/Cuboid.h | 20 +++---- src/gpu/GridGenerator/geometries/Object.h | 20 +++---- .../geometries/Sphere/Sphere.cpp | 20 +++---- .../GridGenerator/geometries/Sphere/Sphere.h | 20 +++---- .../TriangularMesh/TriangularMesh.cpp | 2 +- .../TriangularMesh/TriangularMesh.h | 20 +++---- .../VerticalCylinder/VerticalCylinder.cpp | 32 +++++++---- .../VerticalCylinder/VerticalCylinder.h | 26 +++++---- .../VerticalCylinder/VerticalCylinderTest.cpp | 57 +++++++++++++++++++ 12 files changed, 178 insertions(+), 107 deletions(-) create mode 100644 src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp diff --git a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp index 14b35e69b..949220d07 100644 --- a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp +++ b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp @@ -72,12 +72,12 @@ SPtr<Object> Conglomerate::clone() const return conglomerate; } -double Conglomerate::getX1Centroid() +double Conglomerate::getX1Centroid() const { return (getX1Minimum() + getX1Maximum()) * 0.5; } -double Conglomerate::getX1Minimum() +double Conglomerate::getX1Minimum() const { double minimum = addObjects[0]->getX1Minimum(); for(uint i = 1; i < numberOfAddObjects; i++) @@ -85,7 +85,7 @@ double Conglomerate::getX1Minimum() return minimum; } -double Conglomerate::getX1Maximum() +double Conglomerate::getX1Maximum() const { double maximum = addObjects[0]->getX1Maximum(); for (uint i = 1; i < numberOfAddObjects; i++) @@ -93,12 +93,12 @@ double Conglomerate::getX1Maximum() return maximum; } -double Conglomerate::getX2Centroid() +double Conglomerate::getX2Centroid() const { return (getX2Minimum() + getX2Maximum()) * 0.5; } -double Conglomerate::getX2Minimum() +double Conglomerate::getX2Minimum() const { double minimum = addObjects[0]->getX2Minimum(); for (uint i = 1; i < numberOfAddObjects; i++) @@ -106,7 +106,7 @@ double Conglomerate::getX2Minimum() return minimum; } -double Conglomerate::getX2Maximum() +double Conglomerate::getX2Maximum() const { double maximum = addObjects[0]->getX2Maximum(); for (uint i = 1; i < numberOfAddObjects; i++) @@ -114,12 +114,12 @@ double Conglomerate::getX2Maximum() return maximum; } -double Conglomerate::getX3Centroid() +double Conglomerate::getX3Centroid() const { return (getX3Minimum() + getX3Maximum()) * 0.5; } -double Conglomerate::getX3Minimum() +double Conglomerate::getX3Minimum() const { double minimum = addObjects[0]->getX3Minimum(); for (uint i = 1; i < numberOfAddObjects; i++) @@ -127,7 +127,7 @@ double Conglomerate::getX3Minimum() return minimum; } -double Conglomerate::getX3Maximum() +double Conglomerate::getX3Maximum() const { double maximum = addObjects[0]->getX3Maximum(); for (uint i = 1; i < numberOfAddObjects; i++) @@ -162,13 +162,13 @@ bool Conglomerate::isPointInObject(const double& x1, const double& x2, const dou return false; } -void Conglomerate::scale(double delta) +void Conglomerate::changeSizeByDelta(double delta) { for (uint i = 0; i < numberOfAddObjects; i++) - addObjects[i]->scale(delta); + addObjects[i]->changeSizeByDelta(delta); for (uint i = 0; i < numberOfSubtractObjects; i++) - subtractObjects[i]->scale(delta); + subtractObjects[i]->changeSizeByDelta(delta); } void Conglomerate::findInnerNodes(SPtr<GridImp> grid) diff --git a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h index 0b3f7ad7b..a8eb1a7ca 100644 --- a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h +++ b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h @@ -53,17 +53,17 @@ public: SPtr<Object> clone() const override; - double getX1Centroid() override; - double getX1Minimum() override; - double getX1Maximum() override; - double getX2Centroid() override; - double getX2Minimum() override; - double getX2Maximum() override; - double getX3Centroid() override; - double getX3Minimum() override; - double getX3Maximum() override; - - void scale(double delta) override; + double getX1Centroid() const override; + double getX1Minimum() const override; + double getX1Maximum() const override; + double getX2Centroid() const override; + double getX2Minimum() const override; + double getX2Maximum() const override; + double getX3Centroid() const override; + double getX3Minimum() const override; + double getX3Maximum() const override; + + void changeSizeByDelta(double delta) override; bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override; diff --git a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp index fde944bc8..de8afcd87 100644 --- a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp +++ b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp @@ -46,47 +46,47 @@ SPtr<Object> Cuboid::clone() const return std::make_shared<Cuboid>(minX1, minX2, minX3, maxX1, maxX2, maxX3); } -double Cuboid::getX1Centroid() +double Cuboid::getX1Centroid() const { return getCenter(minX1, maxX1); } -double Cuboid::getX1Minimum() +double Cuboid::getX1Minimum() const { return getMinimum(minX1, maxX1); } -double Cuboid::getX1Maximum() +double Cuboid::getX1Maximum() const { return getMaximum(minX1, maxX1); } -double Cuboid::getX2Centroid() +double Cuboid::getX2Centroid() const { return getCenter(minX2, maxX2); } -double Cuboid::getX2Minimum() +double Cuboid::getX2Minimum() const { return getMinimum(minX2, maxX2); } -double Cuboid::getX2Maximum() +double Cuboid::getX2Maximum() const { return getMaximum(minX2, maxX2); } -double Cuboid::getX3Centroid() +double Cuboid::getX3Centroid() const { return getCenter(minX3, maxX3); } -double Cuboid::getX3Minimum() -{ +double Cuboid::getX3Minimum() const +{ return getMinimum(minX3, maxX3); } -double Cuboid::getX3Maximum() +double Cuboid::getX3Maximum() const { return getMaximum(minX3, maxX3); } @@ -131,7 +131,7 @@ bool Cuboid::isBetween(const real& coord, const real& start, const real& end) } -void Cuboid::scale(double delta) +void Cuboid::changeSizeByDelta(double delta) { this->minX1 -= delta; this->minX2 -= delta; diff --git a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h index 7ff5c14c2..35d5d04c7 100644 --- a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h +++ b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h @@ -44,17 +44,17 @@ public: SPtr<Object> clone() const override; - double getX1Centroid() override; - double getX1Minimum() override; - double getX1Maximum() override; - double getX2Centroid() override; - double getX2Minimum() override; - double getX2Maximum() override; - double getX3Centroid() override; - double getX3Minimum() override; - double getX3Maximum() override; + double getX1Centroid() const override; + double getX1Minimum() const override; + double getX1Maximum() const override; + double getX2Centroid() const override; + double getX2Minimum() const override; + double getX2Maximum() const override; + double getX3Centroid() const override; + double getX3Minimum() const override; + double getX3Maximum() const override; - void scale(double delta) override; + void changeSizeByDelta(double delta) override; bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override; diff --git a/src/gpu/GridGenerator/geometries/Object.h b/src/gpu/GridGenerator/geometries/Object.h index 8bb0a35d5..116bb8fc2 100644 --- a/src/gpu/GridGenerator/geometries/Object.h +++ b/src/gpu/GridGenerator/geometries/Object.h @@ -46,20 +46,20 @@ public: virtual ~Object() = default; virtual SPtr<Object> clone() const = 0; - virtual double getX1Centroid() = 0; - virtual double getX1Minimum() = 0; - virtual double getX1Maximum() = 0; + virtual double getX1Centroid() const = 0; + virtual double getX1Minimum() const = 0; + virtual double getX1Maximum() const = 0; - virtual double getX2Centroid() = 0; - virtual double getX2Minimum() = 0; - virtual double getX2Maximum() = 0; + virtual double getX2Centroid() const = 0; + virtual double getX2Minimum() const = 0; + virtual double getX2Maximum() const = 0; - virtual double getX3Centroid() = 0; - virtual double getX3Minimum() = 0; - virtual double getX3Maximum() = 0; + virtual double getX3Centroid() const = 0; + virtual double getX3Minimum() const = 0; + virtual double getX3Maximum() const = 0; - virtual void scale(double delta) = 0; + virtual void changeSizeByDelta(double delta) = 0; virtual bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) = 0; diff --git a/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp b/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp index 4669bbcfb..2a54c710c 100644 --- a/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp +++ b/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp @@ -54,47 +54,47 @@ SPtr<Object> Sphere::clone() const return std::make_shared<Sphere>(centerX, centerY, centerZ, radius); } -double Sphere::getX1Centroid() +double Sphere::getX1Centroid() const { return centerX; } -double Sphere::getX1Minimum() +double Sphere::getX1Minimum() const { return centerX - radius; } -double Sphere::getX1Maximum() +double Sphere::getX1Maximum() const { return centerX + radius; } -double Sphere::getX2Centroid() +double Sphere::getX2Centroid() const { return centerY; } -double Sphere::getX2Minimum() +double Sphere::getX2Minimum() const { return centerY - radius; } -double Sphere::getX2Maximum() +double Sphere::getX2Maximum() const { return centerY + radius; } -double Sphere::getX3Centroid() +double Sphere::getX3Centroid() const { return centerZ; } -double Sphere::getX3Minimum() +double Sphere::getX3Minimum() const { return centerZ - radius; } -double Sphere::getX3Maximum() +double Sphere::getX3Maximum() const { return centerZ + radius; } @@ -115,7 +115,7 @@ bool Sphere::isPointInObject(const double& x1, const double& x2, const double& x } -void Sphere::scale(double delta) +void Sphere::changeSizeByDelta(double delta) { this->radius += delta; } diff --git a/src/gpu/GridGenerator/geometries/Sphere/Sphere.h b/src/gpu/GridGenerator/geometries/Sphere/Sphere.h index 9ac8821a9..92f600d20 100644 --- a/src/gpu/GridGenerator/geometries/Sphere/Sphere.h +++ b/src/gpu/GridGenerator/geometries/Sphere/Sphere.h @@ -46,20 +46,20 @@ public: SPtr<Object> clone() const override; - double getX1Centroid() override; - double getX1Minimum() override; - double getX1Maximum() override; - double getX2Centroid() override; - double getX2Minimum() override; - double getX2Maximum() override; - double getX3Centroid() override; - double getX3Minimum() override; - double getX3Maximum() override; + double getX1Centroid() const override; + double getX1Minimum() const override; + double getX1Maximum() const override; + double getX2Centroid() const override; + double getX2Minimum() const override; + double getX2Maximum() const override; + double getX3Centroid() const override; + double getX3Minimum() const override; + double getX3Maximum() const override; bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override; - void scale(double delta) override; + void changeSizeByDelta(double delta) override; int getIntersection(const Vertex &P, const Vertex &direction, Vertex &pointOnObject, real &qVal) override; diff --git a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp index 91bb8f030..e5ab3c832 100644 --- a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp +++ b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp @@ -185,7 +185,7 @@ bool intersectPlane(const Vertex &normal, const Vertex &pointOnPlane, const Vert return false; } -void TriangularMesh::scale(double offset) +void TriangularMesh::changeSizeByDelta(double offset) { std::vector<Triangle> triangles = this->triangleVec; diff --git a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h index 7c050dd70..14ff45395 100644 --- a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h +++ b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h @@ -88,16 +88,16 @@ private: public: SPtr<Object> clone() const override; - 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; + double getX1Centroid() const override { throw "Not implemented in TriangularMesh"; } + double getX1Minimum() const override { return minmax.minX; } + double getX1Maximum() const override { return minmax.maxX; } + double getX2Centroid() const override { throw "Not implemented in TriangularMesh"; } + double getX2Minimum() const override { return minmax.minY; } + double getX2Maximum() const override { return minmax.maxY; } + double getX3Centroid() const override { throw "Not implemented in TriangularMesh"; } + double getX3Minimum() const override { return minmax.minZ; } + double getX3Maximum() const override { return minmax.maxZ; } + void changeSizeByDelta(double delta) override; bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override { return false; diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp index 5019f2a75..909651be6 100644 --- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp +++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp @@ -48,47 +48,47 @@ SPtr<Object> VerticalCylinder::clone() const return std::make_shared<VerticalCylinder>(centerX, centerY, centerZ, radius, height); } -double VerticalCylinder::getX1Centroid() +double VerticalCylinder::getX1Centroid() const { return centerX; } -double VerticalCylinder::getX1Minimum() +double VerticalCylinder::getX1Minimum() const { return centerX - radius; } -double VerticalCylinder::getX1Maximum() +double VerticalCylinder::getX1Maximum() const { return centerX + radius; } -double VerticalCylinder::getX2Centroid() +double VerticalCylinder::getX2Centroid() const { return centerY; } -double VerticalCylinder::getX2Minimum() +double VerticalCylinder::getX2Minimum() const { return centerY - radius; } -double VerticalCylinder::getX2Maximum() +double VerticalCylinder::getX2Maximum() const { return centerY + radius; } -double VerticalCylinder::getX3Centroid() +double VerticalCylinder::getX3Centroid() const { return centerZ; } -double VerticalCylinder::getX3Minimum() +double VerticalCylinder::getX3Minimum() const { return centerZ - 0.5 * height; } -double VerticalCylinder::getX3Maximum() +double VerticalCylinder::getX3Maximum() const { return centerZ + 0.5 * height; } @@ -111,8 +111,18 @@ bool VerticalCylinder::isPointInObject(const double& x1, const double& x2, const } -void VerticalCylinder::scale(double delta) +void VerticalCylinder::changeSizeByDelta(double delta) { this->radius += delta; - this->height += delta; + this->height += 2 * delta; } + +double VerticalCylinder::getRadius() const +{ + return radius; +} + +double VerticalCylinder::getHeight() const +{ + return height; +} \ No newline at end of file diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h index 64cdecef5..f312df8f6 100644 --- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h +++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h @@ -40,26 +40,30 @@ class GRIDGENERATOR_EXPORT VerticalCylinder : public Object { public: VerticalCylinder(const double& centerX, const double& centerY, const double& centerZ, const double& radius, const double& height); + // the axis is in the z-direction static SPtr<VerticalCylinder> makeShared(double centerX, double centerY, double centerZ, double radius, double height); SPtr<Object> clone() const override; - double getX1Centroid() override; - double getX1Minimum() override; - double getX1Maximum() override; - double getX2Centroid() override; - double getX2Minimum() override; - double getX2Maximum() override; - double getX3Centroid() override; - double getX3Minimum() override; - double getX3Maximum() override; + double getX1Centroid() const override; + double getX1Minimum() const override; + double getX1Maximum() const override; + double getX2Centroid() const override; + double getX2Minimum() const override; + double getX2Maximum() const override; + double getX3Centroid() const override; + double getX3Minimum() const override; + double getX3Maximum() const override; + + double getRadius() const; + double getHeight() const; bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override; - void scale(double delta) override; - + void changeSizeByDelta(double delta) override; + protected: double centerX; double centerY; diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp new file mode 100644 index 000000000..7bca5db99 --- /dev/null +++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp @@ -0,0 +1,57 @@ +#include <gmock/gmock.h> + +#include "VerticalCylinder.h" + +class VerticalCylinderTest : public testing::Test +{ +protected: + std::array<double, 3> center = { 0.1, 0.2, 0.3 }; + double radius = 2.0; + double height = 8.0; + VerticalCylinder cylinder = VerticalCylinder(center[0], center[1], center[2], radius, height); +}; + +TEST_F(VerticalCylinderTest, getCentroid) +{ + EXPECT_THAT(cylinder.getX1Centroid(), testing::Eq(center[0])); + EXPECT_THAT(cylinder.getX2Centroid(), testing::Eq(center[1])); + EXPECT_THAT(cylinder.getX3Centroid(), testing::Eq(center[2])); +} + +TEST_F(VerticalCylinderTest, getMinimum) +{ + EXPECT_THAT(cylinder.getX1Minimum(), testing::Eq(-radius + center[0])); + EXPECT_THAT(cylinder.getX2Minimum(), testing::Eq(-radius + center[1])); + EXPECT_THAT(cylinder.getX3Minimum(), testing::Eq(-0.5 * height + center[2])); +} + +TEST_F(VerticalCylinderTest, getMaximum) +{ + EXPECT_THAT(cylinder.getX1Maximum(), testing::Eq(radius + center[0])); + EXPECT_THAT(cylinder.getX2Maximum(), testing::Eq(radius + center[1])); + EXPECT_THAT(cylinder.getX3Maximum(), testing::Eq(0.5 * height + center[2])); +} + +TEST_F(VerticalCylinderTest, isPointInObject) +{ + double epsilon = 0.0001; + EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2], 0.0, 0.0)); + + // x + EXPECT_TRUE(cylinder.isPointInObject(center[0] - radius + epsilon, center[1], center[2], 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0] - radius - epsilon, center[1], center[2], 0.0, 0.0)); + EXPECT_TRUE(cylinder.isPointInObject(center[0] + radius - epsilon, center[1], center[2], 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0] + radius + epsilon, center[1], center[2], 0.0, 0.0)); + + // y + EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] - radius + epsilon, center[2], 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] - radius - epsilon, center[2], 0.0, 0.0)); + EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] + radius - epsilon, center[2], 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] + radius + epsilon, center[2], 0.0, 0.0)); + + // z + EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height + epsilon, 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height - epsilon, 0.0, 0.0)); + EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height - epsilon, 0.0, 0.0)); + EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height + epsilon, 0.0, 0.0)); +} \ No newline at end of file -- GitLab