Gmsh の使い方

2015年11月22日

はじめに

Gmsh の使い方について。

バージョン

Gmsh 2.11.0 Windows 版

セットアップ

パッケージを適当なところに入れて、ショートカットをデスクトップにでも置いておけばよいが、そのままだとフォントサイズが小さすぎて下のメッセージウインドウの文字が読めないので、ショートカットに起動オプションとして "-fontsize 18" を付ける。

2 次元メッシュの作成

Gmsh は ".geo" ファイルを作成からメッシュを作成する。GUI ではこのファイルを作成していくことになる。はじめに名前を付けたら、あとは GUI の操作に応じてコマンドが自動的にファイルに追記していく。操作のやりなおしはエディタで行うので、GUI の操作に対してどういうコマンドが追記されているか確認しておいたほうがよい。

  1. まずメニュー [File]-[New] でファイルに名前を付ける。
  2. ツリー [Modules] - [Geometry] - [Elementary entities] - [Add] - [Point] で点を追加する。終わったら "q" を押す。
  3. 同じく [Straight line] で点を 2 つずつ選択して線を追加する。終わったら "q" を押す。
  4. 同じく [Plane surface] で線を選択して面を追加する。終わったら "q" を押す。
  5. ツリー [Modules] - [Geometry] - [Physical groups] - [Add] - [Line] で境界に番号を付ける。ひとまとめにしたい境界をいくつか選んで "e" を押すと、番号が付く。終わったら "q" を押す。
  6. 同じく [Surface] で内部領域に番号を付ける。ひとまとめにしたい領域をいくつか選んで "e" を押すと、番号が付く。終わったら "q" を押す。
  7. Physical group の番号に名前を付けたい場合は、".geo" ファイルをテキストエディタで開いて、"Physical Line" や "Physical Surface" の番号の部分を文字列に変える。場所に対応する番号を確認するには、マウスをエンティティに重ねたときに表示される "Physical" の番号を見ればよい。あるいは、メニュー [Tools]-[Visibility] の [List browser] で確認することもできる。
    Physical Line("left") = {4};
    Physical Line("right") = {2};
    Physical Line("top") = {3};
    Physical Line("bottom") = {1};
    Physical Surface("fluid") = {6};
    
    1 つ番号を付けて、エディタで名前を付けて保存して、また別の番号を付けて、名前を付けて…という手順も可能。名前をすべて付け終わったら、".geo" ファイルを開きなおす。
  8. メニュー [Tools]-[Options] の [Mesh]-[General] の "Min/Max element size" でメッシュサイズを指定する。
  9. ツリー [Modules]-[Mesh]-[1D] を押す。続いて [2D] を押すと、メッシュが作成される。
  10. メニュー [File]-[Save Mesh] で ".msh" ファイルが ".geo" ファイルと同じ場所に書き出される。

四辺形メッシュの作成

デフォルトでは三角形メッシュができる。四辺形メッシュを作りたい場合は、メニュー [Tools]-[Options] の [Mesh]-[General] の "Recombine all triangular meshse" にチェックを入れる。あるいは、ツリー [Modules]-[Mesh]-[Define]-[Recombine] で四辺形メッシュにしたい面を指定する。

同オプション画面の "2D algorithm" で "Delaunay for quads" を選ぶときれいなメッシュが得られるかもしれない。

ツリー [Modules]-[Mesh]-[Define]-[Transfinite] を使う方法もある。

サンプル

square.geo

Point(1) = {0, 0, 0, 1.0};
Point(2) = {1, 0, 0, 1.0};
Point(3) = {1, 1, 0, 1.0};
Point(4) = {0, 1, 0, 1.0};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Line Loop(5) = {4, 1, 2, 3};
Plane Surface(6) = {5};
Physical Line("left") = {4};
Physical Line("right") = {2};
Physical Line("top") = {3};
Physical Line("bottom") = {1};
Physical Surface("fluid") = {6};

3 次元メッシュの作成

3 次元メッシュの作成は 2 次元の場合と同様で、Volume まで作成するのと、Physical groups の選択が Line、Surface の代りに Surface、Volume に変わるだけである。

Point - Line - Surface - Volume と作っていく代わりに、ツリー [Modules]-[Geometry]-[Element entities]-[Translate]-[Extrude surface] で Surface を伸ばしてボリュームを作ることもできる。

メッシュは 1D - 2D - 3D と作成していく (いきなり 3D でもよい)。

六面体メッシュの作成

六面体メッシュの作成にはツリー [Modules]-[Mesh]-[Define]-[Transfinite] を用いる。これを用いるには、面がそれぞれ 4 辺からなり、ボリュームが 6 面からなる必要がある。

まず、[Transfinite]-[Surface] でそれぞれの面について指定する。それから [Transfinite]-[Volume] でボリュームを選ぶ。その時、点を選択する必要があるが、表を反時計回りに、次に裏を反時計回りに、という風に規則的に点を選択する必要がある。

サンプル

box.geo

Point(1) = {0, 0, 0, 1.0};
Point(2) = {1, 0, 0, 1.0};
Point(3) = {1, 1, 0, 1.0};
Point(4) = {0, 1, 0, 1.0};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Line Loop(5) = {4, 1, 2, 3};
Plane Surface(6) = {5};
Extrude {0, 0, 1} {
  Surface{6};
}
Physical Surface("left") = {15};
Physical Surface("right") = {23};
Physical Surface("top") = {28};
Physical Surface("bottom") = {6};
Physical Surface("front") = {19};
Physical Surface("back") = {27};
Physical Volume("fluid") = {1};
Transfinite Surface {15};
Transfinite Surface {23};
Transfinite Surface {27};
Transfinite Surface {19};
Transfinite Surface {28};
Transfinite Surface {6};
Recombine Surface {15, 23, 27, 19, 28, 6};
Transfinite Volume{1} = {1, 2, 10, 6, 4, 3, 14, 5};

メッシュサイズの指定

メニュー [Tools]-[Options] でのメッシュサイズの指定は、".geo" ファイルに残らない。コマンドで全体のメッシュサイズを指定するには、次のように書き込む。

Mesh.CharacteristicLengthMin = 0.;
Mesh.CharacteristicLengthMax = 0.1;

ツリー [Modules]-[Mesh]-[Define]-[Element size at points] で点に対してメッシュサイズを指定することができる。

コマンドは以下のようになる。

Characteristic Length {1} = 0.01;
Characteristic Length {2} = 0.1;
Characteristic Length {3} = 0.1;
Characteristic Length {4} = 0.1;

メッシュの出力形式の指定

メニュー [File]-[Save As ...] で Gmsh 以外のメッシュ形式でメッシュを出力できる。

STL の利用

STL を利用するには、次のような ".geo" ファイルを用いる。

Merge "mixing_elbow.stl";

CreateTopology;

ll[] = Line "*";
For i In {0: #ll[]-1}
  Compound Line(newl) = ll[i];
EndFor

ss[] = Surface "*";
s = news;
For i In {0 : #ss[]-1}
  Compound Surface(s+i) = ss[i];
EndFor

Surface Loop(1) = {s : s + #ss[] - 1};
Volume(1) = {1};

Physical Surface ("in1") = {s};
Physical Surface ("in2") = {s+1};
Physical Surface ("out") = {s+2};
Physical Surface ("side") = {s+3};
Physical Volume ("fluid") = {1};

Geometry.HideCompounds = 0;

1 行目の "Merge" で STL ファイルを指定する。それ以下で Compound LIne, Compound Surface というものを作り、形状に直している。そうしないと STL 自体メッシュデータなので、表面のメッシュが STL に依存してしまう (2D でメッシュを切りなおせない) ことになる。

メッシュ作成後、STL の線が邪魔な場合は、メニュー [Tools]-[Visibility] の [List browser] で表面を見えなくすればよい。

Gmsh メッシュファイルの書式

2 次元メッシュを例に説明する。

$MeshFormat
2.2 0 8
$EndMeshFormat

ヘッダー。バージョン、ファイルタイプ、データサイズを指定するが、このまま書けばよい。

$PhysicalNames
5
1 1 "left"
1 2 "right"
1 3 "top"
1 4 "bottom"
2 5 "fluid"
$EndPhysicalNames

境界・領域 (Physical group) の名前。最初の数字は項目の数。続いて、次元、Physical group の番号、名前を書く。上の例では 2 次元メッシュなので、境界は 1 次元、領域は 2 次元が指定されている。

$Nodes
45
1 0 0 0
2 1 0 0
3 1 1 0

...

$EndNodes

節点。最初の数字は節点の数。続いて、節点番号、座標を書く。

$Elements
88
1 1 2 4 1 1 5
2 1 2 4 1 5 6
3 1 2 4 1 6 7

...

21 2 2 5 6 22 34 28
22 2 2 5 6 28 34 36
23 2 2 5 6 24 36 29

...

$EndElements

要素。最初の数字は要素の数。続いて、要素番号、要素タイプ、タグの数、タグリスト、節点番号リスト。

要素タイプは次のようなものがある。

  • 1 : 線
  • 2 : 三角形
  • 3 : 四辺形
  • 4 : テトラ
  • 5 : ヘキサ
  • 6 : プリズム
  • 7 : ピラミッド

タグは、通常は 2 つで、1 つめは境界・領域 (Physical group) 番号、2 つめはジオメトリの番号らしい。