From 75121352485a7e336129df579baba2550db99fe7 Mon Sep 17 00:00:00 2001
From: Mathis Kelm <mathis.kelm@iws.uni-stuttgart.de>
Date: Wed, 13 Dec 2023 14:25:18 +0100
Subject: [PATCH] [multidomain] remove corner storage from box scvf

---
 .../facet/box/fvelementgeometry.hh            | 67 ++++++++++++++-----
 .../facet/box/subcontrolvolumeface.hh         | 38 +++++------
 2 files changed, 64 insertions(+), 41 deletions(-)

diff --git a/dumux/multidomain/facet/box/fvelementgeometry.hh b/dumux/multidomain/facet/box/fvelementgeometry.hh
index e802017844..17d8bf724e 100644
--- a/dumux/multidomain/facet/box/fvelementgeometry.hh
+++ b/dumux/multidomain/facet/box/fvelementgeometry.hh
@@ -46,6 +46,8 @@ class BoxFacetCouplingFVElementGeometry<GG, true>
     using LocalIndexType = typename IndexTraits<GridView>::LocalIndex;
     using CoordScalar = typename GridView::ctype;
     using FeLocalBasis = typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
+
+    using GeometryHelper = typename GG::GeometryHelper;
 public:
     //! export type of the element
     using Element = typename GridView::template Codim<0>::Entity;
@@ -158,20 +160,33 @@ public:
     const Element& element() const
     { return *element_; }
 
-    // suppress warnings due to current implementation
-    // these interfaces should be used!
-    #pragma GCC diagnostic push
-    #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
     //! Create the geometry of a given sub control volume
     typename SubControlVolume::Traits::Geometry geometry(const SubControlVolume& scv) const
-    { return scv.geometry(); }
+    {
+        assert(isBound());
+        const auto geo = element().geometry();
+        return { Dune::GeometryTypes::cube(dim), GeometryHelper(geo).getScvCorners(scv.indexInElement()) };
+    }
 
     //! Create the geometry of a given sub control volume face
     typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const
-    { return scvf.geometry(); }
-
-    #pragma GCC diagnostic pop
+    {
+        assert(isBound());
+        using ScvfGeometry = typename SubControlVolumeFace::Traits::Geometry;
+        const GeometryHelper geometryHelper(element().geometry());
+        typename SubControlVolumeFace::Traits::CornerStorage corners;
+        if (scvf.boundary() || scvf.interiorBoundary())
+        {
+            corners = geometryHelper.getBoundaryScvfCorners(scvf.facetIndexInElement(),
+                                                            scvf.indexInElementFacet());
+            return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
+        }
+        else
+        {
+            corners = geometryHelper.getScvfCorners(scvf.index());
+            return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
+        }
+    }
 
 private:
     const GridGeometry* gridGeometryPtr_;
@@ -306,20 +321,36 @@ public:
     const Element& element() const
     { return *element_; }
 
-    // suppress warnings due to current implementation
-    // these interfaces should be used!
-    #pragma GCC diagnostic push
-    #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
     //! Create the geometry of a given sub control volume
     typename SubControlVolume::Traits::Geometry geometry(const SubControlVolume& scv) const
-    { return scv.geometry(); }
+    {
+        assert(isBound());
+        const auto geo = element().geometry();
+        return { Dune::GeometryTypes::cube(dim), GeometryHelper(geo).getScvCorners(scv.indexInElement()) };
+    }
 
     //! Create the geometry of a given sub control volume face
     typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const
-    { return scvf.geometry(); }
-
-    #pragma GCC diagnostic pop
+    {
+        assert(isBound());
+        using ScvfGeometry = typename SubControlVolumeFace::Traits::Geometry;
+        GeometryHelper geometryHelper(element().geometry());
+        
+        if (scvf.boundary() || scvf.interiorBoundary())
+            return {
+                Dune::GeometryTypes::cube(ScvfGeometry::mydimension),
+                geometryHelper.getBoundaryScvfCorners(
+                     scvf.facetIndexInElement(),
+                     scvf.indexInElementFacet()
+                )
+            };
+
+        else
+            return {
+                Dune::GeometryTypes::cube(ScvfGeometry::mydimension),
+                geometryHelper.getScvfCorners(scvf.index())
+            };
+    }
 
 private:
 
diff --git a/dumux/multidomain/facet/box/subcontrolvolumeface.hh b/dumux/multidomain/facet/box/subcontrolvolumeface.hh
index 6f33bb60f3..a48a2f8ee2 100644
--- a/dumux/multidomain/facet/box/subcontrolvolumeface.hh
+++ b/dumux/multidomain/facet/box/subcontrolvolumeface.hh
@@ -62,13 +62,7 @@ public:
                                          const typename Element::Geometry& elemGeometry,
                                          unsigned int scvfIndex,
                                          std::vector<LocalIndexType>&& scvIndices)
-    : corners_(geometryHelper.getScvfCorners(scvfIndex))
-    , center_(0.0)
-    , unitOuterNormal_(geometryHelper.normal(corners_, scvIndices))
-    , area_(Dumux::convexPolytopeVolume<T::dim-1>(
-        Dune::GeometryTypes::cube(T::dim-1),
-        [&](unsigned int i){ return corners_[i]; })
-    )
+    : center_(0.0)
     , scvfIndex_(scvfIndex)
     , scvIndices_(std::move(scvIndices))
     , facetIndex_(/*undefined*/)
@@ -77,9 +71,14 @@ public:
     , interiorBoundary_(false)
     , boundaryFlag_{}
     {
-        for (const auto& corner : corners_)
+        auto corners = geometryHelper.getScvfCorners(scvfIndex);
+        unitOuterNormal_ = geometryHelper.normal(corners, scvIndices_);
+        area_ = Dumux::convexPolytopeVolume<T::dim-1>(
+            Dune::GeometryTypes::cube(T::dim-1),
+            [&](unsigned int i){ return corners[i]; });
+        for (const auto& corner : corners)
             center_ += corner;
-        center_ /= corners_.size();
+        center_ /= corners.size();
     }
 
     //! Constructor for domain or interior boundary scvfs
@@ -92,13 +91,8 @@ public:
                                          std::vector<LocalIndexType>&& scvIndices,
                                          bool boundary,
                                          bool interiorBoundary)
-    : corners_(geometryHelper.getBoundaryScvfCorners(intersection.indexInInside(), indexInIntersection))
-    , center_(0.0)
+    : center_(0.0)
     , unitOuterNormal_(intersection.centerUnitOuterNormal())
-    , area_(Dumux::convexPolytopeVolume<T::dim-1>(
-        Dune::GeometryTypes::cube(T::dim-1),
-        [&](unsigned int i){ return corners_[i]; })
-    )
     , scvfIndex_(scvfIndex)
     , scvIndices_(std::move(scvIndices))
     , facetIndex_(intersection.indexInInside())
@@ -107,9 +101,13 @@ public:
     , interiorBoundary_(interiorBoundary)
     , boundaryFlag_{intersection}
     {
-        for (const auto& corner : corners_)
+        auto corners = geometryHelper.getBoundaryScvfCorners(intersection.indexInInside(), indexInIntersection);
+        area_ = Dumux::convexPolytopeVolume<T::dim-1>(
+            Dune::GeometryTypes::cube(T::dim-1),
+            [&](unsigned int i){ return corners[i]; });
+        for (const auto& corner : corners)
             center_ += corner;
-        center_ /= corners_.size();
+        center_ /= corners.size();
     }
 
     //! The center of the sub control volume face
@@ -175,18 +173,12 @@ public:
         return indexInFacet_;
     }
 
-    //! The geometry of the sub control volume face
-    [[deprecated("Will be removed after 3.7. Use fvGeometry.geometry(scvf).")]]
-    Geometry geometry() const
-    { return Geometry(Dune::GeometryTypes::cube(Geometry::mydimension), corners_); }
-
     //! Return the boundary flag
     typename BoundaryFlag::value_type boundaryFlag() const
     { return boundaryFlag_.get(); }
 
 private:
     // geometrical information
-    CornerStorage corners_;
     GlobalPosition center_;
     GlobalPosition unitOuterNormal_;
     Scalar area_;
-- 
GitLab