1212import matplotlib .pyplot as plt
1313from matplotlib .patches import Polygon
1414from 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
2917if __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