1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| from numpy import * import numpy as np import numba as nb from numba import jit from matplotlib import cm import matplotlib.pyplot as plt
lx, ly = 200, 200 w = [4/9, 1/9,1/9,1/9,1/9, 1/36,1/36,1/36,1/36] cx = [0, 1, 0, -1, 0, 1, -1, -1, 1] cy = [0, 0, 1, 0, -1, 1, 1, -1, -1] tau, mstep = 1, 5000 G, psi0, rho0 = -140, 4, 200
delta_rho = 200 + (1-2.0 * np.random.random((lx, ly)))
u_x = zeros((lx,ly)); u_y = zeros((lx,ly)) u = zeros((lx,ly)); v = zeros((lx,ly)) ueq = zeros((lx,ly)); veq = zeros((lx,ly)) rho = zeros((lx,ly)); psi = zeros((lx,ly)) fin = zeros((9,lx,ly)); feq = zeros((9,lx,ly)) fout = zeros((9,lx,ly))
for k in range(9): fin[k, :, :] = w[k] * delta_rho
@jit(nopython=True) def uv(fin, rho, u, v, cx, cy): for i in range(lx): for j in range(ly): rho[i,j] = fin[:,i,j].sum() uSum = vSum = 0 for k in range(9): uSum += fin[k,i,j] * cx[k] vSum += fin[k,i,j] * cy[k] u[i,j] = uSum / rho[i,j] v[i,j] = vSum / rho[i,j] return rho, u, v
@jit(nopython=True) def fxy(psi, rho): for i in range(lx): for j in range(ly): psi[i,j] = 4 * exp(-rho0 / rho[i,j]) return psi
@jit(nopython=True) def fff(ueq, veq, rho, fin, feq, fout, w, cx, cy): for i in range(lx): for j in range(ly): t1 = ueq[i,j]**2 + veq[i,j]**2 for k in range(9): t2 = ueq[i,j]*cx[k] + veq[i,j]*cy[k] feq[k,i,j] = rho[i,j]*w[k]*(1 + 3*t2 + 4.5*t2**2 - 1.5*t1) fout[k,i,j] = fin[k,i,j] - (fin[k,i,j] - feq[k,i,j])/tau return feq, fout
for counter in range(mstep): rho, u, v = uv(fin, rho, u, v, nb.typed.List(cx), nb.typed.List(cy)) psi = fxy(psi, rho) Fx = Fy = zeros((lx,ly)) for k in range(9): if k != 0: shifted_psi = np.roll(np.roll(psi, cx[k], axis=0), cy[k], axis=1) Fx += G * psi * w[k] * shifted_psi * cx[k] Fy += G * psi * w[k] * shifted_psi * cy[k] ueq = u + Fx * tau / rho veq = v + Fy * tau / rho feq, fout = fff(ueq, veq, rho, fin, feq, fout, nb.typed.List(w), nb.typed.List(cx), nb.typed.List(cy)) for k in range(9): fin[k,:,:] = np.roll(np.roll(fout[k,:,:], cx[k], axis=0), cy[k], axis=1) if counter % 100 == 0: plt.imshow(rho, cmap=cm.bwr) plt.pause(0.01) plt.clf()
|