From 5765f0312bc93e6e9edbb1e4cba5f852aab4ea70 Mon Sep 17 00:00:00 2001
From: Ansgar Burchardt <Ansgar.Burchardt@tu-dresden.de>
Date: Wed, 17 Jun 2020 23:59:00 +0200
Subject: [PATCH] multigridstep.cc: avoid repeating dynamic casts

---
 dune/solvers/iterationsteps/multigridstep.cc | 23 +++++++-------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc
index e49ad648..0361d6d3 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 {
-- 
GitLab