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