定常不可压缩势流圆柱绕流pythen编程
时间: 2023-07-02 09:21:45 浏览: 161
了解,圆柱绕流是一个经典的流体力学问题,其主要特征是卡门涡街现象。下面是一个简单的定常不可压缩势流圆柱绕流的Python程序示例,供你参考:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义计算区域大小和网格数量
L = 4.0
H = 2.0
nx = 101
ny = 51
# 定义网格尺寸
dx = L / (nx - 1)
dy = H / (ny - 1)
# 定义计算网格
x = np.linspace(0, L, nx)
y = np.linspace(0, H, ny)
X, Y = np.meshgrid(x, y)
# 初始化速度场和压力场
u = np.zeros((ny, nx))
v = np.zeros((ny, nx))
p = np.zeros((ny, nx))
# 设定边界条件
u[:, 0] = 1.0 # 左边界速度为1
u[:, -1] = 0.0 # 右边界速度为0
v[0, :] = 0.0 # 下边界速度为0
v[-1, :] = 0.0 # 上边界速度为0
p[:, 0] = p[:, 1] # 左边界压力为常数
p[:, -1] = p[:, -2] # 右边界压力为常数
p[0, :] = p[1, :] # 下边界压力为常数
p[-1, :] = p[-2, :] # 上边界压力为常数
# 设定迭代次数和误差阈值
maxiter = 50000
tolerance = 1e-6
# 开始迭代计算
for iter in range(maxiter):
# 计算速度场
un = u.copy()
vn = v.copy()
u[1:-1, 1:-1] = (un[1:-1, 1:-1] -
un[1:-1, 1:-1] * (dt / dx) *
(un[1:-1, 1:-1] - un[1:-1, 0:-2]) -
vn[1:-1, 1:-1] * (dt / dy) *
(un[1:-1, 1:-1] - un[0:-2, 1:-1]) -
(dt / (2 * rho * dx)) *
(p[1:-1, 2:] - p[1:-1, 0:-2]) +
nu * (dt / dx ** 2) *
(un[1:-1, 2:] - 2 * un[1:-1, 1:-1] +
un[1:-1, 0:-2]) +
nu * (dt / dy ** 2) *
(un[2:, 1:-1] - 2 * un[1:-1, 1:-1] +
un[0:-2, 1:-1]))
v[1:-1, 1:-1] = (vn[1:-1, 1:-1] -
un[1:-1, 1:-1] * (dt / dx) *
(vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) -
vn[1:-1, 1:-1] * (dt / dy) *
(vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) -
(dt / (2 * rho * dy)) *
(p[2:, 1:-1] - p[0:-2, 1:-1]) +
nu * (dt / dx ** 2) *
(vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] +
vn[1:-1, 0:-2]) +
nu * (dt / dy ** 2) *
(vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] +
vn[0:-2, 1:-1]))
# 计算速度散度和压力场
rhs = (rho * ((u[1:-1, 2:] - u[1:-1, 0:-2]) /
(2 * dx) + (v[2:, 1:-1] - v[0:-2, 1:-1]) /
(2 * dy)) /
dt)
pn = p.copy()
for q in range(nt):
p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy ** 2 +
(pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx ** 2) /
(2 * (dx ** 2 + dy ** 2)) -
dx ** 2 * dy ** 2 / (2 * (dx ** 2 + dy ** 2)) *
rhs)
# 设定边界条件
p[:, 0] = p[:, 1] # 左边界压力为常数
p[:, -1] = p[:, -2] # 右边界压力为常数
p[0, :] = p[1, :] # 下边界压力为常数
p[-1, :] = 0.0 # 上边界压力为0
# 检查误差是否小于阈值,如果是则结束迭代
err = np.sqrt(np.sum((p - pn) ** 2) / np.sum(pn ** 2))
if err < tolerance:
break
# 检查误差是否小于阈值,如果是则结束迭代
err = np.sqrt(np.sum((u - un) ** 2 + (v - vn) ** 2) /
np.sum(un ** 2 + vn ** 2))
if err < tolerance:
break
# 绘制速度场和压力场
fig = plt.figure(figsize=(11, 7), dpi=100)
plt.contourf(X, Y, p, alpha=0.5, cmap='jet')
plt.colorbar()
plt.contour(X, Y, p, cmap='jet')
plt.quiver(X[::3, ::3], Y[::3, ::3], u[::3, ::3],
v[::3, ::3], alpha=0.5)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
```
上述程序示例中,我们使用的是经典的有限差分法来求解圆柱绕流问题。需要注意的是,在程序中我们使用的是无量纲单位,因此需要根据具体情况来调整参数。此外,如果要求解非定常圆柱绕流问题,则需要使用更加复杂的数值方法,例如有限体积法或有限元法等。
希望以上内容能够帮助你解决问题,如果还有其他问题请随时提出。
阅读全文