前項に引き続き、クランク‐スライダ機構のシミュレーションモデルを作成します。本項では特に、“axial rotation”ジョイントと“drive caller”によってクランクに動力を与える方法について説明します。最後に全体の入力ファイルとシミュレーション結果のアニメーションを示します。
このジョイントはrevolute hinge(第14項参照)と同等な拘束に加え、任意の角速度を与えることができるジョイントです。axial rotationを定義する基本的なステートメントの型は次のようになります。
joint: <label>,
axial rotation,
<node 1>,
<relative offset 1>,
hinge, <relative orientation matrix 1>,
<node 2>,
<relative offset 2>,
hinge, <relative orientation matrix 2>,
<angular velocity>;
ここで、 <relative offset 1>と<relative orientation matrix 1>、および <relative offset 2>と<relative orientation matrix 2>によって定義される2つの相対座標系の z 軸が回転軸になります。2つの相対座標系は一致させます。<angular velocity>は入力する角速度で、“drive caller”と呼ばれるオブジェクトによって指定します。drive callerについては以下で説明します。
強制変位や力などを定義する要素に対して時間依存の入力を与える必要がある場合には、drive callerと呼ばれるオブジェクトを使用します。drive callerは基本的には時間依存のスカラー関数です。種類によって時間依存性が陽の場合もあれば、陰の場合もあります(陰の場合には、状態変数に依存する入力をdrive callerで与えるので、実質的にフィードバックを形成します)。drive callerの例としては、正弦波入力を与える“sine drive”、一定値入力を与える“constant drive”などがあります。最も汎用的な“string drive”では任意の陽または陰の時間関数を入力することができます(第22項参照)。また、ファイルに記述されたデータを入力する“file drive”なども用意されています。drive callerは多くの種類がありますので、詳しくは公式のInput manualを参照してください。
本例題では、axial rotationジョイントの角速度入力として、“ramp drive”を使用します。ramp driveの型は次のようになります。(図1参照)
ramp,
<slope>,
<initial time>,
{ forever | <final time> },
<initial value>
本例題のクランク‐スライダ機構のシミュレーションモデルにおいて、クランクはaxial rotationジョイントで「Node_Ground」に取り付け、axial rotationの角速度入力はramp driveで与えます。角速度は、時刻1(s)までの間に静止状態から2π(rad/s)まで上昇させ、その後一定に保ちます。
set: integer JoAxrot_Ground_Crank = 2;
joint: JoAxrot_Ground_Crank,
axial rotation,
Node_Ground,
null, # relative offset
hinge, eye, # relative orientation
Node_Crank,
-Length_Crank/2., 0., 0., # relative offset
hinge, eye, # relative orientation
ramp, 2.*pi, 0., 1., 0.; # angular velocity
以上を踏まえて作成した、例題5のクランク‐スライダ機構の解析を行うための入力ファイルをコード1に示します。コードの行数が多いので、区切り線によって見やすくしています。
# crank_slider.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-2;
max iterations: 10;
tolerance: 1.e-6;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
structural nodes: 4;
rigid bodies: 3;
joints: 6;
end: control data;
#-----------------------------------------------------------------------------
# Design Variables
set: real Mass_Crank = 1.;
set: real Mass_Conrod = 1.;
set: real Mass_Slider = 1.;
set: real Length_Crank = 0.2;
set: real Length_Conrod = 0.4;
set: real Offset_Slider = 0.05;
#-----------------------------------------------------------------------------
# Reference Labels
set: integer Ref_Conrod = 1;
# Node Labels
set: integer Node_Ground = 1;
set: integer Node_Crank = 2;
set: integer Node_Conrod = 3;
set: integer Node_Slider = 4;
# Body Labels
set: integer Body_Crank = 1;
set: integer Body_Conrod = 2;
set: integer Body_Slider = 3;
# Joint Labels
set: integer JoClamp_Ground = 1;
set: integer JoAxrot_Ground_Crank = 2;
set: integer JoRevh_Crank_Conrod = 3;
set: integer JoInlin_Conrod_Slider = 4;
set: integer JoInlin_Ground_Slider = 5;
set: integer JoPrism_Ground_Slider = 6;
#-----------------------------------------------------------------------------
# Intermediate Variables
set: real Izz_Crank = Mass_Crank*Length_Crank^2./12.;
set: real Izz_Conrod = Mass_Conrod*Length_Conrod^2./12.;
#-----------------------------------------------------------------------------
# References
reference: Ref_Conrod,
Length_Crank, 0., 0., # absolute position
euler, 0., 0., asin(Offset_Slider/Length_Conrod), # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
#-----------------------------------------------------------------------------
# Nodes
structural: Node_Ground, static,
0., 0., 0., # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
structural: Node_Crank, dynamic,
Length_Crank/2., 0., 0., # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
structural: Node_Conrod, dynamic,
reference, Ref_Conrod, Length_Conrod/2., 0., 0., # absolute position
reference, Ref_Conrod, eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
structural: Node_Slider, dynamic,
reference, Ref_Conrod, Length_Conrod, 0., 0., # absolute position
eye, # absolute orientation
null, # absolute velocity
null; # absolute angular velocity
end: nodes;
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
#-----------------------------------------------------------------------------
# Bodies
body: Body_Crank, Node_Crank,
Mass_Crank, # mass
null, # relative center of mass
diag, 1., 1., Izz_Crank; # inertia matrix
body: Body_Conrod, Node_Conrod,
Mass_Conrod, # mass
null, # relative center of mass
diag, 1., 1., Izz_Conrod; # inertia matrix
body: Body_Slider, Node_Slider,
Mass_Slider, # mass
null, # relative center of mass
eye; # inertia matrix
#-----------------------------------------------------------------------------
# Joints
joint: JoClamp_Ground,
clamp,
Node_Ground,
null, # absolute position
eye; # absolute orientation
joint: JoAxrot_Ground_Crank,
axial rotation,
Node_Ground,
null, # relative offset
hinge, eye, # relative orientation
Node_Crank,
-Length_Crank/2., 0., 0., # relative offset
hinge, eye, # relative orientation
ramp, 2.*pi, 0., 1., 0.; # angular velocity
joint: JoRevh_Crank_Conrod,
revolute hinge,
Node_Crank,
reference, Ref_Conrod, null, # relative offset
hinge, reference, Ref_Conrod, eye, # relative axis orientation
Node_Conrod,
reference, Ref_Conrod, null, # relative offset
hinge, reference, Ref_Conrod, eye; # relative axis orientation
joint: JoInlin_Conrod_Slider,
in line,
Node_Conrod,
Length_Conrod/2., 0., 0., # relative line position
eye, # relative orientation
Node_Slider;
joint: JoInlin_Ground_Slider,
in line,
Node_Ground,
0., Offset_Slider, 0., # relative line position
1, 0., 0., -1., 3, 1., 0., 0., # relative orientation
Node_Slider;
joint: JoPrism_Ground_Slider,
prismatic,
Node_Ground,
Node_Slider;
end: elements;
シミュレーション結果のアニメーションを動画1に示します。