diff --git a/NumLib/ODESolver/ConvergenceCriterion.h b/NumLib/ODESolver/ConvergenceCriterion.h index 95ab8e9fdd890cc88ad2e245114af2ad6712d594..db0024ed0bf6aee69f1d85fd069302c05fb0660f 100644 --- a/NumLib/ODESolver/ConvergenceCriterion.h +++ b/NumLib/ODESolver/ConvergenceCriterion.h @@ -53,6 +53,10 @@ public: //! Check if the residual satisfies the convergence criterion. virtual void checkResidual(GlobalVector const& residual) = 0; + //! Tell the ConvergenceCriterion that it is called for the first time now + //! (while solving a specific nonlinear system). + virtual void preFirstIteration() {} + //! Indicate that a new iteration now starts. //! //! A concrete implementation of ConvergenceCriterion might want to check diff --git a/NumLib/ODESolver/NonlinearSolver.cpp b/NumLib/ODESolver/NonlinearSolver.cpp index 4cf1e2d69a236e7c1aa8fd066d98abfd4741ced6..990d00a8ce1f5338dffa0f719ab6daa7ed3cec8b 100644 --- a/NumLib/ODESolver/NonlinearSolver.cpp +++ b/NumLib/ODESolver/NonlinearSolver.cpp @@ -48,12 +48,12 @@ bool NonlinearSolver<NonlinearSolverTag::Picard>::solve( LinAlg::copy(x, x_new); // set initial guess, TODO save the copy + _convergence_criterion->preFirstIteration(); unsigned iteration = 1; - for (; iteration <= _maxiter; ++iteration) + for (; iteration <= _maxiter; + ++iteration, _convergence_criterion->reset()) { - _convergence_criterion->reset(); - BaseLib::RunTime time_iteration; time_iteration.start(); @@ -192,11 +192,12 @@ bool NonlinearSolver<NonlinearSolverTag::Newton>::solve( LinAlg::copy(x, minus_delta_x); minus_delta_x.setZero(); + _convergence_criterion->preFirstIteration(); + unsigned iteration = 1; - for (; iteration <= _maxiter; ++iteration) + for (; iteration <= _maxiter; + ++iteration, _convergence_criterion->reset()) { - _convergence_criterion->reset(); - BaseLib::RunTime time_iteration; time_iteration.start();