Skip to content

Commit ecf49c9

Browse files
author
Daniel Ruprecht
committed
add script that plots modulus of stability function for different ratios of lamabda_fast to lambda_slow versus the number of iterations k
1 parent 9d2d65a commit ecf49c9

File tree

2 files changed

+33
-30
lines changed

2 files changed

+33
-30
lines changed

examples/fwsw/plot_stability.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131
swparams = {}
3232
### SET TYPE OF QUADRATURE NODES ###
3333
#swparams['collocation_class'] = collclass.CollGaussLobatto
34-
swparams['collocation_class'] = collclass.CollGaussLegendre
35-
#swparams['collocation_class'] = collclass.CollGaussRadau_Right
34+
#swparams['collocation_class'] = collclass.CollGaussLegendre
35+
swparams['collocation_class'] = collclass.CollGaussRadau_Right
3636

3737
### SET NUMBER OF QUADRATURE NODES ###
38-
swparams['num_nodes'] = 3
38+
swparams['num_nodes'] = 4
3939

4040
### SET NUMBER OF ITERATIONS - SET K=0 FOR COLLOCATION SOLUTION ###
41-
K = 4
41+
K = 3
4242

4343
do_coll_update = True
4444

examples/fwsw/plot_stablimits.py

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,12 @@
1212
import matplotlib.pyplot as plt
1313
from matplotlib.patches import Polygon
1414
from subprocess import call
15-
16-
def get_stab_function(LHS, RHS, Kmax, lambd, do_coll_update):
17-
Pinv = np.linalg.inv(LHS)
18-
Mat_sweep = np.linalg.matrix_power(Pinv.dot(RHS), Kmax)
19-
for l in range(0,Kmax):
20-
Mat_sweep = Mat_sweep + np.linalg.matrix_power(Pinv.dot(RHS),k).dot(Pinv)
21-
if do_coll_update:
22-
stab_fh = 1.0 + lambd*level.sweep.coll.weights.dot(Mat_sweep.dot(np.ones(nnodes)))
23-
else:
24-
q = np.zeros(nnodes)
25-
q[nnodes-1] = 1.0
26-
stab_fh = q.dot(Mat_sweep.dot(np.ones(nnodes)))
27-
return stab_fh
15+
from matplotlib.ticker import ScalarFormatter
2816

2917
if __name__ == "__main__":
30-
mvals = [4]
31-
kvals = np.arange(2,9)
32-
lambdaratio = [1, 5, 50]
18+
mvals = [3]
19+
kvals = np.arange(2,10)
20+
lambdaratio = [1, 5, 10]
3321
stabval = np.zeros((np.size(mvals), np.size(lambdaratio), np.size(kvals)))
3422

3523
for i in range(0,np.size(mvals)):
@@ -39,6 +27,8 @@ def get_stab_function(LHS, RHS, Kmax, lambd, do_coll_update):
3927
pparams['lambda_f'] = np.array([0.0])
4028
pparams['u0'] = 1.0
4129
swparams = {}
30+
# swparams['collocation_class'] = collclass.CollGaussLobatto
31+
# swparams['collocation_class'] = collclass.CollGaussLegendre
4232
swparams['collocation_class'] = collclass.CollGaussRadau_Right
4333
swparams['num_nodes'] = mvals[i]
4434
do_coll_update = True
@@ -62,26 +52,39 @@ def get_stab_function(LHS, RHS, Kmax, lambd, do_coll_update):
6252
Q = level.sweep.coll.Qmat[1:,1:]
6353

6454
for j in range(0,np.size(lambdaratio)):
65-
lambda_slow = 0.1*1j
55+
lambda_slow = 1j
6656
lambda_fast = lambdaratio[j]*lambda_slow
6757

68-
LHS = np.eye(nnodes) - step.status.dt*( lambda_fast*QI + lambda_slow*QE )
69-
RHS = step.status.dt*( (lambda_fast+lambda_slow)*Q - (lambda_fast*QI + lambda_slow*QE) )
58+
LHS, RHS = level.sweep.get_scalar_problems_sweeper_mats( lambdas = [ lambda_fast, lambda_slow ] )
7059

7160
for k in range(0, np.size(kvals)):
7261
Kmax = kvals[k]
73-
stab_fh = get_stab_function(LHS, RHS, kvals[k], lambda_fast+lambda_slow, do_coll_update)
62+
Mat_sweep = level.sweep.get_scalar_problems_manysweep_mat( nsweeps = Kmax, lambdas = [ lambda_fast, lambda_slow ] )
63+
if do_coll_update:
64+
stab_fh = 1.0 + (lambda_fast + lambda_slow)*level.sweep.coll.weights.dot(Mat_sweep.dot(np.ones(nnodes)))
65+
else:
66+
q = np.zeros(nnodes)
67+
q[nnodes-1] = 1.0
68+
stab_fh = q.dot(Mat_sweep.dot(np.ones(nnodes)))
7469
stabval[i,j,k] = np.absolute(stab_fh)
7570

71+
rcParams['figure.figsize'] = 2.5, 2.5
7672
fig = plt.figure()
7773
fs = 8
78-
plt.plot(kvals, stabval[0,0,:], 'o-', color='b', label=("Ratio: %3.0f" % lambdaratio[0]))
79-
plt.plot(kvals, stabval[0,1,:], 's-', color='r', label=("Ratio: %3.0f" % lambdaratio[1]))
80-
plt.plot(kvals, stabval[0,2,:], 'd-', color='g', label=("Ratio: %3.0f" % lambdaratio[2]))
74+
plt.plot(kvals, stabval[0,0,:], 'o-', color='b', label=("$\lambda_{fast}/\lambda_{slow}$=%3.0f" % lambdaratio[0]))
75+
plt.plot(kvals, stabval[0,1,:], 's-', color='r', label=("$\lambda_{fast}/\lambda_{slow}$=%3.0f" % lambdaratio[1]))
76+
plt.plot(kvals, stabval[0,2,:], 'd-', color='g', label=("$\lambda_{fast}/\lambda_{slow}$=%3.0f" % lambdaratio[2]))
8177
plt.plot(kvals, 1.0+0.0*kvals, '--', color='k')
82-
plt.legend(loc='lower right', fontsize=fs, prop={'size':fs})
83-
78+
plt.xlabel('Number of iterations K', fontsize=fs)
79+
plt.ylabel(r'Modulus of stability function $\left| R \right|$', fontsize=fs)
80+
plt.ylim([0.0, 1.2])
81+
plt.legend(loc='lower left', fontsize=fs, prop={'size':fs})
82+
plt.gca().get_xaxis().get_major_formatter().labelOnlyBase = False
83+
plt.gca().get_xaxis().set_major_formatter(ScalarFormatter())
84+
plt.title(("M = %1i" % mvals[0]), fontsize=fs)
8485
#plt.plot(kvals, stabval[1,0,:], '-', color='r')
8586
#plt.plot(kvals, stabval[1,1,:], '--', color='r')
8687
#plt.plot(kvals, stabval[1,2,:], '-.', color='r')
87-
plt.show()
88+
filename = 'stablimit-M'+str(mvals[0])+'.pdf'
89+
fig.savefig(filename, bbox_inches='tight')
90+
call(["pdfcrop", filename, filename])

0 commit comments

Comments
 (0)