From e61f4d0b93701e66170fcfeae27cb57fa5871de1 Mon Sep 17 00:00:00 2001 From: Norihiro Watanabe <norihiro.watanabe@ufz.de> Date: Fri, 4 Nov 2016 07:26:35 +0100 Subject: [PATCH] [Num/ODE] print norms of delta x in ConvergenceCriterionResidual --- NumLib/ODESolver/ConvergenceCriterionResidual.cpp | 10 ++++++++++ NumLib/ODESolver/ConvergenceCriterionResidual.h | 8 +++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/NumLib/ODESolver/ConvergenceCriterionResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionResidual.cpp index 04222e2be30..9f8e0b7df67 100644 --- a/NumLib/ODESolver/ConvergenceCriterionResidual.cpp +++ b/NumLib/ODESolver/ConvergenceCriterionResidual.cpp @@ -29,6 +29,16 @@ ConvergenceCriterionResidual::ConvergenceCriterionResidual( "specified."); } +void ConvergenceCriterionResidual::checkDeltaX(const GlobalVector& minus_delta_x, + GlobalVector const& x) +{ + auto error_dx = MathLib::LinAlg::norm(minus_delta_x, _norm_type); + auto norm_x = MathLib::LinAlg::norm(x, _norm_type); + + INFO("Convergence criterion: |dx|=%.4e, |x|=%.4e, |dx|/|x|=%.4e", error_dx, + norm_x, error_dx / norm_x); +} + void ConvergenceCriterionResidual::checkResidual(const GlobalVector& residual) { auto norm_res = MathLib::LinAlg::norm(residual, _norm_type); diff --git a/NumLib/ODESolver/ConvergenceCriterionResidual.h b/NumLib/ODESolver/ConvergenceCriterionResidual.h index 0ca02e66e49..44cb35bf4db 100644 --- a/NumLib/ODESolver/ConvergenceCriterionResidual.h +++ b/NumLib/ODESolver/ConvergenceCriterionResidual.h @@ -30,11 +30,13 @@ public: boost::optional<double>&& relative_tolerance, MathLib::VecNormType norm_type); - bool hasDeltaXCheck() const override { return false; } + bool hasDeltaXCheck() const override { return true; } bool hasResidualCheck() const override { return true; } - void checkDeltaX(const GlobalVector& /*minus_delta_x*/, - GlobalVector const& /*x*/) override {} + /// The function will only do diagnostic output and no actual check of the + /// solution increment is made + void checkDeltaX(const GlobalVector& minus_delta_x, + GlobalVector const& x) override; void checkResidual(const GlobalVector& residual) override; void preFirstIteration() override { _is_first_iteration = true; } -- GitLab