From b1a13fd1deaa819e1c6f0bf3c5007c2a484bf2a2 Mon Sep 17 00:00:00 2001
From: bathmann <jasper.bathmann@ufz.de>
Date: Thu, 16 May 2019 17:38:22 +0200
Subject: [PATCH] [NumLib/TimeStepping] Small fix on
 IterationNumberBasedTimeStepping

Introduced information flow whether the timestep was accepted or not.

This prevents the times in the timestepper and the external loop to diverge
which causes two issues otherwise:
1.) Endless loop at t --> t_end, if max_iter > largest multiplier
2.) Endless loop at t --> t_end, if nonlinear solver fails during
	execution
---
 .../Algorithms/IterationNumberBasedTimeStepping.cpp           | 2 +-
 .../Algorithms/IterationNumberBasedTimeStepping.h             | 3 +++
 ProcessLib/UncoupledProcessesTimeLoop.cpp                     | 4 ++++
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
index 4be4bb63d8b..252476d1225 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
@@ -124,6 +124,6 @@ double IterationNumberBasedTimeStepping::getNextTimeStepSize() const
 
 bool IterationNumberBasedTimeStepping::accepted() const
 {
-    return _iter_times <= _max_iter;
+    return _accepted;
 }
 }  // namespace NumLib
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
index ac73d8839a7..f9ba5be2e82 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
@@ -95,6 +95,7 @@ public:
     bool next(double solution_error, int number_iterations) override;
 
     bool accepted() const override;
+    void setAcceptedOrNot(bool accepted) override { _accepted = accepted; };
 
     bool isSolutionErrorComputationNeeded() override { return true; }
 
@@ -125,6 +126,8 @@ private:
     int _iter_times = 0;
     /// The number of rejected steps.
     int _n_rejected_steps = 0;
+    /// True, if the timestep is accepted.
+    bool _accepted = true;
 };
 
 }  // namespace NumLib
diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp
index b1163296cfb..4e1a9d3199a 100644
--- a/ProcessLib/UncoupledProcessesTimeLoop.cpp
+++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp
@@ -349,6 +349,10 @@ double UncoupledProcessesTimeLoop::computeTimeStepping(
         {
             timestepper->setAcceptedOrNot(false);
         }
+        else
+        {
+            timestepper->setAcceptedOrNot(true);
+        }
 
         if (!timestepper->next(solution_error,
                                ppd.nonlinear_solver_status.number_iterations) &&
-- 
GitLab