gmsh v4.10.5のPython APIで構造格子と非構造格子を組み合わせて使う方法について説明する
はじめに
最終的にこんなものができる
↓公式ドキュメントはこれ
↓インストールと設定はこれ
それではいってみよう
ソースコード
ポイントは以下の通り
これを踏まえたうえで,ソースコード全文はこうなる
import gmsh
#initialize gmsh and add model
gmsh.initialize()
#gmsh.option.setNumber("General.Terminal", 1)
gmsh.model.add("test")
boxdim = 1
gridnum = 16
gridsize = 0.1
coef1 = 0.25 #非構造格子のメッシュの細かさ
coef2 = 0.85 #構造格子のメッシュの細かさ
#add poiuts
gmsh.model.geo.addPoint(0,0,0,gridsize,1)
gmsh.model.geo.addPoint(boxdim,0,0,gridsize,2)
gmsh.model.geo.addPoint(boxdim,boxdim,0,gridsize*coef1,3)
gmsh.model.geo.addPoint(0,boxdim,0,gridsize,4)
gmsh.model.geo.addPoint(2*boxdim,0,0,gridsize,5)
gmsh.model.geo.addPoint(2*boxdim,boxdim,0,gridsize,6)
#add Line
gmsh.model.geo.addLine(1,2,7)
gmsh.model.geo.addLine(2,3,8)
gmsh.model.geo.addLine(3,4,9)
gmsh.model.geo.addLine(4,1,10)
gmsh.model.geo.addLine(2,5,11)
gmsh.model.geo.addLine(5,6,12)
gmsh.model.geo.addLine(6,3,13)
#add CurveLoop
gmsh.model.geo.addCurveLoop([7,8,9,10],14)
gmsh.model.geo.addCurveLoop([11,12,13,-8],15)
#add PlenSurface
gmsh.model.geo.addPlaneSurface([14],16)
gmsh.model.geo.addPlaneSurface([15],17)
#Make one square structured.
gmsh.model.geo.mesh.setTransfiniteCurve(7,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteCurve(8,gridnum,meshType="Progression",coef=coef2)
gmsh.model.geo.mesh.setTransfiniteCurve(9,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteCurve(10,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteSurface(16)
gmsh.model.geo.mesh.setRecombine(2,16)
#gmsh.model.geo.mesh.setRecombine(2,17)
#generate mesh and finalize gmsh
gmsh.model.geo.synchronize()
gmsh.model.mesh.generate(3)
gmsh.write('test.msh')
gmsh.finalize()
print("gmsh > done!")
なんのことはない,四角形を2つ作るだけのプログラムである
少し詳しく説明する
非構造格子の設定
非構造格子の設定は以下の部分で行っている
#add poiuts
gmsh.model.geo.addPoint(0,0,0,gridsize,1)
gmsh.model.geo.addPoint(boxdim,0,0,gridsize,2)
gmsh.model.geo.addPoint(boxdim,boxdim,0,gridsize*coef1,3)
gmsh.model.geo.addPoint(0,boxdim,0,gridsize,4)
gmsh.model.geo.addPoint(2*boxdim,0,0,gridsize,5)
gmsh.model.geo.addPoint(2*boxdim,boxdim,0,gridsize,6)
addPoint
の使い方は以下の通り
gmsh.model.geo.addPoint(X座標,Y座標,Z座標,点近傍のメッシュサイズ,Pointのタグ)
gmshのデフォルトは非構造格子なので,4つ目の引数でその点近傍のメッシュサイズを指定したら,あとはいい感じに非構造格子を作成してくれる
構造格子のサイズの決定
構造格子の設定は以下の部分で行っている
#Make one square structured.
gmsh.model.geo.mesh.setTransfiniteCurve(7,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteCurve(8,gridnum,meshType="Progression",coef=coef2)
gmsh.model.geo.mesh.setTransfiniteCurve(9,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteCurve(10,gridnum,meshType="Progression",coef=1)
gmsh.model.geo.mesh.setTransfiniteSurface(16)
gmsh.model.geo.mesh.setRecombine(2,16)
構造格子では,Transfinite meshesを使ってメッシュサイズを決定する
≫Gmsh reference manual (stable release) - 6.3.2 Structured grids
≫tutorial_python_t6.py - GitLab
gmsh.model.geo.mesh.setTransfiniteCurve(Curveのタグ,分割数,分割タイプ,係数)
gmsh.model.geo.mesh.setTransfiniteSurface(Surfaceのタグ)
gmsh.model.geo.mesh.setRecombine(次元数(=2),Surfaceのタグ)
setTransfiniteCurve
メソッドでは分割のタイプとして"Progression"
と"Bump"
を選択することができる
"Progression"
を選択すると,指定した係数(>1)倍だけ曲線の向きにメッシュが大きくなっていく.曲線の逆側からメッシュを大きくしたい場合は負の値を入力すればいい
"Bump"
を選択すると,指定した係数倍だけ曲線の両端のメッシュの大きさが変化する.(係数>1ならメッシュが大きくなる)
デフォルトの引数としてmeshType="Progression"
,coef=1.
が設定されているので,曲線のタグと分割数のみ指定した場合は同じ大きさのメッシュで等分される.
setTransfiniteSurface
メソッドで指定するSurfaceは次の条件を満たしている必要がある
- 点の数が4つ(もしくは3つ)
- 全ての辺が
setTransfiniteCurve
メソッドによって分割されている - 向かい合う辺の分割数が同じ (係数や分割方法は違ってもよい)
これによって,Surface内のメッシュがきれいに整えられる
最後にsetRecombine
によって三角形メッシュが四角形に直され,きれいな構造格子が完成する
使い方
次のコマンドでプログラムを実行する
python test.py
(.gmshvenv) :/mnt/c/Users/mtkbirdman/Desktop/gmsh$ python test.py
Info : Meshing 1D...
Info : [ 0%] Meshing curve 7 (Line)
Info : [ 20%] Meshing curve 8 (Line)
Info : [ 30%] Meshing curve 9 (Line)
Info : [ 50%] Meshing curve 10 (Line)
Info : [ 60%] Meshing curve 11 (Line)
Info : [ 80%] Meshing curve 12 (Line)
Info : [ 90%] Meshing curve 13 (Line)
Info : Done meshing 1D (Wall 0.0046055s, CPU 0s)
Info : Meshing 2D...
Info : [ 0%] Meshing surface 16 (Transfinite)
Info : [ 50%] Meshing surface 17 (Plane, Frontal-Delaunay)
Info : Done meshing 2D (Wall 0.0071206s, CPU 0s)
Info : Meshing 3D...
Info : Done meshing 3D (Wall 2.77e-05s, CPU 0s)
Info : 468 nodes 730 elements
Info : Writing 'test.msh'...
Info : Done writing 'test.msh'
gmsh > done!
実行すると,同じディレクトリ内にtest.msh
が生成される
(.gmshvenv) :/mnt/c/Users/mtkbirdman/Desktop/gmsh$ ls -la
total 36
drwxrwxrwx 1 mtkbirdman mtkbirdman 4096 Oct 27 21:57 .
drwxrwxrwx 1 mtkbirdman mtkbirdman 4096 Oct 27 20:36 ..
drwxrwxrwx 1 mtkbirdman mtkbirdman 4096 Oct 27 20:40 .gmshvenv
-rwxrwxrwx 1 mtkbirdman mtkbirdman 31211 Oct 28 20:08 test.msh
-rwxrwxrwx 1 mtkbirdman mtkbirdman 1626 Oct 27 22:56 test.py
test.msh
をデスクトップ版のgmshで開けば,次のような格子を見ることができる
構造格子と非構造格子のcoef
をそれぞれいじれば,なんとなく使い方は分かってくると思う
おわりに
gmsh v4.10.5のPython APIで構造格子と非構造格子を組み合わせて使う方法について説明した
↓関連記事
↓参考
コメント