色々とOpenFOAM内のtutorialで勉強しているところですが、この度
分からないことが出て参りまして、諸先生方に質問させて頂きたく
投稿致しました。よろしくお願いします。
今チュートリアルにあるダムの決壊の例を用いて、上部の境界条件を
atmosphereからwallに変えた計算をしようとしています。簡単のために、
貯水槽の底にある出っ張りを取り除き、速度Uに対してすべりなし条件を
課しています。また乱流の効果は考えていません。
計算を進めたところ、右の壁(rightWall)を伝わった流体が上部の壁
(topWall)にぶつかり、大部分は下の壁(lowerWall)に跳ね返るのですが、
一部の流体がそのままtopWallを伝わって落ちずに左の壁まで
たどり着いてしまいます。これは現実的には少し妙な気がしますので、
何か自分の計算の設定が間違っているとは思うのですが、浅学のために
原因がわからずにいます。原因の可能性が何か考えられますでしょうか?
恐らく基本的な事が理解できていないのだと思い恐縮ですが、ご助言を
頂ければ大変ありがたく思います。よろしくお願い致します。
参考のため、設定ファイルを記させて頂きます。
0/alpha1
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * //
dimensions [0 0 0 0 0 0 0];
internalField uniform 0;
boundaryField
{
leftWall
{
type zeroGradient;
}
rightWall
{
type zeroGradient;
}
lowerWall
{
type zeroGradient;
}
topWall
{
type zeroGradient;
}
defaultFaces
{
type empty;
}
}
//
************************************************************************* //
0/U
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
leftWall
{
type fixedValue;
value uniform (0 0 0);
}
rightWall
{
type fixedValue;
value uniform (0 0 0);
}
lowerWall
{
type fixedValue;
value uniform (0 0 0);
}
topWall
{
type fixedValue;
value uniform (0 0 0);
}
defaultFaces
{
type empty;
}
}
//
************************************************************************* //
0/p
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * //
dimensions [1 -1 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
leftWall
{
type buoyantPressure;
value uniform 0;
}
rightWall
{
type buoyantPressure;
value uniform 0;
}
lowerWall
{
type buoyantPressure;
value uniform 0;
}
topWall
{
type totalPressure;
p0 uniform 0;
U U;
phi phi;
rho rho;
psi none;
gamma 1;
value uniform 0;
}
defaultFaces
{
type empty;
}
}
//
************************************************************************* //
どうぞよろしくお願い致します。
上部(topWall)の境界条件を閉じた領域として計算したいということだと思うのですが、
速度だけでなく、圧力の境界条件も変更する必要があるんだということだと思います。
たとえば、
topWall
{
type buoyantPressure;
value uniform 0;
}
としてみるなり、
topWall
{
type zeroGradient;
value uniform 0;
}
ではどうでしょう?
E.Moguraさんの言われる通りに上部壁の圧力の境界条件を変える必要がありま
す.
ただ,そうすると今度は tutorials/incompressible/icoFoam/cavity の時と
同じように,境界面で圧力の値の指定が無くなり,そのままでは解けなくなる
ので,cavityケースのsystem/fvSolutionでの
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 0;
pRefCell 0;
pRefValue 0;
}
と同様に,system/fvSolution のPISOエントリー内に,内部の格子で圧力の値
を指定するpRefCellとpRefValueの指定を加えてください.
ところで,kenichiro さんの質問には設定ファイルの初期値が書いてあったの
で,読んでいて私にも問題点がすぐにわかりました.
あまりに大きい初期値や設定ファイルを付けるのは問題がありますが,この程
度の大きさの設定ファイルは質問の際に必ず付けてもらえると,アドバイスし
やすいと思います.
また,多少大きな初期値や設定ファイルの場合には,それらをzipやtar+gzip
or bzip2等で固めて添付しても良いと思います.
>> E.Mogura様
おっしゃるとおり、「上部(topWall)の境界条件を閉じた領域
として計算したい」という動機で計算を行っております。
圧力の境界条件について、ご助言頂いたbuoyantPressureと
zeroGradientの2通りの場合に変更して再計算を行いました。
その結果、相変わらず一部の流体がtopWallを伝わって左の壁まで
落下せずにたどり着いてしまうものの、従来の圧力境界条件を
用いた場合と比較し、重力により落下する流体の割合が増加し、
より現実的と思われる計算結果が得られました。
適切なご助言を頂きまして、誠にありがとうございました。
>> 今野様
pRefCellとpRefValueの指定についてご指摘頂き、ありがとう
ございました。全ての境界条件を閉じた領域で計算する場合には、
何か圧力のリファレンスが必要になるのでしょうか?
ご助言を頂きまして、誠にありがとうございます。
また、今後もご質問させて頂く際はなるべく分かりやすく
させて頂くよう心がけますので、よろしくお願い致します。
ところで、今回自分の疑問点を整理したところ、上部の境界条件の
設定方法もさることながら、圧力の境界条件そのものを理解して
いないことが分かりました。申し訳ありませんが、また追加の質問を
させて頂けないでしょうか。
自分なりに、圧力に対するデフォルトの上部境界条件(0/p)
topWall // 1
{ // 2
type totalPressure; // 3
p0 uniform 0; // 4
U U; // 5
phi phi; // 6
rho rho; // 7
psi none; // 8
gamma 1; // 9
value uniform 0; // 10
}
を解釈したところ、3行目で圧力をp0(全圧)=p(静圧)+\rho*U^2/2(動圧)
として定義し、4行目から7行目まではその全圧で必要となる物理量の
設定だと理解しています。しかし、8行目から10行目までは全圧の定義に
一見現れないと思うのですが、ここでの指定が必要となる理由はなぜ
なのでしょうか?
また、各問題設定において、totalPressureやbuoyantPressure、
zeroGradientの境界条件を選択する決め手のようなものは何かある
のでしょうか?
大変基礎的な質問になり恐縮ですが、お時間がある際にでもご助言を
頂ければ大変ありがたいです。どうぞよろしくお願い致します。
> pRefCellとpRefValueの指定についてご指摘頂き、ありがとう
> ございました。全ての境界条件を閉じた領域で計算する場合には、
> 何か圧力のリファレンスが必要になるのでしょうか?
そういうことです.
> 自分なりに、圧力に対するデフォルトの上部境界条件(0/p)
>
> topWall // 1
> { // 2
> type totalPressure; // 3
> p0 uniform 0; // 4
> U U; // 5
> phi phi; // 6
> rho rho; // 7
> psi none; // 8
> gamma 1; // 9
> value uniform 0; // 10
> }
>
> を解釈したところ、3行目で圧力をp0(全圧)=p(静圧)+\rho*U^2/2(動圧)
> として定義し、4行目から7行目まではその全圧で必要となる物理量の
> 設定だと理解しています。しかし、8行目から10行目までは全圧の定義に
> 一見現れないと思うのですが、ここでの指定が必要となる理由はなぜ
> なのでしょうか?
totalPressureについては,確かに使用法等はユーザーガイドで説明されてい
ませんし,ネットやCFD onlineのOpenFOAMフォーラムを検索しても,出てこな
いようですね.
こういう場合には,もうソースを見るしかありません(笑).
各境界条件のソースは
src/finiteVolume/fields/fvPatchFields/{basic,constraint,derived}
以下にあり,totalPressureのような複雑な境界条件は,大抵derivedの下にあります.
src/finiteVolume/fields/fvPatchFields/derived/totalPressure/totalPressureFvPatchScalarField.{C,H}
ヘッダファイルのtotalPressureFvPatchScalarField.H を見ると
//- Name of the velocity field
word UName_;
//- Name of the flux transporting the field
word phiName_;
//- Name of the density field used to normalise the mass flux
// if neccessary
word rhoName_;
//- Name of the compressibility field used to calculate the wave speed
word psiName_;
//- Heat capacity ratio
scalar gamma_;
//- Total pressure
scalarField p0_;
とpsiやgammaの意味が書いてあります.
さらに,本体のtotalPressureFvPatchScalarField.C を見ると,psiやrhoが定
義された場合での静圧の計算式が書いてあります.
if (psiName_ == "none" && rhoName_ == "none")
{
operator==(p0_ - 0.5*(1.0 - pos(phip))*magSqr(Up));
}
else if (rhoName_ == "none")
{
const fvPatchField<scalar>& psip =
patch().lookupPatchField<volScalarField, scalar>(psiName_);
if (gamma_ > 1.0)
{
scalar gM1ByG = (gamma_ - 1.0)/gamma_;
operator==
(
p0_
/pow
(
(1.0 + 0.5*psip*gM1ByG*(1.0 - pos(phip))*magSqr(Up)),
1.0/gM1ByG
)
);
}
else
{
operator==(p0_/(1.0 + 0.5*psip*(1.0 - pos(phip))*magSqr(Up)));
}
}
else if (psiName_ == "none")
{
const fvPatchField<scalar>& rho =
patch().lookupPatchField<volScalarField, scalar>(rhoName_);
operator==(p0_ - 0.5*rho*(1.0 - pos(phip))*magSqr(Up));
}
さらに,10行目のvalueですが,これはflowRateInletVelocityといった
fixedValue由来(derived)の境界条件でも同様なのですが,いわゆる
placeholder (穴埋め?)というやつです.
fixedValue型の境界条件は,valueの指定が必要なので,とりあえずvalueの値
を書いておかないといけないのですが,totalPressure等のように他の値から
計算される場合には,実際にはその値は使用されません.
> また、各問題設定において、totalPressureやbuoyantPressure、
> zeroGradientの境界条件を選択する決め手のようなものは何かある
> のでしょうか?
buoyantPressureについては,OpenFOAMフォーラムを検索すると色々スレッド
が出てくると思いますが,これもソースのヘッダファイル
src/finiteVolume/fields/fvPatchFields/derived/buoyantPressure/buoyantPressureFvPatchScalarField.H
を見ると,
Description
Set the pressure gradient boundary condition appropriately for buoyant flow.
If the variable name is "pd" assume it is p - rho*g.h and set the gradient
appropriately. Otherwise assume the variable is the static pressure.
と書いてある通り,浮力流(非等温)での壁の圧力境界条件を指定するものです.
非等温でなく,等温では,壁の圧力の境界条件はzeroGradientで良いです.
また,totalPressureは,壁ではなく,通常流入や流出等,大気等の開いた境
界で指定すると思います.
このように,OpenFOAMはオープンソースですから,もしユーザーガイドを見た
り,ネットを検索してもわからない時には,ソースを見てみることをお勧めし
ます.
どこにソースがあるかわからない時には,検索ユーティリティーやfind等の
Unixのコマンドを使って,ソースツリー以下を検索してみてください.
実際,
src <- OpenFOAMのソースツリーに行くエイリアス
find . -name totalPressure*
とやると,
./finiteVolume/Make/linux64GccDPOpt/totalPressureFvPatchScalarField.o
./finiteVolume/fields/fvPatchFields/derived/totalPressure
./finiteVolume/fields/fvPatchFields/derived/totalPressure/totalPressureFvPatchScalarField.C
./finiteVolume/fields/fvPatchFields/derived/totalPressure/totalPressureFvPatchScalarField.H
./finiteVolume/fields/fvPatchFields/derived/totalPressure/totalPressureFvPatchScalarField.dep
./finiteVolume/lnInclude/totalPressureFvPatchScalarField.C
./finiteVolume/lnInclude/totalPressureFvPatchScalarField.H
と出てくると思います.
At Sun, 7 Mar 2010 01:48:49 -0800 (PST),
kenichiro wrote:
> その結果、相変わらず一部の流体がtopWallを伝わって左の壁まで
> 落下せずにたどり着いてしまうものの、従来の圧力境界条件を
> 用いた場合と比較し、重力により落下する流体の割合が増加し、
> より現実的と思われる計算結果が得られました。
やってみると,確かにそうなりますね.
OpenFOAM tutorial case - interForm/laminar/damBreakClosedFine
http://www.youtube.com/watch?v=oEHyzXnPUAw
これについては,粗い格子分割で滑りなし壁境界の層流計算をしているからか
もしれません.
1.6系をお使いなら,interFoamでそのままRASやLES等の乱流モデルも使えます
ので,添付のファイル(damBreakClosedFine.tar.gz)を解凍して走らせ
てみてください(層流計算版はdamBreakClosedFineLaminar.tar.gz).
tar zxpf damBreakClosedFine.tar.gz
cd damBreakClosedFine
./Allrun
チュートリアルのdamBreakFineのように,分割数を増やしているので,多少計
算時間がかかります.
なお,
./Allclean
で,ケースを初期化します.
これだと,以下のように天井にも達しないようです.
OpenFOAM tutorial case - interForm/ras/damBreakClosedFine
http://www.youtube.com/watch?v=D00AumcZ0Lc
自分は気液二相流は専門外なので,このような問題をRASモデル,それも標準
k-Epsilonモデルで解いて良いのか,良くわかりませんが,,
(たぶん駄目なのでしょうね,,)
一応参考のため.
少し体調をくずし、今までご返信が遅れ大変申し訳ございませんでした。
圧力の境界条件について、ソースレベルから丁寧な解説を頂き、
誠にありがとうございました。おかげをもちまして、各境界条件について
対象としている状態を良く理解することができました。今後は、C言語を
勉強しつつ、さらにコードを読んでみることにします。
また、層流と乱流の2通りについて、今野先生が添付されたファイルを使って
自分でも計算してみたところ、無事に今野先生の結果を再現することが
できました。お時間を頂き作成頂きまして、ありがとうございました。
乱流については全く知識がないのでどちらが現実に近いのか分かりませんが、
その効果を入れるとこうも違うものなんですね。
重ね重ね、色々とご指導を頂きまして誠にありがとうございました。
色々と勉強することが山積みですが、頑張って一歩ずつ進んでいこうと
思います。