Gmshを用いた単純なフレーム作成とメッシュ作成

この投稿は、*code_aster*のスーパーユーザーの1人である**Jean-Pierre Aubry**氏による[Beginning with Code_Aster2nd](https://framabook.org/beginning-with-code_aster/)の第3章「Drawing and meshing a simple frame」を機械翻訳にかけたものです。
原著は、LAL 1.3 ; GNU FDL ; Creative Commons By-Saライセンスで公開されています。

:::note
この最初の章では、Gmshで単純な構造を作成し、そのジオメトリからメッシュを作成します。
:::

# Gmshを用いたフレームの作成

最初の例として、高さ1m、幅2mのAフレーム[^1]を検討します。1つの荷重は幅の4分の3の位置へ10kgの質点で、もう1つの荷重は4分の1の位置へ垂直下向きに100Nの荷重です。このフレームは図1に描かれています。
　注意：構造はジオメトリとして対称ですが、質量ではそうではありません。
　最初に行うことは、問題のディレクトリを作成することで、読み取り/書き込み権限がある場所ならどこでもよく、このディレクトリに*frame1*と名前をつけます。
　Gmshを起動すると、図2のような画面が表示されます。

[^1]: 実際に逆U字型で、庭で子供たちのブランコを支えます。

![frame1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/2c90a553-32b8-0acf-4d6d-75517321f50c.png)
**図1 フレーム1 のスケッチ**

* **untitled.geo**という名前の大きなウィンドウ；
* 上部のメニューバー；
* 下部のステータスバー；
* 右下の小さな三面体；
* 左側のモジュールツリー。

　メインウィンドウでメニュー「File」＞「New...」を選択し、作成したばかりのディレクトリ*frame1*にファイルを作成/保存し、*frame1.geo*という名前を付けます。次の"Which geometry kernel do you want to use?"というダイアログボックスで、一番右の「Built-in」を押してください。
　Gmshの重要な特徴の1つは、GUIで行われたすべての変更が、即座に*.geo*ファイルへ保存されることです。
この挙動は、一般的なスプレッドシートやテキストプロセッサーに慣れている初心者には奇妙に思えるかもしれませんが、いったん理解してしまえば、それを使わずにはいられません。

![gmsh0a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/e2006f97-82f7-eb86-de3f-3cc6602d3850.png)
**図2 いくつかのモジュールを展開したGmsh**

ツリーの 「-」「Modules」の下:

* 「Geometry」ボタンを押し、次に「Elementary entities」を押します;
* 次に、「Add」＞「Point」をクリックすると、別の小さなウィンドウがポップアップ表示されます。;
* 「X coordinate」ボックスに座標x=0、続けてy=-1000、z=0を入力します;
* 「Prescribed mesh element size at point」ボックスに100と入力します;
* 「Add」を押します。

　メインウィンドウの上部中央に表示されるコンテキストで何ができるかについて説明があります。また、**Gmsh**のメインウィンドウ下部のステータスバーに、アクティブなコマンドが表示されます。新しく作成したポイントは、Gmsh のメインウィンドウに小さな四角形のボックスとして表示されます。次に、お気に入りのテキストエディター[^2]で*frame1.geo*ファイルを開きましょう。
次のようなものが表示されます：

[^2]: 私に関する限り、jEditです。

![gmsh1a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/47b036fc-9922-c7f6-fa77-fe73a9ac5d73.png)
**図3 Gmshでの点の作成**

```python
// Gmsh project created on Mon Nov  18 08:32:45 2013
cl1=100;
Point(1) = {0, -1000, 0, cl1};
```
　Gmshで、x=0、y=-1000、z=1000の新しいポイントを入力して、「Add」を押します。テキストエディターに、ソースファイルが変更されたことを示す警告が表示され、テキストウィンドウを更新すると、新しい行が表示されます。

```python
// Gmsh project created on Mon Nov  18 08:32:45 2013
cl1=100;
Point(1) = {0, -1000, 0, cl1};
Point(2) = {0, -1000, 1000, cl1};
```

　テキストエディターで、次のように新しい行を追加します：

```python
Point(3) = {0, -500, 1000, cl1};
```

　ファイルを保存し、Gmshのツリーで「Geometry」＞「Reload script」を押すと、メインウィンドウに新しいポイントが表示されます。
　テキストエディターからGmsh GUIに切り替えることが、効率的に作業を行うための現実的なの方法です！
　「Tools」メニューで「Options」を選択し、「Geometry」を選択します。次に、「Point numbers」オプションをオンまたはオフにして、ポイントの番号付けの表示を切替可能です。点を使用してジオメトリを完成させます。

```python
Point(4) = {0, 0, 1000, cl1};
```

　次に、「Geometry」モジュールで、「Elementary entities」＞「Add」＞「New」＞「Straight line」ボタンを押します。マウスを使用して、各線の2つの端点を選択して点を接続し、画面の上部中央にある要求を注意深く確認します。
　次に、「Geometry」＞「Elementary entities」＞「Symmetry」＞「Line」で、ダイアログボックスにA=0、B=1、C=0、D=0と入力[^3]、マウスですべての線を選択して、「e」と入力します。構造はXOZ平面に対称に複製され、可視性の切り替えに応じて図4のようになります。
　注意:新しい点が自動的に作成され、点4に重複する点はありません。これがどのように行われているかは、テキストエディターで確認できます。**Gmsh**ウィンドウは図4のようになります。

[^3]: 対称性は、ベクトルA、B、Cによって定義されます。ベクトルA、B、Cは、平面に垂直なベクトルの3つの成分（X、Y、Z）であり、Dは、平面からグローバル軸の原点までの空間内の距離です。つまり、空間内の平面方程式の4つのパラメーターです！

![gmsh3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/26d134f9-c104-41f0-9f45-28741d0e7a52.png)
**図4 対称ダイアログボックスでのGmshのジオメトリエンティティ**

　次に、いくつかのプロパティ[^4]を共有するジオメトリエンティティを'グループ'にまとめます。ツリー上の「Geometry」＞「Physical groups」＞「Add」＞「Line」で、フレーム上部のバーの一部である4 つの線をマウスで選択します。これが完了したら、図5のように「e」と入力します。
　テキストエディターに新しい行が追加されていることがわかります：

[^4]: Gmshでは、グループはPhysical と呼ばれます。

```python
Physical Line(7) = {2, 3, 5, 4};
```

![gmsh4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/bcf7616e-0a33-7260-3556-8c63b3744484.png)
**図5 Physical を作成するために選択された4 本の線**

　実際の数字は異なる場合があります！次のように編集します：

```python
Physical Line("topbeam") = {2, 3, 5, 4};
```

　続ける前に非常に重要な警告があり、code aster によって後で処理されるメッシュファイル内では、24文字[^5]を超えるグループ名を使用しないでください。
　これにより、4本の線、2、3、5、4で構成されるグループに'topbeam'という名前が付けられます。次のようなグループになるまで、GUIまたはテキストエディターのいずれかから操作を続けます。ポイントのグループもあります。最終的に、*.geo*ファイルは次のようになります。[^6]:

[^5]: 11.3.10より前のバージョンでは8文字だったので、大幅に改善されました！
[^6]: //行の先頭にあるのは、C言語と同様に、この行がGmshのコメントであることを意味します。

```python
// Gmsh project created on Mon Nov  18 08:32:45 2013
cl1=100;
Point(1) = {0, -1000, 0, cl1};
Point(2) = {0, -1000, 1000, cl1};
Point(3) = {0, -500, 1000, cl1};
Point(4) = {0, 0, 1000, cl1};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Symmetry {0, 1, 0, 0} {
  Duplicata { Line{2, 3, 1}; }
}
Physical Line("topbeam") = {2, 3, 5, 4};
Physical Line("mast") = {1, 6};
Physical Point("groundS") = {1};
Physical Point("groundN") = {13};
Physical Point("loadS") = {3};
Physical Point("massN") = {6};
```

いくつかのGmsh のヒント:

* ステータスバーの左端には、いくつかのボタンがあります；
  * 「X」、「Y」、「Z」は選択した軸からビューを設定し、同時に「↑」を押すと軸が反転します；
  * 「S」はスナップを意味し、誤って有効になった場合は無効にする必要があります（有効にした場合は赤で表示されます）；
  * バルーンヘルプで使用方法が説明されているその他のボタン。
* 複数の項目を一度に選択するには、「ctrl」を押しながらマウスでバウンディングボックスを描きます。バウンディングボックス内に少しでも含まれるエンティティが選択されます。

# Gmshを用いたメッシュ作成

この段階では、ジオメトリエンティティのみが存在するので、それらをメッシュエンティティに変換する必要があります。
 ツリーの中で、「Mesh」＞「1D」を押すと、モデルは図6のようにメッシュ作成されます。
 **Options**ウィンドウで、「Mesh」と「Geometry」の「Visibility」のボックスを切り替え、何が作成されたかを確認します。
　テキストエディターでは、2行目にエントリ「cl1=100」が表示されます。このエントリ「cl1」は、各ノードの4 番目のエントリとして繰り返されます。これは基本メッシュサイズであり、この指定された点の周りに適用されるGmsh の「Characteristic length（特性長）」と呼ばれます。この行のcl1=500 を変更し、テキストエディターで保存し、Gmshで再読み込みしてメッシュを再度作成すると、かなり粗いメッシュが表示されます。

![gmsh5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/74ade054-5482-e00e-4e16-b18835cb4273.png)
**図6 これは、節点番号と、「Options」＞「Color」＞「Coloring mode」を「By physical group」に設定し、要素の色を微調整したメッシュです。**

　同様に、ツリー内の「Mesh」＞「Define」＞「Elements size at points」をクリックし、値を10などの任意の「Value」で埋めて、点の1つを選択し、メッシュを作成します。
　ここで、メッシュを保存するには、「File」＞「Export...」を選択し、ファイルを*frame1.med*という名前で保存します。図7の上部のように、**MED Options**という名前の小さなダイアログボックスがポップアップ表示されます：
　メッシュに作成されたグループを保存するには、「Save all (ignore physical groups)」 のボックスをオフのままにします。

![gmsh6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/662a2e66-c69d-5613-3ea8-9adfc87d5a3d.png)
**図7 Physical「mast」、「massN」、および「LOAD」のみが表示され、節点と行番号、要素ごとに色分けが設定されています。**

それについての詳細:

* このチェックボックスをオフのままにすると、グループに属するすべての要素、これらの要素のみ、点要素（あるいは節点）も同様に、*.med*ファイルに変換されます。つまり、あとで必要なすべてのグループを作成する必要があります。
* このボックスをチェックすると、すべての要素が変換されますが、グループ定義はありません。

　これは非常に重要です。Gmsh でメッシュを作成する場合、見つかったすべてのエンティティが区別なくメッシュされるため、実際のメッシュは上記のように保存されます。
　Gmshの使用に関するもう1つのヒントとして、下部にあるリストブラウザタブの「Tools」＞「Visibility」に移動し、「Physicals groups」をプルダウンします。ここでは、グループごとのvisibility グループを使用して、図7のように必要な状態になっているかどうかを確認できます。
　最後に、「ctrl」+「L」を押すか、ステータスバーをクリックすると、ログである「メッセージコンソール」が、メインウィンドウ下部に表示され、サイズ変更が可能です。