diff --git a/dune/tectonic/minimisation.hh b/dune/tectonic/minimisation.hh index 5bf0888bf9aabc4be740e46f8ec14d5e4f54a44a..0e27a6549542d8901c6eab002585ec16c218a06e 100644 --- a/dune/tectonic/minimisation.hh +++ b/dune/tectonic/minimisation.hh @@ -28,6 +28,14 @@ template <class Functional> void minimise(Functional const &J, typename Functional::LocalVector &x, size_t steps, Bisection const &bisection) { using LocalVector = typename Functional::LocalVector; + auto const diff = [](LocalVector const &a, LocalVector const &b) { + LocalVector tmp = a; + tmp -= b; + return tmp.two_norm(); + }; + + LocalVector x_initial = x; + LocalVector x_o = x; for (size_t step = 0; step < steps; ++step) { LocalVector v; @@ -40,6 +48,20 @@ void minimise(Functional const &J, typename Functional::LocalVector &x, double const alpha = lineSearch(J, x, v, bisection); Arithmetic::addProduct(x, alpha, v); + + if (alpha < 1e-14) // TODO + break; + + double const correction = diff(x, x_o); + double const overallCorrection = diff(x, x_initial); + if (overallCorrection <= 0.0) + return; + + double const correctionQuotient = correction / overallCorrection; + if (correctionQuotient < 0.1) // enough descent; TODO + break; + + x_o = x; } } #endif