LBM二维圆柱绕流,在圆柱上加上射流代码
时间: 2023-06-18 14:02:59 浏览: 47
LBM是一种基于微观粒子运动的数值模拟方法,适用于流体力学领域。对于二维圆柱绕流问题,可以采用LBM方法求解。下面是一个简单的LBM二维圆柱绕流的示例程序,其中加入射流的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义LBM模拟的参数
nx = 201 # x方向格子数
ny = 101 # y方向格子数
cx = nx // 2 # 圆柱圆心x坐标
cy = ny // 2 # 圆柱圆心y坐标
r = 20 # 圆柱半径
viscosity = 0.04 # 粘度
omega = 1 / (3 * viscosity + 0.5) # 松弛时间
u_lid = 0.1 # 上壁面速度
rho0 = 1 # 初始密度
u0 = np.zeros((nx, ny, 2)) # 初始速度
# 初始化密度和速度分布函数
f = np.zeros((nx, ny, 9))
feq = np.zeros((nx, ny, 9))
rho = np.ones((nx, ny)) * rho0
# 定义二维速度数组
c = np.array([[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [-1, 1], [-1, -1], [1, -1]])
# 定义求解函数
def equilibrium_density(u, rho):
u_square = u[:, :, 0] ** 2 + u[:, :, 1] ** 2
for i in range(9):
cu = np.dot(c[i], u.transpose((1, 0, 2)).reshape(ny * nx, 2)).reshape(ny, nx)
feq[:, :, i] = rho * 4 / 9 * (1 - 1.5 * u_square + 3 * cu + 4.5 * cu ** 2 - 1.5 * u_square)
def collision(f, feq):
f += omega * (feq - f)
def streaming(f):
for i in range(9):
f[:, :, i] = np.roll(f[:, :, i], c[i, 0], axis=0)
f[:, :, i] = np.roll(f[:, :, i], c[i, 1], axis=1)
def bounce_back(f):
f[0, :, 2] = f[0, :, 4]
f[0, :, 5] = f[0, :, 7]
f[0, :, 6] = f[0, :, 8]
f[-1, :, 4] = f[-1, :, 2]
f[-1, :, 7] = f[-1, :, 5]
f[-1, :, 8] = f[-1, :, 6]
f[:, 0, 1] = f[:, 0, 3]
f[:, 0, 5] = f[:, 0, 7]
f[:, 0, 8] = f[:, 0, 6]
f[:, -1, 3] = f[:, -1, 1]
f[:, -1, 7] = f[:, -1, 5]
f[:, -1, 6] = f[:, -1, 8]
f[cx - r:cx + r + 1, cy - r:cy + r + 1, 1] = f[cx - r:cx + r + 1, cy - r:cy + r + 1, 3]
f[cx - r:cx + r + 1, cy - r:cy + r + 1, 5] = f[cx - r:cx + r + 1, cy - r:cy + r + 1, 7]
f[cx - r:cx + r + 1, cy - r:cy + r + 1, 8] = f[cx - r:cx + r + 1, cy - r:cy + r + 1, 6]
# 初始化速度场
u0[1:-1, 1:-1, 0] = u_lid
u0[1:-1, 1:-1, 1] = 0
u = u0.copy()
# 迭代求解
for i in range(5000):
# 计算密度和速度分布函数
rho = np.sum(f, axis=2)
equilibrium_density(u, rho)
# 碰撞
collision(f, feq)
# 建立边界条件
bounce_back(f)
# 流动
streaming(f)
# 计算速度
u[:, :, 0] = (f[:, :, 1] + f[:, :, 5] + f[:, :, 8] - f[:, :, 3] - f[:, :, 6] - f[:, :, 7]) / rho
u[:, :, 1] = (f[:, :, 2] + f[:, :, 5] + f[:, :, 6] - f[:, :, 4] - f[:, :, 7] - f[:, :, 8]) / rho
# 添加射流
if i > 1000:
u[cx - r:cx + r + 1, cy - r:cy + r + 1, 0] = u_lid
u[cx - r:cx + r + 1, cy - r:cy + r + 1, 1] = 0
# 绘制流场
if i % 100 == 0:
plt.clf()
plt.imshow(np.sqrt(u[:, :, 0] ** 2 + u[:, :, 1] ** 2).transpose(), cmap='jet')
plt.colorbar()
plt.pause(0.001)
```
在代码中,我们首先定义了LBM模拟的参数,包括圆柱半径、粘度等。然后初始化了密度和速度分布函数,并定义了求解函数、碰撞函数、边界条件函数和流动函数。最后,在迭代求解过程中添加了射流的代码,即在模拟的1000步之后,将圆柱内部的速度设置为射流速度。最终,我们可以通过绘制流场来观察圆柱绕流和射流的交互作用效果。