本項では、外部からの力を表現する“structural force”要素を紹介します。また、structural forceを定義するのに必要な“template drive caller”オブジェクトについて説明します。
例題5で作成したクランク‐スライダ機構のシミュレーションモデルにおいて、スライダに外力が働く場合を考えてみましょう。図1に示すようにスライダに外力が働くとして、入力ファイルを書き直してみます。
外部から働く力は“structural force”要素で表現します。structural forceのステートメントの型は次のようになります。
force: <label>, { absolute | follower }, <node label>, position, <relative arm>, <force value>;
ここで、<node label>は作用対象のnodeのラベル、<relative arm>は作用点のnodeに対する相対座標です。また<force value>はtemplate drive callerオブジェクトによって指定される力の時間関数です。template drive callerについては以下で説明します。
absoluteとfollowerのどちらかを選択します。absoluteを選択すると、力の向きはグローバル座標系に対して常に一定に保たれます。一方、followerを選択すると、力の向きはnodeとともに変化します。
第18項で紹介したdrive callerは、時間依存のスカラー、つまり1次元の入力でした。“template drive caller”は、多次元の入力を与える必要がある場合に用います。例えば、3次元ベクトルや6次元ベクトルの入力が必要な場合です。次の4種類のtemplate drive callerがあります。
nullは零ベクトルを表し、「何も入力しない」ことを意味します。
singleは次のように記述し、基準ベクトルとゲインによって多次元の入力を定義します。
single, <entity>, <drive caller>
ここで、<entity>は一定の基準ベクトル、<drive caller>は時間依存のゲインです。
componentは次のように記述し、多次元の入力を成分ごとに定義します。この場合は、次元の数だけdrive callerが必要です。
component, { inactive | <drive caller> }, { inactive | <drive caller> }, ...
arrayについての説明はここでは省略します。
例題5のクランク‐スライダ機構のシミュレーションモデルに、F = 50(N) の一定スライダ外力をstructural forceによって追加します。スライダは1自由度しか持たないので、作用点はどこでも構いません。「Node_Slider」の位置を作用点とすれば簡単でしょう。以下は、-x方向のスライダ外力を、template drive callerのsingleによって定義します。
set: integer FoStr_Slider = 1; force: FoStr_Slider, absolute, Node_Slider, position, null, # relative arm single, -1, 0, 0, const, 50; # force value
コード1に、スライダ外力を追加した例題6のクランク‐スライダ機構モデルの入力ファイルの全体を示します。structural force要素を追加した最後の箇所以外は例題5の入力ファイルとほとんど同じですが、control dataブロック内でforcesの項が追加されていることに注目してください。
# crank_slider_2.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; forces: 1; 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; # Force Labels set: integer FoStr_Slider = 1; #----------------------------------------------------------------------------- # 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; #----------------------------------------------------------------------------- # Forces force: FoStr_Slider, absolute, Node_Slider, position, null, # relative arm single, -1, 0, 0, const, 50; # force value end: elements;