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