波の無反射境界条件2015年3月13日 | |
はじめに波の無反射境界条件について。 バージョンOpenFOAM 2.3.1 ファイル
波の無反射境界条件広い海の一角を切り出して、そこを波が進む解析をしたい。その際、側面は海が続いているはずなので、そこで波が反射しないようにしたい。そのために波の無反射境界条件について考える。 ここでは interFoam の damBreak のケースをベースに検討する。damBreak の初期条件で 0.1 の高さまで水を溜める。 ![]() rightWall の境界条件をいろいろ変えてみて、右側の領域を広げたケースと比較する。うまくいってそうなケースを以下に示す。 U : zeroGradient, p_rgh : fixedFluxPressure抜けているように見えるが、領域拡張版と少し液面がずれている。でもそこそこ使えそう。 ![]() ![]() ※領域拡張版の結果を半透明にして重ねている。 ゾンマーフェルト放射条件開放境界条件として、ゾンマーフェルト放射条件 (Sommerfeld radiation condition) というものがあるらしい。条件は以下の式で表される。 DΦ/Dt = 0 Φはあるスカラー変数。 OpenFOAM の境界条件クラスを見ると、"advective" がこの条件に当たるらしい。U に advective を適用する。alpha1.water は zeroGradient でよい。 問題は圧力 p_rgh であるが、以前のバージョンにあった境界条件 buoyantPressure を参考にして、水面高さまでは水を支えるような圧力とし、それ以上は p_rgh = 0 にするような境界条件を codedMixed で与える。
rightWall
{
type codedMixed;
refValue uniform 0;
refGradient uniform 0;
valueFraction uniform 0;
redirectType noreflect;
codeInclude
#{
#include "uniformDimensionedFields.H"
#};
code
#{
const uniformDimensionedVectorField& g =
db().lookupObject<uniformDimensionedVectorField>("g");
const fvPatchField<scalar>& rho =
patch().lookupPatchField<volScalarField, scalar>("rho");
valueFraction() = 0.;
refGrad() = -rho.snGrad()*(g.value() & patch().Cf());
vector gn(g.value()/mag(g).value());
forAll(patch().Cf(), fI)
{
scalar h(-gn & patch().Cf()[fI]);
if(h > 0.1)
{
valueFraction()[fI] = 1.;
refValue()[fI] = 0.;
}
}
#};
}
codedMixed を使っているのは、実現したい境界条件がディリクレ条件とノイマン条件の両方を含むからである。はじめに勾配指定を設定し、高さを調べて水面高さ以上だったら値 0 の指定に変更している。 ![]() ![]() うまくいってそうである。 津波解析への適用津波解析の例 に無反射境界条件を適用してみた。 ![]() ![]() U : zeroGradient (左)/U : advective (右) どちらもある程度反射を抑えられているが、advective のほうがよさそうである。 | |
| PENGUINITIS | |