メインリスト
  • HOME 新館 
  • HOME 旧館 
  • OpenFOAM 
  • Salome 

  • sloshing : スロッシング

    いろいろとやりましたが、一番かっこいい動画をTopにおいておきます。 興味の沸いた方は、後述の各種説明にも目を通してください。
    なお、動画を作成するにあたって参考としたレポートはこちらです。
    バッフル板によるスロッシング抑制効果の数値解析/Numerical Investigation on Sloshing with Damping Devices




    interFoamに少しだけ修正を加えて、スロッシング解析を実施してみました。 修正といっても、重力項を時間変化させるだけですが。

    以下の例題については、Nastranによる実施例を別のページに示しています。
    個人的には、CIP法による解析も実施しているのですが...ソースコードがどこいったかなぁ。

    Nastranによる例


    そして、OpenFOAMによる解析結果例です。


    解析の詳細
    解析にあたり、以下を参考とさせていただきました。

    『ALE並列有限要素法による自由表面流れの非線形解析 Non-linear Analysis fo Free Surface Flows by ALE Parallel Finite Element Method』 田中、桜庭、樫山 第14回数値流体力学シンポジウム

    この文書において、スロッシング挙動時の自由表面位置に関してCFDと試験結果の比較がなされています。

    ・ 三次元矩形貯水槽内スロッシング解析
    ・ 貯水槽=幅1.0[m]、奥行0.1[m]、高さ1.0[m]
    ・ 流体=水(50%充填 、密度=1.0×10^3[kg/m3])
    ・ 付加外力=水平加速度 (Acc=Bω2sinωt、 B=0.0093[m]、ω=5.311[rad/sec])


    自由表面位置の推移:実験との比較



    タンクにかかる荷重値のNastranでの解析結果との比較
    ついでに、むかーし自作したCIPコードでのスロッシング解析結果とも比較。お、なかなかやるじゃん、俺。


    以下、ソースコードの修正箇所を参考として示します。 あまりセンスの良い修正ではないかと思いますが...。 「こうするべきだ!」というご指摘をいただければ幸いです。

    私の実力がまだまだなのが問題なのですが...本当は、MeshMotionでスロッシングさせたいんですよねぇ。 きっとできると思うのですが、まだ設定手法が良くわかりません。 どなたかご存知でしたら、どこかでサンプルを提供してもらえると感謝。


    追記
    OpenFOAM-1.3 , OpenFOAM-1.4.1 共に、以下の設定でMake&解析できました。
    ただし、OpenFOAM-1.4.1の場合、fvSolutionの内容が1.3から変更されているので注意が必要です。
    // interFoam.C int main(int argc, char *argv[]) { 略 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; // --- add by Giro start --- // Acc=Bw^2sin(wt) , B=0.0093[m] , w=5.311[rad/sec] Foam::vector gtans0(1.0,0.0,0.0); Foam::vector gtans1(0.0,-9.8,0.0); Foam::doubleScalar acc_g; Foam::doubleScalar B_g=0.0093; Foam::doubleScalar w_g=5.311; Foam::doubleScalar ww_g; // // よく判らない時のお約束。 // いろいろと出力させてみて、中身を見てみましょう。 // Info<< "g.dimensions() = " << g.dimensions() << endl; // Info<< "g.value() = " << g.value() << endl; // Info<< "ghf = " << ghf << endl; // // --- add by Giro end --- while (runTime.run()) { 略 runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; // --- add by Giro start --- // surfaceScalarField ghf("gh", g & mesh.Cf()); // surfaceScalarField ghf is constructed in createFields.H // According to the Programmer's Guide, // mesh.Cf() is the cartesian coordinates of the face centres // (Table 2.1, Sect. 2.3.2), // and "&" is the inner product ("dot-product") operator // (Table 1.2, Sect. 1.4.1). // ww_g=w_g*runTime.timeOutputValue(); acc_g=(B_g*w_g*w_g) * Foam::sin(ww_g); g.value()=gtans1 + acc_g*gtans0; // addition of gravity Info<< "g.value() = " << g.value() << endl; ghf=g & mesh.Cf(); // // --- add by Giro end --- 略 } Info<< "End\n" << endl; return(0); }


    さらに少しだけ修正を加えて、重力項の時間変化を外部ファイル入力にしてみました。 上述のソースコードにおいて、acc_gを計算式で解決する代わりに、外部入力とするだけです。
    これで、複雑な重力変化を簡単に表現できます。 問題は、重力項で制御する事で良いのか?という所ではありますが。
    例えば、荒波を超える船の中のタンク(LNGタンクとか)の中のスロッシングや (重力の方向が変わるというか船の傾きが変わるというか)、 宇宙船の中の燃料タンクなんかには使えるかな。 極単周期な地震波の表現として適当かどうかには、ちと疑問が残りますが、 長周期振動の表現としては使えるんじゃないでしょうか?

    適用した波形は、以下の波形です。この波形を横方向に適用しました。 鉛直方向には、常に9.8[m/s]を付加していますが、 もちろん、これも制御できます(以下で公開するサンプルでは一定にしてますが)。



    そして、解析の結果です。うーん、暴れまくってます。 そして、振動が無くなった後は、自己の持つ固有振動数(周波数)での揺れへと漸近して行きます。







    上の数値実験をさらに発展させました。 ○○地震で観測された加速度の3次元データを入手したので、 それに基づく解析を実施してみました。

    想定した水槽
    ・有効水深4m、幅3.6m、奥行き5.7m
    ・水深2mの水が入っている状態を想定

    想定した加速度
    データはgal表記だったのですが...私にはぜんぜんピンときません。 見慣れた [G] に換算してグラフ化しました。 なお、10分のデータがあったのですが、5分だけをグラフ化。 スペクトルデータで整理する方がカッコいいのでしょうが、それをやると何処のデータ化わかってしまう? そんな事も無いとは思うのですが、どこに迷惑になるとも限らないので、それは載せません。
    & Z方向が鉛直方向だと思うことにしてみた。
    へー、地震の後半は一定の周期性が強く見られるんですねぇ。 なんだろ、地形(地層構造?)に起因する固有振動数とかなのかな?




    解析結果)
    うーん、しょぼいPCでやっているせいでもあるが、 1分解くのに1日かかってしまっている...。

    で、以下は0〜65[sec]までの結果を3倍速で見たものです。ちょっと面白いぞ。



    で、以下は0〜252[sec]までの結果を3倍速で見たものです。 加速度が大きく低下した状態になっても、波が大きくなるタイミングがあります。 タンク内部流体の持つ固有振動数(スロッシング周波数)に合致するタイミングで揺れた状況を捉えているのでしょう。 コップの水が周期的に揺れているのに手の動きを軽くシンクロさせてやると、急に波が高くなるアレですね。 このまま10分までやっても、後処理が面倒くさいだけですので、このくらいでやめておきます。


    Google