From 93658ed3a11d2a92bf15f6d2afd3a8528473039e Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Tue, 14 Jun 2011 06:25:22 +0000 Subject: [PATCH] be a tiny bit faster by not redundantly recomputing the energy at each iteration [[Imported from SVN: r7430]] --- dune/gfe/riemanniantrsolver.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index f8028222..3eae853c 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -178,6 +178,9 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() // ///////////////////////////////////////////////////// // Trust-Region Solver // ///////////////////////////////////////////////////// + + double oldEnergy = assembler_->computeEnergy(x_); + for (int i=0; i<maxTrustRegionSteps_; i++) { Dune::Timer totalTimer; @@ -348,8 +351,6 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() for (int j=0; j<newIterate.size(); j++) newIterate[j] = TargetSpace::exp(newIterate[j], corr[j]); - /** \todo Don't always recompute oldEnergy */ - double oldEnergy = assembler_->computeEnergy(x_); double energy = assembler_->computeEnergy(newIterate); // compute the model decrease @@ -394,12 +395,18 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() x_ = newIterate; trustRegion.scale(2); + + // current energy becomes 'oldEnergy' for the next iteration + oldEnergy = energy; } else if ( (oldEnergy-energy) / modelDecrease > 0.01 || std::abs(oldEnergy-energy) < 1e-12) { // successful iteration x_ = newIterate; + // current energy becomes 'oldEnergy' for the next iteration + oldEnergy = energy; + } else { // unsuccessful iteration trustRegion.scale(0.5); -- GitLab