時光飛逝,當我們還在感慨疫情對普通商家衝擊的時候,今年的雙十一購物狂歡已經拉開了序幕。看著陽臺上還堆著去年雙十一囤的貨物,小編暗暗發誓,今年雙十一絕不剁手。不過在鋪天蓋地的宣傳之下,尤其是馬老闆那句:「雙十一併不是打折的節日,而是感恩的節日,是商家用最好的商品和最優的價格來感恩咱們的客戶。」搞得小編又開始熱血沸騰,暫時將剁手之痛拋之腦後。
不過出來混,遲早是要還的,縱然有各種「X唄」做緩兵之計,不過終究是拆東牆補西牆。小剁怡情,大剁傷身,強剁則灰飛煙滅,一不小心人生就發散了。而對於我們CFDer來說,還有一種發散比人生的發散更容易引起不適——便是計算的發散,甚至可以被稱為「CFDer心中永遠的痛」。
為了更好的理解計算的發散問題,本公眾號繼續發揚鋼鐵直男的探索精神,首先從剁手的起源——微分方程的數值解法說起…
01
剁手的起源
我們知道,描述現實世界的數學模型大部分都是微分方程,比如振動力學中的弦振動方程,流體力學的N-S方程,電磁學中的麥克斯韋方程等等。這些微分方程是無法被計算機直接識別並求解的,必須先轉換為代數方程,並通過求解代數方程來獲取原微分方程的解。
將微分方程轉換為代數方程,並基於劃分好的網格進行數值求解,這一革命性的思想使得NS方程在工程上的數值求解成為了可能,也開啟了CFDer的剁手之路。
目前,CFD領域包含的計算方法主要包括有限差分法、有限元法、有限體積法等等。而其中有限體積法的天然守恆特性和在複雜區域上的適用性,使得其成為商業軟體主流採用的方法。
02
定常剁手 VS 非定常剁手
現實中的流體無時無刻不在發生著變化,因此流動問題原則上都是非定常的。不過具體到某一工程問題,如果流場的變化幅度很小,或者流場的細節變化並非我們感興趣的內容,則通常可簡化為定常。比如對於管路流動,人們更想知道流體通過管道的壓降及平均流場,而不太關心瞬態的流動細節,這樣可使問題大大簡化。
因此對於某一具體的工程問題,我們首先要界定是用定常還是非定常的算法。簡而言之,定常算法只求解流場的某一穩定狀態,而非定常計算則需包含跟時間相關的物理過程的歷史細節。
對於喜歡記帳的朋友,大概可以把定常計算理解為只關心每個月在不同領域的消費額度,而非定常計算則幫助消費者準確記錄每時每刻的消費。
由於認知水平所限,人們感興趣的大多數工程問題,都忽略了瞬態效應而近似為定常問題。比如飛機在平流層穩定的巡航,或者汽車在高速公路上定速行駛。因此定常問題的求解是人們在過去多年以來研究的聚焦點。
03
顯式剁手VS隱式剁手
由於流體力學控制方程奇葩的數學性質,即便是定常計算,其數值求解的實現也不簡單。亞聲速不可壓縮問題的控制方程為橢圓型,任意一點的擾動都會影響全場,而超聲速流動的控制方程為雙曲型,即流場中的擾動只會向下遊傳播。對於不同的流動問題,人們需要構造不同的數值格式——這導致求解方法喪失了普適性。
於是人們嘗試在定常的方程中人為加入時間項,使得不同工況下控制方程的數學性質更為相似,便於構造統一的解法,這便是用非定常的思路來求解定常問題的由來。
在計算機條件欠佳的年代,人們首先發明了 「時間推進法」。具體思路是,通過一個假定的初始流場不斷推進,最終逼近到流動穩定的時刻。這就是我們通常所說的顯式算法。不過這裡的時間步並非真實的物理時刻,因此被稱為「偽時間步」。關於「顯式算法」更粗暴的理解則是,此刻的結果可以直接通過上一步的結果推出來。如果用剁手的觀點來看的話,則可以理解為老闆上個月發多少工資,我這個月就買多少錢的東西。
顯式算法由於構造簡單,尤其是對計算機內存的需求小而廣受歡迎。但顯式算法由於需要兼顧穩定性,時間步不能太大,這大幅增加了計算時長,難以滿足工程需求。就好比對於大多數人來說,如果只依靠工資消費的話,總是滿足不了購物的需求和欲望,於是信用卡就應運而生了。
如果說「掙多少,花多少」是顯式的剁手方式,那麼利用信用卡借錢消費,再還錢的循環迭代模式則可以形容為隱式的剁手方式。隱式算法雖然在一定程度上解決了時間步的限制,但是其複雜的循環迭代模式,一不小心可能就引起信用卡逾期未還的發散。
為了更好的理解CFD計算中隱式的概念,我們一起來看看最常見的SIMPLE方法是如何讓CFDer甘心先消費後付款的。
04
最簡單的SIMPLE方法?
作為每一個CFDer都耳熟能詳的的數值方法,SIMPLE算法最早由Patankar和Spalding兩位大神提出。SIMPLE方法的全名為壓力耦合方程組的半隱式方法(Semi-Implicit Method for Pressure-Linked Equations),是目前工程上應用最為廣泛的一種流場計算方法。
看著Spalding和Patankar這對師徒大神的迷之微笑,筆者不由的回憶起當年學習Patankar的《數值傳熱和流動》的痛苦經歷。儘管教材一直保留著,但往事還是不要再提。
言歸正傳,作為一種壓力修正解法,SIMPLE算法通過「先猜(消)想(費)後修(付)正(錢)」的方法得到壓力場,並求解離散化的動量方程(N-S方程)。其基本思路如下:
NO.1
基於給定的壓力場,求解離散形式的動量方程,得出速度場。但壓力場是假定的或不夠精確的,由此得到的速度場一般不滿足連續方程,因此,必須對給定的壓力場加以修正。
NO.2
修正壓力使用的便是壓力泊松方程,又稱壓力修正方程,此方程由離散形式的動量方程和連續性方程通過代數運算得出。
NO.3
接著,使用修正後的壓力場修正速度,使之滿足連續性方程,但此時新的速度場又不一定滿足動量方程。
NO.4
然後不斷迭代計算,並檢查壓力和速度的修正值是否收斂。若不收斂,則用修正後的壓力開始新一輪的計算。如此反覆,直到獲得收斂的解。
通過上述的介紹可以看到SIMPLE方法巧妙的解決了N-S方程中的一個大問題:速度項通過動量方程和連續方程錯綜複雜的耦合在一起。而更繁瑣的壓力項,僅出現在動量方程中,不能得到直接求解。
在SIMPLE算法提出之後,一些改進算法也隨之提出,其中比較知名的包括SIMPLER算法、SIMPLEC算法、PISO算法等,此處不再贅述。
通過上述對於SIMPLE方法的介紹,可以看到迭代法在工程上求解複雜方程具有很好的實用性。而緊緊扼住CFD計算收斂咽喉的「殘差」,便是迭代法的產物。
05
一張圖看懂迭代與殘差
為了更好的理解迭代和殘差,我們一起看看下面這個簡單的例子:
下表更進一步的給出了15次迭代的過程和計算結果。可見,隨著迭代的不斷推進,x和y的值越來越逼近其真實值1和2。而殘差的絕對值也隨著迭代不斷減小。
如果把變量的殘差值畫成隨迭代步的變化曲線,即殘差曲線。當然上述的方程非常簡單,所以其收斂曲線也很完美,計算的殘差隨著迭代的進行而不斷減小。本節提到的殘差為每個變量的絕對殘差,實際工程計算中還可能會使用相對殘差、最大殘差、平均殘差、均方根殘差等參數。
06
信用卡按時還款了嗎?
雖然很多人使用信用卡進行隱式消費,但是只要能夠規劃好收入和消費的關係,按時還款,便可以保證消費的收斂。那麼對於我們經常使用的CFD軟體,其收斂標準除了迭代的殘差之外,還有什麼額外的參數需要考量呢?
迭代殘差判據,剛剛已經舉例說明了,主要是指計算迭代過程,當前計算步的物理量和前一步的差異,需要達到某一設定的標準。比如小夥伴們通常將此值設置為10-4,10-5等,殘差越小意味著結果越逼近收斂;
通量守恆判據,意味著計算域進出口的物理量要達到平衡。最簡單的便是質量守恆,即流入多少,也流出多少。通常情況下,在計算起始階段,流場距離最終的穩定狀態較遠,進出口可能出現不平衡的回流,導致進出口的流量不一致;
監控參量判據,指的是在計算中實時檢測某些敏感位置的物理量如壓力或速度,如果隨著計算的進行,這些物理量不再變化,基本可認為計算趨於收斂。
上述三大判據便是我們判斷計算收斂或者發散的依據了,而小夥伴們也可以根據實際情況聯立使用或者單獨使用。
07
信用卡長時間逾期未還的後果
無論是消費還是數值計算,大家都希望結果是收斂的。不過,出於各種各樣的原因,總有很多人忘記或者無法按時支付信用卡的欠款,如果長時間的逾期未還,可能就要出現發散的問題了。
對於計算過程中的發散,小夥伴們都不陌生,其表現為殘差的急劇增大並導致計算崩潰。而在流場中則表現為某些區域內變量的大幅波動並超出了計算機可容許的數位。
計算的發散通常與以下這些因素相關:
NO.1邊界條件
邊界條件是首先要檢查的問題,比如開口系統中只設置了進口,而沒有出口;或者進出口都使用了靜壓邊界條件,而計算域中又有劇烈的壓力變化等,均容易導致數值溢出而發散。
NO.2初始流場
對於確定的物理問題,給定了初始流場,也就意味著我們要通過計算彌補初始流場和真實物理場之間的鴻溝。因此給定一個好的初場極大程度上影響著收斂性與收斂速度。畢竟,歷史上能夠從開局一個碗到打下江山的只有一個朱元璋。有的CFDer為了獲取更接近真實的初始流場,通常會單獨進行此預計算,比如人為增加粘度儘快獲得穩定流場,再將粘度恢復為正常值進行計算。
NO.3網格問題
如果計算沒算幾步就開始發散,則很可能是網格質量太差,甚至出現了奇點。如果把網格形容為道路,數值求解所構造的矩陣方程組就是道路上馳騁的車輛。老司機常說的「寧走十裡遠,不走一裡險」便是其中的道理。
NO.4CFL數
無論是顯式還是隱式,都會涉及到調節CFL數,CFL數過大則會導致計算不穩定。CFL數的意義在於調節時間步長,使得求解數值解的依賴域完全包含真實解的依賴域,也可理解為,計算不能漏掉流場中擾動的傳播。
NO.5鬆弛因子
不同於CFL數,鬆弛因子(Relaxation Factors)影響的並非時間步長,而是將該時間步的計算結果與上一步結果的差值作適當縮減,以避免由於差值過大而引起非線性迭代過程的發散。因此調節鬆弛因子也可以調節計算的收斂性。
NO.6另一種不收斂
除了由於殘差劇增或者物理量大幅變化引起的發散之外,還有一種不收斂卻是由於所求解物理場本身的屬性引起的。比如機翼的大攻角工況下,吸力面有大面積的流動分離,這種流動現象本身就有很強的瞬態特徵,強制使用定常算法自然容易引起發散。
08
LBM——不會爆倉的儲蓄卡消費?
傳統CFD方法使用的隱式迭代不可避免的會碰到收斂和發散的問題,儘管各路大神發明了各種「小額貸」或者「還款小助手」,不斷改善計算的穩定性,但本質上無法完全消除計算迭代所導致的發散的風險。
反觀LBM方法,其天然瞬態與接近物理本原的特性,決定了它是一種穩定的顯式方法。而且,LBM中的時間推進就是真正的物理時刻,而非前文提到的「偽時間步」。因此,LBM計算中,下一時刻的狀態完全由上一時刻推算得出,每個物理時間步內並無額外的迭代。
如果把傳統的CFD方法形容為信用卡消費,那麼LBM方法則是典型的儲蓄卡消費。因此,優秀的LBM方法通常具有非常好的魯棒性,幾乎不會出現計算發散的問題。而關於LBM的理論基礎,之前的文章中已有很多的介紹,感興趣的小夥伴可以向前翻閱。
雙十一的優惠力度雖然很大,該收斂的時候還是要收斂,否則下個月還信用卡的時候就要發散啦。人生不僅需要平穩,還需要精緻。正如CFD計算的收斂和精度,一個都不能少。敬請期待後續的文章「關於CFD精度的另類解讀」。