From a79b0b7ddce31fb16754ec99b60b9b5a95151e8a Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Mon, 14 Jan 2019 01:09:27 +0100
Subject: [PATCH] [NL] Pass number of iterations to time step algo.

---
 .../TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp   | 3 ++-
 NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h  | 2 +-
 NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp        | 3 ++-
 NumLib/TimeStepping/Algorithms/FixedTimeStepping.h          | 2 +-
 .../Algorithms/IterationNumberBasedTimeStepping.cpp         | 6 +++++-
 .../Algorithms/IterationNumberBasedTimeStepping.h           | 2 +-
 NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h          | 3 ++-
 ProcessLib/UncoupledProcessesTimeLoop.cpp                   | 3 ++-
 8 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
index ccbb5cf3792..85efd57217a 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
@@ -20,7 +20,8 @@
 
 namespace NumLib
 {
-bool EvolutionaryPIDcontroller::next(const double solution_error)
+bool EvolutionaryPIDcontroller::next(double const solution_error,
+                                     int const /*number_iterations*/)
 {
     const bool is_previous_step_accepted = _is_accepted;
 
diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
index 2a5489bd0bb..2f5b0fc692c 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
@@ -77,7 +77,7 @@ public:
                               time steps.
      * @return true if the next step exists
      */
-    bool next(const double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if current time step is accepted
     bool accepted() const override { return _is_accepted; }
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
index 8c90eb9794f..f9fa3c94130 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
@@ -30,7 +30,8 @@ FixedTimeStepping::FixedTimeStepping(double t0, double tn, double dt)
 {
 }
 
-bool FixedTimeStepping::next(const double /*solution_error*/)
+bool FixedTimeStepping::next(double const /*solution_error*/,
+                             int const /*number_iterations*/)
 {
     // check if last time step
     if (_ts_current.steps() == _dt_vector.size() ||
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
index 72e3d5bafac..302fe049e5c 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
@@ -58,7 +58,7 @@ public:
                       const std::vector<double>& vec_all_dt);
 
     /// move to the next time step
-    bool next(const double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if current time step is accepted
     bool accepted() const override { return true; }
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
index 8b0d000bdba..d60a2184a4f 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
@@ -36,8 +36,11 @@ IterationNumberBasedTimeStepping::IterationNumberBasedTimeStepping(
     assert(iter_times_vector.size() == multiplier_vector.size());
 }
 
-bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/)
+bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/,
+                                            int const number_iterations)
 {
+    _iter_times = number_iterations;
+
     // check current time step
     if (std::abs(_ts_current.current() - end()) <
         std::numeric_limits<double>::epsilon())
@@ -59,6 +62,7 @@ bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/)
     // prepare the next time step info
     _ts_current = _ts_prev;
     _ts_current += getNextTimeStepSize();
+    _iter_times = 0;
 
     return true;
 }
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
index 73aee64bbdd..e863e72a0b5 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
@@ -95,7 +95,7 @@ public:
     ~IterationNumberBasedTimeStepping() override = default;
 
     /// move to the next time step
-    bool next(double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if the current step is accepted
     bool accepted() const override;
diff --git a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
index 026cb7e1a6b..28f12e86571 100644
--- a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
+++ b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
@@ -90,8 +90,9 @@ public:
 
     /// move to the next time step
     /// \param solution_error Solution error between two successive time steps.
+    /// \param number_iterations Number of non-linear iterations used.
     /// \return true if the next step exists
-    virtual bool next(const double solution_error) = 0;
+    virtual bool next(const double solution_error, int number_iterations) = 0;
 
     /// return if current time step is accepted or not
     virtual bool accepted() const = 0;
diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp
index 7cab9ddaece..a44abfdbc8f 100644
--- a/ProcessLib/UncoupledProcessesTimeLoop.cpp
+++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp
@@ -356,7 +356,8 @@ double UncoupledProcessesTimeLoop::computeTimeStepping(
             timestepper->setAcceptedOrNot(false);
         }
 
-        if (!timestepper->next(solution_error) &&
+        if (!timestepper->next(solution_error,
+                               ppd.nonlinear_solver_status.number_iterations) &&
             // In case of FixedTimeStepping, which makes timestepper->next(...)
             // return false when the ending time is reached.
             t + std::numeric_limits<double>::epsilon() < timestepper->end())
-- 
GitLab