LBM非平衡外推格式计算圆柱边界的代码
时间: 2023-12-11 20:05:49 浏览: 58
以下是使用LBM非平衡外推格式计算圆柱边界的简单示例代码:
```python
import numpy as np
from numba import jit
# 定义常量
nx = 101 # 网格数
ny = 101
Lx = 1.0 # 区域大小
Ly = 1.0
dx = Lx / (nx - 1) # 网格间距
dy = Ly / (ny - 1)
dt = 1e-3 # 时间步长
T = 5.0 # 总时间
nu = 0.1 # 动力粘度系数
Re = 50.0 # 雷诺数
omega = 1.0 / (3.0 * nu + 0.5) # 松弛频率
cx = np.array([0, 1, 0, -1, 0, 1, -1, -1, 1]) # 每个格子的速度分量
cy = np.array([0, 0, 1, 0, -1, 1, 1, -1, -1])
w = np.array([4.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 36.0]) # 每个格子的权重
# 初始化数组
f = np.zeros((nx, ny, 9))
rho = np.ones((nx, ny))
ux = np.zeros((nx, ny))
uy = np.zeros((nx, ny))
# 边界条件
def set_boundary(rho, ux, uy):
# 上下边界
rho[0, :] = rho[1, :]
rho[-1, :] = rho[-2, :]
ux[0, :] = 0.0
uy[0, :] = 0.0
ux[-1, :] = 0.0
uy[-1, :] = 0.0
# 左右边界
rho[:, 0] = rho[:, 1]
rho[:, -1] = rho[:, -2]
ux[:, 0] = 0.0
uy[:, 0] = 0.0
ux[:, -1] = 0.0
uy[:, -1] = 0.0
# 圆柱边界
for j in range(1, ny-1):
rho[0, j] = 1.0
ux[0, j] = 0.0
uy[0, j] = 0.0
rho[-1, j] = 1.0
ux[-1, j] = 0.0
uy[-1, j] = 0.0
for i in range(1, nx-1):
rho[i, 0] = 1.0
ux[i, 0] = 0.0
uy[i, 0] = 0.0
rho[i, -1] = 1.0
ux[i, -1] = 0.0
uy[i, -1] = 0.0
for k in range(9):
cu = 3.0 * (cx[k] * ux[i, j] + cy[k] * uy[i, j])
f[i, j, k] = rho[i, j] * w[k] * (1.0 + cu + 0.5 * cu**2 - 1.5 * (ux[i, j]**2 + uy[i, j]**2))
# LBM非平衡外推格式计算
@jit(nopython=True)
def lbm_nbe(f, rho, ux, uy):
# 预测
for i in range(1, nx-1):
for j in range(1, ny-1):
# 计算宏观量
rho[i, j] = 0.0
ux[i, j] = 0.0
uy[i, j] = 0.0
for k in range(9):
rho[i, j] += f[i, j, k]
ux[i, j] += f[i, j, k] * cx[k]
uy[i, j] += f[i, j, k] * cy[k]
ux[i, j] /= rho[i, j]
uy[i, j] /= rho[i, j]
# BGK更新
for k in range(9):
cu = 3.0 * (cx[k] * ux[i, j] + cy[k] * uy[i, j])
f_star = rho[i, j] * w[k] * (1.0 + cu + 0.5 * cu**2 - 1.5 * (ux[i, j]**2 + uy[i, j]**2))
f[i, j, k] = omega * f_star + (1.0 - omega) * f[i, j, k]
# 残差修正
for i in range(1, nx-1):
for j in range(1, ny-1):
# 计算宏观量
rho[i, j] = 0.0
ux[i, j] = 0.0
uy[i, j] = 0.0
for k in range(9):
rho[i, j] += f[i, j, k]
ux[i, j] += f[i, j, k] * cx[k]
uy[i, j] += f[i, j, k] * cy[k]
ux[i, j] /= rho[i, j]
uy[i, j] /= rho[i, j]
# 计算残差
resx = 0.0
resy = 0.0
for k in range(9):
cu = 3.0 * (cx[k] * ux[i, j] + cy[k] * uy[i, j])
f_star = rho[i, j] * w[k] * (1.0 + cu + 0.5 * cu**2 - 1.5 * (ux[i, j]**2 + uy[i, j]**2))
resx += cx[k] * (f[i, j, k] - f_star)
resy += cy[k] * (f[i, j, k] - f_star)
# 更新分布函数
for k in range(9):
f[i, j, k] -= (resx * cx[k] + resy * cy[k])
# 边界条件
set_boundary(rho, ux, uy)
return rho, ux, uy
# 主程序
for t in range(int(T / dt)):
rho, ux, uy = lbm_nbe(f, rho, ux, uy)
```
需要注意的是,此代码仅为示例,未对计算结果进行处理和可视化。完整的圆柱边界计算代码需要考虑更多细节和优化。