ニューズレター

流れ 2007年8月号 目次

― 流体と騒音:汎用ソフトウェア特集 ―

  1. ANSYS社が提供する最新FSIテクノロジー
    一宅 透(アンシス)
  2. CD-adapcoの最新CFD技術のご紹介
    〜“次世代”汎用熱流体解析プログラムSTAR-CCM+〜
    中嶋 達也(シーディー・アダプコ・ジャパン)
  3. オープンソースCFD:OpenFOAMの紹介
    田中 太(福井大学工学部)
  4. 文科省IT基盤構築のための研究開発「革新的シミュレーションソフトウェアの研究開発」
    − マルチフィジックス流体シミュレーション・システムFrontFlow −
    大島 伸行(北海道大学大学院 工学研究科)
  5. 流体騒音解析ソフトウェアCAA++ 〜非線形音響ソルバによる流体騒音の数値予測〜
    毛利 昌康(ディライト)
  6. 編集後記
       池田 浩(東芝)、岩佐 能孝(IHI)、岡 新一(C&I)

 

オープンソースCFD: OpenFOAMの紹介


田中 太
福井大学
大学院工学研究科
機械工学専攻

1.はじめに

 近年,オープンソースという言葉をよく耳にするようになってきた. OS や各種開発ツールなど,様々な分野において,高品質なオープンソースソフトウェアを利用することができる.数値シミュレーションに使用するソフトウェアも,オープンソースソフトウェアが数多く公開されているが,その中でも最近急速に成長している OpenFOAM について紹介する.

 OpenFOAM とは, Open Source Field Operation and Manipulation の略である.これは,英国の Nabla 社(現在の OpenCFD 社)が開発販売していた商用コード FOAM ( Field Operation and Manipulation )を, 2004 年 12 月にオープンソースソフトウェアとして公開したものである. OpenFOAM はオブジェクト指向言語 C++ で開発された汎用のプログラミングツールボックスであり,数値流体力学( Computational Fluid Dynamics ,以後 CFD と略記)や固体の応力解析,金融工学など,連続体力学の分野で使用することができる. OpenFOAM 自体は,主にアプリケーションと呼ばれる実行ファイルを作成するために使われる C++ クラスライブラリ群のことを指している.アプリケーションは,連続体力学における特定の問題を解くためのソルバ,およびデータに対する各種の操作を行うためのユーティリティの 2 つのカテゴリに大別される. OpenFOAM のパッケージには,様々な問題を扱うための多数の標準ソルバおよびプリ・ポスト環境などのユーティリティ群を含んでいる. OpenFOAM の全体的な構造を図 1 に示す.

 

図 1 OpenFOAM の全体的な構造

 プリプロセッシングのためには, FoamX という名称の GUI 環境が用意されている. FoamX は JAVA を用いて開発された. FoamX では,主に数値シミュレーションにおける各種計算条件の設定を行うが,それ以外にも様々なユーティリティを FoamX 環境上から利用可能である.

 複雑形状を対象とした実用解析においては,格子生成機能が大変重要となる.しかし,残念ながら OpenFOAM には貧弱な格子生成機能しかない.複雑形状の解析には,他の専用格子生成ソフトウェアを用いて計算格子を作成し,これを OpenFOAM 環境に読み込んで使用する.その際に使用するフォーマット変換ツールが用意されている.また,標準アプリケーションと呼ばれる OpenFOAM C++ クラスライブラリを利用して作成された解析ソルバが多数用意されている.この OpenFOAM パッケージに付属した標準アプリケーションだけでも,十分様々な用途に応用することが可能である. OpenFOAM に用意された標準アプリケーションは,非圧縮性,圧縮性,各種乱流モデル,熱伝達,多相流,燃焼など,現在市販されている汎用 CFD パッケージソフトウェアに見劣りしない.それどころか,各種乱流モデルの実装に関しては群を抜く豊富さを誇っている.更に OpenFOAM の特長の 1 つは,背景となる手法,物理学,関連するプログラミング技術に関する知識があれば,新しいソルバやユーティリティをユーザ自身が作成できることにある.可視化処理のようなポストプロセッシングのためには,オープンソースポストプロセッサ ParaView が用意されている.

 これまで一般的に CFD コードは,手続き型言語,とりわけ FORTRAN によって書かれてきた.この場合,新しい物理モデルを組み込むためには,方程式の離散化など下位のレベルからプログラミングをやり直さなければならなかった.それに対して, OpenFOAM には,連続体力学で使用される標準的なベクトルおよびテンソルに関する演算子がオブジェクトとして定義されている.この演算子を使用することで,数学的な記述としてプログラミングを行うことができる.このようなプログラミングスタイルのためには,オブジェクト指向プログラミング( Object-Oriented Programming ,以後, OOP と略記)が応用できる.

 

2.オブジェクト指向言語の概念

 ここでは, OOP 言語の特徴的な概念の中でも, OpenFOAM にとって特に重要な役割を果たしている以下について説明する.

  • 演算子の多重定義
  • 基本クラスと派生クラス

2. 1  演算子の多重定義

 FORTRAN や C 言語などでは,通常,演算子は,一つの役割のみをもっている.大抵の場合, '+' を用いれば,それは,その演算子の前後の ” 数値 ” の和算をすることであり, '-' は前後の ” 数値 ” を減算するという機能のみを持つものである.このとき, ” 文字列 ”+” 数値 ” といった処理は当然ながら許されないし, C 言語では ” 文字列 ”+” 文字列 ” などと言った記述は許されず,多くの場合,それぞれのデータの型にあった専用の関数を用意して,使いわけを行う必要がある.

 これに対して OpenFOAM で採用している C++ では,プログラマにより,演算子 ( のみならず関数 ) の多重定義が可能となっている.これにより, C++ で表現された演算式は, 'object'+'object' と記述された場合, 'object' と 'object' を算術的に加えるという操作ではなく, 'object' と 'object' に対して, '+' で定義された処理を行うという操作になる.結果として,スカラー,ベクトル,行列の 4 則演算子の定義が,通常の数学的な記述と同じように行えるようになる.これは,プログラムの表記も数学的記述と同じような形式で記述可能になることを表している.

2.2 基本クラスと派生クラス

 これまで CFD で多く用いられている手続き型言語の場合,新しい物理モデルなどを組み込むためには方程式の離散化など下位のレベルからプログラミングをやり直さなければならなかった.

 これに対して継承と呼ばれる OOP 言語の概念の一つを中心として, OOP の技法を有効に用いると,例えば実際に処理を行う関数の引数や戻り値などが変更されることがあっても,それを利用しているクラスには,修正の必要がないということが可能となる.このことは,関数の定義をしている部分と関数を利用している部分の分離が可能であることを示している.このためには,変更以前の関数が定義されていたクラスから,新しい物理モデルの導入などにより機能が追加された新しいクラスを,継承を用いて作成することが基本となる.継承とは,クラスを最初から作成するのではなく,あるクラスを元に新たなクラスを作成することを指す.そして,新たに作成されたクラスは,元のクラスの全機能を含み,さらに機能を追加することができる.このときの元となるクラスを基本クラスと呼び,基本クラスに機能を追加しているクラスを派生クラスと呼ぶ.また,派生クラスは別のクラスの基本クラスとなることが可能であり,全体として,階層的な構造が構成される.

 これら多重定義,継承とクラスの階層構造,その他の概念を適用することにより, OpenFOAM は非常にコードの保守と開発が容易になるという大きな特徴がある.

 

3. NS ソルバの開発

 OpenFOAM によるソルバ開発の例として,非圧縮 Navier-Stokes 方程式を解く OpenFOAM コードの主要部分を以下に示す.

 Navier-Stokes 方程式の解法としては PISO を用いている. PISO は R. I. Issa により開発された圧力−流速分離型解法の一種であるが,少ない反復回数で非定常問題を高精度に解くことができるといわれている.そのアルゴリズムは三段階に分かれており以下のようになる.

(1)前の時間ステップの圧力場を初期推測値として,運動方程式が解かれ,速度場の予測値を得る.
(2)予測された速度場の発散をソース項とする圧力ポアソン方程式が解かれて,新しい修正圧力場が得られる.
(3)修正圧力場を使用して速度場が修正される.

 ステップ ( 2 ) と ( 3 ) は,収束解が得られるまで必要な回数(上記の例では nCorr 回)繰り返される.この反復回数は,時間ステップに依存しているが,それぞれの時間ステップごとに通常二回のループで十分である.

 OpenFOAM を用いてソルバを開発すると,わずか 50 行程度のプログラムになり,そのメンテナンスの容易さは大きな利益をもたらす.また,新しい乱流モデルを追加するような改良もわずかなコードの追加で可能となる. OpenFOAM の中では速度場や圧力場もオブジェクトとしてカプセル化されており, U や p といった簡単なシンボルで記述される.そのため,流れ場を配列として捉える必要はなく,ユーザは数学的なシンボルの記述としてプログラミングを行うことができる.

 

4. OpenFOAM 適用例:自動車周りの流れ

 1/20 スケール模型車両( SUBARU LEGACY )を解析対象として,偏揺角 30 °における車両表面の圧力分布や空力係数について,風洞実験と OpenFOAM による数値シミュレーション結果の比較を行った(1). OpenFOAM による数値シミュレーションには,標準アプリケーション icoFoam (非圧縮流体ソルバ)を用いた.図 2 に模型車両を示す.模型の大きさは,全長 234 mm ,幅 86 mm ,高さ 74 mm である.一様流の風速は 18.3 m/s であり,模型周りの流れのレイノルズ数は 2.8 × 105 である.

 図 3 に数値解析で使用した解析モデルを示す.高さ 500 mm ,長さ 1500 mm ,幅 1000 mm の 3 次元直方体を解析領域とした.解析モデルは,流れ方向に対して偏揺角 θYA だけ傾けて設置している.流入境界条件は,空気を左流入面から 18.3 m/s で流入させる.

図 2 1/20 スケール模型車両( SUBARU LEGACY )
図 3 数値解析モデル

 この流入面と地面板以外の面を流出境界条件として圧力を 0 Pa に固定した.計算格子としては非構造格子を使用した. CAD データを基に模型車両表面に三角形サーフェスメッシュを生成し,解析領域の外部境界との間は,テトラメッシュを用いてボリュームメッシュ生成を行った.サーフェスメッシュは 5 万セルであり,境界層を解像するプリズムメッシュを含むボリュームメッシュは 92 万セルである.格子生成には Gridgen (汎用格子生成ソフトウェア:日本総販売代理店 VINAS )を使用し,可視化には使い慣れた FIELDVIEW (汎用可視化ソフトウェア:日本総販売代理店 VINAS )を使用した.どちらの場合も OpenFOAM 付属のトランスレータで相互にデータ変換できる.

 また, OpenFOAM では,領域分割を利用した並列計算が可能である.今回の数値シミュレーションは,一般的な市販 PC ( CPU : Athlon64 2GHz ,メモリ: 2GB ,ネットワーク: 1Gb )を 12 台用いた並列計算を行った. PC の接続にあたっては,特別な装置などは用いていない.特に工夫もせずに行った並列計算の効率は 80 %程度であった.

 OpenFOAM では,下位レベルのベクトルやテンソルに関する演算子オブジェクトが並列計算に対応しているので,どのようなケースでも容易に並列化することが可能である.しかも,物理モデルやソルバ等のような上位レベルでのコードを記述する段階においては,並列化を意識したプログラミングを行う必要が無い.ユーザは,並列計算の実行前に領域分割を行うコマンドを実行するだけでよく,非常に簡単に並列計算の恩恵を受けることができる.

 図 4 は風洞実験と数値シミュレーションから得られた表面圧力分布の比較である.数値シミュレーションと風洞実験では,フロントバンパー付近の圧力分布に違いが見られるがこれはよどみ点近傍に圧力の計測点がなかったためである.フロントガラス表面や風上側面など,流れが衝突して正圧分布を形成する領域では,数値シミュレーションは実験値を良い精度で計算できている.また,風下側側面では,実験で予測された後方に伸びる負圧領域の傾向を捉えている.

(a) 正面

(b) 風下側側面

図 4  圧力分布の比較 (左:風洞実験,右:数値シミュレーション)

 

図 5  模型車両周りの流線

 

 図 5 には,計算から得られた流線を示す.計算で得られた流れ場では, A ピラー部分から剥離した流れが強い渦を巻きながら流れている.この A ピラーからの剥離流れが強い渦を巻くために,図 4 に示す実験から得られた圧力分布には後方に延びる負圧領域が形成されたことがわかる.

 図 6 に空力係数( CD CS CYM )の実験値と解析値の比較を示す.数値シミュレーションから得られた圧力場が比較的精度良く実験値と一致するので,その積分値となる空力係数も実験値を良い精度で計算できている.


図 6  空力係数の比較

 

5. OpenFOAM コミュニティ

 OpenFOAM は GNU の GPL ( General Public License )に基づくフリーソフトウェアである.元々,商用コードとして販売していたものをオープンソースにしたため,公開当初から十分な実用性を備えていたこともあり,オープンソースソフトウェアになってから,世界中の人々がダウンロードして使用し始めている.また,それに伴い活発な OpenFOAM コミュニティが育っている.現在,最も活発に議論が行われているのは, OpenCFD 社が用意している OpenFOAM ディスカッショングループ( http://openfoam.cfd-online.com/cgi-bin/forum/discus.cgi )である.このフォーラムでは,毎日多数の書き込みと議論が行われている. OpenFOAM の公開当初は,問いかけに対して返答できるのは, OpenFOAM 開発者であることが多かったが,現在は様々な人たちがお互いに助け合って問題点の解決に当たっている.また, OpenFOAM WiKi ( http://openfoamwiki.net/index.php/Main_Page )も公開されている.日本語で利用できる OpenFOAM の関連情報としては, OpenFOAM WiKi 日本語版( http://www.ofwikija.org/index.php/ )がある.ここでは, OpenFOAM に付属している英文マニュアルの一部和訳が公開されており, OpenFOAM 初心者の最初のハードルを低くするのに大変貢献している.また最近,株式会社 CAEソリューションズから OpenFOAM ポータルサイト( http://www.openfoam.jp/ )が公開された.

 

6.まとめ

 これまでのような,手続き型言語を使用したコーディングにおいては,実際の支配方程式群はあらかじめ机上において離散化されていなければならず,さらにコーディングはミスを誘発しやすい難しい作業であった.典型的な汎用 CFD コードは, 100,000 行にもなるコードであるので,その実際のコーディングは大変な困難を伴う.

 数学的記述に直接対応する OpenFOAM のプログラミングスタイルは,これまでよりもずっと直感的にコーディングを行うことができる. OpenFOAM は数学的記述を採用した高水準言語を数値シミュレーションの分野に導入することが可能であることを実証し,その有効性を体感することができるソフトウェアである.

 

参考文献

(1) 田中太, 川口清司, 春原健二, 長谷川巧, 高田公義,模型車両周りの流れ解析(ヨーイングモーメントの数値解析精度の検討),
第20回数値流体力学シンポジウム講演論文集,CD-ROM,A6-2,2006
更新日:2007.8.31