コンパイルエラー(蒸発凝縮現象の導入)

552 views
Skip to first unread message

Kawamura

unread,
Jan 12, 2011, 3:45:19 AM1/12/11
to OpenFOAM
お世話になっております。kawamuraです。
いま、interFoamへ蒸発・凝縮導入のためソースコード改良に取り組んでいます。
簡単な蒸発凝縮モデルを作ってみましたが、知識が乏しくなぜコンパイルエラーが起こるかわからないので皆様の知識と経験をお借りしたいと思い、投稿しま
した。


ソース項の計算において、まず蒸気相か液相かを判別し、その後温度によって凝縮か蒸発か生成なしかを決定し、物質移動量Smを決めたいのですが、下記の
Sm決定のソースコードにおいてコンパイルエラーが出ました。

if( alpha1< scalar(0.50)) //vapor phase
{
if( T <= Tsat.value())
    Sm = coeff*(1-alpha1)*rho2*(Tsat-T)/Tsat ; //condensation
else
Sm = 0.0*coeff*(1-alpha1)*rho2*(Tsat-T)/Tsat; //no phase
change
}
if (alpha1>= scalar(0.5)) //liquid phase
{
if( T >= Tsat.value())
Sm = coeff*alpha1*rho1*(T-Tsat)/Tsat ; //evaporation
else
Sm = 0.0*coeff*alpha1*rho1*(T-Tsat)/Tsat;
}

pEqn.H:51: error: no match for ‘operator<’ in ‘alpha1 < 5.0e-1’
/opt/openfoam170/src/OpenFOAM/lnInclude/UList.C:179: note: candidates
are: bool Foam::UList<T>::operator<(const Foam::UList<T>&) const [with
T = double]
pEqn.H:53: error: no match for ‘operator<=’ in ‘T <=
Tsat.Foam::dimensioned<Type>::value [with Type = double]()’
/opt/openfoam170/src/OpenFOAM/lnInclude/UList.C:217: note: candidates
are: bool Foam::UList<T>::operator<=(const Foam::UList<T>&) const
[with T = double]
pEqn.H:58: error: no match for ‘operator>=’ in ‘alpha1 >= 5.0e-1’
/opt/openfoam170/src/OpenFOAM/lnInclude/UList.C:224: note: candidates
are: bool Foam::UList<T>::operator>=(const Foam::UList<T>&) const
[with T = double]
pEqn.H:60: error: no match for ‘operator>=’ in ‘T >=
Tsat.Foam::dimensioned<Type>::value [with Type = double]()’

if文においてalpha1などの値を判断できていないのでしょうか?
前に進めず困っています。お忙しいところ恐縮ですが、どなたかご教授お願いいたします。


Semin JEONG

unread,
Jan 12, 2011, 9:32:08 AM1/12/11
to open...@googlegroups.com
丁と申します。

Tやalphaをそのまま使っても良い(もっと賢い方法がある)かも知れませんが、
2年前に、似てるものを入れた場合は、「次元を合わせること等が面倒」くさ
かったため、
参考になれるかは知れませんが、下記のようにしCellことに計算したことがあり
ます。

ご参考まで。。

qは湿度です。
for (q, celli)
{
scalar etemp=6.1078*pow(10,(7.5*T[celli]/(237.3+T[celli])));
if (T[celli])
{
etemp=6.1078*pow(10,(9.5*T[celli]/(265.3+T[celli])));
}

scalar qtemp=0.622*etemp/(1012.5-0.378*etmep);
if(qtemp[celli]=>qtemp)
{
q[celli]=qtemp;

Semin JEONG

unread,
Jan 12, 2011, 9:45:38 AM1/12/11
to open...@googlegroups.com
(ソースを探すのが面倒だったため。。)Copyしなくて入力しましたが、誤りがありました。

for (q, celli) > forAll(q, celli)
if (T[celli]) > if (T[celli]<0.0)

です。

ohbuchi

unread,
Jan 13, 2011, 4:37:21 PM1/13/11
to OpenFOAM
おはようございます。丁さんのご指摘の様に、volScalarFieldをスカラー値と直接比較する
構文エラーの様に見えます。セルに関するループでセルごとに処理すると良いのでしょか?
未確認です。間違っていたらごめんなさい。

for(mesh.cells(),celli)
{
if( alpha1[celli]< scalar(0.50)) //vapor phase
{
if( T[celli] <= Tsat.value())
    Sm[celli] = coeff*(1-alpha1[celli])*rho2*(Tsat-T[celli])/Tsat
; //condensation
else
Sm[celli] = 0.0*coeff*(1-alpha1[celli])*rho2*(Tsat-T[celli])/
Tsat; //no phase
change
}
if (alpha1[celli]>= scalar(0.5)) //liquid phase
{
if( T[celli] >= Tsat.value())
Sm[celli] = coeff*alpha1*rho1*(T[celli]-Tsat)/Tsat ; //
evaporation
else
Sm[celli] = 0.0*coeff*alpha1[celli]*rho1*(T[celli]-Tsat)/
Tsat;
}
}

Semin JEONG

unread,
Jan 16, 2011, 6:27:05 AM1/16/11
to open...@googlegroups.com
丁です。

返事が遅くなってすみませんでした。

他の方法もあるかも知れませんが、したいことがCellごとに条件をかけることな
ので、
(個人的には)このような方法しかないんじゃないかと思います。

そして、for(mesh.cells(),celli) のところですが、
mesh.cell()で大丈夫かはやってみなかったため、わかりませんが、
少なくともforAll です。(Typeのミスだと思いますが。。)

http://www.cfd-online.com/Forums/openfoam/78236-conditional-operation-geometric-field.html
http://www.cfd-online.com/Forums/openfoam-programming-development/79677-if-else-condition-over-whole-mesh.html

--
===========================================
Se-min JEONG, Ph.D, Assistant Professor

Department of Environment Systems,
Graduate School of Frontier Sciences,
University of Tokyo, 5-1-5 Kashiwa-no-ha,
Kashiwa 277-8563, Japan

Tel: +81-80-5537-5405
===========================================

Kawamura

unread,
Jan 17, 2011, 4:56:41 AM1/17/11
to OpenFOAM
お礼の返事が遅くなりまして申し訳ございません。

丁さんとohbuchiさんのアドバイスを参考に以下のようにしてコンパイルしたところ無事に通りました。
for(mesh.cells(),celli)
{
if( alpha1[celli]< scalar(0.50)) //vapor phase
{
if( T[celli] <= Tsat.value())
    Sm[celli] = coeff.value()*(scalar(1)-
alpha1[celli])*rho2.value()*(Tsat.value()-T[celli])/Tsat.value()
; //condensation
else
Sm[celli] = 0.0*coeff.value()*(scalar(1)-
alpha1[celli])*rho2.value*(Tsat.value()-T[celli])/
Tsat.value(); //no phase change

Fieldデータやスカラー値に関する知識が全くなく、大変勉強になりました。

丁さん、ohbuchiさん、このたびは本当にありがとうございました。
Reply all
Reply to author
Forward
0 new messages