diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index c54ba6f68514a6ea8c6d9e696b9b87fbe24a1ba4..c5b016f5921a6caa8969dc7dbceafeaca4f6a41f 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -95,7 +95,17 @@ void MultipleGridBuilder::addGrid(SPtr<Object> gridShape) if (!coarseGridExists()) return emitNoCoarseGridExistsWarning(); - const auto grid = makeGrid(gridShape, getNumberOfLevels(), 0); + const auto grid = makeGrid(std::move(gridShape), getNumberOfLevels(), 0); + + addGridToListIfValid(grid); +} + +void MultipleGridBuilder::addGridWithSameDeltaAsPreviousGrid(SPtr<Object> gridShape) +{ + if (!coarseGridExists()) + return emitNoCoarseGridExistsWarning(); + + const auto grid = makeGrid(std::move(gridShape), getNumberOfLevels(), 0, grids.back()->getDelta()); addGridToListIfValid(grid); } @@ -195,17 +205,17 @@ bool MultipleGridBuilder::coarseGridExists() const return !grids.empty(); } -SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uint levelFine) +SPtr<Grid> MultipleGridBuilder::makeGrid(SPtr<Object> gridShape, uint level, uint levelFine, std::optional<real> deltaPredefined) { boundaryConditions.push_back(std::make_shared<BoundaryConditions>()); - const real delta = calculateDelta(level); + const real delta = deltaPredefined ? deltaPredefined.value() : calculateDelta(level); bool xOddStart = false, yOddStart = false, zOddStart = false; - auto staggeredCoordinates = getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart); + auto staggeredCoordinates = getStaggeredCoordinates(gridShape, level, levelFine, xOddStart, yOddStart, zOddStart); - SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], + SPtr<Grid> newGrid = this->makeGrid(gridShape, staggeredCoordinates[0], staggeredCoordinates[1], staggeredCoordinates[2], staggeredCoordinates[3], diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h index 0c90c90a6479187ac3b18c880a94da51b1ba7cbf..b35be07a85fe690fd27baf6b4fb151766dd4949a 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h @@ -33,6 +33,7 @@ #ifndef MULTIPLE_GRID_BUILDER_H #define MULTIPLE_GRID_BUILDER_H +#include <optional> #include <vector> #include <array> @@ -52,6 +53,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 addGrid(SPtr<Object> gridShape, uint levelFine); GRIDGENERATOR_EXPORT void addGeometry(SPtr<Object> gridShape); @@ -93,7 +95,7 @@ private: 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); + 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(); diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp index 088cb4820a2daa07432ac330d4fb5bd837f02672..52625feda12f1249df6ec17392fe006b6effeffb 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilderTest.cpp @@ -138,3 +138,24 @@ TEST_F(MultipleGridBuilderTestFixture, fineGridExists_addGridWithoutLevel_addsGr 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) +{ + gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); + EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(2)); + EXPECT_THAT(gridBuilder.getGrid(1)->getDelta(), RealEq(gridBuilder.getGrid(0)->getDelta())); + + gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); + EXPECT_THAT(gridBuilder.getGrids().size(), testing::Eq(3)); + EXPECT_THAT(gridBuilder.getGrid(2)->getDelta(), RealEq(gridBuilder.getGrid(1)->getDelta())); +} + +TEST(MultipleGridBuilderTest, noCoarseGrid_addGridWithPredefinedDelta_warns) +{ + MultipleGridBuilder gridBuilder; + SPtr<Object> gridShape; + + testingVF::captureStdOut(); + gridBuilder.addGridWithSameDeltaAsPreviousGrid(gridShape); + EXPECT_TRUE(testingVF::stdoutContainsWarning()); +}