Skip to content

Commit eb7cfe3

Browse files
committed
Keep spatially extended residual in the levels after computation
1 parent 3abdb6a commit eb7cfe3

File tree

5 files changed

+11
-9
lines changed

5 files changed

+11
-9
lines changed

pySDC/core/level.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def __init__(self, problem_class, problem_params, sweeper_class, sweeper_params,
8383
self.u = [None] * (self.sweep.coll.num_nodes + 1)
8484
self.uold = [None] * (self.sweep.coll.num_nodes + 1)
8585
self.u_avg = [None] * self.sweep.coll.num_nodes
86+
self.residual = [None] * self.sweep.coll.num_nodes
8687
self.f = [None] * (self.sweep.coll.num_nodes + 1)
8788
self.fold = [None] * (self.sweep.coll.num_nodes + 1)
8889

pySDC/core/sweeper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,14 @@ def compute_residual(self, stage=''):
192192

193193
# build QF(u)
194194
res_norm = []
195-
res = self.integrate()
195+
L.residual = self.integrate()
196196
for m in range(self.coll.num_nodes):
197-
res[m] += L.u[0] - L.u[m + 1]
197+
L.residual[m] += L.u[0] - L.u[m + 1]
198198
# add tau if associated
199199
if L.tau[m] is not None:
200-
res[m] += L.tau[m]
200+
L.residual[m] += L.tau[m]
201201
# use abs function from data type here
202-
res_norm.append(abs(res[m]))
202+
res_norm.append(abs(L.residual[m]))
203203

204204
# find maximal residual over the nodes
205205
if L.params.residual_type == 'full_abs':

pySDC/implementations/controller_classes/controller_ParaDiag_nonMPI.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,11 @@ def swap_solution_for_all_at_once_residual(self, local_MS_running):
152152
hook.post_comm(step=S, level_number=0, add_to_stats=True)
153153

154154
# compute residuals locally
155-
residual = S.levels[0].sweep.get_residual()
156-
S.levels[0].status.residual = max(abs(me) for me in residual)
155+
S.levels[0].sweep.compute_residual()
157156

158157
# put residual in the solution variables
159158
for m in range(S.levels[0].sweep.coll.num_nodes):
160-
S.levels[0].u[m + 1] = residual[m]
159+
S.levels[0].u[m + 1] = S.levels[0].residual[m]
161160

162161
def swap_increment_for_solution(self, local_MS_running):
163162
"""

pySDC/implementations/sweeper_classes/ParaDiagSweepers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ def update_nodes(self):
122122
for m in range(M):
123123
L.u[m + 1] = y[m]
124124
if self.params.update_f_evals:
125-
raise
126125
L.f[m + 1] = P.eval_f(L.u[m + 1], L.time + L.dt * self.coll.nodes[m])
127126

128127
L.status.updated = True
@@ -154,6 +153,10 @@ def get_residual(self):
154153

155154
return residual
156155

156+
def compute_residual(self, *args, **kwargs):
157+
self.eval_f_at_all_nodes()
158+
return super().compute_residual(*args, **kwargs)
159+
157160

158161
class QDiagonalizationIMEX(QDiagonalization):
159162
"""

pySDC/tutorial/step_9/B_paradiag_for_nonlinear_problems.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ def residual(_u, u0):
168168
# do ParaDiag
169169
sol_paradiag = u.copy() * 0j
170170
u0 = u.copy()
171-
172171
niter = 0
173172
res = residual(sol_paradiag, u0)
174173
while np.max(np.abs(res)) > restol:

0 commit comments

Comments
 (0)