From 034e434b94832367cfa71e99c49b17de3366e990 Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Sat, 23 Apr 2016 11:09:02 +0200 Subject: [PATCH] [MaL] solve returns success code --- MathLib/ODE/CVodeSolver.cpp | 13 +++++++++---- MathLib/ODE/CVodeSolver.h | 2 +- MathLib/ODE/ConcreteOdeSolver.h | 2 +- MathLib/ODE/OdeSolver.h | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/MathLib/ODE/CVodeSolver.cpp b/MathLib/ODE/CVodeSolver.cpp index 0261d3b1f22..617f27cf3f2 100644 --- a/MathLib/ODE/CVodeSolver.cpp +++ b/MathLib/ODE/CVodeSolver.cpp @@ -93,7 +93,7 @@ private: void setFunction(std::unique_ptr<detail::FunctionHandles>&& f); void preSolve(); - void solve(const double t_end); + bool solve(const double t_end); double const* getSolution() const { return NV_DATA_S(_y); } double getTime() const { return _t; } @@ -263,12 +263,17 @@ void CVodeSolverImpl::preSolve() } } -void CVodeSolverImpl::solve(const double t_end) +bool CVodeSolverImpl::solve(const double t_end) { realtype t_reached; check_error("CVode solve", CVode(_cvode_mem, t_end, _y, &t_reached, CV_NORMAL)); _t = t_reached; + + // check_error asserts that t_end == t_reached and that solving the ODE + // went fine. Otherwise the program will be aborted. Therefore, we don't + // have to check manually for errors here and can always savely return true. + return true; } void CVodeSolverImpl::getYDot(const double t, double const* const y, @@ -325,9 +330,9 @@ void CVodeSolver::preSolve() _impl->preSolve(); } -void CVodeSolver::solve(const double t_end) +bool CVodeSolver::solve(const double t_end) { - _impl->solve(t_end); + return _impl->solve(t_end); } double const* CVodeSolver::getSolution() const diff --git a/MathLib/ODE/CVodeSolver.h b/MathLib/ODE/CVodeSolver.h index 40fc1e6456b..c36e55e0a2f 100644 --- a/MathLib/ODE/CVodeSolver.h +++ b/MathLib/ODE/CVodeSolver.h @@ -39,7 +39,7 @@ protected: void setIC(const double t0, double const* const y0); void preSolve(); - void solve(const double t_end); + bool solve(const double t_end); double const* getSolution() const; double getTime() const; diff --git a/MathLib/ODE/ConcreteOdeSolver.h b/MathLib/ODE/ConcreteOdeSolver.h index c6ccce9c3c5..06dad3d19c8 100644 --- a/MathLib/ODE/ConcreteOdeSolver.h +++ b/MathLib/ODE/ConcreteOdeSolver.h @@ -83,7 +83,7 @@ public: } void preSolve() override { Implementation::preSolve(); } - void solve(const double t) override { Implementation::solve(t); } + bool solve(const double t) override { return Implementation::solve(t); } MappedConstVector<NumEquations> getSolution() const override { return MappedConstVector<NumEquations>{Implementation::getSolution()}; diff --git a/MathLib/ODE/OdeSolver.h b/MathLib/ODE/OdeSolver.h index 7a17de76bc7..800caa377cb 100644 --- a/MathLib/ODE/OdeSolver.h +++ b/MathLib/ODE/OdeSolver.h @@ -43,7 +43,7 @@ public: Eigen::Matrix<double, NumEquations, 1, Eigen::ColMajor> const& y0) = 0; virtual void preSolve() = 0; - virtual void solve(const double t) = 0; + virtual bool solve(const double t) = 0; virtual unsigned getNumEquations() const { return NumEquations; } virtual MappedConstVector<NumEquations> getSolution() const = 0; -- GitLab