dimensionについて

322 views
Skip to first unread message

nago

unread,
Jul 26, 2018, 5:14:45 AM7/26/18
to OpenFOAM
お世話になっています。
nagoと申します。

rhoReactingBuoyantFoamに壁面での水蒸気凝縮を組み込もうとしています。
が、初期からつまづいています。
境界値と第1セル値の温度差や圧力差から凝縮量を計算しようとしています。
境界の値をp.boundaryFieldで取得して、次元設定した変数P_wallに代入しようとしていますが、うまくいきません。
コンパイルは通るのですが、計算すると次元の違いでエラーが出ます。
※ 各境界ファイスに対して値を取得して、以降で化学種ソース項を計算しようとしています。
 ループ部についてはpenguin様のプログラミングメモを参考にしました。

追加したコードは以下です。

≪変数次元設定箇所≫
dimensionedScalar P_wall("P_wall", dimensionSet(1,-1,-2,0,0,0,0), scalar());

≪境界値取得箇所≫
forAll(mesh.boundary(), bid)
{
    const fvPatch &patch = mesh.boundary()[bid];   
    forAll(patch, pfid)                
    {
       P_wall = p.boundaryField()[bid][pfid];  ←エラー発生箇所
  :
  :
  }
}

≪計算でのエラーメッセージ≫
--> FOAM FATAL ERROR:
Different dimensions for =
     dimensions : [1 -1 -2 0 0 0 0] = [0 0 0 0 0 0 0]

    From function dimensionSet::operator=(const dimensionSet&) const
    in file dimensionSet/dimensionSet.C at line 171.


当方、プログラミング経験がほとんどなく、進め方もよくわかっていない状態です。
基本的なことが理解できていないので、稚拙な質問をしていたらすみません。
p.boundaryFieldでは単位の取得ができないのでしょうか?
そもそもの考え方が間違っている?
というか、エラーの内容も上記の解釈であっているのでしょうか。。。

何かご教授願えればと思います。
よろしくお願い致します。



Inaba

unread,
Sep 4, 2018, 10:35:51 AM9/4/18
to OpenFOAM
nago様


こんにちは。
稲葉と申します。

お察しの通りboundaryField関数が返すのはscalarFieldクラスであり次元を含まないものになります。
そのため代入される側も次元なしのものにする必要があり、例えばdimensionedScalae P_wallであれば
P_wall.value() = p.boundaryField()[bid][pfid];
のように使うことになるかと思います。

以上です。
どうぞよろしくお願いします。


稲葉



nago

unread,
Nov 30, 2018, 2:12:07 AM11/30/18
to OpenFOAM
稲葉様、

お返事いただきありがとうございます。
気づくのが遅くなってしまい、申し訳ございません。

やはりそうなのですね。
なんとか当方も.valueをwebで見つけて進めておりました。
クラスの概念とか、やはり難しいですね…。

お世話になりました。
今後もご助力頂ければ幸いです。


2018年9月4日火曜日 23時35分51秒 UTC+9 Inaba:
Reply all
Reply to author
Forward
0 new messages