Skip to content

Commit 64bfbeb

Browse files
committed
added nsweeps parameter to level + LU2 for MG testing
1 parent c82703f commit 64bfbeb

File tree

5 files changed

+71
-10
lines changed

5 files changed

+71
-10
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from __future__ import division
2+
from pySDC.core.Hooks import hooks
3+
4+
5+
class error_output(hooks):
6+
"""
7+
Hook class to add output of error
8+
"""
9+
10+
def pre_iteration(self, step, level_number):
11+
12+
super(error_output, self).pre_iteration(step, level_number)
13+
14+
# some abbreviations
15+
L = step.levels[level_number]
16+
P = L.prob
17+
18+
for m in range(1, L.sweep.coll.num_nodes + 1):
19+
L.uold[m] = P.dtype_u(L.u[m])
20+
21+
def post_iteration(self, step, level_number):
22+
"""
23+
Default routine called after each iteration
24+
Args:
25+
step: the current step
26+
level_number: the current level number
27+
"""
28+
29+
super(error_output, self).post_iteration(step, level_number)
30+
31+
# some abbreviations
32+
L = step.levels[level_number]
33+
P = L.prob
34+
35+
L.sweep.compute_end_point()
36+
37+
uex = P.u_exact(step.time + step.dt)
38+
err = abs(uex - L.uend)
39+
40+
est = []
41+
42+
for m in range(1, L.sweep.coll.num_nodes + 1):
43+
est.append(abs(L.uold[m] - L.u[m]))
44+
45+
est_all = max(est)
46+
47+
print(step.status.iter, err, est_all, L.status.residual)

playgrounds/HeatEquation/periodic_playground.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
77
from pySDC.implementations.transfer_classes.TransferMesh import mesh_to_mesh
88
from pySDC.implementations.controller_classes.allinclusive_classic_nonMPI import allinclusive_classic_nonMPI
9+
from pySDC.implementations.controller_classes.allinclusive_multigrid_nonMPI import allinclusive_multigrid_nonMPI
910

1011
from pySDC.helpers.stats_helper import filter_stats, sort_stats
1112

13+
from playgrounds.HeatEquation.HookClass_error_output import error_output
14+
1215

1316
def main():
1417
"""
@@ -17,19 +20,19 @@ def main():
1720

1821
# initialize level parameters
1922
level_params = dict()
20-
level_params['restol'] = 1E-10
23+
level_params['restol'] = 1E-08
2124
level_params['dt'] = 0.25
2225

2326
# initialize sweeper parameters
2427
sweeper_params = dict()
2528
sweeper_params['collocation_class'] = CollGaussRadau_Right
2629
sweeper_params['num_nodes'] = [3]
27-
sweeper_params['QI'] = 'LU' # For the IMEX sweeper, the LU-trick can be activated for the implicit part
30+
sweeper_params['QI'] = ['LU'] # For the IMEX sweeper, the LU-trick can be activated for the implicit part
2831

2932
# initialize problem parameters
3033
problem_params = dict()
31-
problem_params['nu'] = 1 # diffusion coefficient
32-
problem_params['freq'] = 8 # frequency for the test value
34+
problem_params['nu'] = 1E+05 # diffusion coefficient
35+
problem_params['freq'] = 4 # frequency for the test value
3336
problem_params['nvars'] = [128, 64] # number of degrees of freedom for each level
3437

3538
# initialize step parameters
@@ -45,6 +48,7 @@ def main():
4548
# initialize controller parameters
4649
controller_params = dict()
4750
controller_params['logger_level'] = 30
51+
# controller_params['hook_class'] = error_output
4852

4953
# fill description dictionary for easy step instantiation
5054
description = dict()
@@ -61,7 +65,7 @@ def main():
6165

6266
# set time parameters
6367
t0 = 0.0
64-
Tend = 1.0
68+
Tend = 4 * level_params['dt']
6569

6670
# set up number of parallel time-steps to run PFASST with
6771
num_proc = 4

pySDC/core/Level.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class __Pars(FrozenClass):
5151
def __init__(self, params):
5252
self.dt = None
5353
self.restol = 0.0
54+
self.nsweeps = 1
5455
for k, v in params.items():
5556
setattr(self, k, v)
5657
# freeze class, no further attributes allowed from this point

pySDC/core/Sweeper.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ def rho(x):
7676
QT = coll.Qmat[1:, 1:].T
7777
[_, _, U] = scipy.linalg.lu(QT, overwrite_a=True)
7878
QDmat[1:, 1:] = U.T
79+
elif qd_type == 'LU2':
80+
QT = coll.Qmat[1:, 1:].T
81+
[_, _, U] = scipy.linalg.lu(QT, overwrite_a=True)
82+
QDmat[1:, 1:] = 2 * U.T
7983
elif qd_type == 'IE':
8084
for m in range(coll.num_nodes + 1):
8185
QDmat[m, 1:m + 1] = coll.delta_m[0:m]
@@ -150,7 +154,7 @@ def compute_residual(self):
150154
L = self.level
151155

152156
# check if there are new values (e.g. from a sweep)
153-
assert L.status.updated
157+
# assert L.status.updated
154158

155159
# compute the residual for each node
156160

pySDC/implementations/controller_classes/allinclusive_classic_nonMPI.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,9 @@ def pfasst(self, S, num_procs):
301301

302302
# standard sweep workflow: update nodes, compute residual, log progress
303303
self.hooks.pre_sweep(step=S, level_number=0)
304-
S.levels[0].sweep.update_nodes()
304+
305+
for k in range(S.levels[0].params.nsweeps):
306+
S.levels[0].sweep.update_nodes()
305307
S.levels[0].sweep.compute_residual()
306308
self.hooks.post_sweep(step=S, level_number=0)
307309

@@ -363,7 +365,8 @@ def pfasst(self, S, num_procs):
363365
# sweep and send on middle levels (not on finest, not on coarsest, though)
364366
for l in range(1, len(S.levels) - 1):
365367
self.hooks.pre_sweep(step=S, level_number=l)
366-
S.levels[l].sweep.update_nodes()
368+
for k in range(S.levels[l].params.nsweeps):
369+
S.levels[l].sweep.update_nodes()
367370
S.levels[l].sweep.compute_residual()
368371
self.hooks.post_sweep(step=S, level_number=l)
369372

@@ -416,7 +419,8 @@ def pfasst(self, S, num_procs):
416419

417420
# standard sweep workflow: update nodes, compute residual, log progress
418421
self.hooks.pre_sweep(step=S, level_number=len(S.levels) - 1)
419-
S.levels[-1].sweep.update_nodes()
422+
for k in range(S.levels[-1].params.nsweeps):
423+
S.levels[-1].sweep.update_nodes()
420424
S.levels[-1].sweep.compute_residual()
421425

422426
self.hooks.post_sweep(step=S, level_number=len(S.levels) - 1)
@@ -465,7 +469,8 @@ def pfasst(self, S, num_procs):
465469
# on middle levels: do sweep as usual
466470
if l - 1 > 0:
467471
self.hooks.pre_sweep(step=S, level_number=l - 1)
468-
S.levels[l - 1].sweep.update_nodes()
472+
for k in range(S.levels[l - 1].params.nsweeps):
473+
S.levels[l - 1].sweep.update_nodes()
469474
S.levels[l - 1].sweep.compute_residual()
470475
self.hooks.post_sweep(step=S, level_number=l - 1)
471476

0 commit comments

Comments
 (0)