PR

【gmsh v4.10.5】python APIで構造格子と非構造格子を組み合わせる

gmsh v4.10.5のPython APIで構造格子と非構造格子を組み合わせて使う方法について説明する

スポンサーリンク

はじめに

最終的にこんなものができる

↓公式ドキュメントはこれ

api/gmsh.py · master · gmsh / gmsh · GitLab
The main Gmsh project (
Files · master · gmsh / gmsh · GitLab
The main Gmsh project (

↓インストールと設定はこれ

それではいってみよう

ソースコード

ポイントは以下の通り

ポイント
  1. 構造格子を構成する四角形領域の向かい合う2辺の格子点数は必ず同じにする
  2. 構造格子と非構造格子の境界となる辺の格子点数はsetTransfiniteCurveの2つ目の引数で決まる
  3. 非構造格子の格子の細かさはaddPointの4つ目の引数で指定する

これを踏まえたうえで,ソースコード全文はこうなる

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で開けば,次のような格子を見ることができる

Gmsh: a three-dimensional finite element mesh generator with built-in pre- and post-processing facilities

構造格子と非構造格子のcoefをそれぞれいじれば,なんとなく使い方は分かってくると思う

おわりに

gmsh v4.10.5のPython APIで構造格子と非構造格子を組み合わせて使う方法について説明した

↓関連記事

↓参考

https://github.com/openfoamtutorials/OpenFOAM_Tutorials_/tree/master/GmshBasic1

コメント