網格的拓撲結構和度量信息
這一篇談談網格,開門見山。
一、網格分類
現今採用的網格,主要分為以下三類。
1. 結構網格:
特徵:內部網格點具有相同的毗鄰單元。
優點:生成方法簡單,便於描述,存儲空間要求小;網格正交性和貼體性好。
缺點:複雜幾何結構生成困難,難於實現通用化和自動化。
2. 非結構網格:
特徵:內部網格點不具有相同的毗鄰單元。
優點:適合複雜幾何結構;能夠控制網格點分布密度;容易實現自適應。
缺點:在邊界層內部採用,需要大量的網格數量;數據存儲空間要求大,訪問速度慢。
3. 笛卡爾網格:
特徵:二維就是正方形,三維正方體。
優點:整體上網格生成簡單;正交性好;適合自適應。
缺點:數據存儲複雜,查詢和遍歷較為耗時;物面邊界網格處理複雜。
針對不同的網格類型,有不同的流程求解器。
以後我們只探討非結構網格求解器,因為其他類型的網格按照非結構網格的存儲方式存儲,都可以用非結構網格求解器求解。
在討論具體的非結構網格存儲格式之前,先來看兩個概念—拓撲結構和度量信息。好多人天天說網格、看網格,也沒有搞明白這兩個概念的區別。
拓撲學是幾何學的一個分支,其研究圖形在連續變化(比如任何連續的點在變化後還是連續的)後,還能夠保持不變的一些數學性質,比如連通性。長度、大小對其沒有意義,它的研究對象都是抽象的點、線等,其對應的變換叫拓撲變換。
度量信息則是歐式幾何中才會談到的,它是一些在在剛體變換後幾何圖形還能保持的性質,比如長度、角度等。
那麼對應於非結構網格,這裡的拓撲結構指的是什麼?答案是網格的點、面、體的關係;
度量信息指的是什麼?很簡單,邊的長度、法向量,面的面積、法向量,體的體積等。
二、拓撲結構
先看這張圖:
強調一下,這裡少了網格點的編號,非結構網格中每個網格點,每條邊或者面(二維是邊,三維是面),每個單元都要給定一個不同的編號;
那麼拓撲結構信息可以怎麼給呢?不妨想一想。
比如可以給定所有點的坐標,給定每條邊由哪些點組成,給定每個單元由哪些面組成。
比如可以給定所有點的坐標,給定每個邊由哪些點組成,給定每個單元由哪些點組成。
……
有很多種描述方法,那麼實際給出的拓撲信息是什麼樣子的呢?這還要從流場求解器來看。每個單元的通量計算需要把每條邊上的通量加在一起:
那麼是不是應該這樣:計算通量的時候,按照單元循環,給定每個單元由哪些邊組成,然後把所有邊的通量都算好,加到單元上?
實際上不是的,因為每條邊都屬於兩個單元,這樣必然要計算兩次,太耗時。
真正求解器里計算單元通量的時候都是這樣的:按照邊循環,然後看這條邊屬於哪兩個單元,之後把這條邊的通量合併到這兩個單元上去。
既然如此,那麼網格生成後提供給流場求解器的信息最好是這樣組織:
1. 點的編號,對應的坐標;
2. 邊的編號,組成這條邊的的點的編號;
3. 邊的編號,左右兩個單元編號;
4. 每條邊的類型,是內部邊還是不同的邊界邊(物面、遠場等)。
最重要的是點和單元相對於 邊(面)的拓撲信息。下面看看大型軟體是怎麼給這些信息的,以OpenFOAM為例,每個case的constant/polyMesh目錄下,都包含下面5個文件:
points : 點的編號,坐標。
faces: 面的編號,對應的組成網格點編號。
owner: 面的編號,這個面屬於的那個單元編號(規定其屬於某一個單元)。
neighbour:面的編號,這個面屬於的另一個單元的編號。
boundary: 指定faces中,哪些編號對應的邊在內部或者邊界上。
由於我寫的求解器針對航空外流,所以只有物面和遠場邊界條件兩種,那麼我提供的網格拓撲信息是這樣的(二維情況):
數組 points(3,npoints):點的3個坐標。
數組 faces(4,nedges):1、2索引是邊端點的編號,3、4是左右單元編號,4中用-1、-2用於指定邊界類型(邊界上的邊沒有右單元)。
數組 cells(4,ncells):組成每個單元的節點編號,三角形和四邊形都可以處理。
3、度量信息
把上述的拓撲信息讀取之後,就可以先提前計算出一些度量信息,比如邊的長度,邊的法向(規定由左指向右,或者由owner指向neighbour),單元的體積,中心坐標等,這些信息在後面的計算中需要。
OpenFOAM中處理拓撲結構的類叫primitiveMesh,從這個類繼承出fvMesh,fvMesh用於處理獲得這些度量信息。
如果自己寫程序,比如用Fortran,可以採用module設計(類似於C++的namespace,namespace 和 class區別也不大,便於改成C++):
module grid
變數 points,faces,cells 等
contains
subroutine readGrid !獲得拓撲結構
subroutine vol !計算體積
subroutine disToWall !每個單元到壁面的最短距離,湍流模型需要
……
end module
網格部分大體就這樣, 有些細節沒有寫,寫程序的時候可能會遇到,不過都是小問題,容易找到解決辦法。
推薦閱讀:
※拯救禮炮7號(下)
※影像|蘇聯航天海報背後的英雄、夢想、榮耀和政治
※「音障」美如畫,那它是哪來的呢
※有哪些機器人、無人機、控制等「軟+硬」領域大牛寫的非技術類作品?
※崛起吧!大飛機背後的中國航空工業