1.2.1.1. 1D First-order Linear Convection - The Wave Equation¶
1.2.1.1.1. Understand the Problem¶
What is the final velocity profile for 1D linear convection when the initial conditions are a square wave and the boundary conditions are constant?
1D linear convection is described as follows:
1.2.1.1.2. Formulate the Problem¶
1.2.1.1.2.1. Input Data¶
nt = 51 (number of temporal points)
nx = 21 (number of spatial points)
tmax = 0.5
xmax = 2
c = 1
x |
i |
t |
n |
u(x,t) |
---|---|---|---|---|
\(0\) |
\(0\) |
\(0 \le t \le 0.5\) |
\(0 \le i \le 20\) |
\(1\) |
\(0 < x \le 0.5\) |
\(0 < n \le 12.5\) |
\(0\) |
\(0\) |
\(1\) |
\(0.5 < x \le 1\) |
\(12.5 < n \le 25\) |
\(0\) |
\(0\) |
\(2\) |
\(1 < x < 2\) |
\(25 < n < 50\) |
\(0\) |
\(0\) |
\(1\) |
\(2\) |
\(50\) |
\(0 \le t \le 0.5\) |
\(0 \le i \le 20\) |
\(1\) |
1.2.1.1.2.2. Output Data¶
x |
t |
u(x,t) |
---|---|---|
\(0 < x < 2\) |
\(0.5\) |
\(?\) |
1.2.1.1.3. Design Algorithm to Solve Problem¶
1.2.1.1.3.1. Space-time discretisation¶
i \(\rightarrow\) index of grid in x
n \(\rightarrow\) index of grid in t
1.2.1.1.3.2. Numerical scheme¶
FD in time
BD in space
1.2.1.1.3.3. Discrete equation¶
1.2.1.1.3.4. Transpose¶
1.2.1.1.3.5. Pseudo-code¶
#Constants
nt = 51
tmax = 0.5
dt = tmax/(nt-1)
nx = 21
xmax = 2
dx = xmax/(nx-1)
#Boundary Conditions
for n between 0 and 20
u(0,n)=1
u(50,n)=1
#Initial Conditions
for i between 1 and 49
if(12.5 < i < 25)
u(i,0) = 2
else
u(i,0) = 1
#Iteration
for n between 1 and 20
u(i,n+1) = u(i,n)-c*(dt/dx)*(u(i,n)-u(i-1,n)
1.2.1.1.4. Implement Algorithm in Python¶
def convection(nt, nx, tmax, xmax, c):
"""
Returns the velocity field and distance for 1D linear convection
"""
# Increments
dt = tmax/(nt-1)
dx = xmax/(nx-1)
# Initialise data structures
import numpy as np
u = np.zeros((nx,nt))
x = np.zeros(nx)
# Boundary conditions
u[0,:] = u[nx-1,:] = 1
# Initial conditions
for i in range(1,nx-1):
if(i > (nx-1)/4 and i < (nx-1)/2):
u[i,0] = 2
else:
u[i,0] = 1
# Loop
for n in range(0,nt-1):
for i in range(1,nx-1):
u[i,n+1] = u[i,n]-c*(dt/dx)*(u[i,n]-u[i-1,n])
# X Loop
for i in range(0,nx):
x[i] = i*dx
return u, x
def plot_convection(u,x,nt,title):
"""
Plots the 1D velocity field
"""
import matplotlib.pyplot as plt
plt.figure()
for i in range(0,nt,10):
plt.plot(x,u[:,i],'r')
plt.xlabel('x (m)')
plt.ylabel('u (m/s)')
plt.ylim([0,2.2])
plt.title(title)
plt.show()
u,x = convection(151, 51, 0.5, 2.0, 0.5)
plot_convection(u,x,151,'Figure 1: c=0.5m/s, nt=151, nx=51, tmax=0.5s')
u,x = convection(151, 1001, 0.5, 2.0, 0.5)
plot_convection(u,x,151,'Figure 2: c=0.5m/s, nt=151, nx=1001, tmax=0.5s')
u,x = convection(151, 51, 2.0, 2.0, 0.5)
plot_convection(u,x,151,'Figure 3: c=0.5m/s, nt=151, nx=51, tmax=2s')
1.2.1.1.5. Conclusions¶
1.2.1.1.5.1. Why isn’t the square wave maintained?¶
The first order backward differencing scheme in space creates false diffusion.
If the spatial step is reduced, the error reduces - compare Figure 1 and Figure 2
1.2.1.1.5.2. Why does the wave shift to the right?¶
The square wave is being convected by the constant linear wave speed c
For \(c > 0\) profiles shift to the right by \(c \Delta t\) - see Figure 2
1.2.1.1.5.3. What happens at the wall?¶
As there is no viscosity, there is a non-physical change the the profile near the wall.