rotatingMotion をベースにしたとき境界面情報を取得する方法

101 views
Skip to first unread message

skasai

unread,
Apr 22, 2024, 10:30:06 PMApr 22
to OpenFOAM
こんにちは,
流体力で回転させるための solidbodyMotionFunction を作りたいです.

の FDRotatingMotion に相当しまして,私のやりたいことはこれそのものです.

現在, rotatingMotion.C (.H) をベースにして取り組んでいますが,物体境界面のセルやフェイスのデータや圧力を取得することができず(わからず),回転力やトルクの算出に至っていません.

解決方法をご教授いただきたく存じます.



k k

unread,
May 12, 2024, 9:00:10 AMMay 12
to OpenFOAM
こんにちは。kです。

どういったことがしたいのか(全く同じことがしたいのか、さらにカスタイマイズしたいのか)、私が理解できておらず、ずれた回答していたらすみません。
ただのヒントくらいにしかなりませんが、「物体境界面のセルやフェイスのデータや圧力を取得」だけでしたら、このあたりの記事が参考にできると思います。


fvMeshクラスを使うと、境界面情報のboundaryメソッドが使えて、境界面の名前でidを取得できるイメージです。

                const fvMesh& mesh = refCast<const fvMesh>(d.db());
 
                const label id = mesh.boundary().findPatchID("inlet");// パッチ面に対応したidを取得
                const fvPatch& patch = mesh.boundary()[id]; // idからパッチ情報を取得
fvPatchクラスで作ったpatchからさらに、 volScalarFieldや surfaceScalarFieldなどでセルデータやフェイスデータが取得できます。

あくまで一例ですが、イメージは fvPatchを使えればあとはだいたいセルやフェイス情報は取得できる感覚です。

よろしくお願いいたします。


2024年4月23日火曜日 11:30:06 UTC+9 skasai:

skasai

unread,
May 15, 2024, 1:58:28 AMMay 15
to OpenFOAM
k さん,こんにちは,回答をありがとうございます.

やりたいこと自体は,Chenらの FDRotatingMotion そのものでして...


rotatingMotion.Cを forceDriveMotion.C としてコピーし,transformation() 内に fvMesh を宣言すると

Foam::septernion
Foam::solidBodyMotionFunctions::forceDriveMotion:: transformation() const
{
//
fvMesh& mymesh;
forAll(mymesh.cells(), cell_id)
{
Info << "cell_id = " << cell_id << endl;
}

motionSolvers/displacement/solidBody/solidBodyMotionFunctions/forceDriveMotion/forceDriveMotion.C:77:13: error: ‘mymesh’ declared as reference but not initialized
77 | fvMesh& mymesh;

↑のように怒られてしまいます.
なので,transformation() 内で境界面情報を取得するには,別のアプローチになるのかしら~,と感じている状態です.

これから,ご回答の refCast を試してみます,引き続き情報を頂けるとありがたく存じます.



2024年5月12日日曜日 22:00:10 UTC+9 k k:

skasai

unread,
May 15, 2024, 4:44:34 AMMay 15
to OpenFOAM
試行しました

Foam::septernion
Foam::solidBodyMotionFunctions::forceDriveMotion::transformation() const
{
    scalar t = time_.value();

    //
    const fvMesh& mymesh = refCast<const fvMesh>(d.db());

    // Rotation around axis
    scalar angle = omega_->integrate(0, t);

    quaternion R(axis_, angle);
    septernion TR(septernion(-origin_)*R*septernion(origin_));

    DebugInFunction << "Time = " << t << " transformation: " << TR << endl;

    return TR;
}

↑ですと,dを宣言していないから↓のように怒られ

motionSolvers/displacement/solidBody/solidBodyMotionFunctions/forceDriveMotion/forceDriveMotion.C:76:50: error: ‘d’ was not declared in this scope
   76 |     const fvMesh& mymesh = refCast<const fvMesh>(d.db());


仕方なく,
    //
    const IOdictionary& d = static_cast<const IOdictionary&>(dict.parent().parent());
    const fvMesh& mymesh = refCast<const fvMesh>(d.db());

とすると,やはりdictの宣言で怒られ↓

motionSolvers/displacement/solidBody/solidBodyMotionFunctions/forceDriveMotion/forceDriveMotion.C:76:62: error: ‘dict’ was not declared in this scope
   76 |     const IOdictionary& d = static_cast<const IOdictionary&>(dict.parent().parent());


#include "fvMesh.H"
の他にincludeしなければならないファイルがあるのでしょうか?

困りました.






2024年5月15日水曜日 14:58:28 UTC+9 skasai:
Reply all
Reply to author
Forward
0 new messages