diff --git a/dune/solvers/iterationsteps/cgstep.cc b/dune/solvers/iterationsteps/cgstep.cc index 9dae98fdfb4d962627ee3fa86dd972774904d55a..50490f28aa7a7b31178acce5f20349d191f270a4 100644 --- a/dune/solvers/iterationsteps/cgstep.cc +++ b/dune/solvers/iterationsteps/cgstep.cc @@ -3,13 +3,13 @@ #include <dune/solvers/common/canignore.hh> -template <class MatrixType, class VectorType> -void CGStep<MatrixType, VectorType>::check() const +template <class MatrixType, class VectorType, class Ignore> +void CGStep<MatrixType, VectorType, Ignore>::check() const { } -template <class MatrixType, class VectorType> -void CGStep<MatrixType, VectorType>::preprocess() +template <class MatrixType, class VectorType, class Ignore> +void CGStep<MatrixType, VectorType, Ignore>::preprocess() { // Compute the residual (r starts out as the rhs) this->mat_->mmv(*x_,r_); @@ -19,7 +19,7 @@ void CGStep<MatrixType, VectorType>::preprocess() r_[i] = 0; if (preconditioner_) { - using CanIgnore_t = CanIgnore<DefaultBitVector_t<VectorType>>; + using CanIgnore_t = CanIgnore<Ignore>; CanIgnore_t *asCanIgnore = dynamic_cast<CanIgnore_t*>(preconditioner_); if (asCanIgnore != nullptr and this->hasIgnore()) asCanIgnore->setIgnore(this->ignore()); @@ -32,8 +32,8 @@ void CGStep<MatrixType, VectorType>::preprocess() r_squared_old_ = p_*r_; } -template <class MatrixType, class VectorType> -void CGStep<MatrixType, VectorType>::iterate() +template <class MatrixType, class VectorType, class Ignore> +void CGStep<MatrixType, VectorType, Ignore>::iterate() { // Avoid divide-by-zero. If r_squared was zero, we're done anyway. if (r_squared_old_ <= 0) diff --git a/dune/solvers/iterationsteps/cgstep.hh b/dune/solvers/iterationsteps/cgstep.hh index 366544f8e2f69cc7fdc0d79725df1a93c8cec983..6d7bc3ecdc9badd8c366725fed8d359206ef45ef 100644 --- a/dune/solvers/iterationsteps/cgstep.hh +++ b/dune/solvers/iterationsteps/cgstep.hh @@ -4,16 +4,18 @@ #define DUNE_SOLVERS_ITERATIONSTEPS_CGSTEP_HH #include <dune/solvers/common/preconditioner.hh> +#include <dune/solvers/common/defaultbitvector.hh> #include <dune/solvers/iterationsteps/lineariterationstep.hh> namespace Dune { namespace Solvers { //! A conjugate gradient solver - template <class MatrixType, class VectorType> - class CGStep : public LinearIterationStep<MatrixType,VectorType> + template <class MatrixType, class VectorType, class Ignore = DefaultBitVector_t<VectorType>> + class CGStep : public LinearIterationStep<MatrixType,VectorType,Ignore> { - using Base = LinearIterationStep<MatrixType,VectorType>; + using Base = LinearIterationStep<MatrixType,VectorType,Ignore>; + using Preconditioner = Dune::Solvers::Preconditioner<MatrixType, VectorType, Ignore>; public: CGStep() @@ -30,7 +32,7 @@ namespace Dune { CGStep(const MatrixType& matrix, VectorType& x, const VectorType& rhs, - Preconditioner<MatrixType, VectorType>& preconditioner) + Preconditioner& preconditioner) : Base(matrix,x), p_(rhs.size()), r_(rhs), preconditioner_(&preconditioner) {} @@ -54,7 +56,7 @@ namespace Dune { VectorType r_; // residual using Base::x_; double r_squared_old_; - Preconditioner<MatrixType, VectorType>* preconditioner_; + Preconditioner* preconditioner_; };