From ed784a6ae51e50fb0adc0edbe6a284bae755bd3d Mon Sep 17 00:00:00 2001
From: Timo Koch <timo.koch@iws.uni-stuttgart.de>
Date: Tue, 26 Jul 2022 13:40:13 +0200
Subject: [PATCH] [linear] Specalize solver traits for diamond

Since we also have border entities in the parallel case, the settings are
likely similar as for Box from which we inherit from now. However,
the MPI parallel solvers are not tested/adapted yet.
---
 dumux/linear/linearsolvertraits.hh | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/dumux/linear/linearsolvertraits.hh b/dumux/linear/linearsolvertraits.hh
index 638d080c9d..894fcf1f91 100644
--- a/dumux/linear/linearsolvertraits.hh
+++ b/dumux/linear/linearsolvertraits.hh
@@ -151,9 +151,6 @@ struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
         DofMapper(const typename GridGeometry::GridView& gridView)
         : gridView_(gridView) {}
 
-        auto index(const typename GridGeometry::GridView::Intersection& intersection) const
-        { return gridView_.indexSet().index(intersection); }
-
         template<class Entity>
         auto index(const Entity& e) const
         { return gridView_.indexSet().index(e); }
@@ -165,6 +162,9 @@ struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
         typename GridGeometry::GridView gridView_;
     };
 
+    static DofMapper dofMapper(const GridGeometry& gg)
+    { return { gg.gridView() }; }
+
     using Grid = typename GridGeometry::GridView::Traits::Grid;
     static constexpr int dofCodim = 1;
 
@@ -181,6 +181,24 @@ struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCStaggered>
     }
 };
 
+//! Face-centered diamond scheme: use overlapping or non-overlapping model depending on the grid
+template<class GridGeometry>
+struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::FCDiamond>
+: public LinearSolverTraitsBase<GridGeometry>
+{
+    using DofMapper = typename GridGeometry::DofMapper;
+    using Grid = typename GridGeometry::GridView::Traits::Grid;
+    static constexpr int dofCodim = 1;
+    static constexpr bool canCommunicate = Dumux::Detail::canCommunicate<Grid, dofCodim>;
+
+    static const DofMapper& dofMapper(const GridGeometry& gg)
+    { return { gg.dofMapper() }; }
+
+    template<class GridView>
+    static bool isNonOverlapping(const GridView& gridView)
+    { return gridView.overlapSize(0) == 0; }
+};
+
 //! Cell-centered mpfa: use overlapping model
 template<class GridGeometry>
 struct LinearSolverTraitsImpl<GridGeometry, DiscretizationMethods::CCMpfa>
-- 
GitLab