移動メッシュ — CAE用語解説
移動メッシュ
先生、移動メッシュってCFDでどう使うんですか?
理論と物理
基本概念と支配方程式
移動メッシュって、文字通りメッシュが動くということですか?具体的にどんな物理現象を解析するのに使うんですか?
その通りです。時間とともに形状や位置が変化する境界に合わせて、計算領域のメッシュを変形または再生成する手法です。代表的な適用例は、ピストンシリンダー内の流体解析や、ロータリーコンプレッサーの羽根車の回転、弁の開閉動作のシミュレーションです。例えば、エンジン吸排気バルブのリフト量が最大8mm動く場合、その弁座面周辺のメッシュが連続的に変形します。
メッシュが動くということは、支配方程式にも特別な項が追加されるんですか?普通の流体方程式とどう違うんですか?
はい、重要な点です。移動する座標系で記述する必要があるため、任意ラグランジュ・オイラー(ALE)定式化が用いられます。非圧縮性流体の連続の式とナビエ-ストークス方程式は、メッシュの速度
運動量保存則:
ここで、
メッシュを動かす方法には種類があると聞きました。「メッシュ変形」と「メッシュ再生成」は何が違うんでしょうか?
根本的に異なるアプローチです。メッシュ変形は、境界の変位を内部の節点に伝播させ、メッシュの接続性(トポロジー)を保ったまま形状を変化させます。バネ類比法やラプラス平滑化が使われ、変位が小さい場合(せいぜいセルサイズの60%以内)に有効です。
一方、メッシュ再生成は、形状が大きく変化するたびにメッシュを一から作り直します。例えば、スクリューの回転でメッシュが著しく歪む場合、一定の歪み基準(例えば歪み角が45度を超える)に達したタイミングで再メッシュングが発動します。再生成の方が頑健ですが、計算コストが高く、解のインターポレーション誤差が生じるリスクがあります。
数値解法と実装
離散化とソルバー設定
メッシュ変形で「バネ類比法」と聞きましたが、具体的にどうやって節点の新しい位置を決めているんですか?
各メッシュエッジをバネと見なす物理モデルです。すべてのエッジにバネ定数
メッシュが大きく動くと、セル体積が極端に小さくなったりして計算が発散しそうですが、それを防ぐ特別なスキームはありますか?
はい、そのための「体積保存」や「レイヤー圧縮/伸長」といった高度な手法があります。特に、隙間が狭くなる「スクイーズ」領域では、メッシュ品質を保つために「レイヤー圧縮」が使われます。Siemens Star-CCM+の「モーフィング」機能では、ユーザーが「最小許容スキネス比」(例えば0.05)を設定できます。この閾値を下回ると、ソルバーは隣接するメッシュレイヤーを自動的に圧縮または削除(コラプス)して、メッシュの交差を防ぎます。また、時間積分には陰的スキームが必須で、CFL数(クーラン数)を1.0以下に厳しく制限する必要があります。
メッシュ再生成のトリガーとなる「歪みの指標」にはどんなものがあるんですか?また、再生成された後、前のタイムステップの物理量はどう引き継ぐんですか?
主な指標は3つです。1) スキネス比(面積/辺長の二乗比、0に近いほど悪い)、2) アスペクト比、3) セル歪み角(理想は90度)。OpenFOAMの`dynamicFvMesh`ライブラリでは、`maxSkewness`のデフォルト値は4.0に設定されています。再生成後は、古いメッシュ(ドナーメッシュ)から新しいメッシュ(レシーバーメッシュ)へ物理量を補間(インターポレーション)します。これには保存性を重視する積分値保存補間や、より滑らかな逆距離加重法が使われますが、どうしても数値拡散が生じ、モーメントや渦の強度が若干減衰するのが課題です。
実践ガイド
ワークフローとチェックリスト
実際に移動メッシュ解析をセットアップする時、最初に決めるべき重要なパラメータは何ですか?
まずは動きの定義とタイムステップです。動きは、ユーザー定義関数(UDF)で与えるか、既存のプロファイル(正弦波、ステップ関数)を利用します。次に、動きの規模に対して適切なタイムステップを選びます。経験則として、移動体が1つのセルサイズを横切るのに少なくとも5〜10タイムステップをかけるように設定します。例えば、弁が0.01秒で1mm動き、その領域のセルサイズが0.1mmなら、タイムステップは0.0002秒(0.01/50)程度が目安です。これを守らないと、対流項の離散化誤差が急増します。
メッシュを準備する際、動く領域と動かない領域の境界(インターフェース)はどう設計すればいいですか?「インターフェース」や「オーバーセット」という言葉を聞きます。
ここが設計の肝です。主に2つの方法があります。
1) 非一致インターフェース(Sliding Mesh): 回転部と静止部のメッシュ面が接しており、データを補間して受け渡します。ポンプやファンの解析で一般的。面のメッシュサイズを一致させなくて良いのが利点ですが、補間誤差が生じます。
2) オーバーセットメッシュ(Chimera/IBM): 動く部品のメッシュと背景メッシュが重なり合い、不要なセルは「穴あけ」されます。複雑な並進運動に強く、MSC CradleやPOWERFLOWで採用されています。ただし、保守性の高い背景メッシュが必要で、計算コストが増加します。どちらを選ぶかは、運動の複雑さと許容誤差で決まります。
解析を走らせる前に行うべきメッシュの検証チェックリストはありますか?
最低限、以下の4点を確認します。
1. 初期メッシュ品質: 静的解析で収束する品質(最小スキネス比>0.2, 最大アスペクト比<50)を満たしているか。
2. 変位予測: 動く方向に十分な層数のメッシュがあるか。弁運動なら、リフト方向に最低20層は欲しい。
3. 動的メッシュゾーンの設定: 剛体運動なのか変形なのか、境界条件タイプが正しいか(Ansysでは`system/controlDict`の`dynamicMeshDict`)。
4. 保存性の確認: テストケース(例えば、空洞内の剛体移動)で、質量や運動量の全局誤差がタイムステップを小さくすると減少するか確認する。これが確認できないと、後で発散した際の原因特定が困難になります。
ソフトウェア比較
各ソルバーの実装特徴
Ansys FluentとSiemens Star-CCM+では、移動メッシュのアプローチに違いはありますか?
はい、哲学が異なります。Ansys Fluentは「Dynamic Mesh」機能として、バネ類比法、レイヤー法、ローリメッシュ法をユーザーが組み合わせて設定します。UDF(C言語)で微細な制御が可能で、6DOF(6自由度)ソルバーと連携して複雑な連成運動を扱えます。ただし、設定項目が多く、習得に時間がかかる側面があります。
Siemens Star-CCM+は「モーフィング」と「オーバーセットメッシュ」に強みがあります。特にGUI操作が直感的で、剛体運動モーションモデルをドラッグ&ドロップで定義できます。また、メッシュの「モーフィング制御点」を視覚的に配置できるので、変形を局所的に制御しやすいです。自動化スクリプトはJavaベースです。
オープンソースのOpenFOAMではどうやって実現しているんですか?商用ソフトと比べて制限は?
OpenFOAMは`dynamicFvMesh`クラスを基底として、様々な動的メッシュソルバーを提供しています。例えば、`displacementLaplacian`(ラプラス平滑化)、`solidBodyMotion`(剛体運動)、`dynamicInkJetFvMesh`(インクジェット用)などです。設定は全て`constant/dynamicMeshDict`という辞書ファイルで行い、C++で新しい運動モデルをプログラミングできます。
制限としては、GUIがなく設定が煩雑な点、そして並列計算時の動的メッシュ負荷分散が商用ソフトに比べて未成熟な場合がある点です。大規模なメッシュ再生成を伴う計算では、商用ソルバーの方が安定している傾向があります。しかし、カスタマイズ性と学習コストの低さは最大の強みです。
構造解析(FEM)で使われる「任意ラグランジュ・オイラー法」と、流体解析(CFD)で言う「ALE法」は同じものですか?
概念の源流は同じですが、適用される分野でニュアンスが異なります。構造解析(Abaqus/ LS-DYNAなど)では、ALEは主に「メッシュの最適化」のために使われます。大変形解析でメッシュが歪みすぎるのを防ぐため、材料(ラグランジュ)はそのままで、計算メッシュ(オイラー)だけを再調整(リゾーム)します。これにより、要素ひずみを低減し、計算を継続できます。
一方、流体解析では、ALEは「移動境界にメッシュを追従させる」ことが主目的です。ですから、CFDの文脈では「動的メッシュ」とほぼ同義で使われます。ただし、多物理場連成ソフトのCOMSOL Multiphysicsでは、「ALE」という単一の物理インターフェースで、流体の移動メッシュと構造の大変形を統一的に扱えるのが特徴です。メッシュの動きを記述するための「メッシュ変位」の偏微分方程式を解く点は共通しています。
トラブルシューティング
よくあるエラーと対策
解析中に「Negative volume detected」というエラーで計算が停止してしまいます。最も一般的な原因と対策は何ですか?
移動メッシュ解析で最も頻出する致命的エラーです。原因は主に3つ。
1. タイムステップが大きすぎる: 移動体が1タイムステップで隣接セルを飛び越えてしまい、メッシュが交差します。前述の「セルサイズ/速度」の基準を見直し、タイムステップを1/2や1/10に減らして試します。
2. メッシュ変形の許容量不足: 変形が大きすぎてバネ類比法が追従できない。対策は、Ansys Fluentなら`Remeshing`オプションをオンにし、`Maximum Cell Skewness`(例: 0.9)や`Maximum Face Skewness`(例: 0.8)の閾値を緩和する。または、最初からメッシュ再生成(リメッシュ)を前提とした粗いメッシュで始める。
3. 境界条件の矛盾: 隣接するゾーンで動きの定義が衝突していないか確認。全ての境界でメッシュの動きが一貫している必要があります。
計算は進むのですが、物理量(例えば抗力)の時系列データが不自然に「ギザギザ」したり、段階的にジャンプします。これはなぜ起こるんですか?
これはほぼ間違いなくメッシュの不連続な変化が原因です。具体的には、メッシュ再生成が実行されたタイミングで、インターポレーション誤差が生じ、力の積分値が段階的に変化します。また、「ギザギザ」はタイムステップ毎のメッシュ品質の微小な変動が、離散化誤差を増幅している可能性があります。
対策としては、1) リメッシュの頻度を減らす(歪みの閾値を緩める)、2) リメッシュの前後でメッシュサイズや品質が急変しないようにする(`cellSizeCalculation`を`intersection`から`uniform`に変更する等)、3) 出力する物理量を、数ステップの移動平均で処理してノイズを低減する、などがあります。根本的には、動的メッシュに依存しない「オーバーセット法」への切り替えも検討すべきケースです。
並列計算で動的メッシュを使うと、なぜか計算速度が極端に遅くなったり、負荷分散エラーが出ます。原因は何でしょうか?
並列動的メッシュは高度な課題です。主な原因は2つ。
1. 動的負荷分散の不均衡: メッシュが動く(再生成される)と、領域ごとのセル数が変化します。初期の均等な分割が崩れ、一部のプロセッサに負荷が集中します。Ansys Fluentでは`Adaptive Mesh Refinement`と連携する`Dynamic Load Balancing`を有効にする必要があります。間隔(例えば100ステップ毎)を設定して自動で負荷分散し直します。
2. インターフェース通信の増加: メッシュが変化すると、プロセッサ間の境界(インターフェース)の形状や面積が変わり、データ通信のオーバーヘッドが増大します。特に、再生成が頻繁に起こる場合は顕著です。対策として、可能ならば動的メッシュゾーンを1つのプロセッサ領域にまとめて分割する(`split`機能を使う)ことで、通信コストを削減できます。OpenFOAMでは、`redistributePar`ツールを定期的に実行するスクリプトを組む必要がある場合があります。
関連トピック
なった
詳しく
報告