網格的拓撲結構和度量信息

這一篇談談網格,開門見山。

一、網格分類

現今採用的網格,主要分為以下三類。

1. 結構網格:

特徵:內部網格點具有相同的毗鄰單元。

優點:生成方法簡單,便於描述,存儲空間要求小;網格正交性和貼體性好。

缺點:複雜幾何結構生成困難,難於實現通用化和自動化。

2. 非結構網格:

特徵:內部網格點不具有相同的毗鄰單元。

優點:適合複雜幾何結構;能夠控制網格點分布密度;容易實現自適應。

缺點:在邊界層內部採用,需要大量的網格數量;數據存儲空間要求大,訪問速度慢。

3. 笛卡爾網格:

特徵:二維就是正方形,三維正方體。

優點:整體上網格生成簡單;正交性好;適合自適應。

缺點:數據存儲複雜,查詢和遍歷較為耗時;物面邊界網格處理複雜。

針對不同的網格類型,有不同的流程求解器。

以後我們只探討非結構網格求解器,因為其他類型的網格按照非結構網格的存儲方式存儲,都可以用非結構網格求解器求解。

在討論具體的非結構網格存儲格式之前,先來看兩個概念—拓撲結構和度量信息。好多人天天說網格、看網格,也沒有搞明白這兩個概念的區別。

拓撲學是幾何學的一個分支,其研究圖形在連續變化(比如任何連續的點在變化後還是連續的)後,還能夠保持不變的一些數學性質,比如連通性。長度、大小對其沒有意義,它的研究對象都是抽象的點、線等,其對應的變換叫拓撲變換

度量信息則是歐式幾何中才會談到的,它是一些在在剛體變換後幾何圖形還能保持的性質,比如長度、角度等。

那麼對應於非結構網格,這裡的拓撲結構指的是什麼?答案是網格的點、面、體的關係;

度量信息指的是什麼?很簡單,邊的長度、法向量,面的面積、法向量,體的體積等。

二、拓撲結構

先看這張圖:

強調一下,這裡少了網格點的編號,非結構網格中每個網格點,每條邊或者面(二維是邊,三維是面),每個單元都要給定一個不同的編號;

那麼拓撲結構信息可以怎麼給呢?不妨想一想。

比如可以給定所有點的坐標,給定每條邊由哪些點組成,給定每個單元由哪些面組成。

比如可以給定所有點的坐標,給定每個邊由哪些點組成,給定每個單元由哪些點組成。

……

有很多種描述方法,那麼實際給出的拓撲信息是什麼樣子的呢?這還要從流場求解器來看。每個單元的通量計算需要把每條邊上的通量加在一起:

 oint_{partial Omega }^{} [(ar{ar{F_{c} } } -ar{ar{F_{v} } })cdot ar{n} ]dS =sum_{f=1}^{N_{f} }{int_{ f}^{} [(ar{ar{F_{c} } } -ar{ar{F_{v} } })cdot ar{n} ]dS }

那麼是不是應該這樣:計算通量的時候,按照單元循環,給定每個單元由哪些邊組成,然後把所有邊的通量都算好,加到單元上?

實際上不是的,因為每條邊都屬於兩個單元,這樣必然要計算兩次,太耗時。

真正求解器里計算單元通量的時候都是這樣的:按照邊循環,然後看這條邊屬於哪兩個單元,之後把這條邊的通量合併到這兩個單元上去。

既然如此,那麼網格生成後提供給流場求解器的信息最好是這樣組織:

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號(下)
影像|蘇聯航天海報背後的英雄、夢想、榮耀和政治
「音障」美如畫,那它是哪來的呢
有哪些機器人、無人機、控制等「軟+硬」領域大牛寫的非技術類作品?
崛起吧!大飛機背後的中國航空工業

TAG:空气动力学 | 航空航天 | 计算 |