Skip to content
Snippets Groups Projects
Commit 93658ed3 authored by Oliver Sander's avatar Oliver Sander Committed by sander@FU-BERLIN.DE
Browse files

be a tiny bit faster by not redundantly recomputing the energy at each iteration

[[Imported from SVN: r7430]]
parent 0146a9ee
No related branches found
No related tags found
No related merge requests found
...@@ -178,6 +178,9 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() ...@@ -178,6 +178,9 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve()
// ///////////////////////////////////////////////////// // /////////////////////////////////////////////////////
// Trust-Region Solver // Trust-Region Solver
// ///////////////////////////////////////////////////// // /////////////////////////////////////////////////////
double oldEnergy = assembler_->computeEnergy(x_);
for (int i=0; i<maxTrustRegionSteps_; i++) { for (int i=0; i<maxTrustRegionSteps_; i++) {
Dune::Timer totalTimer; Dune::Timer totalTimer;
...@@ -348,8 +351,6 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() ...@@ -348,8 +351,6 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve()
for (int j=0; j<newIterate.size(); j++) for (int j=0; j<newIterate.size(); j++)
newIterate[j] = TargetSpace::exp(newIterate[j], corr[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); double energy = assembler_->computeEnergy(newIterate);
// compute the model decrease // compute the model decrease
...@@ -394,12 +395,18 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() ...@@ -394,12 +395,18 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve()
x_ = newIterate; x_ = newIterate;
trustRegion.scale(2); trustRegion.scale(2);
// current energy becomes 'oldEnergy' for the next iteration
oldEnergy = energy;
} else if ( (oldEnergy-energy) / modelDecrease > 0.01 } else if ( (oldEnergy-energy) / modelDecrease > 0.01
|| std::abs(oldEnergy-energy) < 1e-12) { || std::abs(oldEnergy-energy) < 1e-12) {
// successful iteration // successful iteration
x_ = newIterate; x_ = newIterate;
// current energy becomes 'oldEnergy' for the next iteration
oldEnergy = energy;
} else { } else {
// unsuccessful iteration // unsuccessful iteration
trustRegion.scale(0.5); trustRegion.scale(0.5);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment