OpenFOAMのコード埋め込み型境界条件
1. 境界条件の作成
流体解析において、オリジナルの境界条件の作成が必要となるときがあります。その場合、OpenFOAMでは2つの解決法が考えられます。
- ソースコードを改変して境界条件を作成する。
- コード埋め込み型境界条件を利用する。
1.のソースコードの改変には相応のプログラミングスキルと時間が必要です。しかし、単純な境界条件であれば、2.のコード埋め込み型境界条件を利用することで比較的簡単にオリジナルの境界条件が作成可能です。この境界条件は、設定項目にソースコードの記述部分があり、自動的にコンパイルされ計算が実行されます。
以下に、コード埋め込み型境界条件の説明と適用例を紹介します。
2. 機能の概要
OpenFOAMの境界条件の一つにcodedFixedValueがあります。これを利用すればオリジナルの固定値の境界条件を設定することが可能です。境界条件内にC++のソースコードを記述する箇所があり、そこにソースコードを記述してオリジナルの境界条件を作成します。この機能は、流入速度に関数分布をもたせたい場合などで役に立ちます。
設定例はおおよそ以下のようになっています。
<patchName> // 適用するパッチの名前
{
type codedFixedValue;
name userDefinedBC; // 境界条件の名前
value uniform (0 0 0);
// local function(クラス外ローカル外部関数)
localCode
#{
void userDefinedBC_info()
{
Info<< “This is userDefinedBC.¥n”;
}
#};
// code in updateCoeffs function(ソースコードの記述部分)
code
#{
userDefinedBC_info();
#};
codeInclude // code内の記述に必要なinclude文
#{
// #include “sampleRequired.H“
#};
}
3. 使用例:ビル風の解析
直方体の領域内に設置された建物群に風が吹き込むビル風の定常解析を行います(図1)。建物群の中央部に高層ビル(図2中央の青い建物)を配置しています。
3-1. codedFixedValueの計算設定
助走区間の短縮のため、流入速度に1/7乗則を設定します。既存の境界条件では対応できないため、codedFixedValueを利用して境界条件を作成します。1/7乗則は次式で表されます。
今回はU_max=11.43 m/s,z_max=500 mとします。これらは図1に示したモデルの上面部分の速度と座標です。
codedFixedValue の設定内容は以下の通りです。
inlet
{
type codedFixedValue;
name powerLaw;
value uniform ( 0 0 0 );
code
#{
fvPatchField<vector> f
(
patch().lookupPatchField<volVectorField, vector>(“U”)
);
const scalar umax = 11.4285714286; // 速度の最大値
const scalar zmax = 500.0; // z座標の最大値
forAll(f, i)
{
const scalar z = patch().Cf()[i][2]; // パッチを構成する面メッシュのz座標
f[i] = vector(umax*pow(z/zmax,1.0/7.0), 0.0, 0.0); // 1/7乗則の設定
}
operator==(f);
#};
}
code#{ #}; 内の forAll(f, i){ } 部分に記述されている通り、パッチを構成する面メッシュのz座標を取得し、その値を使ってその座標における速度を1/7乗則の数式に従って計算しています。
記述はC++のソースコードと同じなので、数学関数を用いることができます。上の設定では累乗関数 pow() を利用しています。
このように、数式を用いて境界値に分布を持たせることができます。
3-2. 解析結果
流速に平行な鉛直断面の速度のカラーマップと、流入部分の速度ベクトルを図3に示します。1/7乗則に従い、流入部付近で上に行くほど流れが速くなる分布になっています。
解析結果から流速をサンプリングするため、流入部から0.5m風下側に離れた位置に鉛直向きに仮想の線分を配置します(図4)。
この線を含む下流方向(X方向)の平面上の速度分布を図5に示します。図5では、解析結果からサンプリングした値と理論値を併せて示しています。1/7乗則が流入境界条件に適用されていることが確認できます。
この解析例のように、codedFixedValue 境界条件を使うことで、分布をもった固定値の境界条件を作成することができます。
関連記事/関連ページ
●OpenFOAMライブラリでプログラムを書く (1)関数形
●OpenFOAM で回転を表わす4つの方法
●OpenFOAM 解説書『OpenFOAMライブラリリファレンス』
●OpenFOAM コンサルティングサービス