1自由度のバネ‐マス‐ダンパー系のシミュレーションモデルを作成してみましょう。ここでは、バネとダンパー(減衰器)を表現する2つの方法を紹介します。まず本項で、“structural internal force”を“plugin variable”とともに用いる方法を紹介します。そして次項で、“deformable displacement joint”を用いる方法を紹介します。
図1のように、天井から吊り下げられたバネ‐マス‐ダンパー系を考えます。マスは M = 1kg、バネの自然長は L = 1m 、バネ定数は K = 20N/m とします。ダンパーは速度の大きさに比例する減衰力を速度と反対向きに与え、その比例定数(減衰定数)は C = 1Ns/m であるとします。マスをバネの自然長の位置から静かに放した時の、マスの運動を調べるシミュレーションモデルを作成します。ただし、重力加速度は g = 9.81m/s2 とし、マスは鉛直線上のみを運動するものとします。
本例題のシミュレーションモデルの設計図を図2に示します。バネが自然長を取っている初期状態でモデルを作成します。
staticなnode「Node_Ground」をグローバル座標系の原点にClampで固定します。マスのnode「Node_Mass」は z = - L = - 1 の位置に定義し、「Node_Ground」との間にin lineおよびprismaticジョイントを設けることによって、「Node_Mass」を z 軸上の1自由度に拘束します。「Node_Ground」と「Node_Mass」の間に、structural internal force「Force_SpringDamper」を定義し、これでバネ力および減衰力を表現します。
“structural internal force”は、2つのnodeの間に作用する力を定義する要素です。structural internal forceのステートメントの型は次のようになります。
force: <label>, { absolute | follower } internal, <node1 label>, position, <relative arm 1>, <node2 label>, position, <relative arm 2>, <force value>;
ここで、<relative arm>はnodeに対する作用点の相対座標、<force value>はtemplate drive callerで定める力の値です。<force value>の力はnode1に作用し、node2は反作用を受けます。absoluteを選択すると力の向きはグローバル座標系に対して常に一定に保たれ、followerを選択すると力の向きはnode1とともに変化します。
z を「Node_Mass」の z 座標、 vz を「Node_Mass」の z 方向速度とすると、「Force_SpringDamper」がバネ力と減衰力を表現するために発生すべき力は、次の式で与えられます。
この力の定義は、次のように行うことができます。
まず z と vz を“Plugin変数”「DZ」、「VZ」として定義します。
set: [node, DZ, Node_Mass, structural, string="X[3]"]; set: [node, VZ, Node_Mass, structural, string="XP[3]"];
Plugin変数の値は各シミュレーションステップで逐一更新されるので、ダイナミックな変数を使用したい場合に有効です。一般に、Plugin変数に代入することができるのは、nodeやelementの“Private Data”です。各nodeまたはelementのPrivate Dataについては公式のInput manualを参照してください。
次に、「Force_SpringDamper」をstring driveを用いて次のように定義します。
force: Force_SpringDamper, follower internal, Node_Mass, position, null, # relative arm Node_Ground, position, null, # relative arm single, 0., 0., 1., string, "-K*(DZ-(-L))-C*VZ"; # force value
例題8のバネ‐マス‐ダンパー系の解析を行うための入力ファイルの記述例を以下のコード1に示します。
# spring_mass_damper.mbd #----------------------------------------------------------------------------- # [Data Block] begin: data; problem: initial value; end: data; #----------------------------------------------------------------------------- # [<Problem> Block] begin: initial value; initial time: 0.; final time: 5.; time step: 1.e-3; max iterations: 10; tolerance: 1.e-6; end: initial value; #----------------------------------------------------------------------------- # [Control Data Block] begin: control data; output frequency: 10; structural nodes: 2; rigid bodies: 1; joints: 3; forces: 1; gravity; end: control data; #----------------------------------------------------------------------------- # Design Variables set: real M = 1.; #[kg] Mass set: real L = 1.; #[m] Spring Natural Length set: real K = 20.; #[N/m] Spring Stiffness Coefficient set: real C = 1; #[Ns/m] Damper Damping Coefficient #----------------------------------------------------------------------------- # Node Labels set: integer Node_Ground = 1; set: integer Node_Mass = 2; # Body Labels set: integer Body_Mass = 1; # Joint Labels set: integer JoClamp_Ground = 1; set: integer JoInLin_Ground_Mass = 2; set: integer JoPrism_Ground_Mass = 3; # Force Labels set: integer Force_SpringDamper = 1; #----------------------------------------------------------------------------- # [Nodes Block] begin: nodes; #----------------------------------------------------------------------------- # Nodes structural: Node_Ground, static, null, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: Node_Mass, dynamic, 0., 0., -L, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity end: nodes; #----------------------------------------------------------------------------- # Plugin Variables set: [node, DZ, Node_Mass, structural, string="X[3]"]; set: [node, VZ, Node_Mass, structural, string="XP[3]"]; #----------------------------------------------------------------------------- # [Elements Block] begin: elements; #----------------------------------------------------------------------------- # Bodies body: Body_Mass, Node_Mass, M, # mass null, # relative center of mass eye; # inertia matrix #----------------------------------------------------------------------------- # Joints joint: JoClamp_Ground, clamp, Node_Ground, null, # absolute position eye; # absolute orientation joint: JoInLin_Ground_Mass, in line, Node_Ground, null, # relative line position eye, # relative line orientation Node_Mass; joint: JoPrism_Ground_Mass, prismatic, Node_Ground, Node_Mass; #----------------------------------------------------------------------------- # Forces force: Force_SpringDamper, follower internal, Node_Mass, position, null, # relative arm Node_Ground, position, null, # relative arm single, 0., 0., 1., string, "-K*(DZ-(-L))-C*VZ"; # force value #----------------------------------------------------------------------------- # Gravity gravity: 0., 0., -1., const, 9.81; end: elements;
シミュレーション結果のアニメーションを動画1に示します。