Skip to content

Commit 88809f5

Browse files
author
Thomas Baumann
committed
Added some more work counters
1 parent 1e1e309 commit 88809f5

File tree

4 files changed

+14
-2
lines changed

4 files changed

+14
-2
lines changed

pySDC/implementations/problem_classes/LeakySuperconductor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ def __init__(self, problem_params, dtype_u=mesh, dtype_f=mesh):
9696
self.leak = np.logical_and(self.xv > self.params.leak_range[0], self.xv < self.params.leak_range[1])
9797

9898
self.work_counters['newton'] = WorkCounter()
99+
self.work_counters['rhs'] = WorkCounter()
99100
if not self.params.direct_solver:
100101
self.work_counters['linear'] = WorkCounter()
101102

@@ -141,6 +142,7 @@ def eval_f(self, u, t):
141142
"""
142143
f = self.dtype_f(self.init)
143144
f[:] = self.A.dot(u.flatten()).reshape(self.params.nvars) + self.eval_f_non_linear(u, t)
145+
self.work_counters['rhs']()
144146
return f
145147

146148
def solve_system(self, rhs, factor, u0, t):
@@ -196,6 +198,7 @@ def get_non_linear_Jacobian(u):
196198
for n in range(0, self.params.newton_iter):
197199
# assemble G such that G(u) = 0 at the solution of the step
198200
G = u - factor * self.eval_f(u, t) - rhs
201+
self.work_counters['rhs'].niter -= 1 # Work regarding construction of the Jacobian etc. should count into the Newton iterations only
199202

200203
res = np.linalg.norm(G, np.inf)
201204
if res <= self.params.newton_tol and n > 0: # we want to make at least one Newton iteration
@@ -281,6 +284,7 @@ def eval_f(self, u, t):
281284
f.impl[:] = self.A.dot(u.flatten()).reshape(self.params.nvars)
282285
f.expl[:] = self.eval_f_non_linear(u, t)
283286

287+
self.work_counters['rhs']()
284288
return f
285289

286290
def solve_system(self, rhs, factor, u0, t):

pySDC/implementations/problem_classes/Lorenz.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import numpy as np
2-
from pySDC.core.Problem import ptype
2+
from pySDC.core.Problem import ptype, WorkCounter
33
from pySDC.implementations.datatype_classes.mesh import mesh
44

55

@@ -44,6 +44,7 @@ def __init__(self, problem_params):
4444
dtype_f=mesh,
4545
params=problem_params,
4646
)
47+
self.work_counters['newton'] = WorkCounter()
4748

4849
def eval_f(self, u, t):
4950
"""
@@ -122,6 +123,7 @@ def solve_system(self, rhs, dt, u0, t):
122123

123124
# update solution
124125
u = u - delta
126+
self.work_counters['newton']()
125127

126128
return u
127129

pySDC/implementations/problem_classes/Van_der_Pol_implicit.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from scipy.integrate import solve_ivp
33

44
from pySDC.core.Errors import ParameterError, ProblemError
5-
from pySDC.core.Problem import ptype
5+
from pySDC.core.Problem import ptype, WorkCounter
66
from pySDC.implementations.datatype_classes.mesh import mesh
77

88

@@ -39,6 +39,7 @@ def __init__(self, problem_params, dtype_u=mesh, dtype_f=mesh):
3939
super(vanderpol, self).__init__(
4040
(problem_params['nvars'], None, np.dtype('float64')), dtype_u, dtype_f, problem_params
4141
)
42+
self.work_counters['newton'] = WorkCounter()
4243

4344
def u_exact(self, t, u_init=None, t_init=None):
4445
"""
@@ -128,6 +129,7 @@ def solve_system(self, rhs, dt, u0, t):
128129
x1 = u[0]
129130
x2 = u[1]
130131
n += 1
132+
self.work_counters['newton']()
131133

132134
if np.isnan(res) and self.params.stop_at_nan:
133135
raise ProblemError('Newton got nan after %i iterations, aborting...' % n)

pySDC/projects/Resilience/leaky_superconductor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def compare_imex_full(plotting=False):
209209
newton_iter_max = 20
210210

211211
res = {}
212+
rhs = {}
212213

213214
custom_description = {}
214215
custom_description['problem_params'] = {
@@ -232,6 +233,7 @@ def compare_imex_full(plotting=False):
232233

233234
res[imex] = get_sorted(stats, type='u')[-1][1]
234235
newton_iter = [me[1] for me in get_sorted(stats, type='work_newton')]
236+
rhs[imex] = np.mean([me[1] for me in get_sorted(stats, type='work_rhs')]) // 1
235237

236238
if imex:
237239
assert all([me == 0 for me in newton_iter]), "IMEX is not supposed to do Newton iterations!"
@@ -252,6 +254,8 @@ def compare_imex_full(plotting=False):
252254
max(res[True]) > prob.params.u_max
253255
), f"Expected runaway to happen, but maximum temperature is {max(res[True]):.2e} < u_max={prob.params.u_max:.2e}!"
254256

257+
assert rhs[True] == rhs[False], f"Expected IMEX and fully implicit schemes to take the same number of right hand side evaluations per step, but got {rhs[True]} and {rhs[False]}!"
258+
255259

256260
if __name__ == '__main__':
257261
compare_imex_full(plotting=True)

0 commit comments

Comments
 (0)