[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)
上節(jié)測(cè)試中所采用的計(jì)算參數(shù)是固定的(具有固定的時(shí)間步長(zhǎng)和網(wǎng)格尺寸),下面嘗試著更改這些參數(shù),看看對(duì)于計(jì)算結(jié)果是否存在影響。
還是用上次的代碼做測(cè)試,為了方便測(cè)試,對(duì)代碼進(jìn)行簡(jiǎn)單封裝,代碼如下(相同的代碼,這里就不注釋了):
import numpy as np
import matplotlib.pyplot as plt
def linearconv(nx):
dx = 2/(nx -1)
nt = 20
dt = 0.025
c = 1
u = np.ones(nx)
u[int(0.5/dx):int(1/dx+1)] = 2
un = np.ones(nx)
plt.plot(np.linspace(0,2,nx),u,'b',lw=3,label='origin')
for n in range(nt):
un = u.copy()
for i in range(1,nx):
u[i] = un[i]- c* dt / dx * (un[i] - un[i-1])
plt.plot(np.linspace(0,2,nx),u,'r',lw=3,label='current')
plt.legend()
plt.show()
下面通過改變網(wǎng)格尺寸(即dx的數(shù)量),來觀察計(jì)算結(jié)果。
linearconv(41) #網(wǎng)格數(shù)為41
![[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖1](https://img.jishulink.com/images/202205/bxQasriguyjoEJouzW8HcH.gif)
這里用step1的參數(shù)計(jì)算結(jié)果作為參考,這里可以看到,波形存在較大的擴(kuò)散,隨時(shí)間推移,波形與初始形狀偏離嚴(yán)重。
linearconv(61)
可以看出,隨著網(wǎng)格數(shù)量增加,波形失真在減小。
linearconv(71)
波形與初始形狀越來越接近。
linearconv(81)
隨著網(wǎng)格數(shù)量增加,波形失真越來越小,可以認(rèn)為是計(jì)算越來越精確。
linearconv(91)
![[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖5](https://img.jishulink.com/images/202205/mnXjTPWvcJA3TjqKgEoZ6s.gif)
發(fā)生了什么情況,計(jì)算已經(jīng)完全偏離了初始波形,出現(xiàn)了錯(cuò)誤。這其中發(fā)生了什么呢?要回答這個(gè)問題,我們必須考慮一下代碼中實(shí)際發(fā)生了什么。
在時(shí)間循環(huán)的每一次迭代中,我們使用當(dāng)前時(shí)刻的波的數(shù)據(jù)來估計(jì)下一個(gè)時(shí)刻中的波的速度。最初,網(wǎng)格點(diǎn)數(shù)的增加返回了更準(zhǔn)確的答案。數(shù)值擴(kuò)散較少,波形看起來比第一個(gè)例子更像方波。
在每個(gè)時(shí)間步長(zhǎng)內(nèi),波的傳播距離大于網(wǎng)格尺寸dx。網(wǎng)格尺寸dx與總網(wǎng)格數(shù)量nx有關(guān)。因此,穩(wěn)定計(jì)算條件需要滿足下式:
這里u為波速,σ常稱之為Courant數(shù),其值決定了計(jì)算是否穩(wěn)定。在在新版本的代碼中,我們采用CFL數(shù)來根據(jù)dx來計(jì)算合適的dt。
下面改寫代碼:
#新代碼
import numpy as np
import matplotlib.pyplot as plt
def linearconv_m(nx):
dx = 2 / ( nx - 1 )
nt = 20
c = 1
sigma = 0.5
dt = sigma * dx
u = np.ones(nx)
u[int(0.5 / dx):int(1 / dx + 1)] = 2
plt.plot(np.linspace(0,2,nx),u,'b',lw=3,label='origin')
un = np.ones(nx)
for n in range(nt):
un = u.copy()
for i in range(1,nx):
u[i] = un[i]- c* dt / dx * (un[i] - un[i-1])
plt.plot(np.linspace(0,2,nx),u,'r',lw=3,label='current')
plt.legend()
測(cè)試一下新的程序代碼:
linearconv_m(90)
linearconv_m(180)
嗯,滿足了CFL條件后,不管網(wǎng)格怎么加密,計(jì)算結(jié)果依然不會(huì)崩潰。
注:本系列教程來自國(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é)可以去官方主頁了解更多信息。
本文轉(zhuǎn)載自微信公眾號(hào)“CFD之道”,有刪減,感謝源作者。
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺(tái)客服
TOP

![[免費(fèi)案例]Ensight案例教程分享](https://img.jishulink.com/cimage/245b3ca9e2c939e40491a25edae94515.jpeg?image_process=resize,fw_576,fh_320,)


















