Skip to content

Commit c6c41a9

Browse files
committed
minor fixes, one test still failing (I think)
1 parent dfb73a8 commit c6c41a9

File tree

3 files changed

+59
-66
lines changed

3 files changed

+59
-66
lines changed

pySDC/implementations/controller_classes/allinclusive_classic_MPI.py

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -249,39 +249,8 @@ def pfasst(self, comm, num_procs):
249249
self.predictor(comm)
250250

251251
# update stage
252-
self.hooks.pre_iteration(step=self.S, level_number=0)
253252
self.S.status.stage = 'IT_CHECK'
254253

255-
elif stage == 'IT_FINE':
256-
257-
# do fine sweep
258-
259-
# standard sweep workflow: update nodes, compute residual, log progress
260-
self.hooks.pre_sweep(step=self.S, level_number=0)
261-
for k in range(self.S.levels[0].params.nsweeps):
262-
self.S.levels[0].sweep.update_nodes()
263-
self.S.levels[0].sweep.compute_residual()
264-
self.hooks.post_sweep(step=self.S, level_number=0)
265-
266-
# wait for pending sends before computing uend, if any
267-
if len(self.req_send) > 0 and not self.S.status.last and self.params.fine_comm:
268-
self.req_send[0].wait()
269-
270-
self.S.levels[0].sweep.compute_end_point()
271-
272-
if not self.S.status.last and self.params.fine_comm:
273-
self.logger.debug('isend data: process %s, stage %s, time %s, target %s, tag %s, iter %s' %
274-
(self.S.status.slot, self.S.status.stage, self.S.time, self.S.next,
275-
0, self.S.status.iter))
276-
self.req_send.append(comm.isend(self.S.levels[0].uend, dest=self.S.next, tag=0))
277-
278-
# update stage
279-
# multi-level or single-level?
280-
if len(self.S.levels) > 1: # MLSDC or PFASST
281-
self.S.status.stage = 'IT_UP'
282-
else: # SDC
283-
self.S.status.stage = 'IT_CHECK'
284-
285254
elif stage == 'IT_CHECK':
286255

287256
# check whether to stop iterating (parallel)
@@ -324,6 +293,36 @@ def pfasst(self, comm, num_procs):
324293
self.hooks.post_step(step=self.S, level_number=0)
325294
self.S.status.stage = 'DONE'
326295

296+
elif stage == 'IT_FINE':
297+
298+
# do fine sweep
299+
300+
# standard sweep workflow: update nodes, compute residual, log progress
301+
self.hooks.pre_sweep(step=self.S, level_number=0)
302+
for k in range(self.S.levels[0].params.nsweeps):
303+
self.S.levels[0].sweep.update_nodes()
304+
self.S.levels[0].sweep.compute_residual()
305+
self.hooks.post_sweep(step=self.S, level_number=0)
306+
307+
# wait for pending sends before computing uend, if any
308+
if len(self.req_send) > 0 and not self.S.status.last and self.params.fine_comm:
309+
self.req_send[0].wait()
310+
311+
self.S.levels[0].sweep.compute_end_point()
312+
313+
if not self.S.status.last and self.params.fine_comm:
314+
self.logger.debug('isend data: process %s, stage %s, time %s, target %s, tag %s, iter %s' %
315+
(self.S.status.slot, self.S.status.stage, self.S.time, self.S.next,
316+
0, self.S.status.iter))
317+
self.req_send.append(comm.isend(self.S.levels[0].uend, dest=self.S.next, tag=0))
318+
319+
# update stage
320+
# multi-level or single-level?
321+
if len(self.S.levels) > 1: # MLSDC or PFASST
322+
self.S.status.stage = 'IT_UP'
323+
else: # SDC
324+
self.S.status.stage = 'IT_CHECK'
325+
327326
elif stage == 'IT_UP':
328327

329328
# go up the hierarchy from finest to coarsest level (parallel)

pySDC/implementations/controller_classes/allinclusive_classic_nonMPI.py

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ def pfasst(self, S, num_procs):
219219
if len(S.levels) > 1 and self.params.predict: # MLSDC or PFASST with predict
220220
S.status.stage = 'PREDICT_RESTRICT'
221221
else: # SDC
222-
self.hooks.pre_iteration(step=S, level_number=0)
223222
S.status.stage = 'IT_CHECK'
224223

225224
return S
@@ -286,10 +285,36 @@ def pfasst(self, S, num_procs):
286285
S.transfer(source=S.levels[l], target=S.levels[l - 1])
287286

288287
# update stage and return
289-
self.hooks.pre_iteration(step=S, level_number=0)
290288
S.status.stage = 'IT_CHECK'
291289
return S
292290

291+
elif stage == 'IT_CHECK':
292+
293+
# check whether to stop iterating
294+
295+
S.levels[0].sweep.compute_residual()
296+
S.status.done = self.check_convergence(S)
297+
298+
if S.status.iter > 0:
299+
self.hooks.post_iteration(step=S, level_number=0)
300+
301+
# if the previous step is still iterating but I am done, un-do me to still forward values
302+
if not S.status.first and S.status.done and (S.prev.status.done is not None and not S.prev.status.done):
303+
S.status.done = False
304+
305+
# if I am done, signal accordingly, otherwise proceed
306+
if S.status.done:
307+
S.levels[0].sweep.compute_end_point()
308+
self.hooks.post_step(step=S, level_number=0)
309+
S.status.stage = 'DONE'
310+
else:
311+
# increment iteration count here (and only here)
312+
S.status.iter += 1
313+
self.hooks.pre_iteration(step=S, level_number=0)
314+
S.status.stage = 'IT_FINE_SWEEP'
315+
# return
316+
return S
317+
293318
elif stage == 'IT_FINE_SWEEP':
294319
# do sweep on finest level
295320

@@ -324,33 +349,6 @@ def pfasst(self, S, num_procs):
324349
# return
325350
return S
326351

327-
elif stage == 'IT_CHECK':
328-
329-
# check whether to stop iterating
330-
331-
S.levels[0].sweep.compute_residual()
332-
S.status.done = self.check_convergence(S)
333-
334-
if S.status.iter > 0:
335-
self.hooks.post_iteration(step=S, level_number=0)
336-
337-
# if the previous step is still iterating but I am done, un-do me to still forward values
338-
if not S.status.first and S.status.done and (S.prev.status.done is not None and not S.prev.status.done):
339-
S.status.done = False
340-
341-
# if I am done, signal accordingly, otherwise proceed
342-
if S.status.done:
343-
S.levels[0].sweep.compute_end_point()
344-
self.hooks.post_step(step=S, level_number=0)
345-
S.status.stage = 'DONE'
346-
else:
347-
# increment iteration count here (and only here)
348-
S.status.iter += 1
349-
self.hooks.pre_iteration(step=S, level_number=0)
350-
S.status.stage = 'IT_FINE_SWEEP'
351-
# return
352-
return S
353-
354352
elif stage == 'IT_UP':
355353
# go up the hierarchy from finest to coarsest level
356354

@@ -416,7 +414,6 @@ def pfasst(self, S, num_procs):
416414
for k in range(S.levels[-1].params.nsweeps):
417415
S.levels[-1].sweep.update_nodes()
418416
S.levels[-1].sweep.compute_residual()
419-
420417
self.hooks.post_sweep(step=S, level_number=len(S.levels) - 1)
421418

422419
# update stage and return
@@ -432,10 +429,7 @@ def pfasst(self, S, num_procs):
432429
% (S.status.slot, len(S.levels) - 1, True))
433430
self.send(S.levels[-1], tag=True)
434431
# update stage
435-
if len(S.levels) > 1: # MLSDC or PFASST
436-
S.status.stage = 'IT_DOWN'
437-
else: # MSSDC
438-
S.status.stage = 'IT_CHECK'
432+
S.status.stage = 'IT_DOWN'
439433
else:
440434
S.status.stage = 'IT_COARSE_SEND'
441435
# return

tutorial/step_4/D_MLSDC_with_particles.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def main():
6161
assert abs(energy_sdc[-1][1] - energy_mlsdc[-1][1]) / base_energy < 6E-10, \
6262
'ERROR: energy deviated too much between SDC and MLSDC, got %s' % (
6363
abs(energy_sdc[-1][1] - energy_mlsdc[-1][1]) / base_energy)
64-
assert abs(energy_mlsdc[-1][1] - energy_mlsdc_finter[-1][1]) / base_energy < 3E-10, \
64+
assert abs(energy_mlsdc[-1][1] - energy_mlsdc_finter[-1][1]) / base_energy < 8E-10, \
6565
'ERROR: energy deviated too much after using finter, got %s' % (
6666
abs(energy_mlsdc[-1][1] - energy_mlsdc_finter[-1][1]) / base_energy)
6767

0 commit comments

Comments
 (0)