From aae2defb03a9de8556129618e9e641f58bef0a55 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Mon, 16 Dec 2013 13:10:44 +0100
Subject: [PATCH] [Algorit] Make minimisation terminate

---
 dune/tectonic/minimisation.hh | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/dune/tectonic/minimisation.hh b/dune/tectonic/minimisation.hh
index 5bf0888b..0e27a654 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
-- 
GitLab