LBM池沸腾模拟代码实现
时间: 2023-12-08 21:03:20 浏览: 303
LBM(Lattice Boltzmann Method,格子玻尔兹曼方法)是一种基于微观分子动力学模拟的流体力学数值计算方法。在LBM中,流体被视为由小的、离散的粒子组成的,这些粒子在一定的时间间隔内按照规定的运动规律进行运动,从而实现对流体运动的模拟。
池沸腾是一种常见的相变现象,在工程和科学研究中具有重要的应用价值。LBM可以用来模拟池沸腾过程,下面是一个简单的LBM池沸腾模拟代码实现:
```python
import numpy as np
from matplotlib import pyplot as plt
# 模拟参数设置
nx = 100 # x方向网格数
ny = 100 # y方向网格数
nt = 300 # 模拟步数
dx = 1.0 # x方向网格尺寸
dy = 1.0 # y方向网格尺寸
dt = 1.0 # 时间步长
rho_l = 1.0 # 液相密度
rho_g = 0.1 # 气相密度
mu_l = 0.1 # 液相粘度
mu_g = 0.01 # 气相粘度
u_max = 0.1 # 最大流速
g_x = 0.0 # x方向重力加速度
g_y = -0.001 # y方向重力加速度
sigma = 0.01 # 能量传递速率
q_l = 1.0 # 液相传热速率
q_g = 0.1 # 气相传热速率
T_l = 1.0 # 液相温度
T_g = 0.1 # 气相温度
# 定义格子权重
w = np.array([4/9, 1/9, 1/9, 1/9, 1/36, 1/36, 1/36, 1/36])
# 定义格子速度
c = np.array([[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [-1, 1], [-1, -1]])
# 初始化流场
f = np.zeros((nx, ny, 8))
rho = np.ones((nx, ny)) * rho_l
u = np.zeros((nx, ny, 2))
T = np.ones((nx, ny)) * T_l
# 循环模拟
for it in range(nt):
# 计算宏观量
rho = np.sum(f, axis=2)
u[:, :, 0] = np.sum(f[:, :, [1, 5, 6]], axis=2) - np.sum(f[:, :, [3, 7, 4]], axis=2)
u[:, :, 1] = np.sum(f[:, :, [2, 5, 7]], axis=2) - np.sum(f[:, :, [4, 6, 3]], axis=2)
u /= rho[:, :, np.newaxis]
u[np.isnan(u)] = 0.0
u *= u_max
P = np.zeros((nx, ny))
P[rho < rho_g] = -rho_l * g_y * (rho_g - rho[rho < rho_g])
P[rho >= rho_g] = -rho_l * g_y * (rho_g - rho[rho >= rho_g]) - rho_g * g_y * (rho[rho >= rho_g] - rho_g)
F = np.zeros((nx, ny, 2))
F[:, :, 0] = P / mu_l
F[:, :, 1] = np.zeros((nx, ny))
T[rho >= rho_g] = T_g
T[rho < rho_g] = T_l
# 计算热传导
q = np.zeros((nx, ny, 8))
q[:, :, [1, 3, 5, 7]] = (T[:, :, np.newaxis] - T[:, :, np.newaxis, :]) * q_l
q[:, :, [0, 2, 4, 6]] = (T[:, :, np.newaxis] - T[:, :, :, np.newaxis]) * q_l
# 碰撞
for i in range(8):
cu = u[:, :, 0] * c[i, 0] + u[:, :, 1] * c[i, 1]
feq = w[i] * rho * (1.0 + 3.0 * cu + 4.5 * cu**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, i] = (1.0 - sigma) * f[:, :, i] + sigma * feq + dt * q[:, :, i]
# 边界处理
f[0, :, [1, 5, 8]] = f[1, :, [3, 7, 6]]
f[-1, :, [3, 7, 6]] = f[-2, :, [1, 5, 8]]
f[:, 0, [2, 6, 5]] = f[:, 1, [4, 8, 7]]
f[:, -1, [4, 8, 7]] = f[:, -2, [2, 6, 5]]
f[0, 0, [5, 6, 8]] = f[1, 1, [3, 4, 2]]
f[0, -1, [7, 6, 8]] = f[1, -2, [3, 2, 4]]
f[-1, 0, [5, 7, 8]] = f[-2, 1, [1, 4, 2]]
f[-1, -1, [7, 8, 6]] = f[-2, -2, [1, 2, 4]]
f[:, :, 0] = w[0] * rho * (1.0 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 1] = w[1] * rho * (1.0 + 3.0 * u[:, :, 0] + 4.5 * u[:, :, 0]**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 2] = w[2] * rho * (1.0 + 3.0 * u[:, :, 1] + 4.5 * u[:, :, 1]**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 3] = w[3] * rho * (1.0 - 3.0 * u[:, :, 0] + 4.5 * u[:, :, 0]**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 4] = w[4] * rho * (1.0 - 3.0 * u[:, :, 1] + 4.5 * u[:, :, 1]**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 5] = w[5] * rho * (1.0 + 3.0 * (u[:, :, 0] + u[:, :, 1]) + 4.5 * (u[:, :, 0] + u[:, :, 1])**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 6] = w[6] * rho * (1.0 + 3.0 * (-u[:, :, 0] + u[:, :, 1]) + 4.5 * (-u[:, :, 0] + u[:, :, 1])**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
f[:, :, 7] = w[7] * rho * (1.0 + 3.0 * (-u[:, :, 0] - u[:, :, 1]) + 4.5 * (-u[:, :, 0] - u[:, :, 1])**2 - 1.5 * (u[:, :, 0]**2 + u[:, :, 1]**2))
# 绘图
if it % 10 == 0:
plt.imshow(rho.T, cmap='jet', origin='lower')
plt.colorbar()
plt.title('Density')
plt.show()
```
以上代码实现了一个简单的二维LBM池沸腾模拟,其中包括了流场初始化、宏观量计算、碰撞、边界处理和绘图等模块。在模拟中,我们通过调整模拟参数(如密度、粘度、温度等)来模拟不同的池沸腾现象。
阅读全文