From 181ce98d77627586b49800ae038b5f7282df0a93 Mon Sep 17 00:00:00 2001
From: Andreas Lauser <and@poware.org>
Date: Mon, 9 May 2011 15:13:11 +0000
Subject: [PATCH] make it possible to use the parallel linear solvers without
 shared entities

this should make it possible to parallelize the decoupled models.

git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@5780 2fb0f335-1f38-0410-981e-8018bf24f1b0
---
 dumux/decoupled/2p/variableclass2p.hh         |  2 +-
 dumux/decoupled/common/gridAdapt.hh           |  4 +-
 dumux/decoupled/common/variableclass.hh       |  5 +-
 dumux/linear/boxbicgstabilu0solver.hh         |  3 +-
 dumux/linear/domesticoverlapfrombcrsmatrix.hh |  9 +--
 dumux/linear/elementborderlistfromgrid.hh     | 23 +++---
 dumux/linear/foreignoverlapfrombcrsmatrix.hh  | 78 ++++++++++++-------
 dumux/linear/globalindices.hh                 | 25 +++---
 dumux/linear/impetbicgstabilu0solver.hh       | 12 +++
 dumux/linear/overlappingblockvector.hh        |  1 +
 dumux/linear/seqsolverbackend.hh              | 10 +--
 dumux/linear/vertexborderlistfromgrid.hh      | 19 ++---
 dumux/parallel/elementhandles.hh              |  8 --
 test/decoupled/2p/test_impes.cc               |  5 +-
 test/decoupled/2p/test_impes_problem.hh       |  6 +-
 15 files changed, 122 insertions(+), 88 deletions(-)

diff --git a/dumux/decoupled/2p/variableclass2p.hh b/dumux/decoupled/2p/variableclass2p.hh
index ec85e7b814..fcd7fe23f2 100644
--- a/dumux/decoupled/2p/variableclass2p.hh
+++ b/dumux/decoupled/2p/variableclass2p.hh
@@ -273,7 +273,7 @@ public:
         ElementHandleAssign<typename ScalarSolutionType::block_type, ScalarSolutionType, ElementMapper> elementHandle(saturation_, this->elementMapper());
         this->gridView().communicate(elementHandle,
                 Dune::InteriorBorder_All_Interface,
-                Dune::BackwardCommunication);
+                Dune::ForwardCommunication);
 #endif
     }
 
diff --git a/dumux/decoupled/common/gridAdapt.hh b/dumux/decoupled/common/gridAdapt.hh
index 3136e74996..19b3d8e965 100644
--- a/dumux/decoupled/common/gridAdapt.hh
+++ b/dumux/decoupled/common/gridAdapt.hh
@@ -54,8 +54,8 @@ class GridAdapt
     typedef typename Grid::template Codim<0>::Entity 		Entity;
     typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::ScalarSolution ScalarSolutionType;
 
-    static const double refinetol = 0.05;
-    static const double coarsentol = 0.001;
+    static constexpr double refinetol = 0.05;
+    static constexpr double coarsentol = 0.001;
 
 public:
     /*!
diff --git a/dumux/decoupled/common/variableclass.hh b/dumux/decoupled/common/variableclass.hh
index 3249aebdcd..5a57acd438 100644
--- a/dumux/decoupled/common/variableclass.hh
+++ b/dumux/decoupled/common/variableclass.hh
@@ -238,9 +238,8 @@ public:
 #if HAVE_MPI
         ElementHandleAssign<typename ScalarSolutionType::block_type, ScalarSolutionType, ElementMapper> elementHandle(pressure_, elementMapper_);
         gridView_.communicate(elementHandle,
-//                Dune::Overlap_All_Interface,
-                Dune::InteriorBorder_All_Interface,
-                Dune::BackwardCommunication);
+                              Dune::InteriorBorder_All_Interface,
+                              Dune::ForwardCommunication);
 #endif
     }
 
diff --git a/dumux/linear/boxbicgstabilu0solver.hh b/dumux/linear/boxbicgstabilu0solver.hh
index e6464ae2de..4e5acab45e 100644
--- a/dumux/linear/boxbicgstabilu0solver.hh
+++ b/dumux/linear/boxbicgstabilu0solver.hh
@@ -26,6 +26,7 @@
 #ifndef DUMUX_BICGSTAB_ILU0_SOLVER_HH
 #define DUMUX_BICGSTAB_ILU0_SOLVER_HH
 
+#include <dumux/common/propertysystem.hh>
 #include <dumux/linear/vertexborderlistfromgrid.hh>
 #include <dumux/linear/overlappingbcrsmatrix.hh>
 #include <dumux/linear/overlappingblockvector.hh>
@@ -65,7 +66,7 @@ class BoxBiCGStabILU0Solver
     typedef Dune::BiCGSTABSolver<OverlappingVector> Solver;
 
 public:
-    BoxBiCGStabILU0Solver(const Problem &problem, int overlapSize=3)
+    BoxBiCGStabILU0Solver(const Problem &problem, int overlapSize=1)
         : problem_(problem)
         , overlapSize_(overlapSize)
     {
diff --git a/dumux/linear/domesticoverlapfrombcrsmatrix.hh b/dumux/linear/domesticoverlapfrombcrsmatrix.hh
index 3798e52ab9..1cd64366b0 100644
--- a/dumux/linear/domesticoverlapfrombcrsmatrix.hh
+++ b/dumux/linear/domesticoverlapfrombcrsmatrix.hh
@@ -78,8 +78,7 @@ public:
     typedef std::map<ProcessRank, DomesticOverlapWithPeer> DomesticOverlapByRank;
     typedef std::vector<std::map<ProcessRank, BorderDistance> > DomesticOverlapByIndex;
 
-    typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LocalindexPeerindexPeerrank;
-    typedef std::list<LocalindexPeerindexPeerrank> BorderList;
+    typedef std::list<BorderIndex> BorderList;
 
     /*!
      * \brief Constructs the foreign overlap given a BCRS matrix and
@@ -390,9 +389,9 @@ protected:
                 IndexDistanceNpeers(globalIndices_.domesticToGlobal(localIdx),
                                     borderDistance,
                                     numPeers);
-
+            
+            // send all peer ranks which see the given index
             peersSendBuff_[peerRank].push_back(new MpiBuffer<int>(2*numPeers));
-
             typename std::map<ProcessRank, BorderDistance>::const_iterator it = foreignIndexOverlap.begin();
             typename std::map<ProcessRank, BorderDistance>::const_iterator endIt = foreignIndexOverlap.end();
             for (int j = 0; it != endIt; ++it, ++j)
@@ -455,7 +454,7 @@ protected:
                     domesticIdx = globalIndices_.numDomestic();
                     borderDistance_.resize(domesticIdx + 1, std::numeric_limits<int>::max());
                     domesticOverlapByIndex_.resize(domesticIdx + 1);
-
+                    
                     globalIndices_.addIndex(domesticIdx, globalIdx);
                     domesticOverlapByIndex_[domesticIdx][peerRank] = borderDistance;
                     domesticOverlapWithPeer_[peerRank].insert(domesticIdx);
diff --git a/dumux/linear/elementborderlistfromgrid.hh b/dumux/linear/elementborderlistfromgrid.hh
index 3921656a23..67b1fd3a01 100644
--- a/dumux/linear/elementborderlistfromgrid.hh
+++ b/dumux/linear/elementborderlistfromgrid.hh
@@ -33,6 +33,8 @@
 #include <dune/istl/scalarproducts.hh>
 #include <dune/istl/operators.hh>
 
+#include "borderindex.hh"
+
 #include <algorithm>
 #include <list>
 #include <set>
@@ -40,6 +42,7 @@
 
 namespace Dumux {
 
+
 /*!
  * \brief Uses communication on the grid to find the initial seed list
  *        of indices.
@@ -51,14 +54,14 @@ namespace Dumux {
  */
 template <class GridView, class ElementMapper>
 class ElementBorderListFromGrid : public Dune::CommDataHandleIF<ElementBorderListFromGrid<GridView, ElementMapper>,
-                                                               int >
+                                                                int >
 {
     typedef int ProcessRank;
     typedef int Index;
+    typedef int Distance;
     typedef Index LocalIndex;
     typedef Index PeerIndex;
-    typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LindexPindexRank;
-    typedef std::list<LindexPindexRank> BorderList;
+    typedef std::list<BorderIndex> BorderList;
 
 public:
     ElementBorderListFromGrid(const GridView &gv,
@@ -92,14 +95,14 @@ public:
     template<class MessageBufferImp, class EntityType> 
     void scatter(MessageBufferImp &buff, const EntityType &e, size_t n)
     {
-        int peerRank;
-        int peerCellIdx;
-
-        buff.read(peerRank);
-        buff.read(peerCellIdx);
+        BorderIndex bIdx;
+        
+        bIdx.localIdx = map_.map(e);
+        buff.read(bIdx.peerRank);
+        buff.read(bIdx.peerIdx);
+        bIdx.borderDistance = 1;
 
-        int localCellIdx = map_.map(e);
-        borderList_.push_back(LindexPindexRank(localCellIdx, peerCellIdx, peerRank));
+        borderList_.push_back(bIdx);
     };
     
     // Access to the initial seed list.
diff --git a/dumux/linear/foreignoverlapfrombcrsmatrix.hh b/dumux/linear/foreignoverlapfrombcrsmatrix.hh
index 03aa2ca856..f07728eef9 100644
--- a/dumux/linear/foreignoverlapfrombcrsmatrix.hh
+++ b/dumux/linear/foreignoverlapfrombcrsmatrix.hh
@@ -30,6 +30,8 @@
 #ifndef DUMUX_FOREIGN_OVERLAP_FROM_BCRS_MATRIX_HH
 #define DUMUX_FOREIGN_OVERLAP_FROM_BCRS_MATRIX_HH
 
+#include "borderindex.hh"
+
 #include <dune/grid/common/datahandleif.hh>
 #include <dune/common/fmatrix.hh>
 #include <dune/istl/bcrsmatrix.hh>
@@ -45,7 +47,6 @@
 #include <mpi.h>
 #endif // HAVE_MPI
 
-
 namespace Dumux {
 
 /*!
@@ -68,16 +69,16 @@ public:
     typedef Index PeerIndex;
     typedef Index LocalIndex;
     typedef std::pair<LocalIndex, ProcessRank> IndexRank;
+    typedef std::tuple<LocalIndex, ProcessRank, BorderDistance> IndexRankDist;
     typedef std::tuple<Index, BorderDistance, int> IndexDistanceNpeers;
-    typedef std::list<IndexRank> SeedList;
+    typedef std::list<IndexRankDist> SeedList;
 
     typedef std::set<ProcessRank> PeerSet;
     typedef std::list<IndexDistanceNpeers> ForeignOverlapWithPeer;
     typedef std::map<ProcessRank, ForeignOverlapWithPeer> ForeignOverlapByRank;
     typedef std::vector<std::map<ProcessRank, BorderDistance> > ForeignOverlapByIndex;
 
-    typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LocalindexPeerindexPeerrank;
-    typedef std::list<LocalindexPeerindexPeerrank> BorderList;
+    typedef std::list<BorderIndex> BorderList;
 
     /*!
      * \brief Constructs the foreign overlap given a BCRS matrix and
@@ -110,7 +111,7 @@ public:
         // calculate the foreign overlap for the local partition,
         // i.e. find the distance of each row from the seed set.
         foreignOverlapByIndex_.resize(A.N());
-        extendForeignOverlap_(A, initialSeedList, 0, overlapSize);
+        extendForeignOverlap_(A, initialSeedList, overlapSize);
 
         // group foreign overlap by peer process rank
         groupForeignOverlapByRank_(); 
@@ -369,7 +370,7 @@ protected:
         SeedList::const_iterator it = seedList.begin();
         SeedList::const_iterator endIt = seedList.end();
         for (; it != endIt; ++it)
-            peerSet_.insert(it->second);
+            peerSet_.insert(std::get<1>(*it));
     }
     
     // calculate the local border indices given the initial seed list
@@ -378,11 +379,11 @@ protected:
         BorderList::const_iterator it = borderList.begin();
         BorderList::const_iterator endIt = borderList.end();
         for (; it != endIt; ++it) {
-            int localIdx = std::get<0>(*it);
-            int peerRank = std::get<2>(*it);
-            
-            initialSeedList.push_back(IndexRank(localIdx, peerRank));
-            borderIndices_.insert(localIdx);
+            initialSeedList.push_back(IndexRankDist(it->localIdx, 
+                                                    it->peerRank,
+                                                    it->borderDistance));
+            if (it->borderDistance == 0)
+                borderIndices_.insert(it->localIdx);
         };
     };
 
@@ -390,22 +391,32 @@ protected:
     // algorithm.
     void extendForeignOverlap_(const BCRSMatrix &A,
                                SeedList &seedList,
-                               int overlapDistance,
                                int overlapSize)
     {
         // add all processes in the seed rows of the current overlap
         // level
+        int minOverlapDistance = overlapSize*2;
         SeedList::const_iterator it = seedList.begin();
         SeedList::const_iterator endIt = seedList.end();
         for (; it != endIt; ++it) {
-            if (foreignOverlapByIndex_[it->first].count(it->second) == 0) {
-                foreignOverlapByIndex_[it->first][it->second] = overlapDistance;
+            int localIdx = std::get<0>(*it);
+            int peerRank = std::get<1>(*it);
+            int distance = std::get<2>(*it);
+            if (foreignOverlapByIndex_[localIdx].count(peerRank) == 0) {
+                foreignOverlapByIndex_[localIdx][peerRank] = distance;
             }
+            else {
+                foreignOverlapByIndex_[localIdx][peerRank] = 
+                    std::min(distance,
+                             foreignOverlapByIndex_[localIdx][peerRank]);
+            }                
+                
+            minOverlapDistance = std::min(minOverlapDistance, distance);
         }
 
         // if we have reached the maximum overlap distance, we're
         // finished and break the recursion
-        if (overlapSize <= overlapDistance)
+        if (minOverlapDistance >= overlapSize)
             return;
             
         // find the seed list for the next overlap level using the
@@ -413,10 +424,11 @@ protected:
         SeedList nextSeedList;
         it = seedList.begin();
         for (; it != endIt; ++it) {
-            int rowIdx = it->first;
-            int processIdx = it->second;
+            int rowIdx = std::get<0>(*it);
+            int peerRank = std::get<1>(*it);
+            int borderDist = std::get<2>(*it);
                 
-            // find all column indices in the row. The indices of the
+            // find all column indies in the row. The indices of the
             // columns are the additional indices of the overlap which
             // we would like to add
             typedef typename BCRSMatrix::ConstColIterator ColIterator;
@@ -427,19 +439,30 @@ protected:
                     
                 // if the process is already is in the overlap of the
                 // column index, ignore this column index!
-                if (foreignOverlapByIndex_[newIdx].count(processIdx) > 0)
+                if (foreignOverlapByIndex_[newIdx].count(peerRank) > 0)
                     continue;
-                    
-                // check whether the new index is already in the next seed list
-                IndexRank newPair(newIdx, processIdx);
-                if (std::find(nextSeedList.begin(), 
-                              nextSeedList.end(),
-                              newPair) != nextSeedList.end())
-                    continue; // we already have this pair                    
+                
+
+                // check whether the new index is already in the overlap
+                bool hasIndex = false;
+                typename SeedList::iterator sIt = nextSeedList.begin();
+                typename SeedList::iterator sEndIt = nextSeedList.end();
+                for (; sIt != sEndIt; ++sIt) {
+                    if (std::get<0>(*sIt) == newIdx && 
+                        std::get<1>(*sIt) == peerRank)
+                    {
+                        hasIndex = true;
+                        std::get<2>(*sIt) = std::min(std::get<2>(*sIt), borderDist + 1);
+                        break;
+                    }
+                }
+                if (hasIndex)
+                    continue; // we already have this index
 
                 // add the current processes to the seed list for the
                 // next overlap level
-                nextSeedList.push_back(newPair);
+                IndexRankDist newTuple(newIdx, peerRank, borderDist + 1);
+                nextSeedList.push_back(newTuple);
             }
         }
         
@@ -449,7 +472,6 @@ protected:
         // Perform the same excercise for the next overlap distance
         extendForeignOverlap_(A,
                               nextSeedList, 
-                              overlapDistance + 1, 
                               overlapSize);
     };
 
diff --git a/dumux/linear/globalindices.hh b/dumux/linear/globalindices.hh
index 3daed8b5d1..a5acd134dc 100644
--- a/dumux/linear/globalindices.hh
+++ b/dumux/linear/globalindices.hh
@@ -75,8 +75,7 @@ class GlobalIndices
     typedef std::map<PeerIndex, DomesticIndex> BorderWithPeer;
     typedef std::map<ProcessRank, BorderWithPeer> DomesticBorder;
 
-    typedef std::tuple<DomesticIndex, PeerIndex, ProcessRank> LindexPindexRank;
-    typedef std::list<LindexPindexRank> BorderList;
+    typedef std::list<BorderIndex> BorderList;
 
     typedef std::map<PeerIndex, DomesticIndex> PeerToDomesticMap;
     typedef std::map<ProcessRank,  PeerToDomesticMap> ForeignToDomesticMap;
@@ -163,7 +162,6 @@ public:
         int sendBuff[2];
         sendBuff[0] = peerLocalIdx;
         sendBuff[1] = domesticToGlobal(domesticIdx);
-
         MPI_Send(sendBuff, // buff
                   2, // count
                   MPI_INT, // data type
@@ -227,7 +225,11 @@ protected:
     // global index list
     void buildGlobalIndices_() 
     {
+#if HAVE_MPI
         numDomestic_ = 0;
+#else 
+        numDomestic_ = foreignOverlap_.numLocal();
+#endif
 
 #if HAVE_MPI
         if (myRank_ == 0) {
@@ -285,11 +287,11 @@ protected:
             BorderList::const_iterator borderIt = borderList_().begin();
             BorderList::const_iterator borderEndIt = borderList_().end();
             for (; borderIt != borderEndIt; ++borderIt) {
-                int borderPeer = std::get<2>(*borderIt);
+                int borderPeer = borderIt->peerRank;
                 if (borderPeer != peerRank)
                     continue;
-
-                receiveBorderIndex(peerRank);
+                if (borderIt->borderDistance == 0)
+                    receiveBorderIndex(peerRank);
             }
         }
 
@@ -307,17 +309,16 @@ protected:
             BorderList::const_iterator borderIt = borderList_().begin();
             BorderList::const_iterator borderEndIt = borderList_().end();
             for (; borderIt != borderEndIt; ++borderIt) {
-                int borderPeer = std::get<2>(*borderIt);
+                int borderPeer = borderIt->peerRank;
                 if (borderPeer != peerRank)
                     continue;
 
-                int localIdx = std::get<0>(*borderIt);
-                int peerIdx = std::get<1>(*borderIt);
-                sendBorderIndex(peerRank, localIdx, peerIdx);
+                int localIdx = borderIt->localIdx;
+                int peerIdx = borderIt->peerIdx;
+                if (borderIt->borderDistance == 0)
+                    sendBorderIndex(peerRank, localIdx, peerIdx);
             }
         }
-#else // HAVE_MPI
-	numDomestic_ = foreignOverlap_.numLocal();
 #endif // HAVE_MPI
     }
     
diff --git a/dumux/linear/impetbicgstabilu0solver.hh b/dumux/linear/impetbicgstabilu0solver.hh
index d96f20020a..d371610872 100644
--- a/dumux/linear/impetbicgstabilu0solver.hh
+++ b/dumux/linear/impetbicgstabilu0solver.hh
@@ -26,6 +26,7 @@
 #ifndef DUMUX_BICGSTAB_ILU0_SOLVER_HH
 #define DUMUX_BICGSTAB_ILU0_SOLVER_HH
 
+#include <dumux/common/propertysystem.hh>
 #include <dune/istl/solvers.hh>
 #include <dune/istl/preconditioners.hh>
 #include <dumux/common/exceptions.hh>
@@ -38,6 +39,17 @@
 #include <dumux/linear/overlappingoperator.hh>
 
 namespace Dumux {
+namespace Properties {
+NEW_PROP_TAG(Problem);
+NEW_PROP_TAG(PressureCoefficientMatrix);
+NEW_PROP_TAG(PressureRHSVector);
+NEW_PROP_TAG(SolutionTypes);
+NEW_PROP_TAG(GridView);
+NEW_PROP_TAG(LSVerbosity);
+NEW_PROP_TAG(LSMaxIterations);
+NEW_PROP_TAG(LSResidualReduction);
+NEW_PROP_TAG(PreconditionerRelaxation);
+}
 
 /*!
  * \brief Provides a linear solver for the stabilized BiCG method with
diff --git a/dumux/linear/overlappingblockvector.hh b/dumux/linear/overlappingblockvector.hh
index 7c8b244944..888b7866a7 100644
--- a/dumux/linear/overlappingblockvector.hh
+++ b/dumux/linear/overlappingblockvector.hh
@@ -30,6 +30,7 @@
 #include <dune/istl/bvector.hh>
 
 #include <dumux/parallel/mpibuffer.hh>
+#include <dumux/common/valgrind.hh>
 
 namespace Dumux {
 
diff --git a/dumux/linear/seqsolverbackend.hh b/dumux/linear/seqsolverbackend.hh
index d0f80122f0..c47f1cb3a2 100644
--- a/dumux/linear/seqsolverbackend.hh
+++ b/dumux/linear/seqsolverbackend.hh
@@ -54,27 +54,27 @@ NEW_PROP_TAG(PreconditionerIterations);
 
 SET_PROP_DEFAULT(LSVerbosity)
 {public:
-    static const int value = 0;
+    static constexpr int value = 0;
 };
 
 SET_PROP_DEFAULT(LSResidualReduction)
 {public:
-    static const double value = 1e-6;
+    static constexpr double value = 1e-6;
 };
 
 SET_PROP_DEFAULT(LSMaxIterations)
 {public:
-    static const int value = 500;
+    static constexpr int value = 500;
 };
 
 SET_PROP_DEFAULT(PreconditionerRelaxation)
 {public:
-    static const double value = 1.0;
+    static constexpr double value = 1.0;
 };
 
 SET_PROP_DEFAULT(PreconditionerIterations)
 {public:
-    static const int value = 1;
+    static constexpr int value = 1;
 };
 }
 
diff --git a/dumux/linear/vertexborderlistfromgrid.hh b/dumux/linear/vertexborderlistfromgrid.hh
index efaa913276..c8c0e71275 100644
--- a/dumux/linear/vertexborderlistfromgrid.hh
+++ b/dumux/linear/vertexborderlistfromgrid.hh
@@ -27,6 +27,8 @@
 #ifndef DUMUX_VERTEX_BORDER_LIST_FROM_GRID_HH
 #define DUMUX_VERTEX_BORDER_LIST_FROM_GRID_HH
 
+#include "borderindex.hh"
+
 #include <dune/grid/common/datahandleif.hh>
 #include <dune/common/fmatrix.hh>
 #include <dune/istl/bcrsmatrix.hh>
@@ -57,8 +59,7 @@ class VertexBorderListFromGrid : public Dune::CommDataHandleIF<VertexBorderListF
     typedef int Index;
     typedef Index LocalIndex;
     typedef Index PeerIndex;
-    typedef std::tuple<LocalIndex, PeerIndex, ProcessRank> LindexPindexRank;
-    typedef std::list<LindexPindexRank> BorderList;
+    typedef std::list<BorderIndex> BorderList;
 
 public:
     VertexBorderListFromGrid(const GridView &gv, 
@@ -91,14 +92,14 @@ public:
     template<class MessageBufferImp, class EntityType> 
     void scatter(MessageBufferImp &buff, const EntityType &e, size_t n)
     {
-        int peerRank;
-        int peerVertIdx;
-
-        buff.read(peerRank);
-        buff.read(peerVertIdx);
+        BorderIndex bIdx;
+        
+        bIdx.localIdx = map_.map(e);
+        buff.read(bIdx.peerRank);
+        buff.read(bIdx.peerIdx);
+        bIdx.borderDistance = 0;
 
-        int localVertIdx = map_.map(e);
-        borderList_.push_back(LindexPindexRank(localVertIdx, peerVertIdx, peerRank));
+        borderList_.push_back(bIdx);
     };
     
     // Access to the initial seed list.
diff --git a/dumux/parallel/elementhandles.hh b/dumux/parallel/elementhandles.hh
index cabe829b1c..66ce7377ca 100644
--- a/dumux/parallel/elementhandles.hh
+++ b/dumux/parallel/elementhandles.hh
@@ -71,7 +71,6 @@ public:
     void gather(MessageBufferImp &buff, const EntityType &e) const
     {
         int elementIdx = mapper_.map(e);
-        std::cout << "container_[" << elementIdx << "] -> " << container_[elementIdx] << "\n";
         buff.write(container_[elementIdx]);
     }
 
@@ -82,13 +81,6 @@ public:
 
         FieldType tmp;
         buff.read(tmp);
-        if (e.partitionType() == Dune::InteriorEntity)
-            std::cout << "interior: ";
-        else if (e.partitionType() == Dune::GhostEntity)
-            std::cout << "ghost: ";
-        else if (e.partitionType() == Dune::OverlapEntity)
-            std::cout << "overlap: ";
-        std::cout << "container_[" << elementIdx << "] <- " << tmp << "\n";
         container_[elementIdx] = tmp;
     }
 
diff --git a/test/decoupled/2p/test_impes.cc b/test/decoupled/2p/test_impes.cc
index e925d269c4..5e2e910f73 100644
--- a/test/decoupled/2p/test_impes.cc
+++ b/test/decoupled/2p/test_impes.cc
@@ -94,8 +94,9 @@ int main(int argc, char** argv)
         Dune::FieldVector<int,dim> N(6); N[0] = 30;
         Dune::FieldVector<double ,dim> L(0);
         Dune::FieldVector<double,dim> H(60); H[0] = 300;
-        Grid grid(N,L,H);
-
+        Dune::FieldVector<bool,dim> periodic(false);
+        Grid grid(Dune::MPIHelper::getCommunicator(), H, N, periodic, /*overlap=*/1);
+            
         ////////////////////////////////////////////////////////////
         // instantiate and run the concrete problem
         ////////////////////////////////////////////////////////////
diff --git a/test/decoupled/2p/test_impes_problem.hh b/test/decoupled/2p/test_impes_problem.hh
index e65c680329..2a619d24cf 100644
--- a/test/decoupled/2p/test_impes_problem.hh
+++ b/test/decoupled/2p/test_impes_problem.hh
@@ -38,6 +38,7 @@
 #include <dumux/material/fluidsystems/liquidphase.hh>
 #include <dumux/material/components/simpleh2o.hh>
 #include <dumux/material/components/oil.hh>
+#include <dumux/linear/impetbicgstabilu0solver.hh>
 
 #include <dumux/decoupled/2p/impes/impesproblem2p.hh>
 #include <dumux/decoupled/2p/diffusion/fv/fvvelocity2p.hh>
@@ -66,8 +67,8 @@ NEW_TYPE_TAG(IMPESTestProblem, INHERITS_FROM(DecoupledTwoP, MPFAProperties, Tran
 // Set the grid type
 SET_PROP(IMPESTestProblem, Grid)
 {
-    //    typedef Dune::YaspGrid<2> type;
-    typedef Dune::SGrid<2, 2> type;
+    typedef Dune::YaspGrid<2> type;
+    //typedef Dune::SGrid<2, 2> type;
 };
 
 // Set the problem property
@@ -84,6 +85,7 @@ SET_PROP(IMPESTestProblem, TransportModel)
 };
 SET_TYPE_PROP(IMPESTestProblem, DiffusivePart, Dumux::CapillaryDiffusion<TypeTag>);
 SET_TYPE_PROP(IMPESTestProblem, ConvectivePart, Dumux::GravityPart<TypeTag>);
+SET_TYPE_PROP(IMPESTestProblem, LinearSolver, Dumux::IMPETBiCGStabILU0Solver<TypeTag>);
 
 SET_PROP(IMPESTestProblem, PressureModel)
 {
-- 
GitLab