[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)

二維擴(kuò)散問題控制方程可寫成下面形式:

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖1

這里時(shí)間項(xiàng)采用向前差分,空間項(xiàng)均采用中心差分,很容易寫出離散方程:

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖2

同樣寫出待求項(xiàng):

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖3

初始條件及邊界條件見代碼。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

nx = 31  # 定義x方向節(jié)點(diǎn)數(shù)
ny = 31  # 定義y方向節(jié)點(diǎn)數(shù)
nt = 17  # 定義時(shí)間步長(zhǎng)
nu  = 0.05  # 定義擴(kuò)散系數(shù)
dx = 2/(nx-1)  # 定義x方向網(wǎng)格尺寸
dy = 2/(ny-1)  # 定義y方向網(wǎng)格尺寸
sigma = 0.25   # 定義庫(kù)朗數(shù)
dt = sigma * dx * dy /nu

x = np.linspace(0,2,nx)   # x取值范圍
y = np.linspace(0,2,ny)   # y取值范圍
# 定義邊界條件
u = np.ones((ny,nx))
un = np.ones((ny,nx))
# 定義初始條件
u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2

# 繪制初始條件
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y = np.meshgrid(x, y)
surf = ax.plot_surface(X, Y, u, rstride=1, cstride=1, cmap=cm.viridis,
       linewidth=0, antialiased=False)
ax.set_xlim(0, 2)
ax.set_ylim(0, 2)
ax.set_zlim(1, 2.5)
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
plt.show()

(屏幕左右滑動(dòng)可查看完整代碼)

初始條件如下圖所示。

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖4

# 定義函數(shù)進(jìn)行求解
def diffuse(nt):
   u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2

   for n in range(nt + 1):
       un = u.copy()
       u[1:-1, 1:-1] = (un[1:-1,1:-1] +
                       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]))
       u[0, :] = 1
       u[-1, :] = 1
       u[:, 0] = 1
       u[:, -1] = 1


   fig = plt.figure()
   ax = fig.gca(projection='3d')
   surf = ax.plot_surface(x, y, u[:], rstride=1, cstride=1, cmap=cm.viridis,
       linewidth=0, antialiased=True)
   ax.set_zlim(1, 2.5)
   ax.set_xlabel('$x$')
   ax.set_ylabel('$y$')
   plt.show()

下面進(jìn)行計(jì)算。

diffuse(10)

圖形如下圖所示。

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖5

diffuse(14)

計(jì)算結(jié)果如下圖所示。

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖6

diffuse(50)

如下圖所示。

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一二維擴(kuò)散(9/10)的圖7

以上代碼在jupyter lab中運(yùn)行通過。

注:本系列教程來自國(guó)外一個(gè)使用Python進(jìn)行CFD初級(jí)理論學(xué)習(xí)的項(xiàng)目,源項(xiàng)目網(wǎng)址為:http://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/。感興趣的同學(xué)可以去官方主頁(yè)了解更多信息。

本文轉(zhuǎn)載自微信公眾號(hào)“CFD之道”,有刪減,感謝源作者。

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

2