From 6389a000fa6bf1df37d6edb6c6051426a78e891e Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pauli.t.virtanen@jyu.fi>
Date: Wed, 14 Sep 2022 14:30:17 +0300
Subject: [PATCH] solver: count excess time to determine when recompute jac

---
 usadelndsoc/solver.py | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/usadelndsoc/solver.py b/usadelndsoc/solver.py
index c065b1b..43bd791 100644
--- a/usadelndsoc/solver.py
+++ b/usadelndsoc/solver.py
@@ -113,6 +113,7 @@ class Solver:
         self._M = None
         self._t_jac = 0.0
         self._t_solve = 0.0
+        self._t_solve_min = np.inf
 
     def set_shape(self, nx, ny=1):
         self._core.set_shape(nx, ny)
@@ -202,6 +203,7 @@ class Solver:
         if M is None:
             self._t_jac = 0.0
             self._t_solve = 0.0
+            self._t_solve_min = np.inf
 
         self._core.fix_terminals(Phi)
 
@@ -224,6 +226,7 @@ class Solver:
                 frozen_M = False
                 self._t_jac = time.time() - t0 if not first_jac else 0.0
                 self._t_solve = 0.0
+                self._t_solve_min = np.inf
             else:
                 # Don't update preconditioner
                 frozen_M = True
@@ -322,9 +325,11 @@ class Solver:
             else:
                 raise ValueError(f"Unknown {solver=}")
 
-            self._t_solve += time.time() - t0
+            dt = time.time() - t0
+            self._t_solve_min = min(dt, self._t_solve_min)
+            self._t_solve += dt - self._t_solve_min
 
-            if count >= l_maxiter * l_inner_m // 2 and self._t_solve > 2 * self._t_jac:
+            if count >= l_maxiter * l_inner_m // 2 and self._t_solve > self._t_jac:
                 M = None
 
             # Update
@@ -470,7 +475,7 @@ class Solver:
 
     def _eval_jac(self, Phi):
         if not self._core.hess_computed:
-            est = 1e-4 * (self.shape[0] * self.shape[1]) ** 2
+            est = 1.3e-4 * (self.shape[0] * self.shape[1]) ** 2
             _log_solve.info(
                 f"Forming Jacobian (probably takes around {est/60:.0f} min)..."
             )
@@ -553,6 +558,7 @@ class Solver:
 
         self._t_jac = 0.0
         self._t_solve = 0.0
+        self._t_solve_min = np.inf
         self._M = None
         self._Phi[...] = 0
         self._core.fix_terminals(Phi)
-- 
GitLab