Coverage for pySDC/projects/AsympConv/conv_test_toinf.py: 0%
46 statements
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-20 14:51 +0000
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-20 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 Nsteps = 1
23 coll = CollBase(Nnodes, 0, 1, quad_type='RADAU-RIGHT')
24 Qmat = coll.Qmat[1:, 1:]
26 # do LU decomposition of QT (St. Martin's trick)
27 QT = coll.Qmat[1:, 1:].T
28 [_, _, U] = LA.lu(QT, overwrite_a=True)
29 QDmat = U.T
31 Nmat = np.zeros((Nnodes, Nnodes))
32 Nmat[:, -1] = 1
34 Nsweep_list = [1, Nnodes - 1, Nnodes]
35 color_list = ['red', 'blue', 'green']
36 marker_list = ['s', 'o', 'd']
38 setup_list = zip(Nsweep_list, color_list, marker_list)
40 xlist = [10**i for i in range(11)]
42 rc('font', **{"sans-serif": ["Arial"], "size": 24})
43 plt.subplots(figsize=(15, 10))
45 for Nsweeps, color, marker in setup_list:
46 Emat = np.zeros((Nsteps, Nsteps))
47 np.fill_diagonal(Emat[1:, :], 1)
49 Prho_list = []
50 predict_list = []
51 for x in xlist:
52 mat = np.linalg.inv(np.eye(Nnodes * Nsteps) - x * lam * np.kron(np.eye(Nsteps), QDmat)).dot(
53 x * lam * np.kron(np.eye(Nsteps), (Qmat - QDmat)) + np.kron(Emat, Nmat)
54 )
55 mat = np.linalg.matrix_power(mat, Nsweeps)
57 Prho_list.append(max(abs(np.linalg.eigvals(mat))))
58 predict_list.append(1.0 / x)
60 if len(predict_list) > 1:
61 print(
62 x,
63 predict_list[-1],
64 Prho_list[-1],
65 Prho_list[-2] / Prho_list[-1],
66 predict_list[-2] / predict_list[-1],
67 )
69 plt.loglog(
70 xlist,
71 Prho_list,
72 linestyle='-',
73 linewidth=3,
74 color=color,
75 marker=marker,
76 markersize=10,
77 label='spectral radius, L=' + str(Nsteps),
78 )
80 plt.loglog(
81 xlist,
82 [item / predict_list[0] for item in predict_list],
83 linestyle='--',
84 linewidth=2,
85 color='k',
86 label='estimate',
87 )
89 plt.xlabel('time-step size')
90 plt.ylabel('spectral radius')
91 plt.legend(loc=3, numpoints=1)
92 plt.grid()
93 plt.ylim([1e-16, 1e00])
95 if type(lam) is complex:
96 fname = 'data/smoother_specrad_toinf_M' + str(Nnodes) + '_LU_imag.png'
97 else:
98 fname = 'data/smoother_specrad_toinf_M' + str(Nnodes) + '_LU_real.png'
99 plt.savefig(fname, transparent=True, bbox_inches='tight')
102if __name__ == "__main__":
103 compute_and_plot_specrad(Nnodes=3, lam=-1)
104 compute_and_plot_specrad(Nnodes=3, lam=1j)
105 compute_and_plot_specrad(Nnodes=7, lam=-1)
106 compute_and_plot_specrad(Nnodes=7, lam=1j)