TetGen — CAE用語解説
TetGen
自作のFEMコードで四面体メッシュを生成したいんですけど、TetGenってどうやって使うんですか?
理論と物理
TetGenの基本概念
「TetGen」という名前を聞いたのですが、これは何をするソフトウェアなんですか?
TetGenは、3次元の幾何形状を四面体(テトラヘドロン)メッシュに自動的に分割する、いわゆる「テトラヘドラルメッシャー」です。特に、与えられた表面メッシュから内部を埋める体積メッシュを生成する「Delaunay四面体分割」と「境界適合性」を保証するアルゴリズムで知られています。オープンソースで、C++で書かれています。
Delaunay分割って聞きますが、四面体の場合、何を最適化しているんですか?三角形の場合は外接円に他の点が入らない、でしたよね。
その通りです。3次元Delaunay分割では、任意の四面体の外接球の内部に他のメッシュ頂点が存在しないように四面体を構成します。この性質は、メッシュ要素の形状(アスペクト比)が極端に悪くなるのを防ぎ、数値計算の安定性に寄与します。TetGenはこの性質を満たす分割を効率的に構築します。
境界適合性が重要とありましたが、複雑なCAD形状の表面を正確に再現するのは難しそうですが、どうやってるんですか?
良い質問です。TetGenは入力として表面メッシュ(STLファイルなど)の三角形ファセット群を受け取ります。アルゴリズム内部で「制約付きDelaunay分割」や「Delaunay細分化」を用い、これらの表面三角形を構成する辺や面をメッシュの辺や面として強制的に保持します。この際、指定した幾何学的許容誤差(デフォルトで1.0e-9など)以内で境界を近似します。
数値解法と実装
アルゴリズムと制御パラメータ
TetGenを実際に使う時、主要な制御パラメータにはどんなものがありますか?
コマンドラインオプションで指定する主要パラメータは幾つかあります。「-p」は単純なDelaunay分割、「-q」はメッシュ品質改善(目標エッジ比の設定)、「-a」は最大四面体体積の制限、「-Y」は自己交差などの入力面メッシュの修復を抑制します。例えば、-q1.5/20 は、エッジ比1.5以下、最小二面角20度以上を目標に品質改善を行います。
「最大四面体体積」を制限する「-a」は、メッシュを細かく均一にするために使うのですか?
そうです。例えば -a0.01 と指定すると、生成される四面体の体積が0.01立方単位を超えないように制御します。これは、応力集中が予想される領域などで局所的にメッシュを細かくしたい場合に有効です。ただし、全体に適用するので、必要以上に全体の要素数を増加させるリスクもあります。局所細分化には別のアプローチが必要です。
品質改善「-q」のアルゴリズムは、具体的にどのように悪い要素を修正するんですか?
主に「頂点の挿入」と「頂点の移動(スムーシング)」を組み合わせた「Delaunay細分化」と「最適化ベースのスムーシング」です。品質が閾値以下の四面体を見つけると、その外心や辺の中点などに新たな頂点を追加し、Delaunay条件を保ちながらメッシュを再構成します。この反復処理によって、平均的な要素品質を向上させます。
実践ガイド
ワークフローと前処理
CADからTetGenを使って体積メッシュを作る典型的なワークフローを教えてください。
大まかには以下のステップです。1. CADソフト(SolidWorks, CATIA等)でモデリング。2. 表面メッシュを生成(多くのCAE前処理ソフトや、Netgen, gmsh等を使用)。この時、STLまたはPLY, OFF形式で出力。3. その表面メッシュをTetGenに読み込ませ、-pq などのオプションで体積メッシュ生成。4. 出力された.node, .ele, .faceファイルを、求解ソフト(CalculiX, Code_Aster等)用の入力形式に変換。
ステップ2の「表面メッシュ」の品質が、TetGenの成否を大きく左右しそうですが、具体的に気をつける点は?
最も重要なのは「水密性」です。表面メッシュに隙間(ノンマニフォールドエッジ)や自己交差があると、TetGenは内部と外部を判別できず、体積メッシュ生成に失敗します。また、極端に細長い三角形や大きさが急激に変化する要素も問題の原因になります。前処理ソフトのメッシュ修復機能(例えば、Salomeの「Remove bad cells」やMeshLabの「Remeshing」)で事前に修復するのが定石です。
複数の材料(例えば金属部品と樹脂部品)が接触しているアセンブリ形状をメッシュ化したい時、TetGenは対応できますか?
はい、可能です。その場合、入力となる表面メッシュにおいて、異なる材料領域の界面も三角形ファセットとして明確に定義されている必要があります。TetGenは、入力された全ての表面ファセットを境界として認識します。出力される.faceファイルや.eleファイルには領域マーカーが付与されるので、後段のソルバーで異なる材料定数を割り当てる際に利用できます。
ソフトウェア比較
他のメッシャーとの位置づけ
商用CAEソフト(Ansys, Abaqus)にもメッシャーは内蔵されていますよね。TetGenの強みや使う場面はどこですか?
その通りです。Ansys MeshingやAbaqus/CAEのメッシャーはGUI統合やCAD連携が強力です。TetGenの強みは、第一に「オープンソース」である点。研究開発やカスタムツールチェーンに組み込みやすい。第二に「ロバスト性」。非常に複雑で悪い表面メッシュに対しても、修復オプション(-dや-w)を使ってメッシュ生成を試みられる。多くのオープンソースCAEソフト(FEniCS, Elmer FEM)のデフォルトメッシャーとして採用されているのも理由です。
他のオープンソースメッシャー、例えば「Netgen」や「gmsh」と比べてどうですか?
良い比較点です。Netgenは独自の幾何カーネル(CSG)を持ち、CADから直接メッシュを生成できるのが特徴です。gmshはスクリプト駆動で高度なメッシュ制御が可能で、構造化/非構造化メッシュの両方を扱います。一方、TetGenは「与えられた表面メッシュから体積メッシュを生成する」という一点に特化しています。そのため、ワークフローの中では、gmshで表面メッシュを作成し、TetGenで体積メッシュ化する、といった連携も見られます。
商用ソフトの中では、どれがTetGenを採用または参考にしているんでしょうか?
直接「採用」と公表している例は少ないですが、TetGenのアルゴリズムは学界で広く参照され、その考え方は多くのメッシャーに影響を与えています。例えば、COMSOL Multiphysicsの「テトラヘドロンメッシュ」機能も、Delaunayベースのアルゴリズムと品質改善技術を実装しています。また、医学画像処理分野のソフト(3D Slicerなど)では、TetGenライブラリが直接組み込まれて、臓器モデルのメッシュ生成に使われています。
トラブルシューティング
よくあるエラーと対策
TetGenを実行したら「Self-intersections detected. Use -d option to remove them.」というエラーが出ました。どうすればいいですか?
これは入力した表面メッシュが自己交差しているというエラーです。まずは -d オプションを試してください。これは自己交差を検出・修復しようと試みます。しかし根本解決には、MeshLabやBlenderなどのメッシュ編集ソフトで自己交差部分を手動で修正する必要があるかもしれません。表面メッシュ生成時の解像度が低すぎる場合にも起こるので、元のCADで面取りを施すか、表面メッシュを細かく再生成するのも一案です。
メッシュ生成は成功したのですが、後段の有限要素解析ソルバーで「負のヤコビアン」エラーが出ます。原因は?
これは、TetGenで生成された四面体の中に、形状が極端に悪い要素(例えば、ある頂点が他の3頂点が作る平面の反対側にあり、ほぼ潰れた要素)が含まれている可能性が高いです。TetGenの品質改善オプション「-q」の目標値をより厳しく設定してみてください。例えば -q1.2/15 (エッジ比1.2以下、最小二面角15度以上)など。また、-a オプションで最大体積を制限し、全体的にメッシュを細かくすることも有効です。
非常に細長い形状(薄板や細い梁)をメッシュ化すると、要素数が膨大になるか、失敗します。対処法は?
これはテトラヘドロンメッシュの本質的な課題です。薄板構造にはシェル要素、細長い梁にはビーム要素を使うのが適切です。どうしても3D固体要素が必要な場合は、二つのアプローチがあります。1. 表面メッシュ生成時に、薄い部分の厚さ方向に十分な層の三角形ができるようにする(=厚さ方向の解像度を確保)。2. TetGenの -a パラメータを、薄い部分の体積に見合った非常に小さい値に設定する。いずれにせよ、要素数は爆発的に増加するため、メッシュ戦略の見直しをまず検討すべきです。
メッシュ生成に非常に時間がかかります。高速化する方法はありますか?
まず、-O0 から -O3 までの最適化レベルを確認・変更してみてください(コンパイル時オプション)。実行時では、品質改善「-q」は計算コストが高いので、まずは -p だけでメッシュ生成できるか試し、必要に応じて段階的に品質目標を厳しくします。また、最大体積制限「-a」の値は控えめに。根本的には、入力表面メッシュの三角形数を減らす(不要な細かい特徴を除去する)ことが最も効果的です。
関連トピック
なった
詳しく
報告