0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

ESI版OpenFOAM v2406を対象にして、タイトルに記した計算を行う。
この計算は、回転する流速場にあるノッチ付き円盤状の水(以下、$\alpha$と記す)が一周してどのくらい初期の形状を保てるか、というものである。
ソルバはinterIsoFoam/interFoamを使用し、$\alpha$の移流のみ計算する。
ESI版はinterIsoFoamのチュートリアルに本問題があり、それを使用する。
Foundation版OpenFOAM 11でも計算を行う。

解析モデル

image.png

設定値一覧
名前 設定値
ドメイン長さ $L [m]$ $1$
ディスク半径 $R [m]$ $0.15$
ノッチ幅 $W [m]$ $0.05$
ノッチ高さ $H [m]$ $0.25$
ディスク初期位置 $(x_0,y_0,z_0)$ $(0.5, 0, 0.75)$

回転する流速場

ESI版OpenFOAMでは、function objectで流速場の初期設定ができる。
U0_v2406.png

速度場$U(u,0,v)$の分布は次式の通りである。

u = \frac{\pi}{3.14} (0.5 - z)
v = \frac{\pi}{3.14} (x - 0.5)
functions
{
    setVelocity
    {
        type            setFlow;
        libs            (fieldFunctionObjects);
        writeControl    writeTime;
        mode            rotation;
        scale           1;
        //reverseTime     1;
        omega           1.000507215; // 2*pi/(2*3.14)
        //omega           6.28318530718;
        origin          (0.5 0 0.5);
        refDir          (1 0 0);
        axis            (0 1 0);
    }
}

system/controlDictのオリジナルからreverseTimeをコメントにし、omegaを$\frac{2\pi}{2✕3.14}$に変更する。つまり、ノッチ付き円盤の周期は、$2✕3.14=6.28 [s]$である。これを計算終了時刻とする。

ノッチ付き円盤の動き

frame.0000.png
frame.0002.png
frame.0004.png
frame.0006.png
frame.0008.png

評価式

計算開始時と計算終了時の$\alpha$の分布より、次の誤差を計算する。

\epsilon_{ND2} = \frac{1}{L} \sum_{j=1}^{N} A_{j} |\alpha_{J}^{I} - \alpha_{j}^{F}|
変数一覧
変数名 説明
$L$ 界面の長さ $[m]$
$A_j$ $セルjの面積 [m^2]$
$\alpha_j^I$ $計算開始時のセルjの\alpha$
$\alpha_j^F$ $計算終了時のセルjの\alpha$

$L$は計算開始時の界面の長さとすると、約$1.442 [m]$である。$A_j$はセルの分割数から算出した値とする。文献では$\alpha_j^I$を1タイムステップ実行後の値としているが、ここでは初期値とする。

ESI版OpenFOAMの計算結果

誤差$\epsilon_{ND2}$の計算結果
ケース1 ケース2 ケース3
分割数 $100✕100$ $200✕200$ $400✕400$
$interIsoFoam$ $0.001 97$ $0.000 51$ $0.000 24$
$interFoam$ $0.003 42$ $0.001 39$ $0.000 75$

なお、interIsoFoamのreconstructSchemeはisoAlphaである。

Foundation版の回転する速度場

Foundation版では、0/UのinternalFieldsにcodeStreamを適用することで、初期設定ができる。

internalField   #codeStream
{
    codeInclude
    #{
        //#include "fvCFD.H"
        #include "volFields.H"
    #};

    codeOptions
    #{
        -I$(LIB_SRC)/finiteVolume/lnInclude \
        -I$(LIB_SRC)/meshTools/lnInclude
    #};

    codeLibs
    #{
        -lfiniteVolume \
        -lmeshTools
    #};

    code
    #{
        const IOdictionary& d = static_cast<const IOdictionary&>(dict);
        const fvMesh& mesh = refCast<const fvMesh>(d.db());

        vectorField U_0(mesh.nCells(), Foam::Vector<double>(0.0,0.0,0.0));

        forAll(U_0, i)
        {
            const scalar x = mesh.C()[i][0];
            const scalar z = mesh.C()[i][2];
            const scalar u = constant::mathematical::pi * (0.5 - z) / 3.14;
            const scalar v = constant::mathematical::pi * (x - 0.5) / 3.14;
            U_0[i] = Foam::Vector<double>(u,0.0,v);
        }

        // ESI style U_0.writeEntry("", os);
        writeEntry(os, "", U_0);
    #};
};

バージョン11以前では、codeIncludeで"fvCFD.H"をインクルードする。
また、ESI版で使う場合は、writeEntryの書き方を変える。
このコードは実行時にコンパイルされ、速度場は次のようになる。
U0_11.png

この速度場は、ESI版と同じ(のはず)である。

Foundation版OpenFOAMの計算結果

Foundation版のinterFoamでは、$\alpha$の発散スキームとして次の3つが用意されている。

誤差$\epsilon_{ND2}$の計算結果
ケース1 ケース2 ケース3
分割数 $100✕100$ $200✕200$ $400✕400$
$interfaceCompression$ $0.00411$ $0.00177$ $0.00097$
$PLIC$ $0.00449$ $0.00177$ $0.00097$
$MPLIC$ $0.00449$ $0.00210$ $0.00133$

まとめ

本問題に関しては、ESI版の方が誤差が小さく、計算の準備が容易である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?