diff --git a/dune/solvers/common/canignore.hh b/dune/solvers/common/canignore.hh index 4464ac01b4453913ba0c311d8611db074fb3f797..019e5f07af72da181cae51998100435d3b4eab48 100644 --- a/dune/solvers/common/canignore.hh +++ b/dune/solvers/common/canignore.hh @@ -47,6 +47,13 @@ public: ignoreNodes_ = &i; } + /** + * \brief Only if this returns true can ignore() safely be called. + */ + bool hasIgnore() const { + return ignoreNodes_ != nullptr; + } + /** * \brief Const access to bit vector */ diff --git a/dune/solvers/iterationsteps/blockgsstep.cc b/dune/solvers/iterationsteps/blockgsstep.cc index 284351e051ae919ca2775d9164f715bf7ffaf6c4..d49c588d7335a68459b04c0cfb2b8ceeb54867ba 100644 --- a/dune/solvers/iterationsteps/blockgsstep.cc +++ b/dune/solvers/iterationsteps/blockgsstep.cc @@ -24,7 +24,7 @@ template<class MatrixType, class DiscFuncType, class BitVectorType> inline void BlockGSStep<MatrixType, DiscFuncType, BitVectorType>::iterate() { - assert(this->ignoreNodes_ != nullptr); + assert(this->hasIgnore()); if (gs_type_ != Direction::BACKWARD) for (std::size_t i=0; i<this->x_->size(); i++) diff --git a/dune/solvers/iterationsteps/blockgssteps.hh b/dune/solvers/iterationsteps/blockgssteps.hh index aa995c0957657b617af58b33a2033eaf01be2a49..c8db9a23a999fd99a2c6e3cd2e39559d0735f265 100644 --- a/dune/solvers/iterationsteps/blockgssteps.hh +++ b/dune/solvers/iterationsteps/blockgssteps.hh @@ -310,7 +310,7 @@ struct BlockGSStep : public LinearIterationStep<Matrix, Vector, BitVector> { , direction_(direction) {} void iterate() { - assert(this->ignoreNodes_ != nullptr); + assert(this->hasIgnore()); assert(this->mat_ != nullptr); assert(this->x_ != nullptr); assert(this->rhs_ != nullptr); diff --git a/dune/solvers/iterationsteps/cgstep.cc b/dune/solvers/iterationsteps/cgstep.cc index 4e00a3bb9fca0c9de51cbd3ca513f0897aa186fe..3085b2b776afdb0dcd96f4b1fed936b2db3ccb30 100644 --- a/dune/solvers/iterationsteps/cgstep.cc +++ b/dune/solvers/iterationsteps/cgstep.cc @@ -4,8 +4,6 @@ template <class MatrixType, class VectorType> void CGStep<MatrixType, VectorType>::check() const { - if (this->ignoreNodes_ == nullptr) - DUNE_THROW(SolverError, "ignoreNodes_ member not set"); } template <class MatrixType, class VectorType> @@ -13,9 +11,10 @@ void CGStep<MatrixType, VectorType>::preprocess() { // Compute the residual (r starts out as the rhs) matrix_->mmv(*x_,r_); - for (size_t i=0; i < r_.size(); ++i) - if (this->ignore()[i].any()) - r_[i] = 0; + if (this->hasIgnore()) + for (size_t i=0; i < r_.size(); ++i) + if (this->ignore()[i].any()) + r_[i] = 0; if (preconditioner_) { preconditioner_->setMatrix(*matrix_); @@ -36,9 +35,10 @@ void CGStep<MatrixType, VectorType>::iterate() x_->axpy(alpha, p_); // x_1 = x_0 + alpha_0 p_0 r_.axpy(-alpha, q); // r_1 = r_0 - alpha_0 Ap_0 - for (size_t i=0; i < r_.size(); ++i) - if (this->ignore()[i].any()) - r_[i] = 0; + if (this->hasIgnore()) + for (size_t i=0; i < r_.size(); ++i) + if (this->ignore()[i].any()) + r_[i] = 0; if (preconditioner_) preconditioner_->apply(q, r_); diff --git a/dune/solvers/iterationsteps/trustregiongsstep.cc b/dune/solvers/iterationsteps/trustregiongsstep.cc index 8fd542ea78931932a9e716728bab0aca207de770..f7f7208d91d807cd05b7406071cd9e87a205da38 100644 --- a/dune/solvers/iterationsteps/trustregiongsstep.cc +++ b/dune/solvers/iterationsteps/trustregiongsstep.cc @@ -13,7 +13,7 @@ void TrustRegionGSStep<MatrixType, VectorType>::iterate() // Dirichlet nodes in this block std::bitset<BlockSize> ignoreNodes(0); - if (this->ignoreNodes_ != nullptr) + if (this->hasIgnore()) ignoreNodes = this->ignore()[i]; if (ignoreNodes.all()) diff --git a/dune/solvers/solvers/umfpacksolver.hh b/dune/solvers/solvers/umfpacksolver.hh index f2a36ac82cf11f88f18a37bcdb21a2f94a8d6f12..a89bfeb851f828d5772e87407c249aeb494af2ea 100644 --- a/dune/solvers/solvers/umfpacksolver.hh +++ b/dune/solvers/solvers/umfpacksolver.hh @@ -70,7 +70,7 @@ public: // We may use the original rhs, but ISTL modifies it, so we need a non-const type here VectorType mutableRhs = *rhs_; - if (this->ignoreNodes_ == nullptr) + if (not this->hasIgnore()) { ///////////////////////////////////////////////////////////////// // Solve the system