diff --git a/apps/gpu/RotatingGrid/RotatingGrid.cpp b/apps/gpu/RotatingGrid/RotatingGrid.cpp index 43df5652b9c7190a19313697824aaedf06509761..f418745204a2508b1423b4484894b925af4001f9 100644 --- a/apps/gpu/RotatingGrid/RotatingGrid.cpp +++ b/apps/gpu/RotatingGrid/RotatingGrid.cpp @@ -85,7 +85,7 @@ int main() const real velocityLB = 0.05; // LB units const uint nx = 64; - const uint timeStepOut = 1000; + const uint timeStepOut = 10000; const uint timeStepEnd = 10000; ////////////////////////////////////////////////////////////////////////// @@ -104,7 +104,7 @@ int main() gridBuilder->addCoarseGrid(-0.5 * L, -0.5 * L, -1.5 * L, 0.5 * L, 0.5 * L, 1.5 * L, dx); - gridBuilder->addGridWithSameDeltaAsPreviousGrid(std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 0.25 * L, 0.5 * L)); + gridBuilder->addGridRotatingGrid(std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 0.25 * L, 0.5 * L)); GridScalingFactory scalingFactory = GridScalingFactory(); scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible); @@ -195,7 +195,7 @@ int main() // gridBuilder->writeGridsToVtk(para->getOutputPath() + "grid"); // NeighborDebugWriter::writeNeighborLinkLinesDebug(para.get()); - // sim.run(); + sim.run(); } catch (const spdlog::spdlog_ex &ex) { std::cout << "Log initialization failed: " << ex.what() << std::endl; diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index c5b016f5921a6caa8969dc7dbceafeaca4f6a41f..10171598762e9f9378febd4334910012f11c248c 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -45,6 +45,7 @@ #include "grid/BoundaryConditions/Side.h" #include "grid/Grid.h" #include "grid/GridFactory.h" +#include "geometries/VerticalCylinder/VerticalCylinder.h" #include "io/GridVTKWriter/GridVTKWriter.h" #include "io/STLReaderWriter/STLWriter.h" @@ -100,14 +101,16 @@ void MultipleGridBuilder::addGrid(SPtr<Object> gridShape) addGridToListIfValid(grid); } -void MultipleGridBuilder::addGridWithSameDeltaAsPreviousGrid(SPtr<Object> gridShape) +void MultipleGridBuilder::addGridRotatingGrid(SPtr<VerticalCylinder> cylinder) { - if (!coarseGridExists()) - return emitNoCoarseGridExistsWarning(); + if (!coarseGridExists()) return emitNoCoarseGridExistsWarning(); - const auto grid = makeGrid(std::move(gridShape), getNumberOfLevels(), 0, grids.back()->getDelta()); + const auto grid = makeRotatingGrid(std::move(cylinder), getNumberOfLevels(), 0); - addGridToListIfValid(grid); + if (!isGridInCoarseGrid(grid)) return emitGridIsNotInCoarseGridWarning(); + + rotatingGrid = grid; + addGridToList(grid); } void MultipleGridBuilder::addGrid(SPtr<Object> gridShape, uint levelFine) @@ -205,15 +208,38 @@ bool MultipleGridBuilder::coarseGridExists() const return !grids.empty(); } -SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uint levelFine, std::optional<real> deltaPredefined) +SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uint levelFine) +{ + boundaryConditions.push_back(std::make_shared<BoundaryConditions>()); + + const real delta = calculateDelta(level); + + bool xOddStart = false, yOddStart = false, zOddStart = false; + + const auto staggeredCoordinates = getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart); + + SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], + staggeredCoordinates[1], + staggeredCoordinates[2], + staggeredCoordinates[3], + staggeredCoordinates[4], + staggeredCoordinates[5], delta, level); + + newGrid->setOddStart(xOddStart, yOddStart, zOddStart); + + return newGrid; +} + +SPtr<Grid> MultipleGridBuilder::makeRotatingGrid(SPtr<Object> gridShape, uint level, uint levelFine) { boundaryConditions.push_back(std::make_shared<BoundaryConditions>()); - const real delta = deltaPredefined ? deltaPredefined.value() : calculateDelta(level); + const real delta = grids.back()->getDelta(); bool xOddStart = false, yOddStart = false, zOddStart = false; - auto staggeredCoordinates = getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart); + const auto staggeredCoordinates = + getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart, { 0.5, 0.5, 0.5 }); SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], staggeredCoordinates[1], @@ -222,7 +248,7 @@ SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uin staggeredCoordinates[4], staggeredCoordinates[5], delta, level); - newGrid->setOddStart( xOddStart, yOddStart, zOddStart ); + newGrid->setOddStart(xOddStart, yOddStart, zOddStart); return newGrid; } @@ -235,7 +261,7 @@ real MultipleGridBuilder::calculateDelta(uint level) const return delta; } -std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool& xOddStart, bool& yOddStart, bool& zOddStart) const +std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool& xOddStart, bool& yOddStart, bool& zOddStart, std::array<double, 3> relativeStagger) const { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -282,7 +308,7 @@ std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gr // use geometric series to account for overlap of higher levels: // overlap + overlap/2 + overlap/4 + ... - overlap *= 2.0 * ( 1.0 - pow(0.5, levelFine - level ) ); + overlap *= 2.0 * ( 1.0 - pow(0.5, levelFine - level) ); } // add overlap for finest level @@ -316,12 +342,12 @@ std::array<real, 6> MultipleGridBuilder::getStaggeredCoordinates(SPtr<Object> gr // Step 3 // make the grid staggered with one layer of stopper nodes on the outside - staggeredCoordinates[0] -= 0.25 * deltaCoarse; - staggeredCoordinates[1] -= 0.25 * deltaCoarse; - staggeredCoordinates[2] -= 0.25 * deltaCoarse; - staggeredCoordinates[3] += 0.25 * deltaCoarse; - staggeredCoordinates[4] += 0.25 * deltaCoarse; - staggeredCoordinates[5] += 0.25 * deltaCoarse; + staggeredCoordinates[0] -= relativeStagger[0] * deltaCoarse; + staggeredCoordinates[1] -= relativeStagger[1] * deltaCoarse; + staggeredCoordinates[2] -= relativeStagger[2] * deltaCoarse; + staggeredCoordinates[3] += relativeStagger[0] * deltaCoarse; + staggeredCoordinates[4] += relativeStagger[1] * deltaCoarse; + staggeredCoordinates[5] += relativeStagger[2] * deltaCoarse; // Step 4 // add two layers until the refinement region is completely inside the fine grid @@ -641,3 +667,7 @@ GRIDGENERATOR_EXPORT void MultipleGridBuilder::setSubDomainBox(SPtr<BoundingBox> this->subDomainBox = subDomainBox; } +GRIDGENERATOR_EXPORT SPtr<Grid> MultipleGridBuilder::getRotatingGrid() +{ + return rotatingGrid; +} diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h index b35be07a85fe690fd27baf6b4fb151766dd4949a..839d9b24e645e40e9d92acf8f5d94d1b641e4ca1 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h @@ -45,6 +45,7 @@ class Object; class BoundingBox; +class VerticalCylinder; class MultipleGridBuilder : public LevelGridBuilder { @@ -53,7 +54,7 @@ public: GRIDGENERATOR_EXPORT void addCoarseGrid(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta); GRIDGENERATOR_EXPORT void addGrid(SPtr<Object> gridShape); - GRIDGENERATOR_EXPORT void addGridWithSameDeltaAsPreviousGrid(SPtr<Object> gridShape); + GRIDGENERATOR_EXPORT void addGridRotatingGrid(SPtr<VerticalCylinder> cylinder); GRIDGENERATOR_EXPORT void addGrid(SPtr<Object> gridShape, uint levelFine); GRIDGENERATOR_EXPORT void addGeometry(SPtr<Object> gridShape); @@ -70,15 +71,22 @@ public: GRIDGENERATOR_EXPORT real getEndY(uint level) const; GRIDGENERATOR_EXPORT real getEndZ(uint level) const; - GRIDGENERATOR_EXPORT std::vector<SPtr<Grid> > getGrids() const; + GRIDGENERATOR_EXPORT std::vector<SPtr<Grid>> getGrids() const; GRIDGENERATOR_EXPORT void buildGrids(bool enableThinWalls = false); - GRIDGENERATOR_EXPORT void setNumberOfLayers( uint numberOfLayersFine, uint numberOfLayersBetweenLevels ); + GRIDGENERATOR_EXPORT void setNumberOfLayers(uint numberOfLayersFine, uint numberOfLayersBetweenLevels); GRIDGENERATOR_EXPORT void writeGridsToVtk(const std::string &path) const; GRIDGENERATOR_EXPORT void setSubDomainBox(SPtr<BoundingBox> subDomainBox); + GRIDGENERATOR_EXPORT SPtr<Grid> getRotatingGrid(); + +protected: + virtual SPtr<Grid> makeGrid(SPtr<Object> gridShape, uint level, uint levelFine); + virtual SPtr<Grid> makeGrid(SPtr<Object> gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const; + virtual SPtr<Grid> makeRotatingGrid(SPtr<Object> gridShape, uint level, uint levelFine); + private: void addGridToList(SPtr<Grid> grid); real calculateDelta(uint level) const; @@ -86,18 +94,17 @@ private: bool isGridInCoarseGrid(SPtr<Grid> grid) const; void addFineGridToList(uint level, SPtr<Object> gridShape); - void addIntermediateGridsToList(uint levelDifference, uint levelFine, uint nodesBetweenGrids, SPtr<Object>gridShape); + void addIntermediateGridsToList(uint levelDifference, uint levelFine, uint nodesBetweenGrids, SPtr<Object> gridShape); void eraseGridsFromListIfInvalid(uint oldSize); void addGridToListIfValid(SPtr<Grid> grid); - std::array<real, 6> getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool &xOddStart, bool &yOddStart, bool &zOddStart) const; + std::array<real, 6> getStaggeredCoordinates(SPtr<Object> gridShape, uint level, uint levelFine, bool &xOddStart, + bool &yOddStart, bool &zOddStart, + std::array<double, 3> relativeStagger = { 0.25, 0.25, 0.25 }) const; std::array<real, 6> getStaggeredCoordinates(real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const; std::array<real, 3> getOffset(real delta) const; std::vector<uint> getSpacingFactors(uint levelDifference) const; - SPtr<Grid> makeGrid(SPtr<Object> gridShape, uint level, uint levelFine, std::optional<real> deltaPredefined = std::nullopt); - SPtr<Grid> makeGrid(SPtr<Object> gridShape, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, uint level) const; - static void emitNoCoarseGridExistsWarning(); static void emitGridIsNotInCoarseGridWarning(); @@ -107,6 +114,8 @@ private: uint numberOfLayersFine; uint numberOfLayersBetweenLevels; + SPtr<Grid> rotatingGrid = nullptr; + SPtr<BoundingBox> subDomainBox; public: diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp index 52625feda12f1249df6ec17392fe006b6effeffb..7632edec4a576a93012ee6d865b196feaa3abf76 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp @@ -1,19 +1,26 @@ #include "basics/tests/testUtilities.h" -#include "geometries/Sphere/Sphere.h" +#include "geometries/VerticalCylinder/VerticalCylinder.h" #include "grid/GridBuilder/MultipleGridBuilder.h" +class MultipleGridBuilderForTest: public MultipleGridBuilder{ +public: + using MultipleGridBuilder::makeGrid; + using MultipleGridBuilder::makeRotatingGrid; +}; + class MultipleGridBuilderTestFixture : public testing::Test { protected: - MultipleGridBuilder gridBuilder; - SPtr<Object> gridShape; + MultipleGridBuilderForTest gridBuilder; + SPtr<VerticalCylinder> cylinder; real delta = 0.1; public: void SetUp() override { - gridShape = std::make_shared<Sphere>(0.0, 0.0, 0.0, 0.0); - gridBuilder.addCoarseGrid(0.0, 0.0, 0.0, 1.0, 1.0, 1.0, delta); + cylinder = std::make_shared<VerticalCylinder>(0.0, 0.0, 0.0, 2.0, 8.0); + gridBuilder.addCoarseGrid(-10. + 0.5 * delta, -10. + 0.5 * delta, -10. + 0.5 * delta, 10. - 0.5 * delta, + 10. - 0.5 * delta, 10. - 0.5 * delta, delta); } }; @@ -25,34 +32,34 @@ TEST_F(MultipleGridBuilderTestFixture, addCoarseGrid_addsOneGridToGridList) TEST(MultipleGridBuilderTest, noCoarseGrid_addGrid_warns) { MultipleGridBuilder gridBuilder; - SPtr<Object> gridShape; + SPtr<Object> cylinder; testingVF::captureStdOut(); - gridBuilder.addGrid(gridShape, 1); + gridBuilder.addGrid(cylinder, 1); EXPECT_TRUE(testingVF::stdoutContainsWarning()); } TEST_F(MultipleGridBuilderTestFixture, coarseGridExist_addGrid_doesNotWarn) { testingVF::captureStdOut(); - gridBuilder.addGrid(gridShape, 1); + gridBuilder.addGrid(cylinder, 1); EXPECT_FALSE(testingVF::stdoutContainsWarning()); } TEST(MultipleGridBuilderTest, noCoarseGrid_addGridWithoutLevel_warns) { MultipleGridBuilder gridBuilder; - SPtr<Object> gridShape; + SPtr<Object> cylinder; testingVF::captureStdOut(); - gridBuilder.addGrid(gridShape); + gridBuilder.addGrid(cylinder); EXPECT_TRUE(testingVF::stdoutContainsWarning()); } TEST_F(MultipleGridBuilderTestFixture, coarseGridExist_addGridWitoutLevel_doesNotWarn) { testingVF::captureStdOut(); - gridBuilder.addGrid(gridShape); + gridBuilder.addGrid(cylinder); EXPECT_FALSE(testingVF::stdoutContainsWarning()); } @@ -60,7 +67,7 @@ TEST_F(MultipleGridBuilderTestFixture, coarseGridExist_addGrid_addsGridToList) { uint levelFine = 1; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)) << "coarse level + 1 new level = 2 levels"; } @@ -68,7 +75,7 @@ TEST_F(MultipleGridBuilderTestFixture, coarseGridExist_addGridAtLevelTwo_addsTwo { uint levelFine = 2; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(3)) << "coarse level + 2 new levels = 3 levels"; } @@ -76,10 +83,10 @@ TEST_F(MultipleGridBuilderTestFixture, fineGridExist_addGridAtLevelTwo_addsOneGr { uint levelFine = 2; - gridBuilder.addGrid(gridShape, 1); + gridBuilder.addGrid(cylinder, 1); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)) << "coarse level + fineLevel = 2 levels"; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(3)) << "coarse level + fineLevel + 1 new levels = 3 levels"; } @@ -87,10 +94,10 @@ TEST_F(MultipleGridBuilderTestFixture, fineGridExist_addGridAtLevelThree_addsTwo { uint levelFine = 3; - gridBuilder.addGrid(gridShape, 1); + gridBuilder.addGrid(cylinder, 1); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)) << "coarse level + fineLevel = 2 levels"; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(4)) << "coarse level + fineLevel + 2 new levels = 4 levels"; } @@ -98,10 +105,10 @@ TEST_F(MultipleGridBuilderTestFixture, fineGridExist_addGridAtSameLevel_noGridAd { uint levelFine = 1; - gridBuilder.addGrid(gridShape, 1); + gridBuilder.addGrid(cylinder, 1); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)) << "coarse level + fineLevel = 2 levels"; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)) << "Can't add grid on same level twice --> no new grid should be added"; } @@ -110,7 +117,7 @@ TEST_F(MultipleGridBuilderTestFixture, addGrid_hasHalfDeltaComparedToCoarseGrid) { uint levelFine = 1; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrid(levelFine)->getDelta(), testing::Eq(0.5 * delta)); } @@ -118,44 +125,73 @@ TEST_F(MultipleGridBuilderTestFixture, addGridAtLevelTwo_hasHalfOfHalfDeltaCompa { uint levelFine = 2; - gridBuilder.addGrid(gridShape, levelFine); + gridBuilder.addGrid(cylinder, levelFine); EXPECT_THAT(gridBuilder.getGrid(levelFine)->getDelta(), testing::Eq(0.5 * 0.5 * delta)); } TEST_F(MultipleGridBuilderTestFixture, addGridWithoutLevel_addsGridAtLevelOne) { - gridBuilder.addGrid(gridShape); + gridBuilder.addGrid(cylinder); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)); EXPECT_THAT(gridBuilder.getGrid(1)->getDelta(), testing::Eq(0.5 * delta)); } TEST_F(MultipleGridBuilderTestFixture, fineGridExists_addGridWithoutLevel_addsGridAtLevelTwo) { - gridBuilder.addGrid(gridShape); + gridBuilder.addGrid(cylinder); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)); EXPECT_THAT(gridBuilder.getGrid(1)->getDelta(), testing::Eq(0.5 * delta)); - gridBuilder.addGrid(gridShape); + gridBuilder.addGrid(cylinder); EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(3)); EXPECT_THAT(gridBuilder.getGrid(2)->getDelta(), testing::Eq(0.5 * 0.5 * delta)); } -TEST_F(MultipleGridBuilderTestFixture, addGridWithPredefinedDelta_hasCorrectDelta) +TEST_F(MultipleGridBuilderTestFixture, addRotatingGrid_hasCorrectDelta) { - gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); - EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)); - EXPECT_THAT(gridBuilder.getGrid(1)->getDelta(), RealEq(gridBuilder.getGrid(0)->getDelta())); + EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(1)); + gridBuilder.addGridRotatingGrid(cylinder); + EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(1)) << "Rotating grid is not added to list of grids."; + EXPECT_THAT(gridBuilder.getGrid(0)->getDelta(), RealEq(gridBuilder.getRotatingGrid()->getDelta())); - gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); - EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(3)); - EXPECT_THAT(gridBuilder.getGrid(2)->getDelta(), RealEq(gridBuilder.getGrid(1)->getDelta())); + gridBuilder.addGridRotatingGrid(cylinder); + EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(1)) << "Rotating grid is not added to list of grids."; + EXPECT_THAT(gridBuilder.getGrid(0)->getDelta(), RealEq(gridBuilder.getRotatingGrid()->getDelta())); } TEST(MultipleGridBuilderTest, noCoarseGrid_addGridWithPredefinedDelta_warns) { MultipleGridBuilder gridBuilder; - SPtr<Object> gridShape; - + SPtr<VerticalCylinder> cylinder; + testingVF::captureStdOut(); - gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); + gridBuilder.addGridRotatingGrid(cylinder); EXPECT_TRUE(testingVF::stdoutContainsWarning()); } + +TEST_F(MultipleGridBuilderTestFixture, makeGrid_innerGridHasCorrectDimensions) +{ + const auto numberOfLevels = 1; + const auto grid = gridBuilder.makeGrid(cylinder, numberOfLevels, 0); + + EXPECT_THAT(grid->getStartX(), RealNear(cylinder->getX1Minimum() - 0.25 * delta, 0.00005)); + EXPECT_THAT(grid->getStartY(), RealNear(cylinder->getX2Minimum() - 0.25 * delta, 0.00005)); + EXPECT_THAT(grid->getStartZ(), RealNear(cylinder->getX3Minimum() - 0.25 * delta, 0.00005)); + + EXPECT_THAT(grid->getEndX(), RealNear(cylinder->getX1Maximum() + 0.25 * delta, 0.00005)); + EXPECT_THAT(grid->getEndY(), RealNear(cylinder->getX2Maximum() + 0.25 * delta, 0.00005)); + EXPECT_THAT(grid->getEndZ(), RealNear(cylinder->getX3Maximum() + 0.25 * delta, 0.00005)); +} + +TEST_F(MultipleGridBuilderTestFixture, makeRotatingGrid_innerGridHasCorrectDimensions) +{ + const auto numberOfLevels = 1; + const auto grid = gridBuilder.makeRotatingGrid(cylinder, numberOfLevels, 0); + + EXPECT_THAT(grid->getStartX(), RealNear(cylinder->getX1Minimum() - 0.5 * delta, 0.00005)); + EXPECT_THAT(grid->getStartY(), RealNear(cylinder->getX2Minimum() - 0.5 * delta, 0.00005)); + EXPECT_THAT(grid->getStartZ(), RealNear(cylinder->getX3Minimum() - 0.5 * delta, 0.00005)); + + EXPECT_THAT(grid->getEndX(), RealNear(cylinder->getX1Maximum() + 0.5 * delta, 0.00005)); + EXPECT_THAT(grid->getEndY(), RealNear(cylinder->getX2Maximum() + 0.5 * delta, 0.00005)); + EXPECT_THAT(grid->getEndZ(), RealNear(cylinder->getX3Maximum() + 0.5 * delta, 0.00005)); +}