Skip to content

Commit d89cac1

Browse files
Added hook for logging SDC iterations (#433)
1 parent b216d0d commit d89cac1

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

pySDC/implementations/hooks/log_work.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,27 @@ def post_step(self, step, level_number):
5353
type=f'work_{key}',
5454
value=L.prob.work_counters[key].niter - self.__work_last_step[step.status.slot][level_number][key],
5555
)
56+
57+
58+
class LogSDCIterations(hooks):
59+
"""
60+
Log the number of SDC iterations between steps.
61+
You can control the name in the stats via the class attribute ``name``.
62+
"""
63+
64+
name = 'k'
65+
66+
def post_step(self, step, level_number):
67+
super().post_step(step, level_number)
68+
69+
L = step.levels[level_number]
70+
self.increment_stats(
71+
process=step.status.slot,
72+
process_sweeper=L.sweep.rank,
73+
time=L.time + L.dt,
74+
level=L.level_index,
75+
iter=step.status.iter,
76+
sweep=L.status.sweep,
77+
type=self.name,
78+
value=step.status.iter,
79+
)

pySDC/tests/test_hooks/test_log_work.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
def run_Lorenz(useMPI, maxiter=4, newton_maxiter=5, num_procs=1):
5-
from pySDC.implementations.hooks.log_work import LogWork
5+
from pySDC.implementations.hooks.log_work import LogWork, LogSDCIterations
66
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
77
from pySDC.implementations.problem_classes.Lorenz import LorenzAttractor
88
from pySDC.helpers.stats_helper import get_sorted
@@ -32,7 +32,7 @@ def run_Lorenz(useMPI, maxiter=4, newton_maxiter=5, num_procs=1):
3232
# initialize controller parameters
3333
controller_params = {}
3434
controller_params['logger_level'] = 30
35-
controller_params['hook_class'] = LogWork
35+
controller_params['hook_class'] = [LogWork, LogSDCIterations]
3636
controller_params['mssdc_jac'] = False
3737

3838
# fill description dictionary for easy step instantiation
@@ -69,13 +69,16 @@ def run_Lorenz(useMPI, maxiter=4, newton_maxiter=5, num_procs=1):
6969

7070
uend, stats = controller.run(u0=uinit, t0=t0, Tend=num_steps * num_procs * level_params['dt'])
7171

72+
# print(stats)
7273
for i in range(num_procs):
7374
res = {
7475
key: [me[1] for me in get_sorted(stats, type=key, comm=comm, process=i)]
75-
for key in ['work_newton', 'work_rhs']
76+
for key in ['work_newton', 'work_rhs', LogSDCIterations.name]
7677
}
7778

7879
expected = {}
80+
expected[LogSDCIterations.name] = maxiter
81+
7982
if i == 0:
8083
# we evaluate all nodes when beginning the step and then every node except the initial conditions in every iteration
8184
expected['work_rhs'] = maxiter * sweeper_params['num_nodes'] + sweeper_params['num_nodes'] + 1

0 commit comments

Comments
 (0)