From d8aa6c00c38f7d4f8a2fb88ccf9138537c7bd213 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Tue, 7 Jun 2016 13:31:52 +0200
Subject: [PATCH] Replace std::min/max with std::fmin/fmax for NaNs

---
 .../iterationsteps/projectedlinegsstep.cc     | 27 +++++++------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git a/dune/solvers/iterationsteps/projectedlinegsstep.cc b/dune/solvers/iterationsteps/projectedlinegsstep.cc
index b852c1af..542754ce 100755
--- a/dune/solvers/iterationsteps/projectedlinegsstep.cc
+++ b/dune/solvers/iterationsteps/projectedlinegsstep.cc
@@ -114,28 +114,19 @@ solveLocalSystem(const Dune::BTDMatrix<typename MatrixType::block_type>& matrix,
         for (size_t i=0; i<linearCorrection.size(); i++) {
 
             for (int j=0; j<BlockSize; j++) {
-
+                // fmin and fmax ignore NAN values
                 if (linearCorrection[i][j] > 0) {
-
-                    // This division can cause nan on some platforms...
-                    if (!isnan( (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]) )
-                        lineSearchObs.lower(0) = std::max(lineSearchObs.lower(0),
-                                                          (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]);
-
-                    if (!isnan( (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]) )
-                        lineSearchObs.upper(0) = std::min(lineSearchObs.upper(0),
-                                                          (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]);
+                    lineSearchObs.lower(0) = std::fmax(lineSearchObs.lower(0),
+                                                       (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]);
+                    lineSearchObs.upper(0) = std::fmin(lineSearchObs.upper(0),
+                                                       (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]);
                 }
-
                 if (linearCorrection[i][j] < 0) {
-                    if (!isnan( (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]) )
-                        lineSearchObs.lower(0) = std::max(lineSearchObs.lower(0),
-                                                          (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]);
-                    if (!isnan( (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]) )
-                        lineSearchObs.upper(0) = std::min(lineSearchObs.upper(0),
-                                                          (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]);
+                    lineSearchObs.lower(0) = std::fmax(lineSearchObs.lower(0),
+                                                       (localObstacles[i].upper(j)-x[i][j]) / linearCorrection[i][j]);
+                    lineSearchObs.upper(0) = std::fmin(lineSearchObs.upper(0),
+                                                       (localObstacles[i].lower(j)-x[i][j]) / linearCorrection[i][j]);
                 }
-
             }
 
         }
-- 
GitLab