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