from __future__ import division
from scipy.sparse import spdiags
from scipy.sparse.linalg import spsolve
import numpy as np
beta = 0.5
J = 200 # total number of mesh points
z = np.linspace(-10,10,J) # vertices
dz = abs(z[1]-z[0]) # space step
dt = 0.2 # time step
v = 2 * np.ones(len(z)) # velocity field (constant)
r = v / 2 * dt / dz
# initial conditions
gaussian = lambda z, height, position, hwhm: height * np.exp(-np.log(2) * ((z - position)/hwhm)**2)
u_init = gaussian(z, 1, -3,import 2)pylab
def make_advection_matrices(z, r):
"""Return matrices A and M for advection equations"""
lower = -beta * r; centreones = np.ones(len(z)); upper = beta * r
A = spdiags( [lower[-beta*r, centreones, upper]beta*r], (-1,0,1), len(z), len(z) )
lowerM = spdiags( [(1-beta) * r; centre =r, np.ones(len(z)); upper =, -(1-beta) * r
M = spdiags( [lower, centre, upper]r], (-1,0,1), len(z), len(z) )
return A.tocsr(), M.tocsr()
def plot_iteration(z, u, iteration):
"""Plot the solver progress"""
import pylab
pylab.plot(z, u, label="Iteration %d" % iteration)
# Set up basic pylabconstants
beta = 0.savefig5
J = 200 # total number of mesh points
z = np.linspace("%d_solution"-10,10,J) %# iterationvertices
dz = abs(z[1]-z[0]) # space step
dt = 0.2 pylab # time step
v = 2 * np.claones(len(z)) # velocity field (constant)
r = v / 2 * dt / dz
# Initial conditions (peak function)
gaussian = lambda z, height, position, hwhm: height * np.exp(-np.log(2) * ((z - position)/hwhm)**2)
u_init = gaussian(z, 1, -3, 2)
A, M = make_advection_matrices(z, r)
u = u_init
for i in range(10):
d = M * u
u = spsolve(A, M * u)
plot_iteration(z, u, i)
pylab.legend()
pylab.show()