From 5c14cbff72371614bf88231bb966099dac0e76d5 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Mon, 3 Apr 2017 17:45:58 +0200
Subject: [PATCH] [dt] Changed some arguments of the members of the time
 stepper classes

---
 NumLib/ODESolver/TimeDiscretization.cpp       | 23 ++++++++++---------
 NumLib/ODESolver/TimeDiscretization.h         | 15 ++++++++----
 .../Algorithms/FixedTimeStepping.cpp          |  2 +-
 .../Algorithms/FixedTimeStepping.h            |  2 +-
 .../Algorithms/ITimeStepAlgorithm.h           |  7 ++----
 ...erationNumberBasedAdaptiveTimeStepping.cpp |  3 ++-
 ...IterationNumberBasedAdaptiveTimeStepping.h |  2 +-
 ProcessLib/UncoupledProcessesTimeLoop.cpp     |  7 +++++-
 8 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/NumLib/ODESolver/TimeDiscretization.cpp b/NumLib/ODESolver/TimeDiscretization.cpp
index 4120f19aa3e..4e84ac8ccf9 100644
--- a/NumLib/ODESolver/TimeDiscretization.cpp
+++ b/NumLib/ODESolver/TimeDiscretization.cpp
@@ -22,35 +22,36 @@ namespace NumLib
  *
  *  \warning the value of x_old is changed to x - x_old after this computation.
  */
-static double computeRelativeError(GlobalVector const& x, GlobalVector& x_old)
+static double computeRelativeError(GlobalVector const& x, GlobalVector& x_old,
+                                   MathLib::VecNormType norm_type)
 {
-    const double norm2_x = MathLib::LinAlg::norm2(x);
+    const double norm2_x = MathLib::LinAlg::norm(x, norm_type);
     assert(norm2_x > std::numeric_limits<double>::epsilon());
 
     // dx = x - x_old --> x_old
     MathLib::LinAlg::axpy(x_old, -1.0, x);
-    return MathLib::LinAlg::norm2(x_old) / norm2_x;
+    return MathLib::LinAlg::norm(x_old, norm_type) / norm2_x;
 }
 
-double BackwardEuler::getRelativeError(GlobalVector const& x)
+double BackwardEuler::getRelativeError(GlobalVector const& x, MathLib::VecNormType norm_type)
 {
-    return computeRelativeError(x, _x_old);
+    return computeRelativeError(x, _x_old, norm_type);
 }
 
-double ForwardEuler::getRelativeError(GlobalVector const& x)
+double ForwardEuler::getRelativeError(GlobalVector const& x, MathLib::VecNormType norm_type)
 {
-    return computeRelativeError(x, _x_old);
+    return computeRelativeError(x, _x_old, norm_type);
 }
 
-double CrankNicolson::getRelativeError(GlobalVector const& x)
+double CrankNicolson::getRelativeError(GlobalVector const& x, MathLib::VecNormType norm_type)
 {
-    return computeRelativeError(x, _x_old);
+    return computeRelativeError(x, _x_old, norm_type);
 }
 
-double BackwardDifferentiationFormula::getRelativeError(GlobalVector const& x)
+double BackwardDifferentiationFormula::getRelativeError(GlobalVector const& x, MathLib::VecNormType norm_type)
 {
     return (_xs_old.size() < _num_steps) ? 0. : computeRelativeError(
-                                                    x, *_xs_old[_offset]);
+                                                    x, *_xs_old[_offset], norm_type);
 }
 
 void BackwardDifferentiationFormula::pushState(const double,
diff --git a/NumLib/ODESolver/TimeDiscretization.h b/NumLib/ODESolver/TimeDiscretization.h
index 671aae90b68..6f2044d6c9f 100644
--- a/NumLib/ODESolver/TimeDiscretization.h
+++ b/NumLib/ODESolver/TimeDiscretization.h
@@ -125,7 +125,8 @@ public:
      *          before pushState(...), in which the value of _x_old is updated.
      * \param x    The solution at the current timestep.
      */
-    virtual double getRelativeError(GlobalVector const& x) = 0;
+    virtual double getRelativeError(GlobalVector const& x,
+                                    MathLib::VecNormType norm_type) = 0;
 
     /*! Indicate that the current timestep is done and that you will proceed to
      * the next one.
@@ -232,7 +233,8 @@ public:
         MathLib::LinAlg::copy(x0, _x_old);
     }
 
-    double getRelativeError(GlobalVector const& x) override;
+    double getRelativeError(GlobalVector const& x,
+                            MathLib::VecNormType norm_type) override;
 
     void pushState(const double /*t*/, GlobalVector const& x,
                    InternalMatrixStorage const&) override
@@ -284,7 +286,8 @@ public:
         MathLib::LinAlg::copy(x0, _x_old);
     }
 
-    double getRelativeError(GlobalVector const& x) override;
+    double getRelativeError(GlobalVector const& x,
+                            MathLib::VecNormType norm_type) override;
 
     void pushState(const double /*t*/, GlobalVector const& x,
                    InternalMatrixStorage const&) override
@@ -360,7 +363,8 @@ public:
         MathLib::LinAlg::copy(x0, _x_old);
     }
 
-    double getRelativeError(GlobalVector const& x) override;
+    double getRelativeError(GlobalVector const& x,
+                            MathLib::VecNormType norm_type) override;
 
     void pushState(const double, GlobalVector const& x,
                    InternalMatrixStorage const& strg) override
@@ -434,7 +438,8 @@ public:
             &NumLib::GlobalVectorProvider::provider.getVector(x0));
     }
 
-    double getRelativeError(GlobalVector const& x) override;
+    double getRelativeError(GlobalVector const& x,
+                            MathLib::VecNormType norm_type) override;
 
     void pushState(const double, GlobalVector const& x,
                    InternalMatrixStorage const&) override;
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
index caee9abc4c1..fa74b69f7ad 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
@@ -94,7 +94,7 @@ std::unique_ptr<ITimeStepAlgorithm> FixedTimeStepping::newInstance(
     return std::make_unique<FixedTimeStepping>(t_initial, t_end, timesteps);
 }
 
-bool FixedTimeStepping::next()
+bool FixedTimeStepping::next(const double /*solution_error*/)
 {
     // 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 b070548ab4e..40e0e3cf179 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
@@ -67,7 +67,7 @@ public:
         BaseLib::ConfigTree const& config);
 
     /// move to the next time step
-    bool next() override;
+    bool next(const double solution_error) override;
 
     /// return if current time step is accepted
     bool accepted() const override { return true; }
diff --git a/NumLib/TimeStepping/Algorithms/ITimeStepAlgorithm.h b/NumLib/TimeStepping/Algorithms/ITimeStepAlgorithm.h
index e70818a5696..e43b2cee496 100644
--- a/NumLib/TimeStepping/Algorithms/ITimeStepAlgorithm.h
+++ b/NumLib/TimeStepping/Algorithms/ITimeStepAlgorithm.h
@@ -56,13 +56,10 @@ public:
         _ts_current += dt;
     }
 
-    /// Assign solution error to the corresponding member, if it exists.
-    /// \param solution_error Solution error between two successive time steps.
-    virtual void setSolutionError(const double solution_error) = 0;
-
     /// move to the next time step
+    /// \param solution_error Solution error between two successive time steps.
     /// \return true if the next step exists
-    virtual bool next() = 0;
+    virtual bool next(const double solution_error) = 0;
 
     /// return if current time step is accepted or not
     virtual bool accepted() const = 0;
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.cpp
index 3b4238d9523..001f569af1f 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.cpp
@@ -37,7 +37,8 @@ IterationNumberBasedAdaptiveTimeStepping::
     assert(iter_times_vector.size() == multiplier_vector.size());
 }
 
-bool IterationNumberBasedAdaptiveTimeStepping::next()
+bool IterationNumberBasedAdaptiveTimeStepping::next(
+    const double /*solution_error*/)
 {
     // check current time step
     if (std::abs(_ts_current.current() - _t_end) <
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.h
index bbbb97a6f0c..4140e949dcf 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedAdaptiveTimeStepping.h
@@ -95,7 +95,7 @@ public:
     ~IterationNumberBasedAdaptiveTimeStepping() override = default;
 
     /// move to the next time step
-    bool next() override;
+    bool next(const double solution_error) override;
 
     /// return if the current step is accepted
     bool accepted() const override;
diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp
index 3e596eb9933..78885d772d3 100644
--- a/ProcessLib/UncoupledProcessesTimeLoop.cpp
+++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp
@@ -14,6 +14,7 @@
 #include "NumLib/ODESolver/TimeDiscretizedODESystem.h"
 #include "NumLib/ODESolver/ConvergenceCriterionPerComponent.h"
 #include "NumLib/TimeStepping/Algorithms/FixedTimeStepping.h"
+#include "NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h"
 
 #include "MathLib/LinAlg/LinAlg.h"
 
@@ -36,6 +37,10 @@ std::unique_ptr<NumLib::ITimeStepAlgorithm> createTimeStepper(
     {
         timestepper = NumLib::FixedTimeStepping::newInstance(config);
     }
+    else if (type == "EvolutionaryPIDcontroller")
+    {
+        timestepper = NumLib::createEvolutionaryPIDcontroller(config);
+    }
     else
     {
         OGS_FATAL("Unknown timestepper type: `%s'.", type.c_str());
@@ -633,7 +638,7 @@ bool UncoupledProcessesTimeLoop::loop()
             if (t > timestepper->end())  // skip the process that already stops
                 continue;
 
-            timestepper->next();
+            // TODO SOON          timestepper->next();
             if (timestepper->getTimeStep().dt() < dt)
             {
                 dt = timestepper->getTimeStep().dt();
-- 
GitLab