|
21 | 21 |
|
22 | 22 | from unflatten import unflatten |
23 | 23 |
|
24 | | -from standard_integrators import dirk |
| 24 | +from standard_integrators import dirk, bdf2, trapezoidal |
25 | 25 |
|
26 | 26 | if __name__ == "__main__": |
27 | 27 |
|
|
40 | 40 | swparams['do_LU'] = False |
41 | 41 |
|
42 | 42 | sparams = {} |
43 | | - sparams['maxiter'] = 3 |
| 43 | + sparams['maxiter'] = 4 |
44 | 44 |
|
45 | | - dirk_order = 2 |
| 45 | + dirk_order = 4 |
46 | 46 |
|
47 | 47 | # setup parameters "in time" |
48 | 48 | t0 = 0 |
49 | 49 | Tend = 3000 |
50 | | - Nsteps = 500 |
51 | | - #Tend = 30 |
52 | | - #Nsteps = 5 |
| 50 | + Nsteps = 100 |
53 | 51 | dt = Tend/float(Nsteps) |
54 | 52 |
|
55 | 53 | # This comes as read-in for the problem class |
|
92 | 90 | cfl_advection = pparams['u_adv']*dt/P.h[0] |
93 | 91 | cfl_acoustic_hor = pparams['c_s']*dt/P.h[0] |
94 | 92 | cfl_acoustic_ver = pparams['c_s']*dt/P.h[1] |
| 93 | + print "Horizontal resolution: %4.2f" % P.h[0] |
| 94 | + print "Vertical resolution: %4.2f" % P.h[1] |
95 | 95 | print ("CFL number of advection: %4.2f" % cfl_advection) |
96 | 96 | print ("CFL number of acoustics (horizontal): %4.2f" % cfl_acoustic_hor) |
97 | 97 | print ("CFL number of acoustics (vertical): %4.2f" % cfl_acoustic_ver) |
98 | 98 |
|
99 | | - dirk = dirk(P, dirk_order) |
| 99 | + dirk4 = dirk(P, 4) |
| 100 | + dirk2 = dirk(P, 2) |
| 101 | + trap = trapezoidal(P) |
| 102 | + bdf = bdf2(P) |
100 | 103 | u0 = uinit.values.flatten() |
101 | | - |
| 104 | + udirk4 = u0 |
| 105 | + udirk2 = u0 |
| 106 | + ubdf = u0 |
| 107 | + utrap = u0 |
102 | 108 | for i in range(0,Nsteps): |
103 | | - u0 = dirk.timestep(u0, dt) |
104 | | - |
| 109 | + udirk4 = dirk4.timestep(udirk4, dt) |
| 110 | + udirk2 = dirk2.timestep(udirk2, dt) |
| 111 | + utrap = trap.timestep(utrap, dt) |
| 112 | + #if i==0: |
| 113 | + # ubdf_new = bdf.firsttimestep(ubdf, dt) |
| 114 | + # ubdf_m1 = ubdf |
| 115 | + #else: |
| 116 | + # ubdf_new = bdf.timestep(ubdf, ubdf_m1, dt) |
| 117 | + #ubdf_m1 = ubdf |
| 118 | + #ubdf = ubdf_new |
| 119 | + |
105 | 120 | # call main function to get things done... |
106 | 121 | uend,stats = mp.run_pfasst(MS,u0=uinit,t0=t0,dt=dt,Tend=Tend) |
107 | | - |
108 | | - u0 = unflatten(u0, 4, P.N[0], P.N[1]) |
109 | | - |
110 | | - fs = 8 |
111 | | - rcParams['figure.figsize'] = 5.0, 2.5 |
112 | | - fig = plt.figure() |
113 | | - |
114 | | - plt.plot(P.xx[:,5], uend.values[2,:,5], '-', color='b', label='SDC') |
115 | | - plt.plot(P.xx[:,5], u0[2,:,5], '+', color='g', markevery=5, markersize=fs-2, label='DIRK') |
116 | | - plt.legend(loc='lower left', fontsize=fs, prop={'size':fs}) |
117 | | - plt.yticks(fontsize=fs) |
118 | | - plt.xticks(fontsize=fs) |
119 | | - plt.xlabel('x', fontsize=fs, labelpad=0) |
120 | | - plt.ylabel('Bouyancy', fontsize=fs, labelpad=1) |
121 | | - #plt.show() |
122 | | - plt.savefig('boussinesq.pdf', bbox_inches='tight') |
123 | | - |
124 | | - print " #### Logging report for DIRK #### " |
125 | | - print "Number of calls to implicit solver: %5i" % dirk.logger.solver_calls |
126 | | - print "Total number of GMRES iterations: %5i" % dirk.logger.iterations |
127 | | - print "Average number of iterations per call: %6.3f" % (float(dirk.logger.iterations)/float(dirk.logger.solver_calls)) |
| 122 | + udirk4 = unflatten(udirk4, 4, P.N[0], P.N[1]) |
| 123 | + udirk2 = unflatten(udirk2, 4, P.N[0], P.N[1]) |
| 124 | + print "Norm of final solution by trapezoidal rule: %5.3f" % np.linalg.norm( utrap, np.inf ) |
| 125 | + utrap = unflatten(utrap, 4, P.N[0], P.N[1]) |
| 126 | + |
| 127 | + np.save('xaxis', P.xx) |
| 128 | + np.save('sdc', uend.values) |
| 129 | + np.save('dirk2', udirk2) |
| 130 | + np.save('dirk4', udirk4) |
| 131 | + np.save('trap', utrap) |
128 | 132 |
|
129 | | - print " #### Logging report for SDC #### " |
| 133 | + print " #### Logging report for DIRK-4 #### " |
| 134 | + print "Number of calls to implicit solver: %5i" % dirk4.logger.solver_calls |
| 135 | + print "Total number of GMRES iterations: %5i" % dirk4.logger.iterations |
| 136 | + print "Average number of iterations per call: %6.3f" % (float(dirk4.logger.iterations)/float(dirk4.logger.solver_calls)) |
| 137 | + |
| 138 | + print " #### Logging report for DIRK-2 #### " |
| 139 | + print "Number of calls to implicit solver: %5i" % dirk2.logger.solver_calls |
| 140 | + print "Total number of GMRES iterations: %5i" % dirk2.logger.iterations |
| 141 | + print "Average number of iterations per call: %6.3f" % (float(dirk2.logger.iterations)/float(dirk2.logger.solver_calls)) |
| 142 | + |
| 143 | + #print " #### Logging report for BDF2 #### " |
| 144 | + #print "Number of calls to implicit solver: %5i" % bdf.logger.solver_calls |
| 145 | + #print "Total number of GMRES iterations: %5i" % bdf.logger.iterations |
| 146 | + #print "Average number of iterations per call: %6.3f" % (float(bdf.logger.iterations)/float(bdf.logger.solver_calls)) |
| 147 | + |
| 148 | + print " #### Logging report for SDC-(%1i,%1i) #### " % (swparams['num_nodes'], sparams['maxiter']) |
130 | 149 | print "Number of calls to implicit solver: %5i" % P.logger.solver_calls |
131 | 150 | print "Total number of GMRES iterations: %5i" % P.logger.iterations |
132 | | - print "Average number of iterations per call: %6.3f" % (float(P.logger.iterations)/float(P.logger.solver_calls)) |
| 151 | + print "Average number of iterations per call: %6.3f" % (float(P.logger.iterations)/float(P.logger.solver_calls)) |
| 152 | + |
0 commit comments