From 01255a6c56ad6809a4707cde8bf2205a63b9ce28 Mon Sep 17 00:00:00 2001
From: Jonathan Youett <youett@math.fu-berlin.de>
Date: Fri, 1 Sep 2017 11:15:17 +0200
Subject: [PATCH] Make baseSolver protected, store it as shared_ptr and add
 setter

---
 dune/solvers/iterationsteps/multigridstep.cc | 12 ++++++------
 dune/solvers/iterationsteps/multigridstep.hh | 12 +++++++++---
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc
index a0339410..97b1fd21 100644
--- a/dune/solvers/iterationsteps/multigridstep.cc
+++ b/dune/solvers/iterationsteps/multigridstep.cc
@@ -141,14 +141,14 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
     if (basesolver_)
     {
         // If the base solver can ignore dofs give it the ignoreNodes field
-        if (dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_))
-            dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_)->ignoreNodes_ = ignoreNodesHierarchy_[0];
+        if (dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_.get()))
+            dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_.get())->setIgnore(*ignoreNodesHierarchy_[0]);
 
         typedef ::LoopSolver<VectorType> DuneSolversLoopSolver;
 
-        if (dynamic_cast<DuneSolversLoopSolver*>(this->basesolver_)) {
+        if (dynamic_cast<DuneSolversLoopSolver*>(this->basesolver_.get())) {
 
-            DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_);
+            DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get());
 
             typedef LinearIterationStep<MatrixType, VectorType> SmootherType;
             assert(dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_));
@@ -157,9 +157,9 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
             dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->ignoreNodes_ = ignoreNodesHierarchy_[0];
 
         }
-        else if (dynamic_cast<LinearSolver<MatrixType, VectorType>*>(this->basesolver_)) {
+        else if (dynamic_cast<LinearSolver<MatrixType, VectorType>*>(this->basesolver_.get())) {
 
-            LinearSolver<MatrixType,VectorType>* linearBaseSolver = dynamic_cast<LinearSolver<MatrixType,VectorType>*> (this->basesolver_);
+            LinearSolver<MatrixType,VectorType>* linearBaseSolver = dynamic_cast<LinearSolver<MatrixType,VectorType>*> (this->basesolver_.get());
 
             linearBaseSolver->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
         }
diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh
index 50f3f32c..6f00dbfd 100644
--- a/dune/solvers/iterationsteps/multigridstep.hh
+++ b/dune/solvers/iterationsteps/multigridstep.hh
@@ -9,6 +9,7 @@
 
 #include <dune/solvers/transferoperators/multigridtransfer.hh>
 #include <dune/solvers/solvers/iterativesolver.hh>
+#include <dune/solvers/common/wrapownshare.hh>
 
 #include "lineariterationstep.hh"
 
@@ -179,6 +180,13 @@ namespace Dune {
             levelWiseSmoothers_[level] = smoother;
         }
 
+        /** \brief Set base solver */
+        template <class BaseSolver>
+        void setBaseSolver(BaseSolver&& baseSolver)
+        {
+            basesolver_ = wrap_own_share<Solver>(std::forward<BaseSolver>(baseSolver));
+        }
+
     protected:
         /** \brief The presmoothers, one for each level */
         std::vector<std::shared_ptr<LinearIterationStep<MatrixType, VectorType> > > presmoother_;
@@ -186,11 +194,9 @@ namespace Dune {
         /** \brief The postsmoothers, one for each level */
         std::vector<std::shared_ptr<LinearIterationStep<MatrixType, VectorType> > > postsmoother_;
 
-    public:
         /** \brief The base solver */
-        Solver* basesolver_;
+        std::shared_ptr<Solver> basesolver_;
 
-    protected:
         //! Number of presmoothing steps
         int nu1_;
 
-- 
GitLab