From 849db9b0bd46ae68e2998b2fc0885e707b9c52db Mon Sep 17 00:00:00 2001
From: Lasse Hinrichsen <lh1887@mi.fu-berlin.de>
Date: Tue, 6 Jun 2017 11:42:19 +0200
Subject: [PATCH] Add setMatrix() method to DenseMultigridTransfer

See #14.
---
 dune/solvers/solvers/fixedstepsolver.hh       | 64 +++++++++++++++++++
 .../densemultigridtransfer.hh                 |  5 ++
 2 files changed, 69 insertions(+)
 create mode 100644 dune/solvers/solvers/fixedstepsolver.hh

diff --git a/dune/solvers/solvers/fixedstepsolver.hh b/dune/solvers/solvers/fixedstepsolver.hh
new file mode 100644
index 00000000..755c5a49
--- /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 e16abce4..310b027d 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:
 
-- 
GitLab