Yamamoto's Laboratory
 
設定・実行
 
入力ファイル
 
 

はじめに

有限要素法 (FIM: Finite Element Method) のプログラム作成で,最も面倒なのはメッシュ生成の部分です.以前は自分でメッシュ生成のプログラムも書いていましたが,しばらくプログラム作成に離れると,メッシュ生成のソースコードの修正が面倒になりました.そんな折,急ぎで有限要素法のプログラムの作成が必要となりました.「自作するかフリーのプログラム使うか?」選択に迫られました.時間は1日,フリーのプログラムを使うことに決定.

ネットで調べたところ,(1) NETGEN – automatic mesh generator,(2) Triangle (A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator) が良さそうです.

インストール

Windows にもインストールできると思われますが,私はすぐにはできませんでした.以下は,Linux でのインストールと確認方法を示します.

ダウンロードとビルド

Triangle の WEB サイトから,「a.zip」をダウンロードします.ダウンロードされるファイルは,「triangle.zip」です.適当なディレクトリーに,ファイルを保存します.

  1. ダウンロードしたファイルを解凍します.
    $ unzip triangle.zip
    すると,以下のファイルが現れます.
    A.poly    makefile    triangle.c
    README    showme.c    triangle.h    tricall.c
  2. そして,ビルドします.
    $ make
    すると,以下の実行ファイルが出来上がります.
    showme    triangle

実行の確認

ビルドが上手く行ったら,実行の確認をします.以下のコマンドで,サンプルファイル「A.poly」を入力として,メッシュを生成します.オプションの「p」で,直線の線を表すファイルを読み込みます.

$ ./triangle -p A

すると,「A.1.ele」と「A.1.poly」,「A.1.node」というファイルができます.

出来上がったメッシュを確認しましょう.以下のコマンドを実行します.

$ ./showme A.poly &

そして,ele をクリックします.すると,図1が現れます.あまり良いメッシュではないですね.そこで,メッシュの品質を向上させるオプションの「q」を追加します.

$ ./triangle -pq A

このコマンドが生成したメッシュは,先ほど同様「showme A.poly」で見ることができます.図2がその結果で,メッシュが改善されている様子がわかります.

メッシュ「triangle -p」 メッシュ「triangle -pq」
図1: メッシュ「triangle -p」 図2: メッシュ「triangle -pq」

実行ファイルの移動

どこからでも,実行ファイルにアクセスできるように,実行ファイル (showme, triangle) を適当なディレクトリーにコピーします.私は,「~/bin/triangle」にこれらのファイルを保管しました.ディレクトリーや実行ファイルのパーミッションは「755」としました.実行権限が必要ということです.

そして,パスを設定します.設定の記述はいろいろなところで可能ですが,私は「.profile」に以下を記述しました.PCを再起動するとどこからでも,これらの実行ファイルにアクセスできます.

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$HOME/bin/triangle:$PATH"
fi

二次元のメッシュ生成

ポリゴンファイル (*.poly)

まずはメッシュ分割領域を決定するポリゴンファイル (sample.poly) を作成します.これは,ユーザーが作成する唯一のファイルです.ファイルの規約については,開発元の Triangle.poly files に詳しく書かれています.といっても分かり難いです.

メッシュ分割

ポリゴンファイル (sample.poly) ができたら,メッシュ分割します.

まずは,ポリゴンファイルで指定したセグメントのポイント間を接続し,三角形のエレメントに分割します.

$ triangle -p sample

オプション「-p」は,ポリゴンファイルを読み込むという意味です.このオプションを指定しないと,ノードファイル (*.node) を読み込みます.最初は,ノードファイルがありませんので,このオプションをつけて,三角形分割します.このコマンドを実行すると,3つのファイル「sample.1.ele」と「sample.1.node」,「sample.1.poly」が出来上がります.

メッシュ分割の結果は,次のコマンドで確認することができます.

$ showme sample

ウィンドウ「Show Me」が現れますので,1番の「ele」をクリックすると三角形メッシュが現れます.セグメントを指定したポイントのみで三角形メッシュが出来上がっています.0番の「poly」をクリックすると,ポリゴン (セグメントの集合) を表示します.

この状態だと,かなり荒いメッシュなので精度の高い計算には向きません.そこで,メッシュをより細かく分割します.

簡単にメッシュを改良するために,オプション「q」を使います.

$ triangle -pq sample

これで,メッシュが改良 (refine) され,3つのファイル「sample.1.ele」と「sample.1.node」,「sample.1.poly」が修正されます.ちょっとだけメッシュが良くなります.

次にメッシュを良くするためには,オプション「a」を使います.以下のようにすると,エレメントの最大面積が 0.2 以下になります.

$ triangle -pq -a0.2 sample

有限要素法の計算に必要なファイル生成

デフォルトでメッシュ生成プログラム triange は,ノードファイル (*.n.node) とポリゴンファイル (*.n.poly), エレメントファイル (*.n.ele) を生成します.しかし,有限要素法の計算を行うとき,これだけでは情報が不足します.三角形のエッジ (辺) と 隣接エレメントの情報が必要です.これらの情報は,次節に示すエッジファイル (*.n.edge) と 隣接エレメントファイル (*.n. neigh) に書かれます.コマンド「triangle」にオプションをつけることでファイルが出力されます.エッジファイルを出力するオプションは「-e」,隣接エレメントファイルでは「-n」です.

これまで示したオプションを使い,有限要素法の計算に必要なファイルを出力するコマンドは次のようになります.

$ triangle -pqen -a0.2 sample

最大面積は,メッシュを見て調整します.ポリゴンファイル (*.poly) にセグメントの面積を指定した場合のコマンドは,以下のとおりです.

$ triangle -pqena sample

作成されるファイル

元のポリゴンファイル (*.poly) を Triangle で処理すると,「*.n.拡張子」というファイルが出来上がります.「*」は元のポリゴンファイル名,「n」は整数でファイル作成順を表します.ファイルの種類に応じが拡張子が付きます.以下に,Triangle で作成される様々なファイルをしめします.

ファイル名 種類 説明
*.n.node ノード ファイルの各行にはノード番号と座標,属性,境界マーカーが書かれています.
*.n.poly ポリゴン セグメントの境界を表します.境界は直線の集まりで,その直線の両端のノード番号で指定されます.合わせて,境界マーカーもファイルに書かれています.また,ホールを表すセグメントの座標も書かれています.
*.n.ele エレメント 三角形のエレメントの集合を表します.ファイルの各行には,エレメント番号と3つのノード番号が書かれています.
*.n.edge エッジ (辺) 三角形の辺の集合を表します.各行には辺番号とノード番号 (辺の両端),境界マークが書かれています.このファイルを出力するためには,triangle を実行するときに,オプション「-e」を加えます.
*.n.neigh 隣接エレメント 三角形の隣接エレメントを示します.各行には,エレメント番号とその隣接エレメント番号が書かれています.隣接エレメント番号「-1」は,隣接エレメントが無いことをしめしています.このファイルを出力するためには,triangle を実行するときに,オプション「-n」を加えます.

コマンドラインのオプション

メッシュ生成 (triangle)

コマンド「triangle -h」で表示されるオプションとその動作を示します.表示は英語ですが,それを google 翻訳にかけた結果です.おかしな部分も有りますが,とりあえず意味は分かるでしょう.時間があるときに正しい日本語に直します.

オプション 動作
-p 頂点,セグメント,穴,ノードの属性,およびエレメントの面積の制約を指定することができるポリゴンファイル(.polyファイル)を読み取ります.制約ドロネー三角形分割(CDT)の入力をフィッティングを生成します.または,-s,-q,-a,または -u 使用されている場合,準拠制約ドロネー三角形分割(CCDT).あなたが本当にドロネーをしたい場合は,同様 -D 使用し,三角測量(ちょうどドロネーを拘束されません).-p を使用しない場合,トライアングルはデフォルトではノードファイル (*.node) を読み込みます.[英語の原文]
-r 以前に生成されたメッシュを改良 (refime) します.この時,メッシュはノードファイル (*.node) とエレメントファイル (*.ele) から読み込まれます.また -p 使用される場合,ポリゴンファイル (*.poly) が読み込まれ,メッシュ内のセグメントを制約するために使用されます.-a も (以下のない番号で) 使用される場合,エリアファイル (*.area) が読み込まれ,メッシュの面積の制約を課すために使用されます.メッシュの改良に関するさらなる詳細は,以下に表示されます.[英語の原文]
-q ドロネーリファインによる品質メッシュ生成(ポール チューとジム・ルパートのアルゴリズムのハイブリッド).すべての角度が20〜140度の間であることを確認するためにメッシュに頂点を追加します.20度を交換し,最小の角度にバインド代替は,`Q 'の後に指定することができます.指定された角度は,小数点ではなく,指数表記を含んでいてもよいです.最大の角度に - (2シータ180)最小の角度にθ度のバウンドものバウンドを含意することに注意してください.最小角度が28.6度以下であれば,トライアングルは数学的に終了することが保証されている(無限精度演算を想定し - トライアングルでは,精度が不足した場合に終了するために失敗することがあります).実際には,トライアングルは,多くの場合,34度までの最小角度について成功しました.いくつかのメッシュのために,しかし,あなたは不十分な浮動小数点の精度に関連する問題を回避するための最小角を小さくする必要がある場合があります.[英語の原文]
-a 最大の三角形の面積を課しています.オプション a に引き続く数(面積)が領域よりも大きい場合,三角形は生成されません.数が特定されていない場合,.area の(-r が使用される場合)ファイルまたは .poly ファイル(-rを使用しない場合),最大面積制約のセットを指定します. .area ファイルには,各三角形のための独立したエリア制約が含まれており,事後誤差推定値に基づいて,有限要素メッシュを精製するのに有用です. .polyファイルは,必要に応じて,それによってPSLGの最初の三角形分割で三角形の密度を制御し,各セグメント-囲まれた地域の面積制約を含めることができます.あなたは,固定された面積制約とで,かつて以下の番号を指定せずに1回,2回 -a スイッチを呼び出すことによって,様々な面積制約の両方を課すことができます.指定された各領域は,小数点を含むことができます.[英語の原文]
-u 三角形のサイズ上のユーザー定義の制約を課しています.この機能を使用するには,2つの方法があります.一つは,その後,トライアングルを再コンパイルし,あなたが好きな制約をエンコードするためにtriangle.cにtriunsuitable()プロシージャを編集することです.他には,設定EXTERNAL_TESTシンボル(コンパイラスイッチ-DEXTERNAL_TEST),その後)(triunsuitableを実装する個別のオブジェクトファイルとトライアングルをリンクとtriangle.cをコンパイルすることです.いずれの場合も,-uスイッチは,ユーザ定義のテストはすべての三角形に適用されます.[英語の原文]
-A 各三角形が属するどのセグメント囲まれた領域を特定し,各三角形に追加の浮動小数点属性を割り当てます.属性は.polyファイルによって地域に割り当てられます.領域が明示的.polyファイルによってマークされていない場合は,その領域内の三角形は,ゼロの属性が割り当てられています. -Aスイッチは,-pスイッチを使用し,-rスイッチがない場合にのみ効果があります.[英語の原文]
-c 三角測量の凸包上のセグメントを作成します.あなたは頂点集合を三角形分割している場合,このスイッチは,凸包のすべてのエッジを含む,書き込まれる.polyファイルが発生します.あなたはPSLGを三角形分割している場合,このスイッチはPSLGの全体凸包は関係なくPSLGが持っているもののセグメント,三角形分割されることを指定します. PSLGを三角形分割するときにこのスイッチを使用しない場合は,トライアングルは,あなたが入力PSLGのセグメントとそれを囲むことによって,三角形分割される領域を特定したことを想定しています.注意してください:あなたが注意されていない場合(トライアングルは精度が不足した場合は,おそらく失敗),このスイッチが overrefinement 引き起こす可能性がありますPSLGセグメントと凸包セグメント間の非常に薄いの角度,の導入を引き起こす可能性があります.あなたはメッシュを精緻化している場合は,-cスイッチは異なる動作を:それは(何.polyファイルが読み込まれなかった場合に便利)メッシュの境界エッジを含む書き込まれる.polyファイルが発生します.[英語の原文]
-D ドロネー三角形分割を従わせる:あなたはメッシュ内のすべての三角形がドロネーであり,単にドローネー制約されないことを確認したい場合は,このスイッチを使用します.または,あなたはすべてのボロノイ頂点は,三角形分割内にあることを確認したい場合. (一部の有限体積法は,この要件を持っている.)このスイッチは,直径円侵食されているすべてのサブセグメントを分割ルパートのオリジナルアルゴリズムを呼び出します.これは通常,頂点と三角形の数を増加させます.[英語の原文]
-j 出力 .node ファイルファイルからの最終的な三角測量の一部ではない頂点をJettisons.デフォルトでは,トライアングルのコピーと同じ順序で出力.nodeファイルファイルへの入力.nodeファイルファイル内のすべての頂点は,ので,それらのインデックスは変更されません. -jスイッチは,重複入力の頂点を防ぎ,または頂点は`出力 .node ファイルファイルに表示され,穴によって「食べ. 2入力の頂点がまったく同じ座標を持っている場合このように,最初は出力に表示されます.任意の頂点が放棄されている場合,出力.nodeファイルファイル内の頂点番号は入力 .node ファイルのファイルとは異なります.[英語の原文]
-e 三角エレメントの辺のリストが書かれているエッジファイル「*.n.edge」を出力しします.[英語の原文]
-v 三角エレメントに関連したボロノイ図を出力します.いくつかのボロノイ頂点が重複することができるので,縮退を検出しようとしません.ボロノイの議論は下の図を参照してください.[英語の原文]
-n 各三角形に隣接するエレメントのリストのが書かれているファイル「*.n.neigh」を出力します,[英語の原文]
-g ジオメトリセンターGeomviewパッケージでの表示に適しオブジェクトファイル形式(.off)ファイルにメッシュを出力します.[英語の原文]
-B 出力 .node ファイル内のいかなる境界マーカーは,.poly,および出力ファイルを .edge ません.以下,境界マーカーの詳細な説明を参照してください.[英語の原文]
-P いいえ,出力 .poly ファイルはありません.ディスクスペースを節約していますが,メッシュの後の改良に拘束セグメントを維持する能力を失います.[英語の原文]
-N ノードファイル「*.n.node」 を出力しません.[英語の原文]
-E エレメントファイル「*.n.ele 」を出力しません.[英語の原文]
-I いいえ反復番号はありません. .node ファイルや .poly ファイルの出力を抑制しますので,あなたの入力ファイルは上書きされません.それはファイル.eleあなたの入力を上書きしてしまうため(あなたの入力が.polyファイルのみである場合は,.nodeファイルのファイルが書き込まれている.),-rスイッチと共に使用することはできません. -qで使用すべきではない,-a-u,または全く.nodeファイルのファイルが書き込まれていないので,あなたが,入力用の .node ファイルファイルを使用しているので,いずれかのレコードがない場合は -s スイッチはスタイナーポイントを追加しました.[英語の原文]
-O 穴なし..poly ファイルの穴の部分は無視します.[英語の原文]
-X いいえ,正確な算術ません.それは不正確なテストが十分に正確でないと考えている場合,通常,トライアングルは,特定のテストのために正確な浮動小数点演算を使用しています.正確な演算は,浮動小数点丸め誤差にもかかわらず,三角測量アルゴリズムの堅牢性を保証します. -Xスイッチで正確な算術演算を無効にすると,速度の小さな改善を引き起こし,トライアングルが有効なメッシュを生成するために失敗する可能性が作成されます.お勧めできません.[英語の原文]
-z ゼロ(よりもむしろ1)から始まる数字すべてのアイテム.このスイッチは通常入力.nodeファイルや.polyファイルの最初の頂点に番号を付けるために使用される値によって上書きされることに注意してください.別のプログラムからトライアングルを呼び出すときただし,このスイッチは便利です.[英語の原文]
-o2 6個のノードそれぞれと二次サブパラメトリック要素を生成します.[英語の原文]
-Y 境界上の新たな頂点ません.それはいくつかの隣接するメッシュに一致するようにメッシュの境界が保存されなければならない場合に,このスイッチは便利です.あなたはおそらく,メッシュの品質の多くを犠牲にすることをあらかじめご了承ください.トライアングルはしようとしますが,結果のメッシュは不十分な形状の三角形を含んでいてもよいです.すべての境界頂点が密集している場合に適しています.内部境界を含め,すべてのセグメント分割を防ぐために二回(`-YY')をこのスイッチを指定します.[英語の原文]
-S スタイナーポイント(入力ではありませんが,最小角度と最大面積の制約を満たすために追加された頂点)の最大数を指定します.デフォルトでは,無制限の数をできるようにすることです.あなたはそれの後に番号なしでこのスイッチを指定した場合,制限はゼロに設定されています.トライアングルは,常にそれはあなたが設定した上限よりも多くの頂点を使用する必要がある場合であっても,セグメントの交点に頂点を追加します.トライアングルは,分割(-s)によってセグメントを挿入すると,それは常にPLSGのすべてのセグメントが必要な場合は制限を無視して,回収されることを保証するために十分な頂点が追加されます.[英語の原文]
-i むしろドロネー三角形分割を構築するための分割統治アルゴリズムよりも増分を使用します.ディバイド・アンド・統治アルゴリズムが失敗した場合にそれを試してみてください.[英語の原文]
-F ドロネー三角形分割を構築するスティーブン・フォーチュンのsweeplineアルゴリズムを使用します.警告:すべての計算の正確な算術演算を使用していません.正確な結果は保証されません.[英語の原文]
-l 分割統治アルゴリズムで唯一の垂直方向のカットを使用しています.デフォルトでは,トライアングルは通常小さくまたは短く,広い頂点集合を除いて速度を向上させる垂直方向と水平方向のカット,交互に.このスイッチは,主に理論的な関心事です.[英語の原文]
-s セグメントは再帰的にかなり制約ドロネー三角形分割を生成するよりも,その中間点でそれらを分割して,三角測量に強制することを指定します.セグメント分割はルパートのオリジナルのアルゴリズムに忠実であるが,不必要に小さな三角形を作成することができます.このスイッチは,主に理論的な関心事です.[英語の原文]
-C 最終的なメッシュの整合性を確認してください. -Xスイッチが使用されている場合でも,チェックのための正確な算術演算を使用しています.便利なあなたはトライアングルはバグがある疑いがある場合.[英語の原文]
-Q 静か:エラーが発生しない限り,トライアングルが何をしているかのすべての説明を抑制します.[英語の原文]
-V 冗長:トライアングルが何をしているかに関する詳細な情報を提供します.詳細の量を増加させるための複数の`V者を追加します. `-V'が最も有用です.アルゴリズムの進歩とより詳細な統計情報をitgives. `-VVは「トライアングルがはるかにゆっくり実行されることをそんなに頂点ごとの頂点の詳細,およびプリントを提供します. `-vvvvは'だけデバッガが大好きでした情報を提供します.[英語の原文]
-h ヘルプ: これらの指示を表示します.[英語の原文]

表示 (showme)

ページ作成情報

参考資料

  1. 最初は,Triangle のホームページを見ることを勧めます.

更新履歴

2016年06月04日 ページの新規作成


no counter