Coverage for pySDC/projects/AsympConv/conv_test_to0.py: 0%
46 statements
« prev ^ index » next coverage.py v7.6.7, created at 2024-11-16 14:51 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2024-11-16 14:51 +0000
1import matplotlib
2import numpy as np
3import scipy.linalg as LA
5matplotlib.use('Agg')
6import matplotlib.pylab as plt
7from matplotlib import rc
9from pySDC.core.collocation import CollBase
12def compute_and_plot_specrad(Nnodes, lam):
13 """
14 Compute and plot the spectral radius of the smoother for different step-sizes
16 Args:
17 Nnodes: number of collocation nodes
18 lam: test parameter representing the spatial problem
19 """
21 coll = CollBase(Nnodes, 0, 1, quad_type='RADAU-RIGHT')
22 Qmat = coll.Qmat[1:, 1:]
24 # do LU decomposition of QT (St. Martin's trick)
25 QT = coll.Qmat[1:, 1:].T
26 [_, _, U] = LA.lu(QT, overwrite_a=True)
27 QDmat = U.T
29 Nmat = np.zeros((Nnodes, Nnodes))
30 Nmat[:, -1] = 1
32 Nsteps_list = [64, 256]
33 color_list = ['red', 'blue']
34 marker_list = ['s', 'o']
36 setup_list = zip(Nsteps_list, color_list, marker_list)
38 xlist = [0.1**i for i in range(11)]
40 rc('font', **{"sans-serif": ["Arial"], "size": 24})
41 plt.subplots(figsize=(15, 10))
43 for Nsteps, color, marker in setup_list:
44 Emat = np.zeros((Nsteps, Nsteps))
45 np.fill_diagonal(Emat[1:, :], 1)
47 Prho_list = []
48 predict_list = []
49 for x in xlist:
50 mat = np.linalg.inv(np.eye(Nnodes * Nsteps) - x * lam * np.kron(np.eye(Nsteps), QDmat)).dot(
51 x * lam * np.kron(np.eye(Nsteps), (Qmat - QDmat)) + np.kron(Emat, Nmat)
52 )
54 Prho_list.append(max(abs(np.linalg.eigvals(mat))))
55 # predict_list.append((1 + x) ** (1.0 - 1.0 / (Nnodes * Nsteps)) * x ** (1.0 / (Nnodes * Nsteps)))
56 predict_list.append(x ** (1.0 / (Nsteps)))
58 if len(predict_list) > 1:
59 print(
60 x,
61 predict_list[-1],
62 Prho_list[-1],
63 Prho_list[-2] / Prho_list[-1],
64 predict_list[-2] / predict_list[-1],
65 )
67 plt.loglog(
68 xlist,
69 Prho_list,
70 linestyle='-',
71 linewidth=3,
72 color=color,
73 marker=marker,
74 markersize=10,
75 label='spectral radius, L=' + str(Nsteps),
76 )
77 plt.loglog(
78 xlist,
79 predict_list,
80 linestyle='--',
81 linewidth=2,
82 color=color,
83 marker=marker,
84 markersize=10,
85 label='estimate, L=' + str(Nsteps),
86 )
88 ax = plt.gca()
89 ax.invert_xaxis()
91 plt.xlabel('time-step size')
92 plt.ylabel('spectral radius')
93 plt.legend(loc=3, numpoints=1)
94 plt.grid()
95 plt.ylim([1e-02, 1e01])
97 if type(lam) is complex:
98 fname = 'data/smoother_specrad_to0_L64+256_M' + str(Nnodes) + 'LU_imag.png'
99 else:
100 fname = 'data/smoother_specrad_to0_L64+256_M' + str(Nnodes) + 'LU_real.png'
101 plt.savefig(fname, transparent=True, bbox_inches='tight')
104if __name__ == "__main__":
105 compute_and_plot_specrad(Nnodes=3, lam=-1)
106 compute_and_plot_specrad(Nnodes=3, lam=1j)