Gmsh是一個跨平臺三維有限元網絡生成與可視化軟件。我們可以使用它進行三維有限元網絡的前(建模)后(可視化)處理。期間需要使用到的文件即為其網格文件(后綴為.msh),建模中使用的文件格式為.geo文件,其具體格式請參見Gmsh說明文檔。Gmsh網格文件主要包含對三維網絡中頂點(Nodes)、幾何元素(Elements)、頂點數據(NodeData)、和元素數據(ElementData)的描述。同時還可以包含對幾何元素或物理元素組的定義。Gmsh定義的網絡文件格式分為相對較為簡單的2.0版本和Gmsh4開始使用的4.0版本。本文主要包含對Gmsh說明文檔中兩個版本網絡文件格式部分的翻譯說明,以及簡單的示例文件。本文所設計的網絡文件均為ASCII碼文件,相應的二進制文件格式請參見Gmsh說明文檔。
Gmsh2網格文件格式
文件預覽
我們首先給出一個Gmsh2版本的四方體網格文件(cube.msh),使用Gmsh查看如下所示:
使用文本編輯器打開cube.msh,內容如下所示:
$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
8
1 0.0 0.0 0.0
2 1.0 0.0 0.0
3 1.0 1.0 0.0
4 0.0 1.0 0.0
5 0.0 0.0 1.0
6 1.0 0.0 1.0
7 1.0 1.0 1.0
8 0.0 1.0 1.0
$EndNodes
$Elements
1
1 5 1 10 1 2 3 4 5 6 7 8
$EndElements
$NodeData
1
"node data"
1
0.0
3
0
1
8
1 0.1
2 0.1
3 0.1
4 0.1
5 1.0
6 1.0
7 1.0
8 1.0
$EndNodeData
$ElementData
1
"element data"
1
0.0
3
0
1
1
1 2
$EndElementData
格式說明
$MeshFormat
與$EndMeshFormat
關鍵字其間定義了網絡文件的版本(2.2)與必要信息,包括文件類型(對于ASCII碼文件,其值為0)和浮點類型長度值(一般為8)。$Nodes
與$EndNodes
關鍵字內包含網絡文件的頂點信息。第一行為頂點的總個數。其后每一行為頂點的序號和直角坐標,以空格分割。頂點的序號是識別頂點的唯一指標,可以從0或1開始,也可以不連續(但可能會增加電腦內存的開銷)。對于兩個坐標相同但序號不同的頂點,Gmsh將視為兩個獨立的頂點。$Elements
與$EndElements
關鍵字內包含幾何元素信息。第一行為元素的總個數。其后每一行為對單個元素的信息描述,格式為<元素序號> <元素類型> <標簽數> <標簽1> ... <頂點序號列表>
。<元素序號>
為元素的識別標示,可以從0或1開始,也可以不連續(但可能會增加電腦內存的開銷)。<元素類型>
為Gmsh預定義用于識別元素類型的一個整數,例如立方體對應代碼為5(其他類型元素的代碼請參見Gmsh說明文檔)。<標簽數>
標示其后跟隨的元素標簽的個數。Gmsh預定義元素的第一個標簽為其所屬的物理組,第二個標簽為其所屬的幾何組。示例中四方體有一個標簽,標簽代碼為10。對于更復雜的網格文件我們可以對元素歸類到不同物理或幾何組,Gmsh將使用不同的顏色顯示不同組別,方便我們查看網絡文件。<頂點序號列表>
為組成元素的頂點集,對應于$Nodes
標簽中對應的頂點序號。注意元素的頂點序列排列順序應符合Gmsh預定義的順序。$NodeData
與$EndNodeData
(可選的)關鍵字內包含對頂點數據集的描述。從上至下依次為字符串標簽的數量與字符串標簽,Gmsh默認使用第一個字符串標簽為數據集的名稱;其下為浮點標簽的個數與浮點標簽,表示該數據集對應的時間;然后為整形標簽個數與整形標簽,分別為數據集的時間序列號(從0開始)、數據集場的分量個數(等于1、3或者9)以及數據點個數。頭信息后,每一行包含<頂點序號> <數據值>
。
-
$ELementData
與$EndELementData
(可選的)關鍵字內包含對元素數據集的描述。其頭信息格式與頂點數據相同,只是其后數據列中的序號為元素的序號。
Gmsh4網格文件格式
文件預覽
我們還是先給出一個Gmsh4版本的四方體網格文件(cube-gmsh4.msh),使用文本編輯器打開cube-gmsh4.msh,內容如下所示:
$MeshFormat
4.0 0 8
$EndMeshFormat
$Entities
8 12 6 1
1 0 0 0 0 0 0 0
2 1 0 0 1 0 0 0
3 1 1 0 1 1 0 0
4 0 1 1 0 1 1 0
5 0 0 1 0 0 1 0
6 1 0 1 1 0 1 0
7 1 1 1 1 1 1 0
8 0 1 1 0 1 1 0
1 0 0 0 1 0 0 0 2 1 -2
2 1 0 0 1 1 0 0 2 2 -3
3 0 1 0 1 1 0 0 2 3 -4
4 0 0 0 0 1 0 0 2 4 -1
5 0 0 1 1 0 1 0 2 5 -6
6 1 0 1 1 1 1 0 2 6 -7
7 0 1 1 1 1 1 0 2 7 -8
8 0 0 1 0 1 1 0 2 8 -5
9 0 0 0 0 0 1 0 2 1 -5
10 1 0 0 1 0 1 0 2 2 -6
11 1 1 0 1 1 1 0 2 3 -7
12 0 1 0 0 1 1 0 2 4 -8
1 0 0 0 1 1 0 0 4 -1 -2 -3 -4
2 0 0 1 1 1 1 0 4 5 6 7 8
3 0 0 0 1 0 1 0 4 -9 1 10 -5
4 1 0 0 1 1 1 0 4 -10 2 11 -6
5 0 1 0 1 1 1 0 4 12 -7 -11 3
6 0 0 0 0 1 1 0 4 9 -8 -12 4
1 0 0 0 1 1 1 0 6 1 2 3 4 5 6
$EndEntities
$Nodes
1 8
1 3 0 8
1 0.0 0.0 0.0
2 1.0 0.0 0.0
3 1.0 1.0 0.0
4 0.0 1.0 0.0
5 0.0 0.0 1.0
6 1.0 0.0 1.0
7 1.0 1.0 1.0
8 0.0 1.0 1.0
$EndNodes
$Elements
1 1
1 3 5 1
1 1 2 3 4 5 6 7 8
$EndElements
$NodeData
1
"node data"
1
0.0
3
0
1
8
1 0.1
2 0.1
3 0.1
4 0.1
5 1.0
6 1.0
7 1.0
8 1.0
$EndNodeData
$ElementData
1
"element data"
1
0.0
3
0
1
1
1 2
$EndElementData
對應Gmsh2的文件格式,可以發現主要存在以下幾點變化:
- 網絡文件版本號由2.2變為4.0;
- 增加了
$Entities
關鍵字; - 更改了
$Nodes
和$Elements
內格式。
下面我們就后兩點變化進行說明。
格式說明
- Gmsh4在網絡文件中增加了
$Entities
與$EndEntities
關鍵字(不可選)用于說明網絡文件中的實體范圍(超出這個范圍的輸出將不被承認)。實體的空間維度由低向高產生依賴,所以對于一個三維實體范圍我們必須定義實體點與面的范圍定義。下面就其格式做具體說明: - 第一行為實體點、線、面和體的個數,對于一個四面體其值分別為8、12、6和1;
- 實體點的描述,其格式為
<序號> <盒子左下底角坐標> <盒子右上頂角坐標> <物理標簽個數> <物理標簽> ...
。這個我們舉出了盒子的概念,指的是能夠包含所描述實體的一個四方體的范圍。對于一個點而言,這個盒子的最小范圍即為其坐標位置本身; - 實體線的描述,其格式為
<序號> <盒子左下底角坐標> <盒子右上頂角坐標> <物理標簽個數> <物理標簽> ... <包含的實體點個數> <實體點序號列表>
。相對于實體點,線描述所增加的內容對線構成的描述。即一條直線由其兩個頂點的序號所描述,注意正的序號為起點,負的序號為終點; - 實體面的描述,其格式為
<序號> <盒子左下底角坐標> <盒子右上頂角坐標> <物理標簽個數> <物理標簽> ... <包含的實體線個數> <實體線序號列表>
。注意實體面包含的線序號需要首尾相接,Gmsh默認按照逆時針方向計算面的外法線方向。負的序號標示反向的線; - 實體的描述,其格式為
<序號> <盒子左下底角坐標> <盒子右上頂角坐標> <物理標簽個數> <物理標簽> ... <包含的實體面個數> <實體面序號列表>
。注意面的外法線方向朝向實體外部。 - Gmsh4在
$Nodes
中增加了分塊的概念,其具體格式為: - 第一行為塊的個數與總的頂點個數,以下為每個塊的內容;
- 在每個塊中,第一行為塊的序號、塊所屬的空間維度、參數化值(一般為0)和當前塊的頂點數,其后為頂點的序號和空間坐標位置。
- 相應的,
$Elements
中也增加了分塊的概念,其具體格式為: - 第一行為塊的個數與總的元素個數,以下為每個塊的內容;
- 在每個塊中,第一行為塊的序號、塊所屬的空間維度、塊的元素類型和當前塊的元素數,其后為元素的序號和組成元素的頂點序號。可以注意到,對于每一個塊,其包含的元素類型應該是一致的。