OpenFOAM®とは

概要

OpenFOAMは、ESI GroupのOpenCFD社が商標登録を持つ物理場の演算コード群です。C++言語で書かれたGPLに準ずるオープンソースコードとして公開されています。
その機能は、メッシュ作成から流体、熱、分子動力学、電磁流体、固体応力解析などのソルバー群、結果処理や可視化まで多岐にわたっています。デザインプロセス、物理モデル、要求精度、自動化プロセスなど利用者のニーズにマッチしたコード開発によるCAEシミュレーションが実現できます。
IDAJでは、OpenFOAM用のプリポストプロセッサーennovaCFD for OpenFOAMを開発しています。 デローニ法の自動メッシャーと使いやすいGUIによって、OpenFOAMの使い勝手が大幅に向上します。詳細はこちらをご参照ください。

OpenFOAMのプログラミング言語

OpenFOAMはC++言語で書かれています。C++言語の大きな特徴として、オブジェクトオリエンテッドプログラミング言語であることと、テンプレートプログラミングができることが挙げられます。OpenFOAMもこの2つの大きな特徴を巧みに利用して書かれています。この辺りがクラシカルなC言語やFortran言語で書かれたCFDコードと大きく異なる理由の1つです。また、C++言語の特徴の1つであるレイトバインドを利用したランタイムセレクションなども多用されています。

コードストラクチャー

OpenFOAMは、大きく分けて重要な2つのコードストラクチャーレイヤーを持っています。
1つはアプリケーションレイヤーで、もう1つはライブラリーレイヤーです。以下の図は典型的なOpenFOAMのコードストラクチャーです。
この中でアプリケーションレイヤーはディレクトリapplicationsに、ライブラリーレイヤーはsrcの中にソースコードが保存されています。流体ソルバーや自動メッシャーなどはアプリケーションレイヤーに含まれ、ライブラリーレイヤーには各種物理モデル、境界条件、FVM関連のクラスなどが含まれています。
また、アプリケーションレイヤーにあるコード群は、古典的なシーケンシャル言語と同様の記述となっています。

コンパイル

OpenFOAMをコンパイルする場合、コンパイラーは基本的にGNU G++を使用します。
コンパイルスクリプトは一般的なmakeを利用せず、wmakeというスクリプトを利用します。また、OpenFOAMでは大文字と小文字を使い分けているので、Windowsのように大文字と小文字を区別しないファイルシステムではデフォルトのソースコードでは利用できません。

変数

OpenFOAMは、C++言語で一般的に使われるプリミティブ変数をラッパーした独自の変数型が使われます。
簡単に列挙しますと、int、longやlong long型はlabel型に、floatやdouble型はscalar型に、string型は、string、word、fileName型にそれぞれラッピングされています。これとは別に、複雑なvector型、tensor型、次元を持ったdimensioned型が存在します。また、コンテナークラスとしてList、SubList、DynamicList、Linked list、Field、HashTableがあります。
このようにOpenFOAMには多種多様な変数やコンテナークラスが存在します。

並列プログラミング

OpenFOAMでは、領域分割タイプの並列計算が可能です。
この並列計算を簡単にプログラムできるように、プロセッサーコミュニケーションレイヤーとしてPstreamクラスを提供しています。このクラスは以下の図に示すとおり、各MPIライブラリーのアダプターとして機能しますので、各MPIライブラリーを意識しないで並列プログラムを書くことができます。

ランタイムセレクション

OpenFOAMは、アプリケーションレイヤーのコードを書きやすくするため、また多くの物理モデルなどを簡単に実装するため、Strategy デザインパターンライクな実装を行っています。これをランタイムセレクションと呼びます。
以下にRANS系非圧縮乱流モデルのクラス図を示します。乱流モデルは多種多様にあり、それに合わせてアプリケーションレイヤーのコードを書き換えるのは効率的ではありません。
Strategyパターンを使って乱流モデルを実装し、アプリケーションレイヤーのコードが乱流モデルを利用するときに変わったとしても、コードを変更する必要がない設計になっています。

データベース

OpenFOAMは全てのデータをデータベースとして取り扱うため、OpenFOAMを理解する場合、OpenFOAMが扱うデータベースを理解する必要があります。
そこでOpenFOAMは全てのデータをデータベースとして扱います。そこでデータベースを利用する場合には、objectRegistryクラスを継承したfvMeshクラスとTimeクラスを利用します。objectRegistryクラスはHashTableで実装されています。これらのクラスを利用することで、ワーキングディレクトリに保存されているあらゆるデータに統一的に、簡単にかつ安全にアクセスすることができます。例として以下にTimeクラスのクラス図を示します。

ソルバー

今までご紹介したように、OpenFOAMは場の演算を簡単に計算できるように種々の工夫がなされています。
これにより実際のソルバーを記述するアプリケーションレイヤーでは、場の偏微分方程式をほぼそのまま記述することで演算ができる仕組みを提供しています。例えば、非定常拡散方程式は以下の図のようにプログラミングがすることができます。

機能

OpenFOAMは、非圧縮流れ、圧縮流れ、多相流、自由表面、DNS、燃焼、化学反応、浮力を考慮した熱流れ、固体連成熱流れ、ラグランジュ粒子、分子動力学、直接シミュレーション・モンテ・カルロ法、電磁流体、固体応力解析と商用ソフトウェアと同レベルのソルバーが準備されています。また、乱流モデルも非圧縮・圧縮、RANSとLESを合わせて50種類弱のモデルが用意されています。また、各種スキームも有用なものは、ほぼ実装されています。
メッシュ生成ツールとしては、ヘキサメッシュベースでオートメッシャー「snappyHexMesh」があります。また、商用ソフトウェアで生成したメッシュを変換するプログラムも存在し、Ansys Fluent、STAR-CD、gambit、CFX4、ideasからのボリュームメッシュ変換ができます。 結果処理は、市販可視化ソフトウェアへのデータ変換プログラムもあり、EnSight、FieldViewを使用した処理も可能です。
はじめてのOpenFOAMセミナー
IDAJ数値解析アカデミー 出展情報 資料請求/お問い合わせ

Copyright© IDAJ Co., LTD. All Rights Reserved.