ESI版でのMRFに関して

206 views
Skip to first unread message

Keisuke Shima

unread,
May 15, 2023, 1:14:47 AM5/15/23
to OpenFOAM
初めて投稿させていただきます。
現在、OpenFOAM-2.4.0を用いて培養槽の周回振とう解析を行っております。現在はver2.4.0を使用していますが、比較的最近のバージョン(ESI版 v2112くらい?)に置き換えていきたいと考えております。
周回振とうの解析にはMRFを用いていますが、この設定がver2.4.0とver2.4.0以降(以降、新版)ではかなり異なっているようでした。

ver2.4.0版ではsystem/fvOptions内で回転速度などのパラメータを設定していますが、新版ではconstant/MRFpropertiesで設定を行っていることはわかりました。

ver2.4.0で実装していた時は
finiteVolume/cfdTools/general/MRF
fvOptions/sources/derived/MRFSource
を編集し、新たな外力項を設定していました。
新版ではデフォルトでコリオリ力の計算のものは組み込まれていますが、ver2.4.0のように外力項を自作する場合どのようなファイルを編集すればよいか(どのファイルを元にすればよいか)わかりません。

どなたか方法がわかる方がいらっしゃいましたらご教授いただけましたら幸いです。
よろしくお願いいたします。

M.TANAKA

unread,
May 15, 2023, 7:24:35 AM5/15/23
to OpenFOAM
Keisuke Shimaさん

こんばんは、M.TANAKAと申します。ESI版でMRFですと、このtutorialが参考になるかと思います。
tutorials/incompressible/simpleFoam/mixerVessel2D/constant/MRFProperties · master · Development / openfoam · GitLab

2023年5月15日月曜日 14:14:47 UTC+9 Keisuke Shima:

M.TANAKA

unread,
May 27, 2023, 6:58:31 AM5/27/23
to OpenFOAM
Keisuke Shimaさん

すみません、読み飛ばしていました。
> 新たな外力項を設定していました。
遠心力やコリオリ力のような回転に伴う力に加えて、別の種類の力が作用するような系を解析されているということでしょうか?
その場合、MRFProperties以外の設定ファイル(constant/g, constant/fvOptionsとか)が必要になる気がします。
>培養槽の周回振とう
から察するに、固定された軸回りに定常回転するような運動ではないように思いますが、どのような運動か不勉強で分かりません…
運動の様子をもう少し詳しく説明していただけると、皆さんコメントしやすいのではないかと思います。

よろしくお願いします。
2023年5月15日月曜日 20:24:35 UTC+9 M.TANAKA:

Keisuke Shima

unread,
May 27, 2023, 11:52:04 AM5/27/23
to OpenFOAM
M.TANAKA 様

お返事が大変遅くなり申し訳ありません。

ご指摘のとおり、容器自体が振盪するような系の計算を行なっております。以下、図を添付させていただきます。Tank自体が原点を中心として回転するようなケースです。

OpenFOAM-2.4.0ではconstant/gやsystem/fvOptionsで設定を行っていましたが、以降のverではsystem内のfvOptionsが廃止されているようでconstant/MRFpropertiesへ置き換わっているようです。過去にCFD-Onlineで類似した質問があったようですので添付させていただきます。(解決には至っていない模様です)

これまでの新たな撹拌の設定はsrc/fvOptions/sources/derived/MRFSourceを参考に作成していましたが、新たなverになるとこの部分も色々変わっているようでして、この部分の代替となるものの手法がわからず、苦戦している状態です。

この部分に関して、何かご教授いただけましたら幸いです。
よろしくお願いいたします。

fig1.rot.png


2023年5月27日土曜日 19:58:31 UTC+9 M.TANAKA:

M.TANAKA

unread,
May 28, 2023, 12:15:20 AM5/28/23
to OpenFOAM
Keisuke Shimaさん

M.TANAKAです。ちょっと整理させてください。
①課題の明確化
解決したいのは、「OpenFOAM2.4.0と同等の設定の記述方法が分からないこと」ですか?それとも、「同等の設定を行うと解析時にエラーが生じること」ですか?
前者であれば、上で引用されたCFD-Onlineの記述で特に誤りはないように思えます(彼らの環境でエラーが生じる理由は分かりませんが)。そのままShimaさんの手元のケースをこれに倣って書き換えてみてはいかがでしょうか。
後者であれば、まずどのような不具合が起きているのかの情報を共有いただきたいです。例えば、ソルバのログファイルなどです。

②対象とする系とそのモデル化
想定する運動を実現できる解析設定になっているのか気になりました。
運動の様子についてもう少し詳しく聞きたいのですが、「公転」するTankは、ハンマー投げの球のように常に同じ面がOrbitの中心(Oとします)を向いているのでしょうか?それとも、系の外部から見てTankの角度が不変なように「公転」とは反対方向に同じ角速度で「自転」もしているのでしょうか?(後者なのではと予想します)

後者の場合、2つの回転運動の複合なのでMRFの設定も2つ必要になると思います。元のfvOptionsには2つのMRF設定がこんな風に書いていたりしませんか?(※それが実際に実行できるかは私は経験がありません。想像で書いています)

MRF1
{
    type            MRFSource;
    ...
    MRFSourceCoeffs
    {
        ...
origin (-1 0 0); // 「公転」の中心
        axis   (0 0 1); // 反時計回り
        omega  constant 314.16;
    }
}

MRF2
{
    type            MRFSource;
    ...
    MRFSourceCoeffs
    {
        ...
origin (0 0 0); // 「自転」の中心
        axis   (0 0 -1); // 時計回り
        omega  constant 314.16;
    }
}

(余談)
 私の乏しい経験では、非定常流れにMRFを適用するのは(可能とは思いますが)なんとなく収まりの悪い感じがするので、ダイナミックメッシュで実際にTankを運動させてしまっても良いのではと感じます。例えばこちらのチュートリアルをベースに新たに作るという手も、選択肢としてはあります。
 解説しているらしきYouTube動画:https://youtu.be/B6ruOYWpPdI?t=1117

とはいえ、既存の2.4.0用ケースがエラーなく解析可能であり、かつ妥当な計算結果を与えているなら、上の話は気にせずただ書き換えればよいだけではあります。

よろしくお願いします。
2023年5月28日日曜日 0:52:04 UTC+9 Keisuke Shima:

Keisuke Shima

unread,
May 30, 2023, 3:49:48 AM5/30/23
to OpenFOAM
M.TANAKA 様

お返事いただきましてありがとうございます。
まず、今回ご質問させていただきたいことは前者の「OpenFOAM2.4.0と同等の設定の記述方法が分からないこと」です。OpenFOAMのバージョンを変えたときにどの部分が対応するかを知りたいというものです。
撹拌の手法に関してですが、私の言葉足らずで申し訳ありません。系の外部から見ると容器は中心点を基準に公転しており、常に同じ面が見えていることになります。(振とう培養という手法です。)

OpenFOAM2.4.0版ではこのようにして撹拌を再現していました。
void Foam::MRFZone::addnewmethod
(
    const volVectorField& U,
    volVectorField& ddtU
) const
{
    if (cellZoneID_ == -1)
    {
        return;
    }
    const labelList& cells = mesh_.cellZones()[cellZoneID_];
    vectorField& ddtUc = ddtU.internalField();
    scalar t =U.mesh().time().value();
    vector ex = vector(1, 0, 0);
    vector ey = vector(0, 1, 0);
    scalar rg = mag(origin_);
    const vector Omega = this->Omega();
    scalar omega =mag(Omega);
    scalar sinot =Foam::sin(omega*t);
    scalar cosot =Foam::cos(omega*t);
    forAll(cells, i)
    {
        label celli = cells[i];
        ddtUc[celli] += (-1)*omega*omega*rg*(cosot*ex -sinot*ey);
    }
}

ご指摘の通り、MRFを2段重ねることも試してみたいと思います。

過去にダイナミックメッシュを用いた撹拌翼解析も行ったことがあるのですが、解析時間が長かったり、いろいろ代替できないかと思い今はMRFを使っておりまして、、、
ダイナミックメッシュで再現してしまうのもアリかもしれません。

一度試してみます。ご教授いただきましてありがとうございます。


2023年5月28日日曜日 13:15:20 UTC+9 M.TANAKA:

mizuki

unread,
May 30, 2023, 11:31:51 AM5/30/23
to OpenFOAM
MRF専用機能ではありませんが、
fvOptionのcodedで任意の外力を設定できます。
ご参考までに。
2023年5月30日火曜日 16:49:48 UTC+9 Keisuke Shima:

M.TANAKA

unread,
Jun 2, 2023, 11:05:40 AM6/2/23
to OpenFOAM
Keisuke Shimaさん

お返事遅くなりすみません。M.TANAKAです。
>系の外部から見ると容器は中心点を基準に公転しており、常に同じ面が見えていることになります。
でしたら回転は1つで良さそうですね。
(疑問)現象として、定常解で流体は容器に対して静止することになり攪拌は起きなさそうですが、「振とう」という現象はそういうものなのでしょうか?角速度が加減速を繰り返すなら攪拌されそうですが。

> OpenFOAM2.4.0版ではこのようにして撹拌を再現していました。
なんとなく話が嚙み合っていなかった原因が分かりました。そもそも2.4.0用の記法から違っていたのですね。
初めにこのケースを作った人は、相当OpenFOAMに詳しかったようですね。引用されている箇所の前後はcoded #{ ... #}みたいなので囲われている感じでしょうか?私にはちょっと読み解けませんが、C++のレベルでMRFを独自実装されている雰囲気ですね。
想像ですが、2.4.0よりさらに昔はMRFが標準機能でなかったりして、その名残を2.4.0になっても利用していたのかもしれません。
今は標準でMRFPropertiesにいくつかのエンティティを記述するだけでOKです(C++の知識不要です)。
意味は「MRFProperties how to」とかで調べると何かしら出てくるとは思いますが、簡単に:

MRF1 { 
    cellZone rotor; // (疑似的に)回転する領域に対応したcellZoneの指定。先だってtopoSetDictか、snappyHexMesh内でcellZoneを生成する記述があるはず。
    active yes; 

    // Fixed patches (by default they 'move' with the MRF zone) 
    nonRotatingPatches (); // 回転しないパッチの指定。例えばファンの解析で、ケーシングの一部が回転領域内に入っている場合などで使う。
    origin (0 0 0); // 回転軸が通る点。
    axis (0 0 1); // 回転軸の方向。右手系=z+から見ると反時計回り。
    omega 104.72; // 回転角速度。rad/s
}

2023年5月31日水曜日 0:31:51 UTC+9 mizuki:

M.TANAKA

unread,
Jun 2, 2023, 9:09:01 PM6/2/23
to OpenFOAM
あ、全てのセルに回転を適用したいなら、cellZoneを生成しなくても
    cellZone all;
と指定するだけで良いはずです。

2023年6月3日土曜日 0:05:40 UTC+9 M.TANAKA:

Keisuke Shima

unread,
Jun 12, 2023, 3:57:27 AM6/12/23
to OpenFOAM
M. TANAKA様 mizuki様

お世話になります。
お返事遅れまして申し訳ありません。

ご提案いただいた手法を様々検討しております。
ご指摘の通り過去にこのver2.4.0のソルバーを作った方はかなりOpenFOAMとC++に精通していたようでして。
ただ、MRFの機能を使うというよりソルバーにそのまま組み込んだ方がやりやすい気がしてきました。
というのも、これまでMRFを使っているとばかり思っていましたが、どうも様々意見を頂戴しているうちに単なる外力項補正をしているだけなのではと感じてきまして。

進展ありましたらご報告させていただきます。


2023年6月3日土曜日 10:09:01 UTC+9 M.TANAKA:
Reply all
Reply to author
Forward
0 new messages