[問題討論]使用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

這里用step1的參數(shù)計(jì)算結(jié)果作為參考,這里可以看到,波形存在較大的擴(kuò)散,隨時(shí)間推移,波形與初始形狀偏離嚴(yán)重。

linearconv(61)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖2

可以看出,隨著網(wǎng)格數(shù)量增加,波形失真在減小。

linearconv(71)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖3

波形與初始形狀越來越接近。 

linearconv(81)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖4

隨著網(wǎng)格數(shù)量增加,波形失真越來越小,可以認(rèn)為是計(jì)算越來越精確。

linearconv(91)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖5

發(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ì)算條件需要滿足下式: 

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖6

這里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)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖7 

linearconv_m(180)

[問題討論]使用Python學(xué)習(xí)CFD初級(jí)理論系列一CFL條件(3/10)的圖8

嗯,滿足了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之道”,有刪減,感謝源作者。

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

TOP

5