Skip to content

Commit 9b7fe55

Browse files
committed
Added newton_failed_attempts option
1 parent ca4883c commit 9b7fe55

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/solver.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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.

src/solver_options.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ class SolverOptions
8989
// Otherwise stop with error message.
9090
bool redo_newton = false;
9191

92+
// If Newton method fails to converge within max_Newton_iter iterations in a
93+
// row, the solver will try to update Jacobian every single iteration.
94+
int newton_failed_attempts = 3;
95+
9296
// 1 - V-SATS will use NORM_infinity to estimate solution variability,
9397
// 2 - V-SATS will use NORM_2 (default)
9498
int vsats_norm = 2;

0 commit comments

Comments
 (0)