In [ ]:
"""
Copyright (c) 2014 Kunal Tyagi
GNU GPLv3
"""
In [19]:
"""
Program to solve
u_t + a*u_x = 0
u(t+1,x)-u(t,x) = -(a*delta_t/delta_x)*(u(t,x) - u(t,x-1))
"""
from numpy import *
import pylab
In [20]:
# initialisation of constants
LEN_X = 1.0
LEN_T = 1.0
DELTA_X = 0.01
DELTA_T = 0.01
CFL = 0.5
# derived constants
a = CFL*DELTA_X/DELTA_T
num_x = int(LEN_X/DELTA_X)
num_t = int(LEN_T/DELTA_T)
In [21]:
# matrix
u = zeros([num_t, num_x])
f = zeros([num_t, num_x])
In [52]:
# t=0 initialisation
for i in range(0, num_x):
u[0][i] = 0
f[0][i] = 0
if i > 20 and i < 30:
u[0][i] = 1 #sin(pi*(i-20)/10)
In [53]:
for i in range(0, num_t-1):
for j in range(0, num_x):
# u[i+1][j] = (1+CFL)*u[i][j] + CFL*u[i][j-1]
# forward difference is unstable
u[i+1][j] = u[i][j] - CFL*(u[i][j] - u[i][j-1])
plot(u[99], 'b')
plot(u[49], 'r')
plot(u[0], 'g')
Out[53]:
In [54]:
for i in range(0, num_t-1):
for j in range(1, num_x-1):
# Lax Wendroff
u[i+1][j] = u[i][j] - CFL/2*(u[i][j+1] - u[i][j-1]) + (CFL*CFL)/2*(u[i][j+1] - 2*u[i][j] + u[i][j-1])
plot(u[99], 'b')
plot(u[49], 'r')
plot(u[0], 'g')
Out[54]:
In [55]:
for i in range(0, num_t-1):
for j in range(2, num_x-1):
# Beam Warming
u[i+1][j] = u[i][j] - CFL*(u[i][j] - u[i][j-1]) - (CFL*(1-CFL))/2*(u[i][j] - 2*u[i][j-1] + u[i][j-2])
plot(u[99], 'b')
plot(u[49], 'r')
plot(u[0], 'g')
Out[55]:
In [56]:
b = zeros([num_t, num_x])
l = zeros([num_t, num_x])
for i in range(0, num_t-1):
for j in range(2, num_x-1):
# FROMM
l[i+1][j] = u[i][j] - CFL/2*(u[i][j+1] - u[i][j-1]) + (CFL*CFL)/2*(u[i][j+1] - 2*u[i][j] + u[i][j-1])
b[i+1][j] = u[i][j] - CFL*(u[i][j] - u[i][j-1]) - (CFL*(1-CFL))/2*(u[i][j] - 2*u[i][j-1] + u[i][j-2])
u[i+1][j] = (b[i+1][j] + l[i+1][j])/2
plot(u[99], 'b')
plot(u[49], 'r')
plot(u[0], 'g')
Out[56]:
In [ ]: