diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc index da97e31e6893a310a9e9d7c835b71eb19cbd31d0..af839dc1f49fe0262afda5a6d3e6e041e9535a27 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 2af893d291e8d45097b9a6de421227999742a41f..344063aa390794726dc08f86b189b572ff1f580b 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: