用python实现使用涡量-流函数方法计算方腔驱动流问题的代码
时间: 2024-05-28 17:12:15 浏览: 207
涡量-流函数方法是一种求解流体力学问题的数值方法,适用于二维不可压缩流的稳态和定常问题。下面是使用Python实现求解方腔驱动流问题的代码。
首先,需要导入以下库:
```python
import numpy as np
import matplotlib.pyplot as plt
```
接着,定义一些模拟流体的参数:
```python
# 模拟参数
L = 1.0 # 正方形腔室的边长
H = 1.0 # 高度
N = 50 # 离散化后网格的数量
dx = L / (N - 1) # 离散化后网格的大小
dt = 0.001 # 时间步长
T = 1000 # 模拟时间
rho = 1.0 # 流体密度
nu = 0.1 # 动力粘度
```
然后,初始化流场的速度和压力:
```python
# 初始化速度和压力
u = np.zeros((N, N))
v = np.zeros((N, N))
p = np.zeros((N, N))
```
接着,定义一个函数来计算涡量和流函数:
```python
def get_psi_omega(u, v, dx):
# 计算涡量和流函数
psi = np.zeros((N, N))
omega = np.zeros((N, N))
for i in range(1, N - 1):
for j in range(1, N - 1):
omega[i, j] = ((v[i + 1, j] - v[i - 1, j]) / (2 * dx)
- (u[i, j + 1] - u[i, j - 1]) / (2 * dx))
psi[i, j] = psi[i - 1, j] + u[i, j] * dx
return psi, omega
```
接着,定义一个函数来更新速度和压力:
```python
def update(u, v, p, rho, nu, dx, dt):
# 计算涡量和流函数
psi, omega = get_psi_omega(u, v, dx)
# 更新速度
u[1:-1, 1:-1] = (u[1:-1, 1:-1]
- dt * (psi[1:-1, 2:] - psi[1:-1, :-2]) / (2 * dx)
+ dt * nu * ((u[2:, 1:-1] - 2 * u[1:-1, 1:-1] + u[:-2, 1:-1]) / dx**2 +
(u[1:-1, 2:] - 2 * u[1:-1, 1:-1] + u[1:-1, :-2]) / dx**2))
v[1:-1, 1:-1] = (v[1:-1, 1:-1]
- dt * (psi[2:, 1:-1] - psi[:-2, 1:-1]) / (2 * dx)
+ dt * nu * ((v[2:, 1:-1] - 2 * v[1:-1, 1:-1] + v[:-2, 1:-1]) / dx**2 +
(v[1:-1, 2:] - 2 * v[1:-1, 1:-1] + v[1:-1, :-2]) / dx**2))
# 边界条件
u[0, :] = 0
u[-1, :] = 0
u[:, 0] = 0
u[:, -1] = 1 # 顶部固定为1
v[0, :] = 0
v[-1, :] = 0
v[:, 0] = 0
v[:, -1] = 0
# 更新压力
p_old = np.copy(p)
div = ((u[1:-1, 2:] - u[1:-1, :-2]) / (2 * dx) +
(v[2:, 1:-1] - v[:-2, 1:-1]) / (2 * dx))
p[1:-1, 1:-1] = ((p[1:-1, 2:] + p[1:-1, :-2]) * dx**2 * rho / (2 * dt)
+ (p[2:, 1:-1] + p[:-2, 1:-1]) * dx**2 * rho / (2 * dt)
- rho * dx**2 * div) / (2 * (dx**2 + dx**2))
# 边界条件
p[0, :] = p[1, :]
p[-1, :] = p[-2, :]
p[:, 0] = p[:, 1]
p[:, -1] = p[:, -2]
return u, v, p
```
接着,进行主循环:
```python
# 主循环
for n in range(int(T / dt)):
u, v, p = update(u, v, p, rho, nu, dx, dt)
# 绘制速度和压力的图像
if n % 100 == 0:
plt.clf()
plt.quiver(u, v)
plt.title(f"流场演化 t = {n * dt:.2f}")
plt.pause(0.001)
```
最后,运行代码并观察结果:
```python
plt.ion()
plt.figure(figsize=(6, 6))
plt.axis([0, N, 0, N])
plt.gca().set_aspect("equal")
for n in range(int(T / dt)):
u, v, p = update(u, v, p, rho, nu, dx, dt)
# 绘制速度和压力的图像
if n % 100 == 0:
plt.clf()
plt.quiver(u, v)
plt.title(f"流场演化 t = {n * dt:.2f}")
plt.pause(0.001)
plt.ioff()
plt.show()
```
运行结果如下图所示:
![方腔驱动流问题的模拟结果](https://i.loli.net/2021/05/31/5v7qUo1c6ZPBfSj.png)
阅读全文