OpenFOAMへの計算機能追加
連続的データ同化法(VCA法)の実装
大阪大学大学院工学研究科 博士後期課程 松尾智仁 NEE研究会 第18回講演討論会 2015.01.27 於大阪大学中之島センター内容
1.OpenFOAMを使う理由
1.1 OpenFOAMの特徴
1.2 OpenFOAMを使うにあたって
2.OpenFOAMへの計算機能追加
2.1 計算機能の追加の方法
2.2 VCA法によるデータ同化計算機能の追加
•
VCA法とは
•
計算例
21.OpenFOAMを使う理由
31.1 OpenFOAMの特徴
•
オープンソースである
=> 内部でどのような計算が行われているかわかる => 式や処理を自由に改変することができる • 研究で用いる場合… • どのような計算条件(離散化の方法、乱流モデル、差分 スキーム、……)で計算が行われているのかを明らかにす る必要がある • 従来とは違う計算手法を試したくなることがある1.OpenFOAMを使う理由
41.1 OpenFOAMの特徴
•
機能が多彩である
=> たいていの計算であれば、コードを自作しなくても実行 できる => たとえば差分スキームの違いによる結果の差異などが 容易に評価できる • 研究で用いる場合… • 適切なスキームは条件によって異なる • コーディングは主な目的ではない1.OpenFOAMを使う理由
51.2 OpenFOAMを使うにあたって
•
導入のハードルが高い
•
日本語文献がまだ多くはない
•
TutorialやUserGuideがあまり親切ではない
•
Linux 上で動作する
•
GUIが無い
1.OpenFOAMを使う理由
61.2 OpenFOAMを使うにあたって
• 参考サイトなど • OpenCAE学会(http://www.opencae.jp/) • OpenFOAMのユーザガイド翻訳など • PENGUINITIS(http://www.geocities.jp/penguinitis2002/study/OpenFO AM/index.html) • 計算実行、ソース解読などについての多くの情報 • OpenFOAM wiki (英語) (https://openfoamwiki.net/index.php/Main_Page) • OpenFOAMに関する情報多数(非公式) • Google(https://www.google.co.jp/) • 大抵のことは検索すれば見つけられます1.OpenFOAMを使う理由
71.2 OpenFOAMを使うにあたって
• 使用環境• 仮想環境 : VMware player (Windows上で動作) • 作業環境:ワークステーション上のLinux(ssh接続) • Linux : Ubuntu1204 64bit
• OpenFOAM : OpenFOAM 2.3.0
• ソースコード操作:Eclipse ( with Pleiades ) • 結果処理 : paraView
2.OpenFOAMへの計算機能追加
82.1 計算機能の追加の仕方
• ソルバの場所 : /opt/openfoam2.3.0/applications/solver 以下 • ソースコードはC++で書かれている。 • いわゆるオブジェクト指向で • クラスの継承 • オーバーロード(関数/演算子の多重定義) • オーバーライド(関数の上書き) といったC++に特有の機能が使われている • 高度にモジュール化されている。 • 機能追加は比較的簡単に行なえる2.OpenFOAMへの計算機能追加
92.1 計算機能の追加の仕方
• クラスや関数の定義はすでになされているため、主としてそ れらを組み合わせることで任意のソルバを作成する。 • たいていはmain関数だけを作り変えれば足りる例:simpleFoamのmain関数
simpleFoam : 非圧縮流体の定常流れを計算するソルバ int main(int argc, char *argv[]){ #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" #include "createFields.H" #include "createFvOptions.H" #include "initContinuityErrs.H" simpleControl simple(mesh); 計算ケースの読み込み 計算条件(時間)の読み込み メッシュの作成 変数(速度、圧力など)の作成 オプションの設定 初期残差の計算 SIMPLEの繰返しの制御の作成
Info<< "¥nStarting time loop¥n" << endl; while (simple.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl; { #include "UEqn.H" #include "pEqn.H" } turbulence->correct(); runTime.write();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl;
}
Info<< "End¥n" << endl; return 0; }
例:simpleFoamのmain関数(つづき)
結果ファイル書き出し 速度の計算 圧力の計算 乱流に関する計算 SIMPLEの ループ2.1 計算機能の追加の仕方
12•
方程式を追加する場合
•
微分方程式は行列の形で表現される。
例:非圧縮定常流れの運動量方程式(
U)
p UU +∇⋅ eff∇ =−∇ ⋅ ∇ ( ) ν fvScalarMatrix UEqn( fvm::div(phi, U) + turbulence->divDevReff( U) == fvOptions(U) );solve( UEqn() == -fvc::grad(p));
対流項 粘性項
オプション(何もしない) 圧力項
13 例:非定常の物質の保存式
(
C)
S UC ρ t C + ∇ Γ ⋅ ∇ = ⋅ ∇ + ∂ ∂ ) ( fvScalarMatrix Equation( fvm::ddt(conc) +fvm::div(phi,conc) == fvm::laplacian(turbulence->nuEff(), conc) +fvOption(conc) ); 対流項 拡散項 オプション(ソース項) 非定常項2.1 計算機能の追加の仕方
•
方程式を追加する場合
•
微分方程式は行列の形で表現される。
2.2 VCA法によるデータ同化計算機能の追加
14 Variational Continuous Assimilation methodデータ同化法の一種で、観測データを用いてCFDモデルを修正し ながら計算を行う手法
Derber(1989) “A variational continuous assimilation technique”
VCA法とは 数値解析 修正された数値解析 観測データ データ同化 VCA法の概要 - CFDモデルの修正式を定義 - 評価関数を用いて観測値との誤差を評価 - 誤差を最小化する修正項を求める
(
) (
)
∑
=Ψ
−
Ψ
Ψ
−
Ψ
=
P p p p p pI
1 T~
~
2
1
計算値と観測値の差分(
~)
0 1 T = Ψ − Ψ ∂ Ψ ∂ = ∂ ∂∑
= P p p p p Iφ
φ
φ
λ
n n n nA
Ψ
+
=
Ψ
−1 修正項 CFDの支配方程式 I φ 修正項φが評価 関数 I を最小化 するとき、 Iのφに 関する勾配が0に なる。2.2 VCA法によるデータ同化計算機能の追加
VCA法の計算フロー
修正項を更新 CFD解析 CFD CFDと観測値の 誤差を評価 計算終了 観測値の読み込み 計算開始2.2 VCA法によるデータ同化計算機能の追加
2.2 VCA法によるデータ同化計算機能の追加
・室内に未知の放出源があるケースを想定 ・吸込み口の濃度を観測データとして与える ・流れ場/放出時刻は既知。 ・観測データ取得位置における濃度のデータから、放出源の位置と 放出強度を推定。計算例:未知の汚染放出源の
放出源位置と濃度の推定
観測データ 取得位置 U [m/s] 2.0 1.0 0.02.2 VCA法によるデータ同化計算機能の追加
計算条件 流れ場 非圧縮等温定常流れ 吸込口 1.0 m/s 吹出し口 自由開放 放出源大きさ 0.01 m2 (室内中央) 放出強度 100.0 g/m2/s 放出時間 1.0 秒間 速度-圧力解法 SIMPLE 時間の差分スキーム 1次精度オイラー法(Euler) 対流の差分スキーム 2次精度中心差分+TVD制限(Gauss limitedLinear) 勾配の差分スキーム 線形補間(Gauss Linear)拡散の差分スキーム 線形補間(Gauss linear corrected)