diff --git a/dune/solvers/iterationsteps/projectedlinegsstep.cc b/dune/solvers/iterationsteps/projectedlinegsstep.cc index b852c1afdd17ac7fcb365aaccffffe7182be1ef2..542754ce6b963867eff0c12b45f9fa7b921da1c9 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]); } - } }