結構對稱為什麼流場仿出來不對稱?


對稱幾何模擬出非對稱結果很正常:

1. 穩態下是否收斂;

2. 網格是否完全對稱;

3. 非結構網格在大體對稱的情況下,有可能非對稱解;

4. 瞬態下某些對稱幾何下無對稱解,典型的渦街;

5. 非常小的數值擾動,都會導致非對稱接;

5. 如果邊界條件本身加了擾動例如湍流進口,也會導致非對稱解;

6. 如果你在做CFD模擬真實情況但不能得到真實解,首先從實驗著手看看是不是不存在對稱解;

7. CFD結果不適合討論,大家都知道CFD某些情況下會偏離真實解;

最後,強制對稱解可以通過模擬一半來獲得。

以上都是廢話,做CFD的都懂得,匿;

ldy

/*------------------------------------------------------------*/

改一下,不能說很正常,只能說會發生吧。「很正常」略偏激。


首先贊同ldy的回答。

分兩種情況:

第一種:用的是steady state RANS,如果網格,邊界條件全都對稱的話,這時候在對稱幾何中出現非對稱流場基本上有兩種原因,一種是數值方法導致沒收斂,還一種是由流場結構導致的無法收斂。假設你已經對CFD比較了解了不會出現第一個問題,那我們就來討論第二個問題。對於很多流場,其本身就非常不穩定,這時候就算你用的是穩態流場也不能得到一個完全收斂的結果。比如在很多大分離的流場中如果你用穩態演算法其實殘差是沒法下降到很小的,如圓柱繞流等,就算你用SIMPLE演算法也很難得到完全收斂的結果。這時候你就會得到一個隨著時間步持續變化的流場,這也是很正常的。放在你這裡的情況就是你認為收斂了但是流場還不對稱。

第二種:用的是unsteady RANS(看起來你沒用LES)。這時候出現瞬時不對稱的流場就太正常不過了,你需要對流場進行時均,當求時均時間足夠長之後,你會得到一個對稱流場的。


舉個自己從事的一個例子:

考慮一個一維的棍,棍上有兩個點施加一個缺口,然後做拉伸。假設兩個點以棍中點對稱,那麼這個問題就是一個對稱的問題。然而模擬的結果都只是其中一個缺口先斷裂,另一個缺口安然無恙。

這個是一個失穩下對稱問題的非對稱解。還有一些例如三點彎曲或者四點彎曲梁問題,損傷一般都不是對稱的。


補充一個小例子,說明一下我們日常數學意義上的對稱轉換成代碼之後並不一定是對稱的:

比如這個在代碼寫得不小心或者編譯不恰當的時候會出現用低精度值float初始化高精度double的情況

#include&

#include&

int main(){

float afloat = 5.123456789;

double adouble=afloat;

float b=1.2;

std::cout &<&< std::setprecision(20) &<&< adouble &<&< " ";

std::cout &<&< std::setprecision(20) &<&< adouble-b+1.2000 &<&< " ";

std::cout &<&< std::setprecision(20) &<&< adouble+b-1.2000 &<&< " ";

return 0;

}

經驗上我們會覺得得到三個一樣的數字,但是編譯執行一下就知道(g++ -O3):

5.1234569549560546875

5.1234569072723390448

5.1234570026397703302

(double的有效精度沒有這麼長,這裡只是意思一下)。從第七位開始就有差異,於是這相當於給一個流場輸入了一個無窮小擾動,這個小擾動很可能導致失穩,失去對稱性。

輸入值小擾動的另一方面影響是長時間迭代後(Lyapunov time)系統相空間軌跡趨向於混沌,比如MD程序,初始原子位置用float初始化double,經過長時間迭代之後每一次的軌跡都會不一樣。

其他答案里有人評論到「計算機不會做隨機的事情」,其實反例到處都是。intel mkl編譯選項里專門有一條『fp-model precise『, 就跟這個『numerical reproducibility『問題』相關。分析可以看這個

http://sc13.supercomputing.org/sites/default/files/WorkshopsArchive/pdfs/wp140s1.pdf

Consistency of Floating-Point Results using the Intel速 Compiler

Consistency of Floating-Point Results using the Intel? Compiler


or


Why doesn』t my application always give the same answer?

開頭就是『Binary floating-point [FP] representations of most real numbers are
inexact, and there is an inherent uncertainty in the result of most
calculations involving floating-point numbers.』

另外,在cfd涉及的並行計算中程序執行的不確定性會更大,不信去試試這個看看隨機性如何

#pragma omp parallel for

for(int i=0;i&<4;i++){

printf("hello %d
",i);

}

憑記憶寫的,不準確之處歡迎打臉。


如果你相信流體控制方程的解是唯一的,也相信計算機的數字電路是確定性的,那麼不對稱的數值模擬結果意味著輸入和處理中存在不對稱因素。一般地,不對稱性可能來自:

不對稱幾何;

不對稱初始條件;

不對稱邊界條件;

不對稱網格;

線性系統的不對稱求解。

截斷誤差不應該是不對稱的來源,要截斷大家截斷的一樣。截斷誤差加上不對稱的計算過程才能導致不對稱的結果。

渦街只是不對稱的一種表現,也不是來源。渦街無非是一種失穩現象,而失穩必須由不對稱條件觸發。就像匿名答案提到的,你用鏡像條件算半個圓柱,永遠不會出渦街。

當然,小的擾動可以導致「明顯 」不對稱的結果,這是控制方程不穩定的表現;然而這並不意味著不對稱的結果總是可以自發出現。

最後,控制方程的解是唯一的,計算機是確定性的,你都可以選擇不相信。

----

當解不唯一的時候,解的對稱性可以自動地小於問題的對稱性。

(單個解旋轉90度是不對稱的)


這種情況就是考慮紊流的情形,如果雷諾數大於了2000就是紊流,紊流不規則運動,怎麼可能出現對稱性


有一種情況是貼壁效應: 在一個對稱管中的射流,當雷諾數大於一定值時,流動沿著其中一側進行。所以在這種情況下如果模擬出來的結果對稱反而不對了。我也是新手,不知道你是不是這種情況。


不用邀請我了,排名第一匿名的回答已經很好了。

也如那個回答里說的,想要得到完全對稱的模擬結果,可以只用對稱結構的一半進行模擬。


感覺可能是計算機計算的時候產生的截斷誤差。貌似計算機計算流場用的是分步計算然後累積的思路,然後因為計算機精度問題,計算結果是有限位小數,會有一個截斷誤差。

如果在一個區域流場比較密集的話(嗯…流速比較快),大致可以想像,在這一區域的較小的誤差會被逐漸放大,然後對稱的流場數值計算結果就不對稱了。

至於為什麼這部分誤差不會被抵消掉,這個大概和計算機的演算法和流場本身的性質(比如凸性)都有關係吧。(其實主要是我也不太懂……)


推薦閱讀:

openfoam入門,應該從什麼學起?
FLUENT能計算微通道流體/納米流體嗎?
FLUENT為什麼沒有高階精度?
關於漩渦的合理數學描述?
有沒有學習ansys比較好的書籍或視頻教學推薦?

TAG:流體力學 | 計算流體力學CFD | ANSYS | AnsysWorkbench |