rhoPotentialFoam コンパイルエラー

247 views
Skip to first unread message

陽炎

unread,
Feb 24, 2010, 9:16:38 AM2/24/10
to OpenFOAM
圧縮性問題用の初期値をつくるにあたって,
通常の potentialFoam では圧力の次元が異なっていて不便なので,
rhoPotentialFoam というものを発見し,使おうと思っています.
http://www.cfd-online.com/Forums/openfoam-solving/59665-rhosimplefoam-negative-pressure.html#post192276

ところが,当方のバージョンが 1.6 のせいかコンパイルできません.

エラーメッセージには

createFields.H:21: error: no matching function for call to
‘Foam::dictionary::New(Foam::fvMesh&)’

と出ているので,createFields.H の該当個所

autoPtr<basicThermo> thermo
(
basicThermo::New(mesh)
);

を修正すればよいようなのですが,
どう直せばよいかわかりません.

どのように修正すればよいか,お分かりの方がいらっしゃれば
アドバイスをいただけないでしょうか.

IMANO Masashi

unread,
Feb 25, 2010, 11:10:56 AM2/25/10
to open...@googlegroups.com

陽炎さん

今野です.

自分は圧縮性流体は門外漢なので,単にコンパイルできるようにするためだけ
の情報だということを初めに断わっておきます.

rhoPotentialFoamに近い圧縮性SIMPLE法のソルバーrhoSimpleFoamで
1.5系と1.6系のソースの違いをdiff等で調べると,以下のようになります.
(rhoPotentialFoamと関係ない所は適宜省略しています.)

【createFields.H】

& diff -u ~/OpenFOAM/OpenFOAM-1.5.x/applications/solvers/compressible/rhoSimpleFoam/createFields.H ~/OpenFOAM/OpenFOAM-1.6.x/applications/solvers/compressible/rhoSimpleFoam/createFields.H

(snip)

@@ -1,9 +1,10 @@
- autoPtr<basicThermo> thermo
+ autoPtr<basicPsiThermo> pThermo
(
- basicThermo::New(mesh)
+ basicPsiThermo::New(mesh)
);
+ basicPsiThermo& thermo = pThermo();

(snip)

volScalarField rho
(
@@ -15,12 +16,12 @@
IOobject::READ_IF_PRESENT,
IOobject::AUTO_WRITE
),
- thermo->rho()
+ thermo.rho()
);

(snip)

【rhoSimpleFoam.C】

% diff -u ~/OpenFOAM/OpenFOAM-1.5.x/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C ~/OpenFOAM/OpenFOAM-1.6.x/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C

(snip)

-#include "basicThermo.H"
+#include "basicPsiThermo.H"

ということで,以下のような変更をすればとりあえずコンパイルできるようです.

パッチファイルここから
----
diff -ur rhoPotentialFoam.orig/createFields.H rhoPotentialFoam/createFields.H
--- rhoPotentialFoam.orig/createFields.H 2010-02-26 00:04:38.000000000 +0900
+++ rhoPotentialFoam/createFields.H 2010-02-26 00:05:56.000000000 +0900
@@ -16,10 +16,11 @@

// determine an average density for the p/T conditions
{
- autoPtr<basicThermo> thermo
+ autoPtr<basicPsiThermo> pThermo
(
- basicThermo::New(mesh)
+ basicPsiThermo::New(mesh)
);
+ basicPsiThermo& thermo = pThermo();

volScalarField rho
(
@@ -31,7 +32,7 @@
IOobject::NO_READ,
IOobject::NO_WRITE
),
- thermo->rho()
+ thermo.rho()
);

avgRho = gAverage(rho);
diff -ur rhoPotentialFoam.orig/rhoPotentialFoam.C rhoPotentialFoam/rhoPotentialFoam.C
--- rhoPotentialFoam.orig/rhoPotentialFoam.C 2010-02-26 00:20:05.000000000 +0900
+++ rhoPotentialFoam/rhoPotentialFoam.C 2010-02-26 00:06:10.000000000 +0900
@@ -36,7 +36,7 @@
Copyright (C) 2006 Mark Olesen
\*---------------------------------------------------------------------------*/
#include "fvCFD.H"
-#include "basicThermo.H"
+#include "basicPsiThermo.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
----
パッチファイルここまで


ところで,標準のpotentialFoamソルバーですが,このソースを見ると,
potentialFoam.CにおいてpのPoisson方程式を解く部分を抜き出すと以下の
ようになっており, 読み込んだ初期値のpの次元(p.dimensions())で割って,p
のPoisson方程式を構成しているので,これはpの初期値の次元に依存せずに,
解ける,つまり非圧縮性と圧縮性で共用できるソルバーなのではないでしょうか?

【potentialFoam.C】

fvScalarMatrix pEqn
(
fvm::laplacian
(
dimensionedScalar
(
"1",
dimTime/p.dimensions()*dimensionSet(0, 2, -2, 0, 0),
1
),
p
)
==
fvc::div(phi)
);

pEqn.setReference(pRefCell, pRefValue);
pEqn.solve();


実際,1.6系のtutorialsの
compressible/rhoPorousSimpleFoam/angledDuctImplicit
において,以下のように potentialFoamを動かしても動きます.

% tut
% cd compressible/rhoPorousSimpleFoam/angledDuctImplicit
% cp -r 0 0.orig <-potentialFoamは初期値を書き変えるため,初期値を保存
% potentialFoam

もちろん,potentialFoam の代りに rhoPotentialFoam でも動きます.

rhoPotentialFoamが標準のpotentialFoamと違う所は主に以下のことのような
ので,これらが必要ならrhoPotentialFoamを使えば良いのではないでしょうか?

* Uをrhoの体積平均値で割っている.

* 非直交格子用反復回数やp,phiの結果を終了時に残すがコマンドライン
オプションで指定できる.

* コマンドラインで非直交格子用反復回数が指定されていない場合,
非直交格子用反復を最低でも3回行なう.

陽炎

unread,
Feb 25, 2010, 5:32:52 PM2/25/10
to OpenFOAM
今野様

お返事ありがとうございます.

よく見ずに potentialFoam は非圧縮性用だと思い込んでいましたが,
どうやら私が potentialFoam で失敗したのは,圧縮性だからではなく,
potentialFoam 内で volScalarField psi が宣言されていないために
totalPressure や totalTemperature の psi オプションが使用できない,
ということだったようですね.

この点では rhoPotentialFoam も同様で,
createFields.H 内に volScalarField psi の宣言を追加すると,
一応動作しくれました.

ただ,こんどは速度場がおかしなことになるので,
入口の速度の境界条件などを変えて試してみようと思います.


P.S. 著作権表示の件は,現在追加作業中ですのでもうしばらくお待ちください.

Giro

unread,
Feb 26, 2010, 9:01:33 AM2/26/10
to OpenFOAM
rhopotentialFoamを使った事はありますが
適用する環境によっては、?なコンディションが作成される事があります。
私が試したケースでも、そのような経験をしました。

・適用したい条件よりも 流速の低い条件からスタートして
 徐々に速度を上げていく形で、初期条件(?)を用意する。
・場合によっては、例えば外部流ではゼロスタートで主流条件を全域に与えたほうが良い事もあります。
・管内流なら、準一次元理論解を初期条件として与えた方が良いケースがあります。

ぜひ、いろいろとお試しになってください。

陽炎

unread,
Mar 2, 2010, 10:12:28 AM3/2/10
to OpenFOAM
Giro様

ありがとうございます.

いろいろ試したところ,やはり一時的に非圧縮性問題に適した境界条件にしておいたうえで,
nNonOrthCorr を 20 や 30 といった大きな数字にすることで,
理想的とはいえないまでも,「それほどブッ飛んでいない」速度場を得ることができました.

Reply all
Reply to author
Forward
0 new messages