diff --git a/dune/solvers/solvers/loopsolver.cc b/dune/solvers/solvers/loopsolver.cc index 248561874decff03dad42cfb22c29ac59abac214..01593c5200f9cd3e0447061c6bded0ae48327a18 100644 --- a/dune/solvers/solvers/loopsolver.cc +++ b/dune/solvers/solvers/loopsolver.cc @@ -98,7 +98,7 @@ void Dune::Solvers::LoopSolver<VectorType, BitVectorType>::solve() // Please don't replace this call to 'diff' by computing the norm of the difference. // In some nonlinear DD applications the 'diff' method may be nonlinear. real_type normOfCorrection = this->errorNorm_->diff(oldSolution,this->iterationStep_->getSol()); - real_type convRate = (normOfOldCorrection > 0) + convRate_ = (normOfOldCorrection > 0) ? normOfCorrection / normOfOldCorrection : 0.0; error = normOfCorrection; normOfOldCorrection = normOfCorrection; @@ -107,7 +107,7 @@ void Dune::Solvers::LoopSolver<VectorType, BitVectorType>::solve() if (referenceSolution_) { normOfError = this->errorNorm_->diff(this->iterationStep_->getSol(), *referenceSolution_); - convRate = (normOfOldError > 0) ? normOfError / normOfOldError : 0.0; + convRate_ = (normOfOldError > 0) ? normOfError / normOfOldError : 0.0; error = normOfError; normOfOldError = normOfError; } @@ -117,9 +117,9 @@ void Dune::Solvers::LoopSolver<VectorType, BitVectorType>::solve() error = (oldNorm == 0) ? std::numeric_limits<real_type>::max() : error / oldNorm; - if (!std::isinf(convRate) && !std::isnan(convRate) && i>0) + if (!std::isinf(convRate_) && !std::isnan(convRate_) && i>0) { - totalConvRate *= convRate; + totalConvRate *= convRate_; this->maxTotalConvRate_ = std::max(this->maxTotalConvRate_, std::pow(totalConvRate, 1/((real_type)convRateCounter+1))); convRateCounter++; } @@ -151,7 +151,7 @@ void Dune::Solvers::LoopSolver<VectorType, BitVectorType>::solve() std::cout << " "; else std::cout << std::fixed - << std::setw(9) << std::setprecision(5) << convRate; + << std::setw(9) << std::setprecision(5) << convRate_; std::cout << std::setprecision(oldPrecision); std::cout.flags(oldFormatFlags); diff --git a/dune/solvers/solvers/loopsolver.hh b/dune/solvers/solvers/loopsolver.hh index 9b9465e18fdb875080580edc33cc53f854eba8a6..4d903474bd693ecd143244e61ff6ed1da98760fb 100644 --- a/dune/solvers/solvers/loopsolver.hh +++ b/dune/solvers/solvers/loopsolver.hh @@ -107,6 +107,16 @@ public: return iter_; } + + /** + * \brief Get current convergence rate + */ + auto convergenceRate() const + { + return convRate_; + } + + virtual void preprocess(); /** \brief Loop, call the iteration procedure @@ -119,6 +129,8 @@ protected: std::vector<Dune::Solvers::Criterion> criteria_; int iter_; + + real_type convRate_; }; } // namespace Solvers