Text and code provided under a Creative Commons Attribution license, CC-BY. (c) Lorena A. Barba, 2013. Thanks: Gilbert Forsyth for help writing the notebooks. NSF for support via CAREER award #1149784. from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt import numpy as np nx = 41 ny = 41 nt = 500 nit=50 c = 1 dx = 2.0/(nx-1) dy = 2.0/(ny-1) x = np.linspace(0,2,nx) y = np.linspace(0,2,ny) Y,X = np.meshgrid(y,x) rho = 1 nu = .1 dt = .001 u = np.zeros((ny, nx)) v = np.zeros((ny, nx)) p = np.zeros((ny, nx)) b = np.zeros((ny, nx)) def buildUpB(b, rho, dt, u, v, dx, dy): b[1:-1,1:-1]=rho*(1/dt*((u[2:,1:-1]-u[0:-2,1:-1])/(2*dx)+(v[1:-1,2:]-v[1:-1,0:-2])/(2*dy))-\ ((u[2:,1:-1]-u[0:-2,1:-1])/(2*dx))**2-\ 2*((u[1:-1,2:]-u[1:-1,0:-2])/(2*dy)*(v[2:,1:-1]-v[0:-2,1:-1])/(2*dx))-\ ((v[1:-1,2:]-v[1:-1,0:-2])/(2*dy))**2) return b def presPoisson(p, dx, dy, b): pn = np.empty_like(p) pn[:] = p[:] for q in range(nit): pn[:] = p[:] p[1:-1,1:-1] = ((pn[2:,1:-1]+pn[0:-2,1:-1])*dy**2+(pn[1:-1,2:]+pn[1:-1,0:-2])*dx**2)/\ (2*(dx**2+dy**2)) -\ dx**2*dy**2/(2*(dx**2+dy**2))*b[1:-1,1:-1] p[-1,:] =p[-2,:] ##dp/dy = 0 at y = 2 p[0,:] = p[1,:] ##dp/dy = 0 at y = 0 p[:,0]=p[:,1] ##dp/dx = 0 at x = 0 p[:,-1]=0 ##p = 0 at x = 2 return p def cavityFlow(nt, u, v, dt, dx, dy, p, rho, nu): un = np.empty_like(u) vn = np.empty_like(v) b = np.zeros((ny, nx)) for n in range(nt): un[:] = u[:] vn[:] = v[:] b = buildUpB(b, rho, dt, u, v, dx, dy) p = presPoisson(p, dx, dy, b) u[1:-1,1:-1] = un[1:-1,1:-1]-\ un[1:-1,1:-1]*dt/dx*(un[1:-1,1:-1]-un[0:-2,1:-1])-\ vn[1:-1,1:-1]*dt/dy*(un[1:-1,1:-1]-un[1:-1,0:-2])-\ dt/(2*rho*dx)*(p[2:,1:-1]-p[0:-2,1:-1])+\ nu*(dt/dx**2*(un[2:,1:-1]-2*un[1:-1,1:-1]+un[0:-2,1:-1])+\ dt/dy**2*(un[1:-1,2:]-2*un[1:-1,1:-1]+un[1:-1,0:-2])) v[1:-1,1:-1] = vn[1:-1,1:-1]-\ un[1:-1,1:-1]*dt/dx*(vn[1:-1,1:-1]-vn[0:-2,1:-1])-\ vn[1:-1,1:-1]*dt/dy*(vn[1:-1,1:-1]-vn[1:-1,0:-2])-\ dt/(2*rho*dy)*(p[1:-1,2:]-p[1:-1,0:-2])+\ nu*(dt/dx**2*(vn[2:,1:-1]-2*vn[1:-1,1:-1]+vn[0:-2,1:-1])+\ (dt/dy**2*(vn[1:-1,2:]-2*vn[1:-1,1:-1]+vn[1:-1,0:-2]))) u[0,:] = 0 u[:,0] = 0 u[:,-1] = 1 v[0,:] = 0 v[-1,:]=0 v[:,0] = 0 v[:,-1] = 0 u[-1,:] = 0 return u, v, p u = np.zeros((ny, nx)) v = np.zeros((ny, nx)) p = np.zeros((ny, nx)) b = np.zeros((ny, nx)) nt = 200 u, v, p = cavityFlow(nt, u, v, dt, dx, dy, p, rho, nu) fig = plt.figure(figsize=(11,7), dpi=100) plt.contourf(X,Y,p,alpha=0.5) ###plnttong the pressure field as a contour plt.colorbar() plt.contour(X,Y,p) ###plotting the pressure field outlines plt.quiver(X[::2,::2],Y[::2,::2],u[::2,::2],v[::2,::2]) ##plotting velocity plt.xlabel('X') plt.ylabel('Y') u = np.zeros((ny, nx)) v = np.zeros((ny, nx)) p = np.zeros((ny, nx)) b = np.zeros((ny, nx)) nt = 700 u, v, p = cavityFlow(nt, u, v, dt, dx, dy, p, rho, nu) fig = plt.figure(figsize=(11,7), dpi=100) plt.contourf(X,Y,p,alpha=0.5) plt.colorbar() plt.contour(X,Y,p) plt.quiver(X[::2,::2],Y[::2,::2],u[::2,::2],v[::2,::2]) plt.xlabel('X') plt.ylabel('Y') from IPython.core.display import HTML def css_styling(): styles = open("../styles/custom.css", "r").read() return HTML(styles) css_styling()