@@ -26,10 +26,10 @@ Solver::Solver(RHS &rhs, Jacobian &jac, MassMatrix &mass, SolverOptions &opt)
2626 if (m_opt.verbosity > 1 )
2727 {
2828 std::cout << " Float precision: " << 8 * sizeof (float_type)
29- << " bit\n " ;
29+ << " bit\n " ;
3030 std::cout << " Integer precision: " << 8 * sizeof (MKL_INT) << " bit\n " ;
3131 std::cout << " Numerical algorithm: BDF-" << m_opt.bdf_order
32- << std::endl;
32+ << std::endl;
3333 }
3434
3535 // Initialises the internal solver memory pointer. This is only
@@ -147,6 +147,13 @@ int Solver::operator()(state_type &x, double &t1)
147147 // Counts linear solver calls
148148 std::size_t calls = 0 ;
149149
150+ // Counts how many times the Newton iterator failed to converge within
151+ // max_Newton_iter iterations in a row.
152+ int n_iter_failed = 0 ;
153+
154+ // Can be set to true by the solver if it fails to converge
155+ bool fact_every_iter = m_opt.fact_every_iter ;
156+
150157 if (m_opt.verbosity == 1 )
151158 {
152159 std::cout << " Calculating..." ;
@@ -191,12 +198,16 @@ int Solver::operator()(state_type &x, double &t1)
191198 m_iterator_state.current_scheme ++;
192199 }
193200
194- int iter; // We need this value later
201+ fact_every_iter = (n_iter_failed >= m_opt.newton_failed_attempts )
202+ ? true
203+ : m_opt.fact_every_iter ;
204+
205+ int iter; // Loop index. We need this value later
195206
196207 for (iter = 0 ; iter < m_opt.max_Newton_iter ; iter++)
197208 {
198209 // Reordering, Symbolic and Numerical Factorization
199- if (m_opt. fact_every_iter || iter == 0 || !(iter % m_opt.fact_iter ))
210+ if (fact_every_iter || iter == 0 || !(iter % m_opt.fact_iter ))
200211 {
201212 // Time Integrator with updated Jacobian
202213 m_ti->integrate (J, b, x, m_x_prev, m_iterator_state.t ,
@@ -369,12 +380,17 @@ int Solver::operator()(state_type &x, double &t1)
369380 // Trying to reduce the time step.
370381 if (iter == m_opt.max_Newton_iter )
371382 {
383+ n_iter_failed++;
372384 if (m_opt.verbosity > 1 )
373385 std::cout << " <- redo" ;
374386 if (m_reset_ti_state (x, m_x_prev))
375387 return 3 ; // Newton method failed to converge
376388 continue ;
377389 }
390+ else
391+ {
392+ n_iter_failed = 0 ;
393+ }
378394
379395 // The solver has reached the target time t1 or the stop condition
380396 // triggered.
0 commit comments