Skip to content

Commit 9fd0308

Browse files
author
Thomas Baumann
committed
Fixed adaptivity notebook
1 parent 4368ada commit 9fd0308

File tree

9 files changed

+86
-33
lines changed

9 files changed

+86
-33
lines changed

pySDC/implementations/hooks/log_errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def post_step(self, step, level_number):
2424
iter=step.status.iter,
2525
sweep=L.status.sweep,
2626
type='e_global',
27-
value=abs(L.prob.u_exact(t=L.time + L.dt) - L.u[-1]),
27+
value=abs(L.prob.u_exact(t=L.time + L.dt) - L.uend),
2828
)
2929

3030

@@ -51,5 +51,5 @@ def post_step(self, step, level_number):
5151
iter=step.status.iter,
5252
sweep=L.status.sweep,
5353
type='e_local',
54-
value=abs(L.prob.u_exact(t=L.time + L.dt, u_init=L.u[0], t_init=L.time) - L.u[-1]),
54+
value=abs(L.prob.u_exact(t=L.time + L.dt, u_init=L.u[0], t_init=L.time) - L.uend),
5555
)

pySDC/projects/Resilience/Adaptivity.ipynb

Lines changed: 6 additions & 5 deletions
Large diffs are not rendered by default.

pySDC/projects/Resilience/advection.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,20 @@
33
from pySDC.implementations.problem_classes.AdvectionEquation_ND_FD import advectionNd
44
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
55
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
6-
from pySDC.core.Hooks import hooks
76
from pySDC.helpers.stats_helper import get_sorted
87
import numpy as np
9-
from pySDC.projects.Resilience.hook import log_data, hook_collection
8+
from pySDC.projects.Resilience.hook import LogData, hook_collection
109
from pySDC.projects.Resilience.fault_injection import prepare_controller_for_faults
1110

1211

1312
def plot_embedded(stats, ax):
1413
u = get_sorted(stats, type='u', recomputed=False)
1514
uold = get_sorted(stats, type='uold', recomputed=False)
16-
t = [get_sorted(stats, type='u', recomputed=False)[i][0] for i in range(len(u))]
17-
e_em = np.array(get_sorted(stats, type='e_embedded', recomputed=False))[:, 1]
15+
t = [me[0] for me in u]
16+
e_em = get_sorted(stats, type='error_embedded_estimate', recomputed=False)
1817
e_em_semi_glob = [abs(u[i][1] - uold[i][1]) for i in range(len(u))]
1918
ax.plot(t, e_em_semi_glob, label=r'$\|u^{\left(k-1\right)}-u^{\left(k\right)}\|$')
20-
ax.plot(t, e_em, linestyle='--', label=r'$\epsilon$')
19+
ax.plot([me[0] for me in e_em], [me[1] for me in e_em], linestyle='--', label=r'$\epsilon$')
2120
ax.set_xlabel(r'$t$')
2221
ax.legend(frameon=False)
2322

@@ -26,7 +25,7 @@ def run_advection(
2625
custom_description=None,
2726
num_procs=1,
2827
Tend=2e-1,
29-
hook_class=log_data,
28+
hook_class=LogData,
3029
fault_stuff=None,
3130
custom_controller_params=None,
3231
custom_problem_params=None,
@@ -100,3 +99,26 @@ def run_advection(
10099
# call main function to get things done...
101100
uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend)
102101
return stats, controller, Tend
102+
103+
104+
if __name__ == '__main__':
105+
import matplotlib.pyplot as plt
106+
from pySDC.implementations.convergence_controller_classes.adaptivity import Adaptivity
107+
from pySDC.projects.Resilience.hook import LogUold
108+
109+
adaptivity_params = dict()
110+
adaptivity_params['e_tol'] = 1e-8
111+
112+
convergence_controllers = dict()
113+
convergence_controllers[Adaptivity] = adaptivity_params
114+
115+
description = dict()
116+
description['convergence_controllers'] = convergence_controllers
117+
118+
fig, axs = plt.subplots(1, 2, figsize=(12, 4), sharex=True, sharey=True)
119+
plot_embedded(run_advection(description, 1, hook_class=LogUold)[0], axs[0])
120+
plot_embedded(run_advection(description, 4, hook_class=LogUold)[0], axs[1])
121+
axs[0].set_title('1 process')
122+
axs[1].set_title('4 processes')
123+
fig.tight_layout()
124+
plt.show()

pySDC/projects/Resilience/fault_stats.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import pySDC.helpers.plot_helper as plot_helper
99
from pySDC.helpers.stats_helper import get_sorted
1010

11-
from pySDC.projects.Resilience.hook import hook_collection, LogUAllIter
11+
from pySDC.projects.Resilience.hook import hook_collection, LogUAllIter, LogData
1212
from pySDC.projects.Resilience.fault_injection import get_fault_injector_hook
1313
from pySDC.implementations.convergence_controller_classes.hotrod import HotRod
1414
from pySDC.implementations.convergence_controller_classes.adaptivity import Adaptivity
@@ -490,7 +490,7 @@ def generate_stats(self, strategy=None, runs=1000, reload=True, faults=True):
490490

491491
return None
492492

493-
def single_run(self, strategy, run=0, faults=False, force_params=None, hook_class=hook_collection):
493+
def single_run(self, strategy, run=0, faults=False, force_params=None, hook_class=None):
494494
'''
495495
Run the problem once with the specified parameters
496496
@@ -505,6 +505,7 @@ def single_run(self, strategy, run=0, faults=False, force_params=None, hook_clas
505505
pySDC.Controller: The controller of the run
506506
float: The time the problem should have run to
507507
'''
508+
hook_class = hook_collection + [LogData] if hook_class is None else hook_class
508509
force_params = {} if force_params is None else force_params
509510

510511
# build the custom description
@@ -653,6 +654,7 @@ def scrutinize(self, strategy, run, faults=True):
653654

654655
t, u = get_sorted(stats, type='u')[-1]
655656
k = [me[1] for me in get_sorted(stats, type='k')]
657+
print(k)
656658

657659
print(f'\nOverview for {strategy.name} strategy')
658660

@@ -1089,7 +1091,10 @@ def analyse_adaptivity_single(self, run):
10891091
t_fault = get_sorted(stats[0], type='bitflip')[0][0]
10901092

10911093
# get embedded error
1092-
e_em = [[me[1] for me in get_sorted(stat, type='e_em', time=t_fault, sortby='iter')] for stat in stats]
1094+
e_em = [
1095+
[me[1] for me in get_sorted(stat, type='error_embedded_estimate', time=t_fault, sortby='iter')]
1096+
for stat in stats
1097+
]
10931098

10941099
# compute the global error
10951100
u_end = [get_sorted(stat, type='u')[-1] for stat in stats]
@@ -1159,9 +1164,15 @@ def analyse_HotRod_single(self, run):
11591164
t_fault = get_sorted(stats[0], type='bitflip')[0][0]
11601165

11611166
# get embedded error
1162-
e_em = [[me[1] for me in get_sorted(stat, type='e_em', time=t_fault, sortby='iter')] for stat in stats]
1167+
e_em = [
1168+
[me[1] for me in get_sorted(stat, type='error_embedded_estimate', time=t_fault, sortby='iter')]
1169+
for stat in stats
1170+
]
11631171
# get extrapolated error
1164-
e_ex = [[me[1] for me in get_sorted(stat, type='e_ex', time=t_fault, sortby='iter')] for stat in stats]
1172+
e_ex = [
1173+
[me[1] for me in get_sorted(stat, type='error_extrapolation_estimate', time=t_fault, sortby='iter')]
1174+
for stat in stats
1175+
]
11651176

11661177
# compute the global error
11671178
u_end = [get_sorted(stat, type='u')[-1] for stat in stats]

pySDC/projects/Resilience/heat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
66
from pySDC.core.Hooks import hooks
77
from pySDC.helpers.stats_helper import get_sorted
8-
from pySDC.projects.Resilience.hook import hook_collection, log_data
8+
from pySDC.projects.Resilience.hook import hook_collection, LogData
99
import numpy as np
1010

1111

1212
def run_heat(
1313
custom_description=None,
1414
num_procs=1,
1515
Tend=2e-1,
16-
hook_class=log_data,
16+
hook_class=LogData,
1717
fault_stuff=None,
1818
custom_controller_params=None,
1919
custom_problem_params=None,

pySDC/projects/Resilience/hook.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
hook_collection = [LogSolution, LogEmbeddedErrorEstimate, LogExtrapolationErrorEstimate, LogStepSize]
99

1010

11-
class log_data(hooks):
11+
class LogData(hooks):
1212
"""
1313
Record data required for analysis of problems in the resilience project
1414
"""
@@ -34,7 +34,7 @@ def post_step(self, step, level_number):
3434
process=step.status.slot,
3535
time=L.time,
3636
level=L.level_index,
37-
iter=0,
37+
iter=step.status.iter,
3838
sweep=L.status.sweep,
3939
type='restart',
4040
value=int(step.status.get('restart')),
@@ -52,6 +52,26 @@ def post_step(self, step, level_number):
5252
)
5353

5454

55+
class LogUold(hooks):
56+
"""
57+
Log last iterate at the end of the step. Since the hook comes after override of uold, we need to do this in each
58+
iteration. But we don't know which will be the last, so we just do `iter=-1` to override the previous value.
59+
"""
60+
61+
def post_iteration(self, step, level_number):
62+
super().post_iteration(step, level_number)
63+
L = step.levels[level_number]
64+
self.add_to_stats(
65+
process=step.status.slot,
66+
time=L.time + L.dt,
67+
level=L.level_index,
68+
iter=-1,
69+
sweep=L.status.sweep,
70+
type='uold',
71+
value=L.uold[-1],
72+
)
73+
74+
5575
class LogUAllIter(hooks):
5676
"""
5777
Log solution and errors after each iteration
@@ -68,7 +88,7 @@ def post_iteration(self, step, level_number):
6888
process=step.status.slot,
6989
time=L.time,
7090
level=L.level_index,
71-
iter=iter,
91+
iter=step.status.iter,
7292
sweep=L.status.sweep,
7393
type='u',
7494
value=L.uend,
@@ -77,17 +97,17 @@ def post_iteration(self, step, level_number):
7797
process=step.status.slot,
7898
time=L.time,
7999
level=L.level_index,
80-
iter=iter,
100+
iter=step.status.iter,
81101
sweep=L.status.sweep,
82-
type='e_em',
102+
type='error_embedded_estimate',
83103
value=L.status.get('error_embedded_estimate'),
84104
)
85105
self.add_to_stats(
86106
process=step.status.slot,
87107
time=L.time,
88108
level=L.level_index,
89-
iter=iter,
109+
iter=step.status.iter,
90110
sweep=L.status.sweep,
91-
type='e_ex',
111+
type='error_extrapolation_estimate',
92112
value=L.status.get('error_extrapolation_estimate'),
93113
)

pySDC/projects/Resilience/piline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
88
from pySDC.implementations.convergence_controller_classes.adaptivity import Adaptivity
99
from pySDC.implementations.convergence_controller_classes.hotrod import HotRod
10-
from pySDC.projects.Resilience.hook import log_data, hook_collection
10+
from pySDC.projects.Resilience.hook import LogData, hook_collection
1111

1212

1313
def run_piline(
1414
custom_description=None,
1515
num_procs=1,
1616
Tend=20.0,
17-
hook_class=log_data,
17+
hook_class=LogData,
1818
fault_stuff=None,
1919
custom_controller_params=None,
2020
custom_problem_params=None,

pySDC/projects/Resilience/vdp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
99
from pySDC.implementations.convergence_controller_classes.adaptivity import Adaptivity
1010
from pySDC.core.Errors import ProblemError
11-
from pySDC.projects.Resilience.hook import log_data, hook_collection
11+
from pySDC.projects.Resilience.hook import LogData, hook_collection
1212

1313

1414
def plot_step_sizes(stats, ax):
@@ -85,7 +85,7 @@ def run_vdp(
8585
custom_description=None,
8686
num_procs=1,
8787
Tend=10.0,
88-
hook_class=log_data,
88+
hook_class=LogData,
8989
fault_stuff=None,
9090
custom_controller_params=None,
9191
custom_problem_params=None,

pySDC/tests/test_projects/test_resilience/test_fault_injection.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ def test_fault_stats():
162162
for strategy in vdp_stats.strategies:
163163
dat = vdp_stats.load(strategy, True)
164164
recovered = len(dat['recovered'][dat['recovered'] == True])
165-
crashed = len(dat['error'][dat['error'] == np.inf])
166-
print(strategy.name, dat['recovered'], dat['error'])
165+
crashed = len(dat['error'][dat['error'] == np.inf]) # on some systems the last run crashes...
167166
assert (
168167
recovered >= recovered_reference[strategy.name] - crashed
169168
), f'Expected {recovered_reference[strategy.name]} recovered faults, but got {recovered} recovered faults in {strategy.name} strategy!'

0 commit comments

Comments
 (0)