From 8f7cbb67f9ece996824991a06be265e553c8bfe5 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Mon, 6 Aug 2012 15:59:25 +0200
Subject: [PATCH] Fix: No descent if the gradient is too small

At least for the tangential descent, a gradient of magnitude 1e-16
causes problems. Test included
---
 dune/tectonic/minimisation.hh         | 2 +-
 src/test-gradient-sample-steep.cc     | 2 +-
 src/test-gradient-sample-steep2.cc    | 2 +-
 src/test-gradient-sample-verysteep.cc | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/dune/tectonic/minimisation.hh b/dune/tectonic/minimisation.hh
index 5407fc3f..92eb9c0b 100644
--- a/dune/tectonic/minimisation.hh
+++ b/dune/tectonic/minimisation.hh
@@ -104,7 +104,7 @@ void minimise(Functional const &J, typename Functional::SmallVector &x,
     SmallVector descDir;
     bool const linesearchp = J.descentDirection(x, descDir);
 
-    if (descDir == SmallVector(0.0))
+    if (descDir.two_norm() < 1e-14) // TODO: Make controllable
       return;
 
     if (linesearchp) {
diff --git a/src/test-gradient-sample-steep.cc b/src/test-gradient-sample-steep.cc
index 6b39276f..9e7350bd 100644
--- a/src/test-gradient-sample-steep.cc
+++ b/src/test-gradient-sample-steep.cc
@@ -20,7 +20,7 @@ int main() {
   typedef Functional::SmallVector SmallVector;
 
   SmallMatrix const A = { { 1, 0 }, { 0, 1 } };
-  SmallVector const b = { 1, 2 };
+  SmallVector const b = { 1, 2.5 };
 
   auto const f = Dune::make_shared<Dune::SampleFunction<2> const>();
   auto const phi = Dune::make_shared<Functional::NonlinearityType const>(f);
diff --git a/src/test-gradient-sample-steep2.cc b/src/test-gradient-sample-steep2.cc
index 6f27d54d..30a8507e 100644
--- a/src/test-gradient-sample-steep2.cc
+++ b/src/test-gradient-sample-steep2.cc
@@ -29,7 +29,7 @@ int main() {
   double ret1;
   {
     SmallVector start = { 0, 1 };
-    ret1 = functionTester(J, start, 1);
+    ret1 = functionTester(J, start, 2);
   }
 
   double ret2;
diff --git a/src/test-gradient-sample-verysteep.cc b/src/test-gradient-sample-verysteep.cc
index 78e1ec89..86b3f2c8 100644
--- a/src/test-gradient-sample-verysteep.cc
+++ b/src/test-gradient-sample-verysteep.cc
@@ -29,7 +29,7 @@ int main() {
   double ret1;
   {
     SmallVector start = { 0, 1 };
-    ret1 = functionTester(J, start, 1);
+    ret1 = functionTester(J, start, 2);
   }
 
   double ret2;
-- 
GitLab