diff --git a/dune/solvers/iterationsteps/blockgssteps.hh b/dune/solvers/iterationsteps/blockgssteps.hh index 03ca4d083a7b610ca377f374b8aa3fc4348729da..6835c835c3b1a18aa5bed1c437eb88175e8fd0f0 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);