From 58a65f806ead0c0f2293cf96ca2831a4bacfc48a Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Thu, 14 Jul 2016 16:57:55 +0200
Subject: [PATCH] Make ignoreNodes optional

As the name suggests, anything that derives from CanIgnore is supposed
to optionally support ignoreNodes but not require them to be set.
---
 dune/solvers/iterationsteps/blockgssteps.hh | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/dune/solvers/iterationsteps/blockgssteps.hh b/dune/solvers/iterationsteps/blockgssteps.hh
index 03ca4d08..6835c835 100644
--- a/dune/solvers/iterationsteps/blockgssteps.hh
+++ b/dune/solvers/iterationsteps/blockgssteps.hh
@@ -33,7 +33,7 @@ std::istream& operator>>(std::istream& lhs, Direction& t);
  * \param direction Iteration direction (e.g. forward, backward, ...)
  */
 template <class M, class V, class BitVector, class LocalSolver>
-void linearStep(const M& m, V& x, const V& b, const BitVector& ignore,
+void linearStep(const M& m, V& x, const V& b, const BitVector* ignore,
                 LocalSolver&& localSolver,
                 Direction direction = Direction::FORWARD) {
   // Note: move-capture requires C++14
@@ -43,8 +43,12 @@ void linearStep(const M& m, V& x, const V& b, const BitVector& ignore,
     auto ri = b[i];
     for (auto cIt = row_i.begin(); cIt != row_i.end(); ++cIt)
       cIt->mmv(x[cIt.index()], ri);
+
+    std::bitset<V::block_type::dimension> ignore_i(0);
+    if (ignore != nullptr)
+      ignore_i = (*ignore)[i];
     // Update iterate with correction
-    x[i] += localSolver(row_i[i], std::move(ri), ignore[i]);
+    x[i] += localSolver(row_i[i], std::move(ri), ignore_i);
   };
 
   if (direction != Direction::BACKWARD)
@@ -60,7 +64,8 @@ template <class M, class V, class BitVector, class LocalSolver>
 void linearStep(LinearIterationStep<M, V, BitVector>& lis,
                 LocalSolver&& localSolver,
                 Direction direction = Direction::FORWARD) {
-  linearStep(*lis.mat_, *lis.x_, *lis.rhs_, lis.ignore(),
+  BitVector const* ignore = lis.hasIgnore() ? &lis.ignore() : nullptr;
+  linearStep(*lis.mat_, *lis.x_, *lis.rhs_, ignore,
              std::forward<LocalSolver>(localSolver), direction);
 }
 
@@ -310,7 +315,6 @@ struct BlockGSStep : public LinearIterationStep<Matrix, Vector, BitVector> {
       , direction_(direction) {}
 
   void iterate() {
-    assert(this->hasIgnore());
     assert(this->mat_ != nullptr);
     assert(this->x_ != nullptr);
     assert(this->rhs_ != nullptr);
-- 
GitLab