diff --git a/NumLib/ODESolver/ConvergenceCriterionResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionResidual.cpp index 04222e2be306ad3e1bebc2428320556e38c01ca1..9f8e0b7df67d03a7776eec555e2ce6a9ddee41b1 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 0ca02e66e49313dae964c54b13872ba393680fdd..44cb35bf4dba7d88fc5c3cc11516b988dad75bcd 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; }