diff --git a/dune/solvers/iterationsteps/mmgstep.cc b/dune/solvers/iterationsteps/mmgstep.cc index acc6c2e73cb48d6676a0a339074d2d78fa84151e..a3ace8cf3388357650b2402cac1a5f1fd89736d6 100644 --- a/dune/solvers/iterationsteps/mmgstep.cc +++ b/dune/solvers/iterationsteps/mmgstep.cc @@ -74,8 +74,8 @@ preprocess() typedef ProjectedBlockGSStep<MatrixType, VectorType> SmootherType; - dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->hasObstacle_ = hasObstacleHierarchy_[0]; - dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->obstacles_ = obstacleHierarchy_[0]; + dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->hasObstacle_ = hasObstacleHierarchy_[0]; + dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->obstacles_ = obstacleHierarchy_[0]; #if HAVE_IPOPT } else if (typeid(*this->basesolver_) == typeid(QuadraticIPOptSolver<MatrixType,VectorType>)) { diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc index 97b1fd213d618acd9b4fe89ee4f7ca65b65527be..1d14abfe8ad60bf867c3c44b820464556d3a5bc7 100644 --- a/dune/solvers/iterationsteps/multigridstep.cc +++ b/dune/solvers/iterationsteps/multigridstep.cc @@ -151,10 +151,10 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess() DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get()); typedef LinearIterationStep<MatrixType, VectorType> SmootherType; - assert(dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)); + assert(dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())); - dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]); - dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->ignoreNodes_ = ignoreNodesHierarchy_[0]; + dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]); + dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setIgnore(*ignoreNodesHierarchy_[0]); } else if (dynamic_cast<LinearSolver<MatrixType, VectorType>*>(this->basesolver_.get())) { diff --git a/dune/solvers/solvers/loopsolver.hh b/dune/solvers/solvers/loopsolver.hh index bb9c11c83a989ea0a28badb65b2843eed4d6b45c..9b9465e18fdb875080580edc33cc53f854eba8a6 100644 --- a/dune/solvers/solvers/loopsolver.hh +++ b/dune/solvers/solvers/loopsolver.hh @@ -3,6 +3,8 @@ #ifndef LOOP_SOLVER_HH #define LOOP_SOLVER_HH +#include <type_traits> + #include <dune/solvers/solvers/iterativesolver.hh> #include <dune/solvers/iterationsteps/iterationstep.hh> #include <dune/solvers/norms/norm.hh> @@ -30,6 +32,7 @@ class LoopSolver : public IterativeSolver<VectorType, BitVectorType> public: /** \brief Constructor taking all relevant data */ + DUNE_DEPRECATED_MSG("Handing over raw pointer in the constructor is deprecated!") LoopSolver(IterationStep<VectorType, BitVectorType>* iterationStep, int maxIterations, double tolerance, @@ -39,12 +42,32 @@ public: const VectorType* referenceSolution=0) : IterativeSolver<VectorType, BitVectorType>(maxIterations, tolerance, - errorNorm, + *errorNorm, + verbosity, + useRelativeError), + referenceSolution_(referenceSolution) + { + this->setIterationStep(*iterationStep); + } + + /** \brief Constructor taking all relevant data */ + template <class Step, class RealNorm, class Enable = std::enable_if_t< + not std::is_pointer<Step>::value and not std::is_pointer<RealNorm>::value> > + LoopSolver(Step&& iterationStep, + int maxIterations, + double tolerance, + RealNorm&& errorNorm, + Solver::VerbosityMode verbosity, + bool useRelativeError=true, + const VectorType* referenceSolution=0) + : IterativeSolver<VectorType, BitVectorType>(maxIterations, + tolerance, + std::forward<RealNorm>(errorNorm), verbosity, useRelativeError), referenceSolution_(referenceSolution) { - this->iterationStep_ = iterationStep; + this->setIterationStep(std::forward<Step>(iterationStep)); } /** diff --git a/dune/solvers/solvers/trustregionsolver.cc b/dune/solvers/solvers/trustregionsolver.cc index e37d7dc0b1c4ea6a51c68ab939a19e34e24b2353..f552c3ae36946291fc650bff74be35e14977f909 100644 --- a/dune/solvers/solvers/trustregionsolver.cc +++ b/dune/solvers/solvers/trustregionsolver.cc @@ -16,7 +16,7 @@ void TrustRegionSolver<ProblemType,VectorType,MatrixType>::solve() // if the inner solver is a monotone multigrid set up a max-norm trust-region if (dynamic_cast<::LoopSolver<VectorType>*>(innerSolver_.get())) { - mgStep = dynamic_cast<MonotoneMGStep<MatrixType,VectorType>*>(dynamic_cast<::LoopSolver<VectorType>*>(innerSolver_.get())->iterationStep_); + mgStep = dynamic_cast<MonotoneMGStep<MatrixType,VectorType>*>(dynamic_cast<::LoopSolver<VectorType>*>(&innerSolver_.get()).getIterationStep()); } diff --git a/dune/solvers/solvers/trustregionsolver.hh b/dune/solvers/solvers/trustregionsolver.hh index 04aa5cb16cd0d5d3d243956cd97a829cbf0a5b15..79fe87bdff7aee9a7b91bc92395b60d2ed15cce2 100644 --- a/dune/solvers/solvers/trustregionsolver.hh +++ b/dune/solvers/solvers/trustregionsolver.hh @@ -79,12 +79,13 @@ public: /** \brief Set up the solver. */ + template <class Norm> void setup(const Dune::ParameterTree& trConfig, - Norm<VectorType>& errorNorm, + Norm&& errorNorm, ProblemType& problem, Solver& innerSolver) { setupTrParameter(trConfig); - this->errorNorm_ = &errorNorm; + this->setErrorNorm(std::forward<Norm>(errorNorm)); problem_ = Dune::stackobject_to_shared_ptr(problem); innerSolver_ = Dune::stackobject_to_shared_ptr(innerSolver); }