|
2 | 2 | import math |
3 | 3 | import scipy.sparse.linalg as LA |
4 | 4 | import scipy.sparse as sp |
5 | | -from ProblemClass import Callback, logging |
6 | | -# |
7 | | -# Trapezoidal rule |
8 | | -# |
9 | | -class trapezoidal: |
10 | | - |
11 | | - def __init__(self, M, alpha=0.5): |
12 | | - assert np.shape(M)[0]==np.shape(M)[1], "Matrix M must be quadratic" |
13 | | - self.Ndof = np.shape(M)[0] |
14 | | - self.M = M |
15 | | - self.alpha = alpha |
16 | | - |
17 | | - def timestep(self, u0, dt): |
18 | | - M_trap = sp.eye(self.Ndof) - self.alpha*dt*self.M |
19 | | - B_trap = sp.eye(self.Ndof) + (1.0-self.alpha)*dt*self.M |
20 | | - b = B_trap.dot(u0) |
21 | | - return LA.spsolve(M_trap, b) |
22 | | -# |
23 | | -# A BDF-2 implicit two-step method |
24 | | -# |
25 | | -class bdf2: |
26 | | - |
27 | | - def __init__(self, M): |
28 | | - assert np.shape(M)[0]==np.shape(M)[1], "Matrix M must be quadratic" |
29 | | - self.Ndof = np.shape(M)[0] |
30 | | - self.M = M |
31 | | - |
32 | | - def firsttimestep(self, u0, dt): |
33 | | - b = u0 |
34 | | - L = sp.eye(self.Ndof) - dt*self.M |
35 | | - return LA.spsolve(L, b) |
| 5 | +from ProblemClass import Callback, logging, boussinesq_2d_imex |
36 | 6 |
|
37 | | - def timestep(self, u0, um1, dt): |
38 | | - b = (4.0/3.0)*u0 - (1.0/3.0)*um1 |
39 | | - L = sp.eye(self.Ndof) - (2.0/3.0)*dt*self.M |
40 | | - return LA.spsolve(L, b) |
41 | 7 | # |
42 | 8 | # A diagonally implicit Runge-Kutta method of order 2, 3 or 4 |
43 | 9 | # |
44 | 10 | class dirk: |
45 | 11 |
|
46 | | - def __init__(self, M, order, gmres_maxiter, gmres_restart, gmres_tol): |
| 12 | + def __init__(self, problem, order): |
47 | 13 |
|
48 | | - assert np.shape(M)[0]==np.shape(M)[1], "Matrix M must be quadratic" |
49 | | - self.Ndof = np.shape(M)[0] |
50 | | - self.M = M |
| 14 | + assert isinstance(problem, boussinesq_2d_imex), "problem is wrong type of object" |
| 15 | + self.Ndof = np.shape(problem.M)[0] |
51 | 16 | self.order = order |
52 | 17 | self.logger = logging() |
53 | | - self.gmres_maxiter = gmres_maxiter |
54 | | - self.gmres_restart = gmres_restart |
55 | | - self.gmres_tol = gmres_tol |
| 18 | + self.problem = problem |
56 | 19 |
|
57 | 20 | assert self.order in [2,22,3,4], 'Order must be 2,22,3,4' |
58 | 21 |
|
@@ -144,16 +107,15 @@ def timestep(self, u0, dt): |
144 | 107 | # Returns f(u) = c*u |
145 | 108 | # |
146 | 109 | def f(self,u): |
147 | | - return self.M.dot(u) |
| 110 | + return self.problem.D_upwind.dot(u)+self.problem.M.dot(u) |
148 | 111 |
|
149 | 112 |
|
150 | 113 | # |
151 | 114 | # Solves (Id - alpha*c)*u = b for u |
152 | 115 | # |
153 | 116 | def f_solve(self, b, alpha, u0): |
154 | 117 | cb = Callback() |
155 | | - L = sp.eye(self.Ndof) - alpha*self.M |
156 | | - sol, info = LA.gmres( L, b, x0=u0, tol=self.gmres_tol, restart=self.gmres_restart, maxiter=self.gmres_maxiter, callback=cb) |
| 118 | + sol, info = LA.gmres( self.problem.Id - alpha*(self.problem.D_upwind + self.problem.M), b, x0=u0, tol=self.problem.gmres_tol, restart=self.problem.gmres_restart, maxiter=self.problem.gmres_maxiter, callback=cb) |
157 | 119 | if alpha!=0.0: |
158 | 120 | print "DIRK: Number of GMRES iterations: %3i --- Final residual: %6.3e" % ( cb.getcounter(), cb.getresidual() ) |
159 | 121 | self.logger.add(cb.getcounter()) |
|
0 commit comments