Skip to content

Commit b74c1d4

Browse files
committed
newton vs sdc stuff + fixes
1 parent 0158eee commit b74c1d4

File tree

8 files changed

+284
-5
lines changed

8 files changed

+284
-5
lines changed

projects/FastWaveSlowWave/runconvergence_acoustic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def compute_convergence_data(cwd=''):
4848
# initialize controller parameters
4949
controller_params = dict()
5050
controller_params['logger_level'] = 30
51+
controller_params['hook_class'] = dump_energy
5152

5253
# Fill description dictionary for easy hierarchy creation
5354
description = dict()
@@ -56,7 +57,6 @@ def compute_convergence_data(cwd=''):
5657
description['dtype_f'] = rhs_imex_mesh
5758
description['sweeper_class'] = imex_1st_order
5859
description['sweeper_params'] = sweeper_params
59-
description['hook_class'] = dump_energy
6060

6161
nsteps = np.zeros((3, 9))
6262
nsteps[0, :] = [20, 30, 40, 50, 60, 70, 80, 90, 100]

projects/FastWaveSlowWave/rungmrescounter_boussinesq.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def main(cwd=''):
4343
# initialize controller parameters
4444
controller_params = dict()
4545
controller_params['logger_level'] = 20
46+
controller_params['hook_class'] = gmres_tolerance
4647

4748
# initialize problem parameters
4849
problem_params = dict()
@@ -69,7 +70,6 @@ def main(cwd=''):
6970
description['sweeper_params'] = sweeper_params # pass sweeper parameters
7071
description['level_params'] = level_params # pass level parameters
7172
description['step_params'] = step_params # pass step parameters
72-
description['hook_class'] = gmres_tolerance
7373

7474
# ORDER OF DIRK/IMEX EQUAL TO NUMBER OF SDC ITERATIONS AND THUS SDC ORDER
7575
dirk_order = step_params['maxiter']

projects/FastWaveSlowWave/runitererror_acoustic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ def compute_and_plot_itererror():
5050
# initialize controller parameters
5151
controller_params = dict()
5252
controller_params['logger_level'] = 30
53+
controller_params['hook_class'] = dump_energy
5354

5455
# Fill description dictionary for easy hierarchy creation
5556
description = dict()
5657
description['problem_class'] = acoustic_1d_imex
5758
description['dtype_u'] = mesh
5859
description['dtype_f'] = rhs_imex_mesh
5960
description['sweeper_class'] = imex_1st_order
60-
description['hook_class'] = dump_energy
6161
description['step_params'] = step_params
6262
description['level_params'] = level_params
6363

projects/FastWaveSlowWave/runmultiscale_acoustic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def compute_and_plot_solutions():
5353
# initialize controller parameters
5454
controller_params = dict()
5555
controller_params['logger_level'] = 30
56+
controller_params['hook_class'] = dump_energy
5657

5758
# Fill description dictionary for easy hierarchy creation
5859
description = dict()
@@ -62,7 +63,6 @@ def compute_and_plot_solutions():
6263
description['dtype_f'] = rhs_imex_mesh
6364
description['sweeper_class'] = imex_1st_order
6465
description['sweeper_params'] = sweeper_params
65-
description['hook_class'] = dump_energy
6666
description['step_params'] = step_params
6767
description['level_params'] = level_params
6868

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from __future__ import division
2+
from pySDC.core.Hooks import hooks
3+
import numpy as np
4+
5+
6+
class err_reduction_hook(hooks):
7+
8+
def pre_iteration(self, step, level_number):
9+
"""
10+
Routine called before iteration starts
11+
12+
Args:
13+
step (pySDC.Step.step): the current step
14+
level_number (int): the current level number
15+
"""
16+
super(err_reduction_hook, self).pre_iteration(step, level_number)
17+
18+
L = step.levels[level_number]
19+
if step.status.iter == 2 and np.isclose(L.time+L.dt, 0.1):
20+
21+
P = L.prob
22+
23+
err = []
24+
for m in range(L.sweep.coll.num_nodes):
25+
uex = P.u_exact(L.time + L.dt * L.sweep.coll.nodes[m])
26+
err.append(abs(uex - L.u[m+1]))
27+
err_full = max(err)
28+
self.add_to_stats(process=step.status.slot, time=L.time, level=L.level_index, iter=step.status.iter,
29+
type='error_pre_iteration', value=err_full)
30+
# print(L.time, step.status.iter, err_full)
31+
32+
def post_iteration(self, step, level_number):
33+
"""
34+
Routine called after each iteration
35+
36+
Args:
37+
step (pySDC.Step.step): the current step
38+
level_number (int): the current level number
39+
"""
40+
super(err_reduction_hook, self).post_iteration(step, level_number)
41+
42+
L = step.levels[level_number]
43+
44+
if step.status.iter == 2 and np.isclose(L.time+L.dt, 0.1):
45+
46+
P = L.prob
47+
48+
err = []
49+
for m in range(L.sweep.coll.num_nodes):
50+
uex = P.u_exact(L.time + L.dt * L.sweep.coll.nodes[m])
51+
err.append(abs(uex - L.u[m + 1]))
52+
err_full = max(err)
53+
self.add_to_stats(process=step.status.slot, time=L.time, level=L.level_index, iter=step.status.iter,
54+
type='error_post_iteration', value=err_full)
55+
# print(L.time, step.status.iter, err_full)
56+
57+
58+

projects/parallelSDC/linearized_implicit_fixed_parallel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, params):
3030
assert self.params.fixed_time_in_jacobian in range(self.coll.num_nodes + 1), \
3131
"ERROR: fixed_time_in_jacobian is too small or too large, got %s" % self.params.fixed_time_in_jacobian
3232

33-
self.D, self.V = np.linalg.eig(self.QI[1:, 1:])
33+
self.D, self.V = np.linalg.eig(self.coll.Qmat[1:, 1:])
3434
self.Vi = np.linalg.inv(self.V)
3535

3636
def update_nodes(self):
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import numpy as np
2+
3+
from projects.parallelSDC.linearized_implicit_fixed_parallel import linearized_implicit_fixed_parallel
4+
5+
6+
class linearized_implicit_fixed_parallel_prec(linearized_implicit_fixed_parallel):
7+
"""
8+
Custom sweeper class, implements Sweeper.py
9+
10+
Attributes:
11+
D: eigenvalues of the QI
12+
"""
13+
14+
def __init__(self, params):
15+
"""
16+
Initialization routine for the custom sweeper
17+
18+
Args:
19+
params: parameters for the sweeper
20+
"""
21+
22+
if 'fixed_time_in_jacobian' not in params:
23+
params['fixed_time_in_jacobian'] = 0
24+
25+
# call parent's initialization routine
26+
super(linearized_implicit_fixed_parallel, self).__init__(params)
27+
28+
assert self.params.fixed_time_in_jacobian in range(self.coll.num_nodes + 1), \
29+
"ERROR: fixed_time_in_jacobian is too small or too large, got %s" % self.params.fixed_time_in_jacobian
30+
31+
self.D, self.V = np.linalg.eig(self.QI[1:, 1:])
32+
self.Vi = np.linalg.inv(self.V)
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import matplotlib
2+
matplotlib.use('Agg')
3+
4+
import pickle
5+
import os
6+
import matplotlib.pyplot as plt
7+
import numpy as np
8+
9+
from pySDC.implementations.datatype_classes.mesh import mesh
10+
from projects.parallelSDC.linearized_implicit_fixed_parallel import linearized_implicit_fixed_parallel
11+
from projects.parallelSDC.linearized_implicit_fixed_parallel_prec import linearized_implicit_fixed_parallel_prec
12+
from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
13+
from pySDC.implementations.collocation_classes.gauss_radau_right import CollGaussRadau_Right
14+
from pySDC.implementations.controller_classes.allinclusive_classic_nonMPI import allinclusive_classic_nonMPI
15+
16+
from projects.parallelSDC.GeneralizedFisher_1D_FD_implicit_Jac import generalized_fisher_jac
17+
from projects.parallelSDC.ErrReductionHook import err_reduction_hook
18+
19+
from pySDC.helpers.stats_helper import filter_stats, sort_stats
20+
21+
22+
def main():
23+
# initialize level parameters
24+
level_params = dict()
25+
level_params['restol'] = 1E-12
26+
27+
# This comes as read-in for the step class (this is optional!)
28+
step_params = dict()
29+
step_params['maxiter'] = 20
30+
31+
# This comes as read-in for the problem class
32+
problem_params = dict()
33+
problem_params['nu'] = 1
34+
problem_params['nvars'] = 2047
35+
problem_params['lambda0'] = 5.0
36+
problem_params['newton_maxiter'] = 50
37+
problem_params['newton_tol'] = 1E-12
38+
problem_params['interval'] = (-5, 5)
39+
40+
# This comes as read-in for the sweeper class
41+
sweeper_params = dict()
42+
sweeper_params['collocation_class'] = CollGaussRadau_Right
43+
sweeper_params['num_nodes'] = 5
44+
sweeper_params['QI'] = 'LU'
45+
sweeper_params['fixed_time_in_jacobian'] = 0
46+
47+
# initialize controller parameters
48+
controller_params = dict()
49+
controller_params['logger_level'] = 30
50+
controller_params['hook_class'] = err_reduction_hook
51+
52+
# Fill description dictionary for easy hierarchy creation
53+
description = dict()
54+
description['problem_class'] = generalized_fisher_jac
55+
description['problem_params'] = problem_params
56+
description['dtype_u'] = mesh
57+
description['dtype_f'] = mesh
58+
description['sweeper_params'] = sweeper_params
59+
description['step_params'] = step_params
60+
61+
# setup parameters "in time"
62+
t0 = 0
63+
Tend = 0.1
64+
65+
sweeper_list = [generic_implicit, linearized_implicit_fixed_parallel, linearized_implicit_fixed_parallel_prec]
66+
dt_list = [Tend/2**i for i in range(1,5)]
67+
68+
results = dict()
69+
results['sweeper_list'] = [sweeper.__name__ for sweeper in sweeper_list]
70+
results['dt_list'] = dt_list
71+
72+
# f = open('parallelSDC_nonlinear_out.txt', 'w')
73+
# uinit = None
74+
# uex = None
75+
# uend = None
76+
# P = None
77+
78+
# loop over the different sweepers and check results
79+
for sweeper in sweeper_list:
80+
description['sweeper_class'] = sweeper
81+
error_reduction = []
82+
for dt in dt_list:
83+
84+
print('Working with sweeper %s and dt = %s...' %(sweeper.__name__,dt))
85+
86+
level_params['dt'] = dt
87+
description['level_params'] = level_params
88+
89+
# instantiate the controller
90+
controller = allinclusive_classic_nonMPI(num_procs=1, controller_params=controller_params,
91+
description=description)
92+
93+
# get initial values on finest level
94+
P = controller.MS[0].levels[0].prob
95+
uinit = P.u_exact(t0)
96+
97+
# call main function to get things done...
98+
uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend)
99+
100+
# filter statistics
101+
filtered_stats = filter_stats(stats, type='error_pre_iteration')
102+
error_pre = sort_stats(filtered_stats, sortby='iter')[0][1]
103+
104+
filtered_stats = filter_stats(stats, type='error_post_iteration')
105+
error_post = sort_stats(filtered_stats, sortby='iter')[0][1]
106+
107+
error_reduction.append(error_post/error_pre)
108+
109+
print('error and reduction rate at time %s: %6.4e -- %6.4e' % (Tend, error_post, error_reduction[-1]))
110+
111+
results[sweeper.__name__] = error_reduction
112+
print()
113+
114+
file = open('data/error_reduction_data.pkl', 'wb')
115+
pickle.dump(results, file)
116+
file.close()
117+
118+
119+
def plot_graphs():
120+
"""
121+
Helper function to plot graphs of initial and final values
122+
"""
123+
124+
file = open('data/error_reduction_data.pkl', 'rb')
125+
results = pickle.load(file)
126+
127+
sweeper_list = results['sweeper_list']
128+
dt_list = results['dt_list']
129+
130+
color_list = ['red', 'blue', 'green']
131+
marker_list = ['o', 's', 'd']
132+
label_list = []
133+
for sweeper in sweeper_list:
134+
if sweeper == 'generic_implicit':
135+
label_list.append('SDC')
136+
elif sweeper == 'linearized_implicit_fixed_parallel':
137+
label_list.append('Simplified Newton')
138+
elif sweeper == 'linearized_implicit_fixed_parallel_prec':
139+
label_list.append('Inexact Newton')
140+
141+
setups = zip(sweeper_list, color_list, marker_list, label_list)
142+
143+
# Set up plotting parameters
144+
params = {'legend.fontsize': 20,
145+
'figure.figsize': (12, 8),
146+
'axes.labelsize': 20,
147+
'axes.titlesize': 20,
148+
'xtick.labelsize': 16,
149+
'ytick.labelsize': 16,
150+
'lines.linewidth': 3
151+
}
152+
plt.rcParams.update(params)
153+
154+
# set up figure
155+
plt.figure()
156+
plt.xlabel('dt')
157+
plt.ylabel('error reduction')
158+
# plt.xlim((interval[0] - 0.01, interval[1] + 0.01))
159+
# plt.ylim((-0.1, 1.1))
160+
plt.grid()
161+
162+
# compute values for x-axis and plot
163+
164+
for sweeper, color, marker, label in setups:
165+
166+
plt.loglog(dt_list, results[sweeper], lw=3, ls='-', color=color, marker=marker, markersize=10, label=label)
167+
168+
plt.loglog(dt_list, [dt*2 for dt in dt_list], lw=2, ls='--', color='k', label='linear')
169+
plt.loglog(dt_list, [dt*dt/dt_list[0]*2 for dt in dt_list], lw=2, ls='-.', color='k', label='quadratic')
170+
171+
plt.legend(loc=1, ncol=1, numpoints=1)
172+
173+
plt.gca().invert_xaxis()
174+
plt.xlim([dt_list[0]*1.1, dt_list[-1]/1.1])
175+
plt.ylim([4E-03,1E0])
176+
plt.xticks(dt_list,dt_list)
177+
178+
# plt.show()
179+
180+
# save plot as PDF, beautify
181+
fname = 'data/parallelSDC_fisher_newton.png'
182+
plt.savefig(fname, rasterized=True, bbox_inches='tight')
183+
184+
# assert os.path.isfile(fname), 'ERROR: plotting did not create file'
185+
186+
187+
if __name__ == "__main__":
188+
# main()
189+
plot_graphs()

0 commit comments

Comments
 (0)