CFD網格中的幾何操作(程序中的幾何操作):

上圖是二維情況下非結構網格的嵌套結果示意,其中黑色的粗線代表兩套網格的的邊界。在CFD領域,嵌套網格的使用可以大大的減小網格生成的難度、提高網格的重用性。嵌套網格技術可以很方便的用來處理運動部件,在直升機旋翼的領域,嵌套網格技術幾乎成為CFD模擬的一種主流手段。面對越來越複雜的槳葉、機身等複雜的幾何外形,非結構網格憑藉其良好的適應性在CFD領域展現出了良好的應用潛力。

與結構網格或者笛卡爾網格不同,非結構網格的網格單元形狀相對複雜,對單元的操作也比較複雜,但是網格操作的方法更加通用。下面兩圖是在本文介紹的幾何操作基礎上開發的非結構嵌套網格程序的得到的算例。其中圖1是兩片槳葉和背景網格的嵌套結果示意,圖中的槳葉網格和背景網格均採用了非結構網格。圖2是四片槳葉和背景網格的嵌套結果,但是所採用的背景網格是笛卡爾網格。可以看出,本文的幾何操作的通用性比較好。

圖1:

圖2

師兄Captain Sun - 知乎在文章zhihu.com/question/5131裡面已經把很多CFD成果分享給大家了,其中涉及到了二維、三維的非結構網格的生成、二維的流場模擬、三維的旋翼流場模擬等內容。非結構網格陣面推進非結構網格的嵌套 等網格操作過程中都會頻繁的用到幾何操作(比如:新推進生成的三角形不能與之前的三角形相交;非結構嵌套網格裡面宿主單元的搜索等),此處給大家分享一些程序裡面幾何操作的實現細節。 幾何上看起來很直接的東西在程序裡面實現就不那麼直接了,剛開始的處理這些的時候我也是很煩,貌似無從下手。下面我將處理的一些經驗分享給大家,希望可以幫到需要的人。

1.兩點在線的同一側:

如上圖所示,怎麼樣才可以判斷C、D在線段AB的同一側呢?大家眼睛一看就可以看出來,但是電腦怎麼樣看呢?其實電腦鬧是很笨的,你需要告訴它怎麼做它才可以怎麼做。當然,我們可以建立直線AB的方程,然後判斷C、D是否在AB的同側,但是在建立直線方程的時候需要考慮斜率是否接近無窮大,而且在下面的拓展情況裡面(比如判斷線段的相交、面的相交)下,考慮的情況會更多,處理氣力啊也更複雜。此處介紹給大家的方法是我的CFD求解程序裡面用到的幾何判斷法。

如上圖所示,我們只需要添加線段AB的法向量 n 即可,當任一點M在法向量所指向的一側的時候nbullet BC>0 ( n與BC都是向量,bullet 為點乘運算,下文中的bullet 兩側的量都是向量),在相反側的時候小於0,在直線AB上的時候等於0。

至此,這個問題是不是很清楚了?判斷 C、D是否位於線段AB的同側只需按照下述判斷方法:

(1)(nbullet BC)*(nbullet BD)>0 C、D位於線段AB的同側

(2)(nbullet BC)*(nbullet BD)<0 C、D位於線段AB的兩側

(本文中* 為普通的點乘運算)。(上述構造向量的時候用到了線段上的B點,實際上線段上的點你可以任選,只要保證選擇的點在直線AB上即可)

2.線相交

對於二維的CFD求解所需的網格,網格上面的操作很多情況下是需要判斷線段的相交。

如圖,判斷線段AB、CD是否相交。我們可以將此問題分解為1 中的問題:

(1)假如C、D兩點位於AB線段的兩側,則線段CD必定與直線AB相交;

(2)假如A、B兩點位於CD線段的兩側,則線段AB必定與直線CD相交;(注意我此處「線段」,「直線」的使用),故只要滿足了(1)(2)兩個條件,我們就可以判斷兩條線段的相交關係。

3.點在三角形內部

同樣還是藉助於線段的法向量:

如上圖所示的三角形(其他形狀類似),只要保證:

(1)被檢測點D與B位於線段AC的同側

(2)D、C位於線段AB的同側

(3)D、A位於線段BC的同側 即可以判斷點D位於三角形的內部。

注意上述表述,當時四邊形的時候需要檢測4次(對應4條邊),……,n邊形檢測n次即可。圖示中的法向量方向也可以指向三角形的內部,隨意選即可。

4 兩點在面的同側

與判斷兩點位於線段的同側完全類似,假設n為此面的法向量, (nbullet BF)*(nbullet BD)>0時連點位於面的同側,小於0位於面的兩側,等於0:至少一點位於面上。

5.面相交

線相交的三維推廣是面相交,再往上一級推廣是體的相交(體的相交可以分解為面的相交,在此不再贅述了,只討論面的相交)。

類比於之前線相交,面相交的判斷可以分解為以下兩步:

(1)判斷三角形1中的任何一條線段是否與另外一個三角形相交(其他形狀類似)

(2)按照(1)反過來判斷

下面來判斷一條線段與一個面的相交關係:

如上圖所示,分為以下步驟:

(1)求得面的法向量n,(向量BC叉乘向量BA即可,必要時做規範化處理)

(2)判斷D、F兩點是否位於三角形ABC的同側,位於同側的話表明必定不相交,判斷結束;位於兩側的話進行(3)

(3)求出直線與面ABC的交點M(求交點的時候注意分母不為0)

(4)判斷點M是否在三角形ABC內部(由於是三維的,求邊的法向量的時候還得加一個條件:此法向量位於三角形ABC面內,,簡單的幾何推導,此處不再贅述)

注意此處「三角形」與「面」的區別使用。

至此,關於CFD網格中涉及的幾何操作基本上已經介紹完畢了,也基本上以演算法流程的形式加以了表述,有哪裡看不明白的地方歡迎提問。

推薦閱讀:

誰能用軟體跑一下6+大牌德州的牌型概率不?
男友他媽的媽見到女友他媽的爸叫什麼?
演算法相關學習資料整理
零基礎學開發經驗分享

TAG:程序 | 计算流体力学CFD | 计算几何 |