From ce67dbb4ff5761dfced68ae9db3e55dd533e2982 Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Mon, 14 Aug 2023 10:54:22 +0000
Subject: [PATCH] Add method for adding grid with same delta as previous grid

---
 .../grid/GridBuilder/MultipleGridBuilder.cpp  | 20 +++++++++++++-----
 .../grid/GridBuilder/MultipleGridBuilder.h    |  4 +++-
 .../GridBuilder/MultipleGridBuilderTest.cpp   | 21 +++++++++++++++++++
 3 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index c54ba6f68..c5b016f59 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 0c90c90a6..b35be07a8 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 088cb4820..52625feda 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());
+}
-- 
GitLab