You can overwrite dolfin::nls::NewtonSolver::converged
. E.g. modify the CustomSolver
in your link with the following
class CustomSolver(NewtonSolver):
def __init__(self):
NewtonSolver.__init__(self, mesh.mpi_comm(),
PETScKrylovSolver(), PETScFactory.instance())
def solver_setup(self, A, P, problem, iteration):
self.linear_solver().set_operator(A)
PETScOptions.set("ksp_type", "gmres")
PETScOptions.set("ksp_monitor")
PETScOptions.set("pc_type", "ilu")
self.linear_solver().set_from_options()
def converged(self, r, problem, iteration):
if iteration == 0:
self.r0 = r.norm("l2")
print(f"Iteration {iteration}, relative residual {r.norm('l2')/self.r0:.6e}")
return super().converged(r, problem, iteration)