29
1 Gmsh クイックスタート・ガイド OPEN ACOUSTICS OPEN ACOUSTICS OPEN ACOUSTICS ENJOY SOUND! Christophe Geuzaine, Jean-Fran¸cois Remacle The OpenAcoustics Team , 2010 Gmsh クイックスタート・ガイド OpenAcoustics においてプリ・ポストプロセッシングに Gmsh について、Gmsh マニュアルから およびコマンド・スクリプト サンプルに する し、 えた す。 ライセンス Gmsh ソースコードに する GNU General Public License います。 Copying conditions をご さい。 1 はじめに Gmsh 23 およびメッシュ プリプロセッシング、 データ ポス トプロセッシングを うこ きるソフト エア す。Gmsh インド (グラフィカル・ ユーザ・インタフェイス) によってインタラクティブに、また コマンドスクリプト いて ンタラクティブ (バッチ ) うこ きます。2.1 インタラクティブ を、2.2 インタラクティブ を、3 インタラクティブに するため Gmsh コマンドを たコマンドスクリプト について します。 2 Gmsh の実行 2.1 インタラクティブ・モード 1 ( ) グラフィック・ インド () ニュー・ インド Gmsh をインタラクティブ・モード するに Gmsh アイコンをダブルクリックするか、ター ミナル シェルプロンプトから > gmsh します。これによって 2 インド きます ( 1)1 ( にステータス・バー ある) グラフィック・ インド 1 (ニュー・バー コンテキストに依 して変わるボタン されている) メニュー・ インド す。

Gmsh クイックスタート・ガイド - · PDF file1 Gmsh クイックスタート・ガイド OPEN ACOUSTICS OPEN ACOUSTICSENJOY SOUND! Christophe Geuzaine, Jean-Fran˘cois Remacle著・The

Embed Size (px)

Citation preview

1

Gmshクイックスタート・ガイド

OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Christophe Geuzaine, Jean-Francois Remacle著・The OpenAcoustics Team 訳・著,

2010年

この Gmshクイックスタート・ガイドは、OpenAcousticsにおいてプリ・ポストプロセッシングに使用す

る Gmshについて、Gmshマニュアルから操作方法およびコマンド・スクリプトのサンプルに関する章を抄

訳し、若干の解説を加えたものです。

本文書のライセンスは、Gmshのソースコードに付属する GNU General Public Licenseに従います。詳細

は、本文書末尾の Copying conditionsをご覧下さい。

1 はじめに

Gmshは、2・3次元形状およびメッシュの作成などのプリプロセッシング、解析データの可視化などのポス

トプロセッシングを行うことのできるソフトウエアです。Gmshの操作は、ウインドウ画面 (グラフィカル・

ユーザ・インタフェイス) によってインタラクティブに、または専用のコマンドスクリプト言語を用いて非イ

ンタラクティブ (バッチ的) に行うことができます。2.1節ではインタラクティブな操作方法を、2.2節では非

インタラクティブな操作方法を、3節では非インタラクティブに実行するための Gmsh操作コマンドを記述し

たコマンドスクリプトの書き方について説明します。

2 Gmshの実行

2.1 インタラクティブ・モード

図 1 (左) グラフィック・ウインドウ、(右) メ

ニュー・ウインドウ

Gmsh をインタラクティブ・モードで起動するに

は、Gmshのアイコンをダブルクリックするか、ター

ミナル画面中のシェルプロンプトから

> gmsh

と入力します。これによって 2 つのウインドウが開

きます (図 1)。1つは (最下部にステータス・バーの

ある) グラフィック・ウインドウ、もう 1 つは (メ

ニュー・バーとコンテキストに依存して変わるボタン

が配置されている) メニュー・ウインドウです。

2.1 インタラクティブ・モード OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

モジュール・メニュー

次元の選択

図 2 メッシュ生成メニュー 図 3 スプライン曲線の作成

最初のチュートリアル・ファイルを開くには、‘File

→ Open’ メニューを選択し、ファイル・ダイアログ

で ‘t1.geo’ を選択します。または、ターミナルを使

用しているときは、以下のようにコマンド・ラインで

直接ファイル名を指定することができます。

> gmsh t1.geo

メッシュ生成を行うには、(モジュール・メニューから ‘Mesh’ を選択して) メッシュ・モジュールに移動

し、コンテキスト依存のボタンから次元を選択します。‘1D’によってラインがメッシングされます。‘2D’に

よってサーフェスが、‘1D’が実行されていないときはラインとともにメッシングされます。‘3D’によってボ

リュームが、‘2D’が実行されていない時はサーフェスとともにメッシングされます。生成されたメッシュを

現在のメッシュ・フォーマットで保存するには、‘Save’ボタンをクリックするか、‘File→ Save As’メニュー

から適当なファイル・フォーマットおよびファイル名を選択します。デフォルトのメッシュ・ファイル名は、

現在のアクティブなモデルの名前に、メッシュ・フォーマットに対応する拡張子を追加した名前となります。

新たなジオメトリ (形状) を作成、または既存のジオメトリを変更するには、モジュール・メニューから

‘Geometry’を選択し、コンテキスト依存のボタンに従って下さい (図 3)。たとえば、スプライン曲線を作成

するには、‘Elementary’、‘Add’、‘New’、‘Spline’の順に選択して下さい。そうすると、一連の点を選択し、選

択を終了するには e (または、選択を中止するには ‘q’) を入力するよう促されます。インタラクティブなコマ

ンドの実行が完了すると、現在のスクリプト・ファイルの末尾に文字列が自動的に付加されます。‘Geometry’

メニューの ‘Edit’ボタンを押して、いつでもそのスクリプト・ファイルを手作業で編集し、‘Reload’を押し

てモデルを再度読込むことができます。たとえば多くの場合、変数や点を直接スクリプト・ファイル中で定義

し、つぎに GUIを使用してライン、サーフェス、およびボリュームをインタラクティブに定義するのが手早

い方法といえます。

Gmshでは、複数のファイルを同時に読込むことができます。最初に読込まれたファイルによってアクティ

ブなモデルが決定され、それ以降のファイルはそのモデルに ‘マージ’されます。‘File→Merge’メニュー、ま

たはコマンド・ラインでファイル名を直接指定することで、そのようにファイルをマージすることができます。

たとえば、1番目のチュートリアルの ‘t1.geo’に含まれるジオメトリとともに、‘view1.pos’と ‘view5.msh’

に含まれるポストプロセッシング・ビューをマージするには、以下のようにコマンドを入力します。

> gmsh t1.geo view1.pos view5.msh

2/29

2.2 非インタラクティブ・モード OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

ポストプロセッシング・モジュール (モジュール・メニューから ‘Post-Processing’ を選択して下さい) で

は、それぞれ ‘A scalar map’、‘Nodal scalar map’および ‘Element 1 vector’という 3つのボタンが現れま

す。この例では、幾つかの時刻ステップがビューに含まれます。グラフィック・ウインドウの最下部にある、

小さな “リモート・コントロール”アイコンによって、これらの時刻ステップをひととおり再生することがで

きます。ビューの名前のボタンをクリックすると、クリックされたビューの表示・非表示を切替えることがで

きます。また、その右側の矢印ボタンをクリックすると、ビューのオプション設定を行うことができます。

これらのインタラクティブに設定されるオプションは、スクリプトファイルの中で直接指定することが可能

であることに注意して下さい。現在のアクティブなモデルの現在のオプション設定は、‘File→ Save Options’

メニューから保存することができます。この操作によって、アクティブなモデルの名前に、‘.opt’という拡張

子を付加したファイル名の新たなオプション・ファイルが作成されます。この次にこのモデルを読込む時に

は、このモデルに関連づけられたオプション・ファイルも自動的に読込まれます。現在のオプション設定を

次回以降の Gmsh セッションのためのデフォルト設定として保存するには、かわりに ‘File → Save Default

Options’ メニューを使用して下さい。最後に、‘File → Save As’ メニューに続いて ‘Gmsh options’ フォー

マットを選択すると、現在のオプション設定を任意のファイルに保存することができます。

2.2 非インタラクティブ・モード

Gmshは、GUI無しの、非インタラクティブな ‘バッチ’・モードで実行することもできます。たとえば、1

番目のチュートリアルのメッシュをバッチ・モードで作成するには、以下を入力します。

> gmsh t1.geo -2

‘bgmesh.pos’というファイルに含まれるバックグラウンド・メッシュを使用して同じ例のメッシュを作成す

るには、以下を入力します。

> gmsh t1.geo -2 -bgm bgmesh.pos

全てのコマンドライン・オプションのリストは、次節を参照して下さい。

2.3 コマンドライン・オプション

ジオメトリ関連のオプション:

-0 全ての入力ファイルを処理し、展開されたジオメトリを出力し、終了

-tol 実数 幾何的な許容値を指定

メッシュ関連のオプション:

-1、-2、-3 1次元、2次元または 3次元のメッシュ生成を行い、終了

-part 整数 バッチ処理によってメッシュを生成した後、メッシュを分割

-saveall (物理グループの定義を破棄し) 全ての要素を保存

-o ファイル名 メッシュ出力ファイル名を指定

-format 文字列 出力メッシュ形式を指定 (msh、msh1、msh2、unv、vrml、stl、mesh、bdf、

p3d、cgns、med)

-bin バイナリ・フォーマットが利用可能なときは、バイナリ・フォーマットを使用

3/29

2.3 コマンドライン・オプション OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

-algo 文字列 メッシュの生成アルゴリズムを選択 (meshadapt、del2d、front2d、del3d、

front3d)

-smooth 整数 メッシュのスムージング段階数を指定

-optimize[ netgen] 四面体要素の質を最適化

-order 整数 生成される要素の次数を指定 (1, 2)

-clscale 実数 特性長の拡大率を指定

-clmin 実数 特性長の最小値を指定

-clmax 実数 特性長の最大値を指定

-clcurv 曲率から特性長を算出

-rand 実数 乱数の摂動率を指定

-bgm ファイル名 指定されたファイルから、背景メッシュを読込み

ポストプロセッシング関連のオプション:

-noview 起動時に、全てのビューを非表示に

-link 整数 ビュー間の連動モードを指定 (0、1、2、3、4)

-combine 同一の名前のビューを、複数タイムステップのビューとして連結

表示オプション:

-nodb ダブルバッファリングを行わない

-fontsize 整数 GUIのフォントサイズを指定

-theme 文字列 FLTK GUIのテーマを指定

-display 文字列 ディスプレイを指定

その他のオプション:

- 入力ファイルを処理し、終了

-a、-g、-m、-s、-p それぞれ自動、ジオメトリ、メッシュ、ソルバ、ポストプロセッシングのモー

ドで起動

-pid 標準出力にプロセス IDを出力

-listen 受信接続要求を常にリッスン

-v 整数 メッセージ出力の冗長度を指定

-nopopup スクリプト処理では、ダイアログ・ウインドウを表示しない

-string "文字列" 起動時にオプション文字列を処理

-option ファイル名 起動時にオプション・ファイルを処理

-convert ファイル名 ファイルを最新のバイナリ・フォーマットに変換し、終了。ファイルは複数指

定可能

-version バージョン番号を表示

-info 詳細なバージョン情報を表示

-help このメッセージを表示

4/29

2.4 マウス操作 OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

2.4 マウス操作

以下では、2ボタンマウスでは、中央ボタンは Shift+左ボタンで代用します。1ボタンマウスでは、中央

ボタンは Shift+左ボタン で、右ボタンは Alt+左ボタンで代用します。

マウスの移動:

• マウス・ポインタの位置にあるエンティティをハイライトし、ステータス・バーにプロパティを表示• Ctrl+Leftボタンによって開始された投げ縄ズーム、または投げ縄選択・選択解除を行う

左ボタン:

• 回転• エンティティを選択• Ctrl+Leftボタンによって開始された投げ縄ズーム・投げ縄選択を決定

Ctrl+Leftボタン: 投げ縄ズームまたは投げ縄選択・選択解除を開始

中央ボタン:

• ズーム• エンティティ選択を解除• 投げ縄ズームまたは投げ縄選択解除を決定

Ctrl+中央ボタン: 表示を直交化

右ボタン:

• パン• 投げ縄ズームまたは投げ縄選択・選択解除をキャンセル• ポストプロセッシング・ビューのボタンでメニューを表示

Ctrl+右ボタン: デフォルトの視点にリセット

2.5 キーボード・ショートカット

(Macでは、以下のショートカットの Ctrlは Cmd (‘Appleキー’) で代用します。)

左矢印 (←) 1つ前の時刻ステップへ移動

右矢印 (→) 次の時刻ステップへ移動

上矢印 (↑) 1つ前のビューを可視状態する

下矢印 (↓) 次のビューを可視状態にする

< 1つ前のコンテキストに戻る

> 次のコンテキストに進む

0 プロジェクト・ファイルを再度読込む

1または F1 線分をメッシュ分割

5/29

2.5 キーボード・ショートカット OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

2または F2 面をメッシュ分割

3または F3 ボリュームをメッシュ分割

Escape 投げ縄ズーム・選択をキャンセル、マウスによる選択をオン・オフ

g ジオメトリ・モジュールに移動

m メッシュ・モジュールに移動

p ポストプロセッシング・モジュールに移動

s ソルバ・モジュールに移動

Shift+a 全てのウインドウを前面に

Shift+g ジオメトリに関するオプションを表示

Shift+m メッシュに関するオプションを表示

Shift+o 一般的なオプションを表示

Shift+p ポストプロセッシングに関するオプションを表示

Shift+s ソルバ・オプションを表示

Shift+u ポストプロセッシング・ビューのプラグインを表示

Shift+w ポストプロセッシング・ビューに関するオプションを表示

Ctrl+i 統計情報ウインドウを表示

Ctrl+l メッセージ・コンソールを表示

Ctrl+n プロジェクト・ファイルを新規作成

Ctrl+o プロジェクト・ファイルを開く

Ctrl+q 終了

Ctrl+r プロジェクト・ファイルの名前を変える

Ctrl+s ファイルを保存

Shift+Ctrl+c 切断面ウインドウを表示

Shift+Ctrl+m オブジェクト回転・移動・拡大ウインドウを表示

Shift+Ctrl+n オプション・ウインドウを表示

Shift+Ctrl+s デフォルトのフォーマットでメッシュを保存

Shift+Ctrl+u プラグインのウインドウを表示

Shift+Ctrl+v 可視・不可視選択ウインドウを表示

Alt+a 座標軸モードを切替える

Alt+b 境界ボックスの表示・非表示を切替える

Alt+c あらかじめ定義されたカラー・スキームを切替える

Alt+e 可視状態のポストプロセッシング・ビューについて、要素の輪郭を不可視・可

視にする

Alt+f 再描画モードを変更する (高速・完全)

Alt+h 全てのポストプロセッシング・ビューの非表示・表示を切替える

Alt+i 全てのポストプロセッシング・ビューの凡例の非表示・表示を切替える

Alt+l ジオメトリの輪郭線の非表示・表示を切替える

6/29

OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Alt+m 全てのメッシュ・エンティティを不可視・可視にする

Alt+n 全てのポストプロセッシング・ビューのラベルの非表示・表示を切替える

Alt+o 投影モードを変更する (正投影・透視投影)

Alt+p ジオメトリの点の非表示・表示を切替える

Alt+r 可視状態のポストプロセッシング・ビューについて、範囲モードを切替える

Alt+s ジオメトリの面を不可視・可視にする

Alt+t 可視状態のポストプロセッシング・ビューについて、インターバル・モードを

切替える

Alt+v ジオメトリのボリュームを不可視・可視にする

Alt+w 全ての照明をオン・オフにする

Alt+x 視点を X軸方向にする

Alt+y 視点を Y軸方向にする

Alt+z 視点を Z軸方向にする

Alt+Shift+a 小さな座標軸の非表示・表示を切替える

Alt+Shift+b メッシュのボリューム界面の非表示・表示を切替える

Alt+Shift+d メッシュの界面の非表示・表示を切替える

Alt+Shift+l メッシュの輪郭線表示の非表示・表示を切替える

Alt+Shift+o 透視投影の視野角を調整する

Alt+Shift+p メッシュの点の非表示・表示を切替える

Alt+Shift+s メッシュの面の辺の非表示・表示を切替える

Alt+Shift+v メッシュのボリュームの辺の非表示・表示を切替える

Alt+Shift+w 全てのメッシュの法線を逆にする

Alt+Shift+x 視点を-X方向にする

Alt+Shift+y 視点を-Y方向にする

Alt+Shift+z 視点を-Z方向にする

3 チュートリアル

本節では、Gmshに付属の 9つのサンプルファイルを通して、Gmshにおけるコマンドスクリプトの書き方

を解説します。点を定義するところから始まって、メッシュ生成方法の指定、Gmshの特徴であるメッシュと

ポストプロセッシング・データを混在させる方法などを順次解説します。これらの例に対応するファイルは、

Gmsh 配布物の ‘tutorial’ディレクトリにあります。各サンプルで習得する内容は、以下のようになってい

ます。

t1.geo 変数、基本エンティティ (点、線、面)、物理エンティティ (点、線、面)

t2.geo ファイルの取込み、幾何変換、押出形状、基本エンティティ (ボリューム)、物理エンティティ (ボ

リューム)

t3.geo 押出メッシュ、オプション

t4.geo 内蔵の関数、穴、文字列、メッシュの色

7/29

3.1 チュートリアル 1: ‘t1.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

X

Y

Z X

Y

Z

Geometry Mesh

図 4 チュートリアル 1の形状とメッシュ

t5.geo 特性長、変数の配列、関数、ループ

t6.geo 超限メッシュ

t7.geo 背景メッシュ

t8.geo ポストプロセッシング、スクリプティング、アニメーション、オプション

t9.geo ポストプロセッシング・プラグイン (レベルセット、断面、注記)

Gmshをユーザのコンピュータで実行する方法は、第 2節をご覧下さい。

3.1 チュートリアル 1: ‘t1.geo’

多くの場合、Gmshのコマンド・スクリプトで形状作成を行う際には、まず形状の基点となる点を定義しま

す。点を定義するには x、y、z 座標値を指定しますが、Gmshではそれに加えて、その点におけるメッシュ 1

要素の典型的な辺長である、特性長と呼ばれる値を指定します。Gmshでは多くのスクリプト言語と同様、こ

れらの数値を変数や式を使って指定することが可能です。

線分を定義するには、始点と終点となる点を指定します。面は、複数の線分によって囲まれる領域 (線分

ループ) として定義されます。これらの形状を構成する点、線分、面などのそれぞれは、基本エンティティと

呼ばれます。

また、作成した基本エンティティ、およびそれに対応するメッシュの各領域には、任意の番号または文字列

による名前を付けてグループ化することができます。このようなグループを、物理エンティティと呼びます。

チュートリアル 1では、以上を図 4の長方形形状およびメッシュの作成を通して習得します (チュートリア

ル 2以降も、それぞれ同様の図を掲載)。なお、スクリプト中の ‘/*’から ‘*/’まで、および ‘//’以降、行末ま

では、コメントと見なされてコマンドとしては解釈されません。

ソースコード 1 t1.geo

/*********************************************************************

*

* Gmsh チュートリアル 1

*

* 変数、基本エンティティ (点、線、面)、物理エンティティ (点、線、面)

*

*********************************************************************/

8/29

3.1 チュートリアル 1: ‘t1.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// Gmshのスクリプト言語における最も簡単な構文は、‘代入’ です。以下のコ// マンドによって、‘lc’ という新たな変数が定義されます。

lc = 0.009;

// そして、この変数を使って、Gmshの最も簡単な ‘基本エンティティ’ である// ‘点’ を定義します。点は、4つの数値のリストによって定義されます。すな// わち、座標の 3成分 (X、Yおよび Z)、それから、その点において生成する要// 素の要素寸法を設定するための特性長 (lc) です。

Point(1) = {0, 0, 0, lc};

// そして、メッシュの要素寸法の分布は、これらの特性長をジオメトリ全体に// おいて補間することによって得られます。特性長を指定するもう一つの方法// は、背景メッシュを使うことです (‘t7.geo’ および ‘bgmesh.pos’ をご覧// 下さい)。

// つぎに、さらに幾つかの点と、最初の線分を定義しましょう。線分は、// Gmshにおける基本エンティティの 2つ目の型であり、さらにその線分の中で// も、直線は最も単純です。直線は、点番号のリストによって定義されます。// 例えば、以下のコマンドでは、線 1は点 1から始まり、点 2で終了します。

Point(2) = {.1, 0, 0, lc} ;

Point(3) = {.1, .3, 0, lc} ;

Point(4) = {0, .3, 0, lc} ;

Line(1) = {1,2} ;

Line(2) = {3,2} ;

Line(3) = {3,4} ;

Line(4) = {4,1} ;

// 3つ目の基本エンティティは、面です。上で定義された 4つの線分から簡単な// 長方形状の面を定義するには、まず線分のループを定義する必要があります。// 線分のループとは互いにつながった線分のリストであり、それぞれの線分に// は (線分の方向によって) 符号が関連づけられています。

Line Loop(5) = {4,1,-2,3} ;

// そして、面を線分ループのリストとして定義します (ここでは穴を開けない// ので、線分ループは 1つだけです。‘t4.geo’ 参照)。

Plane Surface(6) = {5} ;

// この時点で、長方形の面 6を表示し、それをメッシュ分割するために必要な// 全ての情報が、Gmshに渡されたことになります。もし、(例えば、線分 1から// 4を離散化して得られる線要素や、面 6を離散化して得られる三角形要素など// の) メッシュの様々な要素に特定の領域番号を関連づけたければ 、さらに// 必要な段階があります。すなわちそれは、‘物理エンティティ’ を定義する// ことです。要素の属する基本エンティティ番号を指定し、それらに共通の番// 号 (領域番号) を与えることで、物理エンティティにまとめることができま// す。

// 例えば以下では、基本エンティティの点 1と 2を物理エンティティ 1にまとめ// ます。

9/29

3.2 チュートリアル 2: ‘t2.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Physical Point(1) = {1,2} ;

// それによって、2つの点要素が、ともに領域番号 1を付されてメッシュ・ファ// イルに保存されます。線分や面要素についても、仕組みは同様です。

MyLine = 99;

Physical Line(MyLine) = {1,2,4} ;

Physical Surface("My fancy surface label") = {6} ;

// 線分 1、2、4のメッシュ分割によって作成された全ての線要素は、領域番号// 99を付されてメッシュ・ファイルに保存されます。面 6の離散化によって得// られた全ての三角形要素は、自動的に決められる領域番号を与えられます// (この場合、"My fancy surface label" の領域名に関連づけられた数値であ// る 100となります)。

// 物理エンティティが全く定義されていない場合、メッシュの全ての要素は、// デフォルトの方向を付されて "そのまま" 保存されます。

3.2 チュートリアル 2: ‘t2.geo’

本チュートリアルでは、形状の移動・コピーのような基本的な変換コマンド、それからボリュームを生成す

る方法として、面ループを定義する方法と、面の押出しとしてボリュームを定義する方法を習得します。

また、形状のコピーを行うコマンドのような、幾つかのコマンドでは、基本エンティティを自動的に生成し

ます。そのようなエンティティに対して、さらに形状コピーや物理エンティティの定義のような操作を行う場

合、自動的に生成されたエンティティの番号を知る必要があります。本チュートリアルでは、そのための方法

として、

1. グラフィカル・ユーザ・インターフェイスを使用して読み取る方法

2. コマンドの実行結果として生成されたエンティティ番号の全てを格納する、複数の要素を持つことがで

きる変数 (リスト) を定義する方法

3. ‘File→ Save as→ Gmsh unrolled geometry’ メニューを使用する方法

の 3種類を習得します。

ソースコード 2 t2.geo

/*********************************************************************

*

* Gmshチュートリアル 2

*

* ファイルの取込み、幾何変換、押出形状、基本エンティティ (ボリューム)、* 物理エンティティ (ボリューム)

*

*********************************************************************/

// まず、1つ前のチュートリアル・ファイルを取込み、このチュートリアルの// 基とします。

Include "t1.geo";

10/29

3.2 チュートリアル 2: ‘t2.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

X

Y

Z X

Y

Z

Geometry Mesh

図 5 チュートリアル 2の形状とメッシュ

// ‘t1.geo’ で行ったのと同様にして、新たな点と線分を追加します。

Point(5) = {0, .4, 0, lc};

Line(5) = {4, 5};

// Gmshには、基本エンティティやそのコピーに対して、(移動、回転などの)

// 変換を行うための仕組みがあります。例えば以下によって、点 3を 0.05単位// だけ左に動かすことができます。

Translate {-0.05, 0, 0} { Point{3}; }

// 変換後の点を複製とし、y軸方向に 0.1だけ移動させることもできます。

Translate {0, 0.1, 0} { Duplicata{ Point{3}; } }

// このコマンドによって、新たな点が作成され、自動的に基本エンティティ番// 号が割当てられました。割当てられた基本エンティティ番号は、グラフィカ// ル・ユーザ・インターフェイス上でマウスをこの点の上に動かすと、グラ// フィック・ウインドウの下端の表示から読み取ることができます。この場合、// この点は 6番となりました。そしてさらに、例えば以下のようにして、点 6を// 使って新たなエンティティを作成することができます。

Line(7) = {3, 6};

Line(8) = {6, 5};

Line Loop(10) = {5,-8,-7,3};

Plane Surface(11) = {10};

// 番号を取得するためにグラフィカル・ユーザ・インターフェイスを使うのは、// 面倒になりがちです。そのような場合、変換コマンドの返り値を直接使用す// るのが良いでしょう。例えば、移動コマンドは移動されたエンティティの基// 本エンティティ番号のリストを返します。したがって、以下のコマンドによっ// て、表面 6と 11の 2つの面のコピーを、x軸方向に移動させることができます。

my_new_surfs[] = Translate {0.12, 0, 0} { Duplicata{ Surface{6, 11}; } };

// ここでmy_new_surfs[] (角括弧に注意) は、複数の要素を格納できる変数で// あり、リストと呼ばれます。このmy_new_surfs[]の場合は、2つの新たな表// 面の番号を格納しています。その番号は、以下のコマンドによって、

11/29

3.2 チュートリアル 2: ‘t2.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// ‘Tools→ Message Console’ メニューから確認することができます。

Printf("New surfaces ’%g’ and ’%g’", my_new_surfs[0], my_new_surfs[1]);

// Gmshでは、(mylist[] = {1,2,3}; のようにして) リストを定義し、また// (myotherlist[] = {mylist[0], mylist[2]}; のようにして) リストの要素// を参照するために角括弧を使います。リストの要素番号は 0から始まります。

// ボリュームは、基本エンティティの (点、線、面に続く) 4つ目の型です。// 面を作成するために線分ループを定義するのと同様に、ボリュームを作成す// るためには面ループ (すなわち、‘シェル’) を定義する必要があります。以// 下のボリュームでは穴を作成しないので、単一の面ループから成っています。

Point(100) = {0., 0.3, 0.13, lc};

Point(101) = {0.08, 0.3, 0.1, lc};

Point(102) = {0.08, 0.4, 0.1, lc};

Point(103) = {0., 0.4, 0.13, lc};

Line(110) = {4, 100}; Line(111) = {3, 101};

Line(112) = {6, 102}; Line(113) = {5, 103};

Line(114) = {103, 100}; Line(115) = {100, 101};

Line(116) = {101, 102}; Line(117) = {102, 103};

Line Loop(118) = {115, -111, 3, 110}; Plane Surface(119) = {118};

Line Loop(120) = {111, 116, -112, -7}; Plane Surface(121) = {120};

Line Loop(122) = {112, 117, -113, -8}; Plane Surface(123) = {122};

Line Loop(124) = {114, -110, 5, 113}; Plane Surface(125) = {124};

Line Loop(126) = {115, 116, 117, 114}; Plane Surface(127) = {126};

Surface Loop(128) = {127, 119, 121, 123, 125, 11};

Volume(129) = {128};

// 面を押出してボリュームを作成できるときは、多くの場合、ボリュームを構// 成する点、線、面を手作業で定義するより、Extrudeコマンドを使用する方// が簡単です。例えば、以下のコマンドによって、面 11がz軸方向に押出され、// 自動的に (所要の点、線、面とともに) 新たなボリュームが作成されます。

Extrude {0, 0, 0.12} { Surface{my_new_surfs[1]}; }

// 以下のコマンドによって、新たな点の幾つかに特性長を明示的に与えること// ができます。

Characteristic Length {103, 105, 109, 102, 28, 24, 6, 5} = lc * 3;

// 複雑な形状の作成に変換コマンドが便利であるような場合には、全ての基本// エンティティの明示的なリストを有する、‘フラットな’ ジオメトリを生成// することもまた便利である場合があります。このようなジオメトリは、// ‘File→ Save as→ Gmsh unrolled geometry’ メニューを選択するか、または// コマンドラインで//

// > gmsh t2.geo -0

//

// と入力して得ることができます。

// 最後に、ボリューム 129と 130の離散化によって得られた全ての四面体に共通// の領域番号を付して保存するには、以下で物理ボリュームを定義します。

12/29

3.3 チュートリアル 3: ‘t3.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

X

Y

Z X

Y

Z

Geometry Mesh

図 6 チュートリアル 3の形状とメッシュ

Physical Volume (1) = {129,130};

3.3 チュートリアル 3: ‘t3.geo’

本チュートリアルでは、押出しコマンドについてさらに詳しく解説し、またグラフィカル・ユーザ・イン

ターフェイスの ‘Tools→ Options’メニューから行うようなオプション指定を、コマンド・スクリプト中で行

う方法を習得します。

押出しを行う Extrudeコマンドでは、生成されたボリューム内のメッシュ作成方法を指定することができ

ます。これによって例えば、押出しの方向に層状のメッシュを作成するよう指定することができます。押出し

の方向についても、移動、回転を同時に指定することができます。押出しによって生成される各面およびボ

リュームの番号は、Extrudeコマンドの返り値から取得することができます。

ソースコード 3 t3.geo

/*********************************************************************

*

* Gmshチュートリアル 3

*

* 押出メッシュ、オプション*

*********************************************************************/

// 再度、最初のチュートリアルを取込むところから始めます。

Include "t1.geo";

// ‘t2.geo’ と同様に、z軸方向に押出を行おうとしています。ただしここでは、// 形状の押出を行うのみならず、押出される面上に生成された 2次元メッシュ// とともに押出を行います。これは同じ ‘Extrude’ コマンドによって行いま// すが、さらに、要素の ‘Layers’ (今回は、ともに高さがh/2の 2層に分割し、// さらに 1層目を 8層に再分割、2層目を 2層に再分割します) を指定します。

h = 0.1;

13/29

3.3 チュートリアル 3: ‘t3.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Extrude {0,0,h} {

Surface{6}; Layers{ {8,2}, {0.5,1} };

}

// 押出を移動の代わりに回転によって行うことも可能で、その結果の生成され// る 4面体メッシュの各要素を 2要素 1組で再結合 (‘Recombine’) し、プリズム// 要素とすることができます (ここでは 1層のみとし、その 1層を 7層に再分割// します)。回転は、回転軸の方向 ({0,1,0})、回転軸上の点 ({-0.1,0,0.1})、// 回転角 (-Pi/2) によって指定します。

Extrude { {0,1,0} , {-0.1,0,0.1} , -Pi/2 } {

Surface{122}; Layers{7}; Recombine;

}

// 移動 ({-2*h,0,0})、回転 ({1,0,0}, {0,0.15,0.25}, Pi/2) を同時に指定// することもできます。

out[] = Extrude { {-2*h,0,0}, {1,0,0} , {0,0.15,0.25} , Pi/2 } {

Surface{144}; Layers{10}; Recombine;

};

// 上の押出コマンドのように、Extrudeコマンドの返り値をリストに代入する// ことで、ボリューム番号をプログラム的に取出すことができます。out[]の// リストには、out[0]に押出された ‘上端’ 面の面番号が、out[1] に押出に// よって作成されたボリューム番号が、out[2]、out[3]、‥‥には各側面の番// 号が格納されています。

// このリストを利用して新たな物理ボリュームを定義し、全ての 4面体および// プリズム要素に、共通の領域番号 (101) を付して保存することができます。

Physical Volume(101) = {1, 2, out[1]};

// ここで、幾つかのオプションを変更してみましょう。全てのインタラクティ// ブなオプションはGmshのスクリプト言語から取得・設定できますので、入力// ファイルの中から、例えばグローバルな特性長の拡大率を定義したり、形状// とメッシュの点それぞれについて色を再定義することができます。

Mesh.CharacteristicLengthFactor = 4;

General.Color.Text = White;

Geometry.Color.Points = Orange;

Mesh.Color.Points = {255,0,0};

// 全ての色設定では、色の名前、もしくはRGB (赤、緑、青の光の三原色) の// 数値のいずれによっても定義することができます。すなわち、// ‘Mesh.Color.Points = Red’ は、‘Mesh.Color.Points = {255,0,0}’ と同等// です。さらに、ユーザ定義の変数と同様に、オプションは代入式の右辺にも// 左辺にも使用できます。したがって以下のコマンドによって、面の色は点の// 色と同じになります。

Geometry.Color.Surfaces = Geometry.Color.Points;

// ‘Help→ Current options’ メニューによって、全てのオプションの現在の値// を見ることができます。全てのオプションをファイルに保存するには、// ‘File->Save as->Gmsh options’ メニューを使用します。現在のオプション// 設定を、以後の全てのGmshセッションにおけるデフォルトのオプションとし// て保存するには、‘File->Save Options->As default’ メニューを使用しま

14/29

3.4 チュートリアル 4: ‘t4.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Hole

File created on Sun Feb 7 13:02:24 2010

Copyright (C) My Company

X

Y

Z

Hole

Y

File created on Sun Feb 7 13:02:24 2010

XZ

Copyright (C) My Company

Geometry Mesh

図 7 チュートリアル 4の形状とメッシュ

// す。

3.4 チュートリアル 4: ‘t4.geo’

本チュートリアルでは、表面に穴を開ける方法を主に解説します。穴も表面全体と同様に線ループとして表

現され、Surfaceコマンドによる表面の作成時に 2つ以上の線ループを指定すると、1つ目の線ループが面全

体、2つ目以降の線ループは 1つ目の線ループによって表現された表面に開けられた穴となります。ただし、

これらの線ループは、互いに同じ線分を共有することができないことに注意してください。

また、Gmshに読込まれた解析結果などの一連のポストプロセッシング・データのそれぞれを、Gmshでは

ポストプロセッシング・ビューと呼びます。データには数値や形状のほか、注記のテキストなども含めること

ができます。コマンドファイル中にポストプロセッシング・データを埋め込むことで、テキストを画面上に出

力することができます。

その他、本チュートリアルでは、線分としては直線のみならず円弧のような曲線も使用可能であること、お

よび式には一般的な数学関数を使用することができることを解説します。

ソースコード 4 t4.geo

/*********************************************************************

*

* Gmshチュートリアル 4

*

* 内蔵の関数、穴、文字列、メッシュの色*

*********************************************************************/

// いつものように、幾つかの変数、点、線分を定義することから始めます。

cm = 1e-02;

e1 = 4.5 * cm; e2 = 6 * cm / 2; e3 = 5 * cm / 2;

h1 = 5 * cm; h2 = 10 * cm; h3 = 5 * cm; h4 = 2 * cm; h5 = 4.5 * cm;

R1 = 1 * cm; R2 = 1.5 * cm; r = 1 * cm;

Lc1 = 0.01;

Lc2 = 0.003;

15/29

3.4 チュートリアル 4: ‘t4.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// コマンドファイル内では、一般的な数学関数を使用することができます (最// 初の文字が大文字であることに注意してください)。加えて、以下のような// 便利な関数を使用することもできます。// Hypot(a, b) := Sqrt(a^2 + b^2):

ccos = (-h5*R1 + e2 * Hypot(h5, Hypot(e2, R1))) / (h5^2 + e2^2);

ssin = Sqrt(1 - ccos^2);

// つぎに、以上の変数を使用して点や線分を定義します。

Point(1) = { -e1-e2, 0.0 , 0.0 , Lc1};

Point(2) = { -e1-e2, h1 , 0.0 , Lc1};

Point(3) = { -e3-r , h1 , 0.0 , Lc2};

Point(4) = { -e3-r , h1+r , 0.0 , Lc2};

Point(5) = { -e3 , h1+r , 0.0 , Lc2};

Point(6) = { -e3 , h1+h2, 0.0 , Lc1};

Point(7) = { e3 , h1+h2, 0.0 , Lc1};

Point(8) = { e3 , h1+r , 0.0 , Lc2};

Point(9) = { e3+r , h1+r , 0.0 , Lc2};

Point(10)= { e3+r , h1 , 0.0 , Lc2};

Point(11)= { e1+e2, h1 , 0.0 , Lc1};

Point(12)= { e1+e2, 0.0 , 0.0 , Lc1};

Point(13)= { e2 , 0.0 , 0.0 , Lc1};

Point(14)= { R1 / ssin , h5+R1*ccos, 0.0 , Lc2};

Point(15)= { 0.0 , h5 , 0.0 , Lc2};

Point(16)= { -R1 / ssin , h5+R1*ccos, 0.0 , Lc2};

Point(17)= { -e2 , 0.0 , 0.0 , Lc1};

Point(18)= { -R2 , h1+h3 , 0.0 , Lc2};

Point(19)= { -R2 , h1+h3+h4, 0.0 , Lc2};

Point(20)= { 0.0 , h1+h3+h4, 0.0 , Lc2};

Point(21)= { R2 , h1+h3+h4, 0.0 , Lc2};

Point(22)= { R2 , h1+h3 , 0.0 , Lc2};

Point(23)= { 0.0 , h1+h3 , 0.0 , Lc2};

Point(24)= { 0 , h1+h3+h4+R2, 0.0 , Lc2};

Point(25)= { 0 , h1+h3-R2, 0.0 , Lc2};

Line(1) = {1 ,17};

Line(2) = {17,16};

// Gmshでは、直線以外の線プリミティブも使用することができます。すなわち、// スプライン、B-スプライン、円弧、楕円弧などです。ここでは、点 14から始// まって点 16で終わる、点 15を円の中心とする新たな円弧を定義します。

Circle(3) = {14,15,16};

// Gmshでは、円弧の中心に対する角度は常にπより小さい必要があることに注// 意してください。ここではさらに、線分、円弧、そして新たな表面を定義し// ます。

Line(4) = {14,13};

Line(5) = {13,12};

Line(6) = {12,11};

Line(7) = {11,10};

16/29

3.4 チュートリアル 4: ‘t4.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Circle(8) = {8,9,10};

Line(9) = {8,7};

Line(10) = {7,6};

Line(11) = {6,5};

Circle(12) = {3,4,5};

Line(13) = {3,2};

Line(14) = {2,1};

Line(15) = {18,19};

Circle(16) = {21,20,24};

Circle(17) = {24,20,19};

Circle(18) = {18,23,25};

Circle(19) = {25,23,22};

Line(20) = {21,22};

Line Loop(21) = {17,-15,18,19,-20,16};

Plane Surface(22) = {21};

// さらに、外側の表面を定義します。この表面は穴を有するため、定義におい// ては 2つの線ループが必要です。

Line Loop(23) = {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10};

Plane Surface(24) = {23,21};

// 一般的に、表面にN個の穴を設ける場合、その表面は N+1個の線ループで定義// されます。すなわち、最初のループが表面全体の外縁を表し、その他のルー// プは穴の縁を表します。

// 最後に、文字列を含むポストプロセッシング・ビューを埋め込むことで、コ// メントを追加することができます。また、メッシュの幾つかのエンティティ// の色を変更します。

View "comments" {

// グラフィック・ウインドウの左端から 10ピクセル、下端から 10ピクセルの// 位置に、文字列を追加します。

T2(10, -10, 0){ "Copyright (C) My Company" };

// StrCat() 関数によって文字列と現在の日付を連結し、その文字列をグラ// フィック・ウインドウの左端から 10ピクセル、上端から 15ピクセルの位置// に追加します。T2(10, 15, 0){ StrCat("File created on ", Today) };

// 3Dモデル座標系の (X,Y,Z) = (0, 0.11, 0) の位置に、文字列を追加します。T3(0, 0.11, 0, 0){ "Hole" };

};

Color Grey50{ Surface{ 22 }; }

Color Purple{ Surface{ 24 }; }

Color Red{ Line{ 1:14 }; }

Color Yellow{ Line{ 15:20 }; }

17/29

3.5 チュートリアル 5: ‘t5.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Hole

File created on Sun Feb 7 13:02:24 2010

Copyright (C) My Company

X

Y

Z

Hole

Copyright (C) My Company

File created on Sun Feb 7 13:02:24 2010

X

Y

Z

Geometry Mesh

図 8 チュートリアル 5の形状とメッシュ

3.5 チュートリアル 5: ‘t5.geo’

チュートリアル 4で解説された表面への穴開けと同様にして、ボリュームにも空洞を作ることができます。

空洞もボリューム全体と同様に面ループとして表現され、Volumeコマンドによるボリュームの作成時に 2つ

以上の面ループを指定すると、1つ目の面ループがボリューム全体、2つ目以降の面ループは 1つ目の面ルー

プによって表現されたボリュームに開けられた空洞となります。ただし、これらの面ループは、互いに同じ表

面を共有することができないことに注意してください。

コマンドファイルでは、チュートリアル 4 で解説した Gmsh 自体の持つ内蔵関数に加えて、Function–

Returnコマンドによってユーザ自身が関数を定義することもできます。ユーザ定義の関数を呼び出すには、

Callコマンドを使用します。

また本チュートリアルには、特性長のスケーリング方法、For–EndForコマンドによる繰返し処理、配列の

定義方法・参照方法、特別な意味を持つ変数を用いた各種エンティティ番号の自動生成、Ruled Surfaceコ

マンドによる曲面の定義方法など、いずれも重要なポイントの解説が含まれています。

ソースコード 5 t5.geo

/*********************************************************************

*

* Gmshチュートリアル 5

*

* 特性長、変数の配列、関数、ループ*

*********************************************************************/

// まず、目標とするメッシュ寸法に関するいくつかの数値を定義することから// 始めます。

lcar1 = .1;

lcar2 = .0005;

lcar3 = .055;

// (上の定義を変更することなく) メッシュの寸法をグローバルに変更したい// 場合は、コマンド・ラインから ‘-clscale’オプション (または、オプショ

18/29

3.5 チュートリアル 5: ‘t5.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// ン・ファイル中の ‘Mesh.CharacteristicLengthFactor’) によって、全ての// 特性長に対するグローバルな拡大率を与えることができます。例えば、//

// > gmsh t5.geo -clscale 1

//

// とすると、このファイルによって、およそ節点数 1,300、四面体要素数// 11,000のメッシュが生成されます。一方、//

// > gmsh t5.geo -clscale 0.2

//

// とすると、およそ節点数 350,000、四面体要素数 210万のメッシュが生成され// ます。これらのメッシュに関する統計情報は、グラフィカル・ユーザ・イン// ターフェイスの‘Tools→ Statistics’メニューで確認することができます。

// さらに幾つかの基本エンティティを定義して、切り取られた立方体を作成し// ましょう。

Point(1) = {0.5,0.5,0.5,lcar2}; Point(2) = {0.5,0.5,0,lcar1};

Point(3) = {0,0.5,0.5,lcar1}; Point(4) = {0,0,0.5,lcar1};

Point(5) = {0.5,0,0.5,lcar1}; Point(6) = {0.5,0,0,lcar1};

Point(7) = {0,0.5,0,lcar1}; Point(8) = {0,1,0,lcar1};

Point(9) = {1,1,0,lcar1}; Point(10) = {0,0,1,lcar1};

Point(11) = {0,1,1,lcar1}; Point(12) = {1,1,1,lcar1};

Point(13) = {1,0,1,lcar1}; Point(14) = {1,0,0,lcar1};

Line(1) = {8,9}; Line(2) = {9,12}; Line(3) = {12,11};

Line(4) = {11,8}; Line(5) = {9,14}; Line(6) = {14,13};

Line(7) = {13,12}; Line(8) = {11,10}; Line(9) = {10,13};

Line(10) = {10,4}; Line(11) = {4,5}; Line(12) = {5,6};

Line(13) = {6,2}; Line(14) = {2,1}; Line(15) = {1,3};

Line(16) = {3,7}; Line(17) = {7,2}; Line(18) = {3,4};

Line(19) = {5,1}; Line(20) = {7,8}; Line(21) = {6,14};

Line Loop(22) = {-11,-19,-15,-18}; Plane Surface(23) = {22};

Line Loop(24) = {16,17,14,15}; Plane Surface(25) = {24};

Line Loop(26) = {-17,20,1,5,-21,13}; Plane Surface(27) = {26};

Line Loop(28) = {-4,-1,-2,-3}; Plane Surface(29) = {28};

Line Loop(30) = {-7,2,-5,-6}; Plane Surface(31) = {30};

Line Loop(32) = {6,-9,10,11,12,21}; Plane Surface(33) = {32};

Line Loop(34) = {7,3,8,9}; Plane Surface(35) = {34};

Line Loop(36) = {-10,18,-16,-20,4,-8}; Plane Surface(37) = {36};

Line Loop(38) = {-14,-13,-12,19}; Plane Surface(39) = {38};

// ファイルを取込む代わりにユーザ定義関数を定義して、立方体に穴を彫り込// みましょう。

Function CheeseHole

// 以下のコマンドでは、予約変数名の ‘newp’ を使用して、新たに作成する// 点の番号を自動的に選択します。現在使用されている最も大きな点番号に// 1を加えた数値が、この番号として自動的に算出されます。(さらに// ‘newp’ と同様、‘newc’、‘news’、‘newv’ そして ‘newreg’ の変数によっ// てそれぞれ、現在定義されている線、表面、ボリューム、そして ‘点以外// の全てのエンティティ’ 番号の最大値から、新たな番号が算出されます。)

p1 = newp; Point(p1) = {x, y, z, lcar3} ;

19/29

3.5 チュートリアル 5: ‘t5.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

p2 = newp; Point(p2) = {x+r,y, z, lcar3} ;

p3 = newp; Point(p3) = {x, y+r,z, lcar3} ;

p4 = newp; Point(p4) = {x, y, z+r,lcar3} ;

p5 = newp; Point(p5) = {x-r,y, z, lcar3} ;

p6 = newp; Point(p6) = {x, y-r,z, lcar3} ;

p7 = newp; Point(p7) = {x, y, z-r,lcar3} ;

c1 = newreg; Circle(c1) = {p2,p1,p7};

c2 = newreg; Circle(c2) = {p7,p1,p5};

c3 = newreg; Circle(c3) = {p5,p1,p4};

c4 = newreg; Circle(c4) = {p4,p1,p2};

c5 = newreg; Circle(c5) = {p2,p1,p3};

c6 = newreg; Circle(c6) = {p3,p1,p5};

c7 = newreg; Circle(c7) = {p5,p1,p6};

c8 = newreg; Circle(c8) = {p6,p1,p2};

c9 = newreg; Circle(c9) = {p7,p1,p3};

c10 = newreg; Circle(c10) = {p3,p1,p4};

c11 = newreg; Circle(c11) = {p4,p1,p6};

c12 = newreg; Circle(c12) = {p6,p1,p7};

// 非平面の表面を作成して、球状の穴を定義します。ここでは 3または 4辺か// ら構成することのできる、線織面を使用します。

l1 = newreg; Line Loop(l1) = {c5,c10,c4}; Ruled Surface(newreg) = {l1};

l2 = newreg; Line Loop(l2) = {c9,-c5,c1}; Ruled Surface(newreg) = {l2};

l3 = newreg; Line Loop(l3) = {c12,-c8,-c1}; Ruled Surface(newreg) = {l3};

l4 = newreg; Line Loop(l4) = {c8,-c4,c11}; Ruled Surface(newreg) = {l4};

l5 = newreg; Line Loop(l5) = {-c10,c6,c3}; Ruled Surface(newreg) = {l5};

l6 = newreg; Line Loop(l6) = {-c11,-c3,c7}; Ruled Surface(newreg) = {l6};

l7 = newreg; Line Loop(l7) = {-c2,-c7,-c12};Ruled Surface(newreg) = {l7};

l8 = newreg; Line Loop(l8) = {-c6,-c9,c2}; Ruled Surface(newreg) = {l8};

// つぎに、後で参照するために、表面ループ番号をリストに保存しておきま// す (最終的なボリュームの作成のために、これらが必要となります)。

theloops[t] = newreg ;

Surface Loop(theloops[t]) = {l8+1,l5+1,l1+1,l2+1,l3+1,l7+1,l6+1,l4+1};

thehole = newreg ;

Volume(thehole) = theloops[t] ;

Return

// ‘For’ ループを使用して、5つの穴を立方体に生成します。

x = 0 ; y = 0.75 ; z = 0 ; r = 0.09 ;

For t In {1:5}

x += 0.166 ;

z += 0.166 ;

// ‘CheeseHole’関数を呼び出します。

Call CheeseHole ;

20/29

3.6 チュートリアル 6: ‘t6.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// それぞれの穴について、物理ボリュームを定義します。

Physical Volume (t) = thehole ;

// 端末に、いくつかの変数を出力します (全ての変数は内部的には浮動小数// 点数として扱われますので、書式文字列に含むことができるのは、‘%g’,

// ‘%f’, ’%e’のような浮動小数点数の書式指定のみであることに注意してく// ださい)。

Printf("Hole %g (center = {%g,%g,%g}, radius = %g) has number %g!",

t, x, y, z, r, thehole) ;

EndFor

// 立方体の外部表面を表す表面ループを定義します。

theloops[0] = newreg ;

Surface Loop(theloops[0]) = {35,31,29,37,33,23,39,25,27} ;

// 5つの穴を取り除いた状態の立方体のボリュームは、6つの表面ループによっ// て定義されます。すなわち、最初の表面ループが外部の表面を表し、それ以// 外の表面ループは穴を表します。(繰返しになりますが、変数の配列を参照// するには、変数名の後に角括弧を付加します)

Volume(186) = {theloops[]} ;

// 最後に、穴の部分を取り除いた立方体を離散化して得られる要素のための物// 理ボリュームを定義します (穴の部分の要素は、‘For’ ループのt = 1から// 5までの繰り返しで、既に定義されています)。

Physical Volume (10) = 186 ;

3.6 チュートリアル 6: ‘t6.geo’

Gmshが生成する要素は、表面メッシュでは三角形、ボリュームメッシュでは四面体による不均一メッシュ

が基本ですが、超限平面を設定することにより、均一サイズ、あるいは等比率でサイズが変化する規則的な三

角形、あるいは四角形による表面メッシュを生成することができます。

ソースコード 6 t6.geo

/*********************************************************************

*

* Gmshチュートリアル 6

*

* 超限メッシュ*

*********************************************************************/

// 最初のチュートリアルのジオメトリを基にして、このチュートリアルを進め// ましょう。Include "t1.geo";

21/29

3.6 チュートリアル 6: ‘t6.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Copyright (C) My Company

Hole

File created on Sun Feb 7 13:02:24 2010

X

Y

Z

Hole

Y

File created on Sun Feb 7 13:02:24 2010

XZ

Copyright (C) My Company

Geometry Mesh

図 9 チュートリアル 6の形状とメッシュ

// 面 6と左側の線分を削除して、3つの新たな線分と置き換えます。Delete{ Surface{6}; Line{4}; }

p1 = newp; Point(p1) = {-0.05, 0.05, 0, lc};

p2 = newp; Point(p2) = {-0.05, 0.1, 0, lc};

l1 = newl; Line(l1) = {1, p1};

l2 = newl; Line(l2) = {p1, p2};

l3 = newl; Line(l3) = {p2, 4};

// 表面を作成します。Line Loop(1) = {2, -1, l1, l2, l3, -3};

Plane Surface(1) = {1};

// 線 2の両端に向かって間隔が狭くなるように、20個の点を配置します。Transfinite Line{2} = 20 Using Bump 0.05;

// 線 11、12、13を合わせて 20個の点を配置します。(点p1と p2はそれぞれ線 l1

// と線l2に共有されますので、合計 6 + 6 + 10 = 22点でなく、20点が作成さ// れることに注意してください!)

Transfinite Line{l1} = 6;

Transfinite Line{l2} = 6;

Transfinite Line{l3} = 10;

// 線 1 (逆方向) と線 3に、等比数列に従って 30個の点を配置します。Transfinite Line{-1,3} = 30 Using Progression 1.2;

// 超限補間のための四隅を指定し、表面を超限平面として定義します。Transfinite Surface{1} = {1,2,3,4};

// (上記右辺のリストは線でなく、点に対する参照であることに注意してくだ// さい。表面の辺上に存在する点が 3または 4点のみである場合は、リストを省// 略することができます。‘Left’、‘Right’ または ‘Alternate’ キーワード// をリストの後に追加することで、三角形の生成方法を制御することができま// す。)

// 生成された三角形要素を、四角形要素に再結合します。Recombine Surface{1};

22/29

3.7 チュートリアル 7: ‘t7.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Hole

Y

0.0115 0.022

background mesh

0.001

Copyright (C) My Company

Z X

File created on Sun Feb 7 13:02:24 2010

Hole

background mesh

X0.001

File created on Sun Feb 7 13:02:24 2010

Y

Z0.0115 0.022

Copyright (C) My Company

Geometry Mesh

図 10 チュートリアル 7の形状とメッシュ

// 楕円スムーザを格子に適用します。Mesh.Smoothing = 100;

3.7 チュートリアル 7: ‘t7.geo’

形状の各部に任意の特性長を指定したいときは、形状内各部における特性長を、ポストプロセッシング・

ビューを用いて「場」として与えることができます。その「場」は、背景メッシュと呼ばれます。

ソースコード 7 t7.geo

/*********************************************************************

*

* Gmshチュートリアル 7

*

* 背景メッシュ*

*********************************************************************/

// 背景メッシュ、すなわち目標とするメッシュ寸法を含むポストプロセッシン// グ・ビューを使用することによって、特性長を非常に正確に指定することが// できます。

// 最初のチュートリアルをマージします。Merge "t1.geo";

// 目標とするメッシュサイズを含むポストプロセッシング・ビューを、マージ// します。Merge "bgmesh.pos";

// 上で読込んだビューを、現在の背景メッシュとして適用します。Background Mesh View[0];

23/29

3.8 チュートリアル 8: ‘t8.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

-2.59e+06-1.29e+06

-3.88e+06

1.52e+031.3e+06

0.35

3.89e+06

0.05

2.59e+06

0.2

Test... (0)

Geometry

図 11 チュートリアル 8の形状

3.8 チュートリアル 8: ‘t8.geo’

Gmshをポストプロセッシングに使用する場合、コマンドファイルを用いて複数のポストプロセッシング・

ビューの同時処理、可視化画像作成方法の指定、およびそのアニメーションの作成・保存を自動的に行うこと

ができます。また、For–EndForコマンドの多重使用による多重の繰返し、If–EndIfによる条件判断につい

ても解説します。

なお本チュートリアルはメッシュの作成を含まないため、図 11にはメッシュの画像はありません。

ソースコード 8 t8.geo

/*********************************************************************

*

* Gmshチュートリアル 8

*

* ポストプロセッシング、スクリプティング、アニメーション、オプション*

*********************************************************************/

// まず、‘t1.geo’ と、幾つかのポストプロセッシング・ビューを取込みます。

Include "t1.geo" ;

Include "view1.pos" ;

Include "view1.pos" ;

Include "view4.pos" ;

// つぎに、一般的なオプションを幾つか設定します。

General.Trackball = 0 ;

General.RotationX = 0 ;

General.RotationY = 0 ;

General.RotationZ = 0 ;

General.Color.Background = White ;

General.Color.Foreground = Black ;

General.Color.Text = Black ;

General.Orthographic = 0 ;

General.Axes = 0 ;

24/29

3.8 チュートリアル 8: ‘t8.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

General.SmallAxes = 0 ;

// それぞれのポストプロセッシング・ビューについても、幾つかのオプション// を設定します。

v0 = PostProcessing.NbViews-4;

v1 = v0+1;

v2 = v0+2;

v3 = v0+3;

View[v0].IntervalsType = 2 ;

View[v0].OffsetZ = 0.05 ;

View[v0].RaiseZ = 0 ;

View[v0].Light = 1 ;

View[v0].ShowScale = 0;

View[v0].SmoothNormals = 1;

View[v1].IntervalsType = 1 ;

View[v1].ColorTable = { Green, Blue } ;

View[v1].NbIso = 10 ;

View[v1].ShowScale = 0;

View[v2].Name = "Test..." ;

View[v2].Axes = 1;

View[v2].Color.Axes = Black;

View[v2].IntervalsType = 2 ;

View[v2].Type = 2;

View[v2].IntervalsType = 2 ;

View[v2].AutoPosition = 0;

View[v2].PositionX = 85;

View[v2].PositionY = 50;

View[v2].Width = 200;

View[v2].Height = 130;

View[v3].Visible = 0;

// つぎに、1から 255まで、1刻みに繰返し処理を行います。(1以外の刻みを使// うには、‘For’文の引数リストに、3つ目の引数を追加します。例えば、// ‘For num In {0.5:1.5:0.1}’ とすると、0.5から 1.5まで、0.1刻みにnum変// 数の値が増加します。)

t = 0 ;

//For num In {1:1}

For num In {1:255}

View[v0].TimeStep = t ;

View[v1].TimeStep = t ;

View[v2].TimeStep = t ;

View[v3].TimeStep = t ;

t = (View[v0].TimeStep < View[v0].NbTimeStep-1) ? t+1 : 0 ;

View[v0].RaiseZ += 0.01/View[v0].Max * t ;

If (num == 3)

25/29

3.8 チュートリアル 8: ‘t8.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

// num == 3のときは、320x240ピクセルのコマを作成します。General.GraphicsWidth = 320 ;

General.GraphicsHeight = 240 ;

EndIf

// ループをネストする (多重ループを作成する) ことも可能です。For num2 In {1:50}

General.RotationX += 10 ;

General.RotationY = General.RotationX / 3 ;

General.RotationZ += 0.1 ;

Sleep 0.01; // 0.01秒、スリープするDraw; // 画面を描画する

If (num == 3)

// ‘Print’ コマンドによって、グラフィック・ウインドウを保存します。// ‘Sprintf’ 関数によって、ファイル名を動的に生成することが可能で// す。Print Sprintf("t8-%02g.gif", num2);

Print Sprintf("t8-%02g.jpg", num2);

EndIf

EndFor

If(num == 3)

// ここにシステム・コマンドの呼び出しを追加して、動画を作成すること// ができます。例えば、

// whirlgifを使用する場合:

//

// System "whirlgif -minimize -loop -o t8.gif t8-*.gif";

// mpeg_encodeを使用する場合:

//

// System "mpeg_encode t8.par";

// mencoderを使用する場合:

//

// System "mencoder ’mf://*.jpg’ -mf fps=5 -o t8.mpg -ovc lavc

// -lavcopts vcodec=mpeg1video:vhq";

// System "mencoder ’mf://*.jpg’ -mf fps=5 -o t8.mpg -ovc lavc

// -lavcopts vcodec=mpeg4:vhq";

// ffmpegを使用する場合:

//

// System "ffmpeg -hq -r 5 -b 800 -vcodec mpeg1video

// -i t8-%02d.jpg t8.mpg"

// System "ffmpeg -hq -r 5 -b 800 -i t8-%02d.jpg t8.asf"

EndIf

EndFor

26/29

3.9 チュートリアル 9: ‘t9.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Hole

X0.001

(and a small subtitle)

A nice titleFile created on Sun Feb 7 13:02:24 2010

Y

0.0115 Z

background mesh

1.11 2.23

A 3D scalar map

0.022

Copyright (C) My Company

-0.0179

Geometry

図 12 チュートリアル 9の形状

3.9 チュートリアル 9: ‘t9.geo’

Gmshには、ポストプロセッシング・ビューに対して等値面あるいは切断面の作成、注記の追加などを行う

プラグインと呼ばれるモジュールが用意されています。本チュートリアルでは、コマンドファイル内でそれら

のプラグインに必要な設定を与え、プラグインを実行する方法を解説します。各プラグインで設定可能なオプ

ションの詳細説明については、グラフィカル・ユーザ・インターフェイスの ‘Tools→ Plugins’によって表示

されるダイアログボックスからプラグインを選び、‘Help’タブをクリックして下さい。

なお本チュートリアルはメッシュの作成を含まないため、図 12にはメッシュの画像はありません。

ソースコード 9 t9.geo

/*********************************************************************

*

* Gmshチュートリアル 9

*

* ポストプロセッシング・プラグイン (レベルセット、断面、注記)

*

*********************************************************************/

// Gmshはプラグインを追加することで、能力を拡張することができます。例え// ば、ポストプロセッシング・プラグインによってビューを変更したり、また// は既に読込まれたビューを基にして、新たなビューを作成することができま// す。Isosurface、CutPlane、CutSphere、Skin、Transform、Smoothのような、// 幾つかのデフォルトのプラグインはGmshに既に静的リンクされています。// Pluginはオプションと同様にして制御することが可能です。つまり、グラ// フィック・ユーザ・インターフェイス (各ビューのボタンをマウスの右ボタ// ンでクリックして、‘Plugins’ を選択)、またはコマンド・ファイルのいず// れかを使用することができます。

// ここでは例えば、3次元スカラー場のビューを取込んでみましょう。

Include "view3.pos" ;

// (3次元スカラー場のビューから等値面を抽出する) ‘Isosurface’ プラグイ// ンのオプションを設定し、実行します。

27/29

3.9 チュートリアル 9: ‘t9.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Plugin(Isosurface).Value = 0.67 ; // 等値面のレベルPlugin(Isosurface).View = 0 ; // View[0]から等値面を作成しますPlugin(Isosurface).Run ; // プラグインを実行します

// (平面A*x+B*y+C*z+D=0を用いて 3次元ビューの断面を計算する) ‘CutPlane’

// プラグインのオプションを設定し、実行します。

Plugin(CutPlane).A = 0 ;

Plugin(CutPlane).B = 0.2 ;

Plugin(CutPlane).C = 1 ;

Plugin(CutPlane).D = 0 ;

Plugin(CutPlane).View = 0 ;

Plugin(CutPlane).Run ;

// タイトルを設定します (ウインドウ座標における 99999より大きな値、ここ// では 1.e5、すなわち 1× 10の 5乗は、中心を表すと解釈されます。// ‘General.GraphicsWidth/2’ を使うこともできますが、現在のウインドウサ// イズのみに対して文字列を中心に合わせます)。

Plugin(Annotate).Text = "A nice title" ;

Plugin(Annotate).X = 1.e5;

Plugin(Annotate).Y = 50 ;

Plugin(Annotate).Font = "Times-BoldItalic" ;

Plugin(Annotate).FontSize = 28 ;

Plugin(Annotate).Align = "Center" ;

Plugin(Annotate).View = 0 ;

Plugin(Annotate).Run ;

Plugin(Annotate).Text = "(and a small subtitle)" ;

Plugin(Annotate).Y = 70 ;

Plugin(Annotate).Font = "Times-Roman" ;

Plugin(Annotate).FontSize = 12 ;

Plugin(Annotate).Run ;

// 最後に、幾つかのオプションを設定します。

View[0].Light = 1;

View[0].IntervalsType = 1;

View[0].NbIso = 6;

View[0].SmoothNormals = 1;

View[1].IntervalsType = 2;

View[2].IntervalsType = 2;

28/29

3.9 チュートリアル 9: ‘t9.geo’ OPEN ACOUSTICSOPEN ACOUSTICS

OPEN ACOUSTICSENJOY SOUND!

Copying conditions

Copyright c⃝1997-2009 Christophe Geuzaine, Jean-Francois Remacle

Gmsh is “free software”; this means that everyone is free to use it and to redistribute it on a free

basis. Gmsh is not in the public domain; it is copyrighted and there are restrictions on its distribution,

but these restrictions are designed to permit everything that a good cooperating citizen would want to

do. What is not allowed is to try to prevent others from further sharing any version of Gmsh that they

might get from you.

Specifically, we want to make sure that you have the right to give away copies of Gmsh, that you

receive source code or else can get it if you want it, that you can change Gmsh or use pieces of Gmsh in

new free programs, and that you know you can do these things.

To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these

rights. For example, if you distribute copies of Gmsh, you must give the recipients all the rights that

you have. You must make sure that they, too, receive or can get the source code. And you must tell

them their rights.

Also, for our own protection, we must make certain that everyone finds out that there is no warranty

for Gmsh. If Gmsh is modified by someone else and passed on, we want their recipients to know that

what they have is not what we distributed, so that any problems introduced by others will not reflect

on our reputation.

The precise conditions of the license for Gmsh are found in the General Public License that accompa-

nies the source code. Further information about this license is available from the GNU Project webpage

http://www.gnu.org/copyleft/gpl-faq.html. Detailed copyright information can be found in Copy-

right and credits.

The source code and various pre-compiled versions of Gmsh (for Unix, Windows and Mac OS) can be

downloaded from the webpage http://geuz.org/gmsh/.

If you use Gmsh, we would appreciate that you mention it in your work. References, as well as the

latest news about Gmsh development, are always available on http://geuz.org/gmsh/. Please send all

Gmsh-related questions to the public Gmsh mailing list at [email protected].

If you want to integrate Gmsh into a closed-source software, or want to sell a modified closed-source

version of Gmsh, please contact one of the authors. You can purchase a version of Gmsh under a different

license, with “no strings attached” (for example allowing you to take parts of Gmsh and integrate them

into your own proprietary code).

29/29