diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc index e49ad6489a385147c492acc52030cf24f62a0b6a..0361d6d34b1adadc0e1c7959a77e985cebb0f4c1 100644 --- a/dune/solvers/iterationsteps/multigridstep.cc +++ b/dune/solvers/iterationsteps/multigridstep.cc @@ -156,25 +156,18 @@ 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_.get())) - dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_.get())->setIgnore(*ignoreNodesHierarchy_[0]); + if (auto canIgnore = std::dynamic_pointer_cast< CanIgnore<BitVectorType> >(this->basesolver_)) + canIgnore->setIgnore(*ignoreNodesHierarchy_[0]); typedef ::LoopSolver<VectorType> DuneSolversLoopSolver; - if (dynamic_cast<DuneSolversLoopSolver*>(this->basesolver_.get())) { - - DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get()); - - assert(dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())); - - dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]); - dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setIgnore(*ignoreNodesHierarchy_[0]); - + if (auto loopBaseSolver = std::dynamic_pointer_cast<DuneSolversLoopSolver>(this->basesolver_)) { + auto iterationStep = dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep()); + assert(iterationStep); + iterationStep->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]); + iterationStep->setIgnore(*ignoreNodesHierarchy_[0]); } - else if (dynamic_cast<LinearSolverType*>(this->basesolver_.get())) { - - LinearSolverType* linearBaseSolver = dynamic_cast<LinearSolverType*> (this->basesolver_.get()); - + else if (auto linearBaseSolver = std::dynamic_pointer_cast<LinearSolverType>(this->basesolver_)) { linearBaseSolver->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]); } else {