From 256ab1cebadae80adee46a3915b58b1b8046fe28 Mon Sep 17 00:00:00 2001
From: Kilian Weishaupt <kilian.weishaupt@iws.uni-stuttgart.de>
Date: Tue, 26 Oct 2021 09:49:11 +0200
Subject: [PATCH] [staggered][gridGeometry] Make scvs(fvGeometry) iterate
 directly over global vector

---
 .../facecentered/staggered/fvelementgeometry.hh          | 7 +------
 .../facecentered/staggered/fvgridgeometry.hh             | 9 +++++++++
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/dumux/discretization/facecentered/staggered/fvelementgeometry.hh b/dumux/discretization/facecentered/staggered/fvelementgeometry.hh
index 2318b5ee7e..ae93ae36e3 100644
--- a/dumux/discretization/facecentered/staggered/fvelementgeometry.hh
+++ b/dumux/discretization/facecentered/staggered/fvelementgeometry.hh
@@ -105,12 +105,7 @@ public:
     //! for (auto&& scv : scvs(fvGeometry))
     friend inline auto
     scvs(const FaceCenteredStaggeredFVElementGeometry& fvGeometry)
-    {
-        using IndexContainerType = std::decay_t<decltype(fvGeometry.scvIndices_())>;
-        using ScvIterator = Dumux::ScvIterator<SubControlVolume, IndexContainerType, ThisType>;
-        return Dune::IteratorRange<ScvIterator>(ScvIterator(fvGeometry.scvIndices_().begin(), fvGeometry),
-                                                ScvIterator(fvGeometry.scvIndices_().end(), fvGeometry));
-    }
+    { return fvGeometry.gridGeometry().scvs(fvGeometry); }
 
     //! iterator range for sub control volumes faces. Iterates over
     //! all scvfs of the bound element.
diff --git a/dumux/discretization/facecentered/staggered/fvgridgeometry.hh b/dumux/discretization/facecentered/staggered/fvgridgeometry.hh
index 44fffdcd12..e326bd31be 100644
--- a/dumux/discretization/facecentered/staggered/fvgridgeometry.hh
+++ b/dumux/discretization/facecentered/staggered/fvgridgeometry.hh
@@ -199,6 +199,15 @@ public:
     const SubControlVolume& scv(GridIndexType scvIdx) const
     { return scvs_[scvIdx]; }
 
+    //! Iterator range for sub control volumes. Iterates over
+    //! all scvs of the element-local fvGeometry.
+    auto scvs(const LocalView& fvGeometry) const
+    {
+        const auto begin = scvs_.cbegin() + numScvsPerElement*fvGeometry.elementIndex();
+        const auto end = begin + numScvsPerElement;
+        return Dune::IteratorRange<decltype(begin)>(begin, end);
+    }
+
     //! Get a sub control volume face with a global scvf index
     const SubControlVolumeFace& scvf(GridIndexType scvfIdx) const
     { return scvfs_[scvfIdx]; }
-- 
GitLab