diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp index db4199d117c7ba6c7eb50590c1ada6989c780cc8..db4dcb4bf49cbeb26cdc43c5973c3780dc3a8305 100644 --- a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp +++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp @@ -35,6 +35,30 @@ ConvergenceCriterionPerComponentResidual:: OGS_FATAL("The given tolerances vector is empty."); } + +void ConvergenceCriterionPerComponentResidual::checkDeltaX( + const GlobalVector& minus_delta_x, GlobalVector const& x) +{ + if ((!_dof_table) || (!_mesh)) + OGS_FATAL("D.o.f. table or mesh have not been set."); + + for (unsigned global_component = 0; global_component < _abstols.size(); + ++global_component) + { + // TODO short cut if tol <= 0.0 + auto error_dx = norm(minus_delta_x, global_component, _norm_type, + *_dof_table, *_mesh); + auto norm_x = + norm(x, global_component, _norm_type, *_dof_table, *_mesh); + + INFO( + "Convergence criterion, component %u: |dx|=%.4e, |x|=%.4e, " + "|dx|/|x|=%.4e", + error_dx, global_component, norm_x, error_dx / norm_x); + } +} + + void ConvergenceCriterionPerComponentResidual::checkResidual( const GlobalVector& residual) { diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h index 885addf410a9c186a3e5fcd6aabc7c5c9354a3c8..2c7c36a434398057e320aaf8e718926877884775 100644 --- a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h +++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h @@ -33,11 +33,11 @@ public: std::vector<double>&& relative_tolerances, 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 {} + void checkDeltaX(const GlobalVector& minus_delta_x, + GlobalVector const& x) override; void checkResidual(const GlobalVector& residual) override; void preFirstIteration() override { _is_first_iteration = true; }