diff --git a/dune/solvers/solvers/fixedstepsolver.hh b/dune/solvers/solvers/fixedstepsolver.hh new file mode 100644 index 0000000000000000000000000000000000000000..755c5a49d4146a40c9b8d7b607f375016efff0a7 --- /dev/null +++ b/dune/solvers/solvers/fixedstepsolver.hh @@ -0,0 +1,64 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#ifndef DUNE_SOLVERS_FIXEDSTEPSOLVER_HH +#define DUNE_SOLVERS_FIXEDSTEPSOLVER_HH + +#include <memory> + +#include <dune/solvers/common/defaultbitvector.hh> +#include <dune/solvers/common/resize.hh> + + + +namespace Dune { +namespace Solvers { + +/** + * \brief An iterative solver using a fixed number of iterations + * + * \tparam Matrix Matrix type of the system + * \tparam Vector Vector type of the system + */ +template<class Matrix, class Vector, class Step> +class FixedStepSolver +{ + using BitVector = Dune::Solvers::DefaultBitVector_t<Vector>; + +public: + + /** \brief Constructor + * \param step The iteration step object to use + * \param noOfSteps The number of steps to take + */ + FixedStepSolver(const std::shared_ptr<Step> step, unsigned int noOfSteps=1) + : step_(step), + noOfSteps_(noOfSteps) + {} + + /** \brief Solve */ + void operator()(Vector& x, const Matrix& m, const Vector& r) + { + Dune::Solvers::resizeInitialize(ignore_, x, false); + step_->setIgnore(ignore_); + step_->setProblem(m, x, r); + step_->preprocess(); + for (unsigned int i=0; i<noOfSteps_; i++) + step_->iterate(); + } + +private: + std::shared_ptr<Step> step_; + unsigned int noOfSteps_; + BitVector ignore_; +}; + + + +} // end namespace Solvers +} // end namespace Dune + + + +#endif // DUNE_SOLVERS_FIXEDSTEPSOLVER_HH + + diff --git a/dune/solvers/transferoperators/densemultigridtransfer.hh b/dune/solvers/transferoperators/densemultigridtransfer.hh index e16abce4d51b218a2c7be572b8469f03c75f1cbb..310b027d6ac1fe292d1b58f36ba643a4db9b71fb 100644 --- a/dune/solvers/transferoperators/densemultigridtransfer.hh +++ b/dune/solvers/transferoperators/densemultigridtransfer.hh @@ -121,6 +121,11 @@ public: return matrix_; } + /** \brief Set matrix */ + template<class M> + void setMatrix(M&& m) { + matrix_ = std::forward<M>(m); + } protected: