From 514b6ce9fb43ce01508e04fa9b7bbe3f7217f4ea Mon Sep 17 00:00:00 2001
From: Jonathan Youett <youett@math.fu-berlin.de>
Date: Thu, 26 Oct 2017 16:29:26 +0200
Subject: [PATCH] Take ownership of transferoperators when handing over shared
 pointer

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

diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc
index da97e31..af839dc 100644
--- a/dune/solvers/iterationsteps/multigridstep.cc
+++ b/dune/solvers/iterationsteps/multigridstep.cc
@@ -58,7 +58,7 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
     //   Check that transfer operators have been supplied
     // //////////////////////////////////////////////////////////
     for (size_t i=0; i<this->mgTransfer_.size(); i++)
-        if (this->mgTransfer_[i] == NULL)
+        if (!this->mgTransfer_[i])
             DUNE_THROW(SolverError, "You have not supplied a multigrid restriction operator "
                        "for level " << i);
 
diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh
index 2af893d..344063a 100644
--- a/dune/solvers/iterationsteps/multigridstep.hh
+++ b/dune/solvers/iterationsteps/multigridstep.hh
@@ -9,7 +9,6 @@
 
 #include <dune/solvers/transferoperators/multigridtransfer.hh>
 #include <dune/solvers/solvers/iterativesolver.hh>
-#include <dune/solvers/common/wrapownshare.hh>
 
 #include "lineariterationstep.hh"
 
@@ -101,35 +100,30 @@ namespace Dune {
         {
             mgTransfer_.resize(transfer.size());
             for(size_t j=0; j<transfer.size(); ++j)
-                mgTransfer_[j] = transfer[j];
+                mgTransfer_[j] = Dune::stackobject_to_shared_ptr(*transfer[j]);
         }
 
         /**
-         * \brief Set transfer operator hierarchy from vector of shared_ptr's.
-         *
-         * Be careful: The Multigrid step does currently not share ownership
-         * afterwards. This may change in the future.
-         */
+         * \brief Set transfer operator hierarchy from vector of shared_ptr's taking over ownership. */
         template <class DerivedTransfer>
         void setTransferOperators(const std::vector<typename std::shared_ptr<DerivedTransfer> >& transfer)
         {
             mgTransfer_.resize(transfer.size());
             for(size_t j=0; j<transfer.size(); ++j)
-                mgTransfer_[j] = transfer[j].get();
+                mgTransfer_[j] = transfer[j];
         }
 
         /**
          * \brief Set transfer operator hierarchy from vector.
          *
          * Be careful: The Multigrid step will not copy the transfer operators
-         * or share ownership
          */
         template <class DerivedTransfer>
         void setTransferOperators(const std::vector<DerivedTransfer>& transfer)
         {
             mgTransfer_.resize(transfer.size());
             for(size_t j=0; j<transfer.size(); ++j)
-                mgTransfer_[j] = &transfer[j];
+                mgTransfer_[j] = Dune::stackobject_to_shared_ptr(transfer[j]);
         }
 
         virtual void iterate();
@@ -242,7 +236,7 @@ namespace Dune {
         std::vector<VectorType> rhsHierarchy_;
 
         //protected:
-        std::vector<MultigridTransfer<VectorType, BitVectorType, MatrixType>* > mgTransfer_;
+        std::vector<std::shared_ptr<MultigridTransfer<VectorType, BitVectorType, MatrixType> > > mgTransfer_;
 
     protected:
 
-- 
GitLab