diff --git a/src/rodsolver.cc b/src/rodsolver.cc index 58382c5e140ac62ba2825475992de32d4d28a4f4..76377e17aff8477852c0d5cfaeff78eaa72007a5 100644 --- a/src/rodsolver.cc +++ b/src/rodsolver.cc @@ -217,7 +217,7 @@ void RodSolver<GridType>::solve() std::cout << "Correction: " << std::endl << corr << std::endl; printf("infinity norm of the correction: %g\n", corr.infinity_norm()); - if (corr.infinity_norm() < 1e-7) { + if (corr.infinity_norm() < 1e-5) { std::cout << "CORRECTION IS SMALL ENOUGH" << std::endl; break; } @@ -256,7 +256,7 @@ void RodSolver<GridType>::solve() // Note that rhs = -g CorrectionType tmp(corr.size()); tmp = 0; - hessianMatrix_->mmv(corr, tmp); + hessianMatrix_->umv(corr, tmp); double modelDecrease = (rhs*corr) - 0.5 * (corr*tmp); std::cout << "Model decrease: " << modelDecrease @@ -269,7 +269,10 @@ void RodSolver<GridType>::solve() // std::cout << "old energy: " << oldEnergy << " new energy: " << energy << std::endl; // exit(0); } - + + if (std::abs(oldEnergy-energy) < 1e-12) + std::cout << "Suspecting rounding problems" << std::endl; + // ////////////////////////////////////////////// // Check for acceptance of the step // ////////////////////////////////////////////// @@ -279,7 +282,8 @@ void RodSolver<GridType>::solve() x_ = newIterate; trustRegionRadius *= 2; - } else if ( (oldEnergy-energy) / modelDecrease > 0.01) { + } else if ( (oldEnergy-energy) / modelDecrease > 0.01 + || std::abs(oldEnergy-energy) < 1e-12) { // successful iteration x_ = newIterate;