Skip to content

Commit e821609

Browse files
author
Daniel Ruprecht
committed
standard_integrators is now using the matrices generated and stored in ProblemClass - this avoids duplication and memory errors when using the dirk integrator
1 parent e93845d commit e821609

File tree

2 files changed

+11
-49
lines changed

2 files changed

+11
-49
lines changed

examples/boussinesq_2d_imex/rungmrescounter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252

5353
# This comes as read-in for the problem class
5454
pparams = {}
55-
pparams['nvars'] = [(4,450,30)]
56-
#pparams['nvars'] = [(4,150,10)]
55+
#pparams['nvars'] = [(4,450,30)]
56+
pparams['nvars'] = [(4,150,10)]
5757
pparams['u_adv'] = 0.02
5858
pparams['c_s'] = 0.3
5959
pparams['Nfreq'] = 0.01
@@ -62,7 +62,7 @@
6262
pparams['order'] = [4] # [fine_level, coarse_level]
6363
pparams['order_upw'] = [5]
6464
pparams['gmres_maxiter'] = [50]
65-
pparams['gmres_restart'] = [20]
65+
pparams['gmres_restart'] = [10]
6666
pparams['gmres_tol'] = [1e-6]
6767

6868
# This comes as read-in for the transfer operations
@@ -87,7 +87,7 @@
8787
P = MS[0].levels[0].prob
8888
uinit = P.u_exact(t0)
8989

90-
dirk = dirk(P.D_upwind + P.M, dirk_order, pparams['gmres_maxiter'], pparams['gmres_restart'], pparams['gmres_tol'])
90+
dirk = dirk(P, dirk_order)
9191
u0 = uinit.values.flatten()
9292

9393
for i in range(0,Nsteps):

examples/boussinesq_2d_imex/standard_integrators.py

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,20 @@
22
import math
33
import scipy.sparse.linalg as LA
44
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
366

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)
417
#
428
# A diagonally implicit Runge-Kutta method of order 2, 3 or 4
439
#
4410
class dirk:
4511

46-
def __init__(self, M, order, gmres_maxiter, gmres_restart, gmres_tol):
12+
def __init__(self, problem, order):
4713

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]
5116
self.order = order
5217
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
5619

5720
assert self.order in [2,22,3,4], 'Order must be 2,22,3,4'
5821

@@ -144,16 +107,15 @@ def timestep(self, u0, dt):
144107
# Returns f(u) = c*u
145108
#
146109
def f(self,u):
147-
return self.M.dot(u)
110+
return self.problem.D_upwind.dot(u)+self.problem.M.dot(u)
148111

149112

150113
#
151114
# Solves (Id - alpha*c)*u = b for u
152115
#
153116
def f_solve(self, b, alpha, u0):
154117
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)
157119
if alpha!=0.0:
158120
print "DIRK: Number of GMRES iterations: %3i --- Final residual: %6.3e" % ( cb.getcounter(), cb.getresidual() )
159121
self.logger.add(cb.getcounter())

0 commit comments

Comments
 (0)