ユーザーガイド 1.5系 - 3.1 OpenFOAMのプログラミング言語
出典: OFWikiJa
[編集] 3.1 OpenFOAMのプログラミング言語
OpenFOAMライブラリィの働きを理解するためにはOpenFOAMの基本言語であるC++の予備知識がいくらか必要となります。そのために不可欠な知識が本章にあります。その前に重要なことは、オブジェクト指向プログラミングやOpenFOAMのメインプログラミング言語としてのC++の選択の背景として一般論で様々な考えを説明するための言語の概念に着目することです。
[編集] 3.1.1 言語とは
口話と数学が普及には、特に抽象的な概念を表現する際の効率性が重要でした。
(概念を表現する際の効率性の)例として、流量について、「速度場(velocity field)」という言葉を私たちが使うとき、流れの性質の言及もせず何ら具体的な速度データがなくとも使っています。その言葉の中には、運動の向きと大きさやその他の物理的性質との関係の概念が要約されています。 これを数学にすると、「速度場」をUなどの簡易な記号で表し、また速度場の大きさを表したいときには|U|として表記します。数学は口話よりも効率性に優れ、複雑な概念を極めて明快に表現できます。
連続体力学の中で解析しようとしている問題は、固有の構成要素やタイプとして表現されたものでもなく、コンピュータの認識する、いわゆるビット、バイト、数値などの概念とも異なります。 問題はいつも、まず口話で提起され、空間と時間の三次元での偏微分方程式として表現されます。それらの方程式はスカラー、ベクトル、テンソルそしてそれらの場、テンソル代数、テンソル解析、次元単位などの概念を含んでおり、これらの解は離散化手法やマトリクス、ソルバそして解法アルゴリズムを必要とします。 テンソル数学と値計算法についてはプログラマーガイドの第1章と第2章に記載しています。
[編集] 3.1.2 オブジェクト指向とC++
C++のようなオブジェクト指向のプログラミング言語は,宣言の型としてクラスという考え方を採用しており,口語の部分や科学計算や技術計算に用いられる数学的な言語を取り扱っています。先に紹介した速度場はプログラミングコードでは記号Uで表され、速度フィールドの大きさはmag(U)で表されます。速度はベクトル場であり、オブジェクト指向コードではvectorFieldクラスとなります。速度フィールドUは,オブジェクト指向の項であることことから,この場合vectorFieldクラスのインスタンス,あるいはオブジェクトとということになります。
プログラミングの中で、物理的なオブジェクトと抽象的な構成要素を表現するオブジェクト指向の持っている明瞭さを過小評価してはいけません。クラス構造は,クラス自身など、開発したコードの領域を包含する集合であるから,容易にコードを管理することができます。新しいクラスには,他のクラスからのプロパティを継承させることができることから,vectorFieldにはvectorクラスとFieldクラスを継承させることができます。C++はテンプレートクラスのメカニズムを備えています。例えばテンプレートクラスField<Type>はscalar、vector、tensorなどどんな<Type>のFieldも表現できます。テンプレートクラスの一般的な特性はテンプレートから作成されるどんなクラスにも通じます。テンプレート化や継承はコードの重複を減らし、コードの全体構造を決めるクラスのヒエラルキーを作ります。
[編集] 3.1.3 方程式の説明
OpenFOAMの設計の中心的なテーマは,OpenFOAMのクラスを用いて書かれたソルバーのアプリケーションであり,偏微分方程式の解法と非常に似た構造を持っています。例えば方程式
はコード
solve
(
fvm::ddt(rho, U)
+ fvm::div(phi, U)
- fvm::laplacian(mu, U)
==
- fvc::grad(p)
);
で表されます。
これらの必要条件としてOpenFOAMの主たるプログラミング言語が継承やテンプレートクラスや仮想関数や演算子の多重定義等オブジェクト指向的特徴を持っていることが必要です。これらのことは,オブジェクト指向を意図した多くの言語でできるわけではなく,実際,FORTRAN-90,C++といった限られたオブジェクト指向の言語でのみ可能となっており,これらの特性をすべての持つ上に,信頼性のあるコンパイラが効率よく実行することから,標準的な仕様で広く使われているという優位性を持っています。だからOpenFOAMの主要言語なのです。
[編集] 3.1.4 ソルバコード
ソルバコードは、解法アルゴリズムと方程式の手続き上の説明のようなものなので当然のようにほとんど手続きです。 オブジェクト指向やソルバを書くためのC++プログラミングへの深い知識は必要ありませんがオブジェクト指向やクラスの原理やいくらかC++コードの構文の基礎知識は知っておくべきでしょう。 基礎的な方程式やモデルや解法の理解やアルゴリズムは非常に重要です。
ユーザーはたいていの場合OpenFOAMクラスのどんなコードでも深く考える必要はありません。 オブジェクト指向の真髄はユーザーが何もしなくてもよいところにあります。 単にクラスの在り方と機能の知識だけでクラスを使うのに十分です。 それぞれのクラスやその機能などの説明は、OpenFOAMの配布物の中にDoxygenで生成されたHTMLのドキュメントとして供給されており、$WM_PROJECT_DIR/doc/Doxygen/html/index.htmlにあります。
