OpenFOAMの並列計算が実現する高速化で、解析のボトルネックを打破!

数値流体力学(CFD)を用いたシミュレーションは、現代のものづくりや研究開発において、もはや不可欠な存在となっています。空気の流れや熱の伝わり方、さらには複雑な化学反応まで、コンピュータ上で仮想的に再現することで、試作にかかる時間やコストを劇的に削減し、設計の最適化を加速させることが可能です。しかしながら、大規模で複雑な現象の解析では、計算にかかる時間が大きなボトルネックとなることも少なくありません。

そこで今回、皆さんと一緒に、この課題を打破するための強力な解決策、すなわちOpenFOAMによる並列計算と最適化戦略について深く掘り下げていきましょう。OpenFOAMがなぜ大規模な解析にこれほどまでに適しているのか、その本質に迫り、具体的な実践方法までを解説してまいります。

目次

OpenFOAMがもたらす並列計算の絶大な力

OpenFOAMは、「Open source Field Operation And Manipulation」の略称であり、その名の通り、数値解析開発および数値流体力学を含む連続体力学の前後処理に特化したC++製のツールボックスとして提供されています。このソフトウェアはGNU General Public License (GPL) バージョン3以降というオープンソースライセンスの下で公開されており、誰でも自由に、そして無償で利用できるという点が、商用ソフトウェアとは一線を画す最大の特長です。

多くの商用CFDソフトウェアでは、計算リソース、特に並列計算を行う際のプロセッサ数に応じて高額なライセンス費用が発生します。しかし、OpenFOAMはオープンソースであるため、このようなライセンス数やライセンス料による制限を受けることなく、無制限に大規模な並列計算を実現できるのです。これにより、従来の計算では時間的・コスト的に難しかった、数百万から数千万メッシュにも及ぶ大規模なシミュレーションを、現実的な範囲で実行することが可能になります。実際、スーパーコンピュータ「富岳」のような世界有数の高性能計算機にもOpenFOAMがインストールされており、その性能と信頼性は高く評価されています。

この並列計算の自由度が、研究機関や企業にとって非常に魅力的であることは言うまでもありません。限られた予算の中で最大限の解析能力を引き出したい、あるいはより詳細で現実に近いモデルを扱いたいといった要望に対して、OpenFOAMは柔軟かつ強力なソリューションを提供します。

実践!並列計算の導入ステップ

OpenFOAMにおける並列計算は、「ドメイン分割」という手法を用いて行われます。これは、計算領域全体を複数の小さなピースに分割し、それぞれのピースを異なるプロセッサで同時に計算させることで、全体の計算時間を短縮するアプローチです。OpenFOAMには、このドメイン分割を効率的に行うためのユーティリティが標準で付属しています。

それでは、OpenFOAMで並列計算を行うための具体的な手順をステップバイステップで見ていきましょう。

1. ケースの準備

まず、解析を行いたいケースのディレクトリに移動します。

チュートリアルケースをコピーして使用する場合、$FOAM_TUTORIALSなどの環境変数を活用して、自身の作業ディレクトリにコピーしてください。

例えば、よく使われる非圧縮性層流ソルバーicoFoamの「cavity」ケースを例にとるならば、以下のように操作します。

cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity $FOAM_RUN/myCavity
cd $FOAM_RUN/myCavity

これで、自身の作業ディレクトリ内に「myCavity」という名前のケースが用意されました。

2. メッシュの生成

次に、計算に必要なメッシュを生成します。多くのケースでは、constant/polyMesh/blockMeshDictファイルに定義された内容に基づいてblockMeshユーティリティが使用されます。

blockMesh

このコマンドにより、計算領域が定義され、メッシュデータが生成されます。

3. ドメインの分割

並列計算を行うためには、このメッシュを複数のプロセッサ用に分割する必要があります。これにはdecomposeParユーティリティを使用します。

まず、system/decomposeParDictという辞書ファイルを用意し、どのようにメッシュを分割するかを定義します。例えば、4つのプロセッサに分割する場合、以下のような内容を記述します。

numberOfSubdomains 4;
method simple;
coeffs
{
    n (2 2 1);
    delta 0.001;
}

ここでは、numberOfSubdomainsで分割数(プロセッサ数)を指定し、methodで分割方法(ここではsimple)を選んでいます。

n (2 2 1)は、x, y, z方向の分割数をそれぞれ2, 2, 1とすることで、合計で4つのサブドメインを作成することを示しています。

この辞書ファイルが設定できたら、以下のコマンドを実行してメッシュを分割します。

decomposePar

この操作により、processor0,processor1,processor2,processor3といった名前のサブディレクトリが作成され、それぞれに分割されたメッシュと初期条件のデータが格納されます。

4. 並列ソルバーの実行

メッシュの分割が完了したら、いよいよソルバーを並列実行します。

mpirunコマンドとparallelオプションを用いて、分割されたサブドメイン上でソルバーを起動します。

mpirun -np 4 icoFoam -parallel > log &

ここで、-np 4は4つのプロセッサを使用することを示し、icoFoamは実行するソルバー名です。

-parallelオプションが並列実行モードを有効にし、> log &で計算ログをlogファイルにバックグラウンドで出力させます。

計算が進行すると、各プロセッサがそれぞれの分割領域の計算を担当し、最終的な結果が生成されます。

並列実行に特化したsimpleFoamなどの非圧縮性乱流解析ソルバーは、MPIプロセス数増加に伴い性能が向上することが報告されています。

5. 結果の再構築

並列実行された計算結果は、通常、各processorNディレクトリに分散して格納されます。

結果を統合して全体像を可視化したり、後処理を行ったりするためには、reconstructParユーティリティを用いてこれらのデータを再構築することが一般的です。

reconstructPar

このコマンドを実行すると、統合された結果が元のケースディレクトリ内の時刻ディレクトリに再構築されます。

計算効率を極限まで高める最適化戦略

並列計算を導入することで大幅な高速化が期待できるOpenFOAMですが、さらに計算効率を向上させるための戦略が存在します。

特に、大規模なシミュレーションでは、I/O性能が計算のボトルネックとなることがあります。

スケーラビリティの理解と非並列化部分への対応

計算ノードに搭載されるコア数やMPIプロセス数の増加に伴い、OpenFOAMの性能は向上しますが、同時にスケーラビリティが悪化する傾向も示されています。
これは、特に並列化されていない処理が存在する場合に顕著になります。

例えば、メッシュの分割を行うdecomposeParユーティリティは、並列実行されるソルバー(例:simpleFoam)とは異なり、単一プロセスで実行されるため、ノード数が増えるにつれて全体に占める所要時間の割合が増加し、ボトルネックとなることがあります。

このような課題に対しては、非並列実行されるdecomposeParを高性能計算クラスタから切り離し、予め1コアの仮想マシンインスタンスなどで実行するといった工夫が有効です。
これにより、計算ノードの貴重なリソースをソルバーの実行に集中させ、全体的なコストパフォーマンスを最大化することが可能になります。

I/O性能の改善:高速ストレージの活用

OpenFOAMが計算中に生成するファイルは、総容量だけでなく、総ファイル数も非常に多いため、一般的なNFS(Network File System)でサービスされる共有ストレージに対しては、I/O性能が課題となることがあります。
特に、高並列実行のケースや計算結果の出力頻度が高いケースでは、このI/Oが計算全体の所要時間を大きく左右します。

このような状況では、高いIOPS性能を持つNVMe SSDローカルディスクをストレージ領域として活用することが極めて有効です。
計算結果の書き出し先をNVMe SSDに変更することで、CFD解析フロー全体の所要時間を大幅に短縮し、解析コストを削減できます。

具体的な手順は次のようになります。
OpenFOAMのケースディレクトリは通常、共有ストレージに存在することを前提とし、共有ストレージとNVMe SSDローカルディスク間でデータを同期しながら、NVMe SSDローカルディスクを最大限に活用します。

  1. ヘッドノードでの初期同期: CFD解析フロー開始時に、共有ストレージにあるケースディレクトリ内の全ファイルを、ヘッドノードのNVMe SSDローカルディスクにrsyncなどを使って同期します。
  2. decomposeParの実行: ヘッドノードのNVMe SSDローカルディスク上でdecomposeParを実行します。
  3. 全ファイルの同期: ヘッドノードのNVMe SSDローカルディスクから、その他全ての計算ノードのNVMe SSDローカルディスクへ、ケースディレクトリ内の全ファイルを同期します。
  4. potentialFoamの並列実行: 全てのノードがNVMe SSDローカルディスクを使用してpotentialFoamを並列実行します。
  5. simpleFoamの並列実行: 同様に、全てのノードがNVMe SSDローカルディスクを使用してsimpleFoamを並列実行します。計算結果はローカルNVMe SSDに書き出されます。
  6. 一部ファイルの同期(計算ノードからヘッドノードへ): 計算終了後、結果ファイルの一部を計算ノードのNVMe SSDローカルディスクからヘッドノードのNVMe SSDローカルディスクへ同期します。
  7. 最終同期(ヘッドノードから共有ストレージへ): 最後に、ヘッドノードのNVMe SSDローカルディスクから、最終的な結果ファイルの一部を共有ストレージへ同期します。

この際、system/controlDictファイル内のwriteIntervalという設定値を調整することも重要です。この値がデフォルトのまま(例えば1,000など)では、計算結果が頻繁に出力されず、NVMe SSDローカルディスクの効果を十分に得ることができません。例えば、writeInterval10に変更することで、より頻繁な出力が可能になり、高速ストレージの恩恵を享受できます。

実際にこの方法を適用すると、simpleFoamの実行時間が40.4%短縮され、decomposeParの実行時間が34.2%短縮されるなど、総所要時間(計算ノードの総所要コスト)が26.2%短縮されるという顕著な効果が報告されています。

さらなる高速化と安定稼働のための着眼点

OpenFOAMを最大限に活用するためには、並列計算とI/O最適化だけでなく、いくつかの重要な着眼点があります。

  • 乱流モデルとメッシュ解像度の関係: 高いレイノルズ数条件下の流れでは、乱流挙動を直接解くのは計算コストが非常に高く、非現実的です。代わりに、レイノルズ平均シミュレーション(RAS)乱流モデル(例:標準k-εモデルなど)を用いることで、平均流れの挙動と乱れの統計値を効率的に計算できます。また、RASモデルを用いる場合、壁近傍のセルにおける流れがモデル化されるため、壁方向への極端なメッシュ勾配は必ずしも必要ではありません。OpenFOAMでは、0/nutファイルで乱流粘性係数を指定し、様々な壁関数モデルを各パッチの境界条件として設定することが可能です。
  • 時間ステップ制御と安定性: 非定常解析では、時間ステップの制御が計算の安定性と精度に大きく影響します。OpenFOAMでは、自動時間ステップ制御が可能です。controlDict内でadjustableRunTimeオプションを選択することで、OpenFOAMは指定された時刻に結果を出力できるよう時間刻みを補正しつつ、自動的に時間刻みを制御します。また、多相流ソルバーであるinterFoamなどでは、fvSolution内のnAlphaSubCyclescAlphaキーワードが重要です。nAlphaSubCyclesはα方程式内の内側反復の数を示し、時間ステップや計算時間の莫大な増加なしに解を安定させるのに役立ちます。cAlphaキーワードは界面の圧縮を制御する要素であり、通常は1.0の値が推奨されます。
  • ハードウェア選定の重要性: OpenFOAMのような数値流体力学計算では、ハードウェアの選定も計算効率に直結します。流体計算のソルバー実行においては、CPUのクロック数よりもコア数がより効果的であるとされています。また、プリポスト処理も同じマシンで行う場合はクロック数も影響しますが、計算実行(ソルバー)のみを考えるならば、より多くのコアを持つCPUが有利です。さらに、大量のデータを扱うため、メモリーの品質も計算の安定性と速度に大きく関わります。

終わりに:未来のシミュレーションを切り拓く

OpenFOAMは、そのオープンソースとしての特性とC++で実装された堅牢なライブラリ群により、CFD解析の世界に新たな可能性を切り開きました。特に、ライセンスの制約なく大規模並列計算が可能な点、そしてソースコードが公開されていることによる極めて高い拡張性は、複雑な物理現象を扱う今日のシミュレーションにおいて、計り知れない価値をもたらしています。

本記事でご紹介した並列計算の基本手順、そしてI/O最適化をはじめとする計算効率向上戦略を理解し実践することで、皆さんのOpenFOAMを用いた解析は、これまでのボトルネックを打破し、さらなる高速化と大規模化を実現することができるでしょう。これは、自動車産業における空力解析から、環境シミュレーション、製造業の加工プロセス最適化、さらには内燃機関の燃焼解析といった特殊な応用事例まで、多岐にわたる分野での飛躍的な進歩に貢献します。

OpenFOAMは、単なるツールボックスではありません。それは、自らの手で物理モデルを組み込み、ソルバーをカスタマイズし、未知の現象を探求するための無限の可能性を秘めたフレームワークなのです。

OpenFOAM導入支援のご案内

この記事では、OpenFOAMの基本から応用、そしてその可能性について解説してきました。しかし、実際にOpenFOAMを導入し、業務で活用していくには、専門的な知識や経験が必要となる場合があります。

もしあなたが、

  • OpenFOAMの導入を検討しているが、何から始めれば良いか分からない
  • 既存の解析業務にOpenFOAMを取り入れたい
  • 特定の課題に対してOpenFOAMを用いたカスタマイズされたソリューションを開発したい
  • OpenFOAMの操作方法や解析ノウハウについて専門的なサポートを受けたい

とお考えでしたら、ぜひ弊社のOpenFORM導入支援サービスをご検討ください。

弊社では、長年のCAE解析経験とOpenFOAMに関する深い知識を持つ専門家が、お客様のニーズに合わせた最適な導入プランをご提案いたします。初期環境構築から操作トレーニング、解析モデルの作成支援、さらには高度なカスタマイズや専用ツールの開発まで、OpenFOAMの導入から活用までをトータルにサポートいたします。

OpenFOAMの可能性を最大限に引き出し、貴社の研究開発や製品開発の加速、コスト削減に貢献できるよう、全力でサポートさせていただきます。まずは、お気軽にお問い合わせください。

OpenFOAMならデジタルソリューション株式会社へ
ご質問・ご不明点がございましたら、お気軽にお問い合わせください。

こちらも読まれています

目次