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