rigidBodyMotion
OpenFOAMのrigidBodyMotionでは、複雑な物体の動きを表現することができます。
例えば、OpenFOAMのチュートリアル
$FOAM_TUTORIALS/multiphase/overInterDyMFoam/rigidBodyHull
では、船体と一緒に動くプロペラの回転をrigidBodyMotionで模擬しています。
この機能を使用して、二重振り子の計算を行ってみました。
ケースファイル
こちらにOpenFOAM v2212で動作確認をしたケースファイルが置いてあります。
dynamicMeshDictの設定
物体は上の動画の赤い物体「box1」と青い物体「box2」の2つが定義されています。「box1」は絶対座標系で$(0, 0, 1)$の位置に紐でつながっていて、「box2」は「box1」に紐でつながっています。(もちろん、紐と言っても剛体を想定しています。)
まず、「box1」の設定から見てみましょう。
box1の設定
box1
{
type cuboid;
parent root;
mass 5;
L (0.1 0.1 0.1);
centerOfMass (-1.0 0.0 0.0);
joint
{
type Ry;
}
transform (1 0 0 0 1 0 0 0 1) (0.0 0.0 1.0);
patches (box1);
innerDistance 100;
outerDistance 200;
}
物体は、「cuboid」というタイプで定義されていて、mass
で物体の質量、L
で直方体の各方向の長さを定義します。これらの設定を使って、慣性モーメントの値は自動的に計算されます。
transform
は、この物体の運動についての原点の位置の設定です。parent
がroot
に指定されているので、絶対座標系に対してこの値を定義します。設定の最初のカッコが回転移動を表すテンソル、次のカッコが並進移動を表すベクトルになっています。「box1」は$(0, 0, 1)$の位置で固定された紐につながっているので、transform
の2つ目のカッコの設定が(0.0 0.0 1.0)
になっています。
centerOfMass
は重心位置の設定です。この物体の運動の原点位置$(0, 0, 1)$からの相対座標値で設定します。「box1」の初期位置は、振り子の中心位置から$x$方向に$-1$離れた点ですので、(-1.0 0.0 0.0)
に設定しています。
box2の設定
box2
{
type cuboid;
parent box1;
mass 5;
L (0.1 0.1 0.1);
centreOfMass (-1.0 0.0 0.0);
joint
{
type Ry;
}
transform (1 0 0 0 1 0 0 0 1) (-1.0 0.0 0.0);
patches (box2);
innerDistance 100;
outerDistance 200;
}
「box2」は、「box1」と紐でつながっています。つまり、「box2」は移動する「box1」まわりに回転するように定義する必要があるので、parent
はbox1
に設定します。
transform
で設定する「box2」の運動の原点は「box1」のある位置です。parent
がbox1
に設定されているので、transform
は「box1」の運動の原点位置に対する相対座標値で設定します。「box1」の初期位置は「box1」の運動の原点に対して$x$方向に-1離れた点ですので、transform
の2つ目のカッコの設定は(-1.0 0.0 0.0)
にします。
centerOfMass
は「box1」と同じように、この物体の運動の原点位置からの相対座標値で設定するので、(-1.0 0.0 0.0)
にします。