前々項と前項で、例題1の入力ファイル「free_falling_body.mbd」(コード1にあらためて示します)のコード全ての意味を解説しました。本項では、この入力ファイルをより読みやすくする工夫をいくつか紹介します。MBDynの入力形式はとても柔軟性が高く、ちょっとした工夫を施すことで、読みやすく効果的な入力ファイルを作成することができます。入力ファイルを読みやすくすることは、今後複雑なシミュレーションモデルを構築する際に重要となります。
# free_falling_body.mbd begin: data; problem: initial value; end: data; begin: initial value; initial time: 0.; final time: 1.; time step: 1.e-3; max iterations: 10; tolerance: 1.e-6; end: initial value; begin: control data; structural nodes: 1; rigid bodies: 1; gravity; end: control data; begin: nodes; structural: 1, dynamic, null, eye, 0., 3., 0., null; end: nodes; begin: elements; body: 1, 1, 1., null, eye; gravity: 0., 0., -1., const, 9.81; end: elements;
MBDynは余分なスペース(空白)は無視してくれます。ですから、スペースを自由自在に使って、インデントをつけたり、数字を揃えるなどして、コードを視覚的に分かりやすくしましょう。
MBDynでは、ほぼ自由に改行することができます。意味のあるまとまりごとに改行し、1列あたりの情報を少なくすることでコードが見やすくなります。
MBDynでは、ステートメントの途中でもコメントを挿入することができます。改行とコメントを組み合わせれば、長く複雑なステートメントも分かりやすくすることができます。
“set”カードを用いて変数を定義することができます。setカードは入力ファイル中のどこでも(ブロック外でも)使うことができ、例えば、次のステートメントは実数の変数「Vy0」を作成し、数値「3」を代入します。
set: real Vy0 = 3.;
このように定義した変数は、普通の数値と同様に扱うことができます。変数を用いれば数値をまとめて変えやすいので、後で変える可能性が高い数は変数にしておくと便利でしょう。
変数を用いるメリットは、数値をまとめて変えやすいということ以外にもう一つあります。それは、数値を名前で扱うことができるため、より説明的にコードを書くことができることです。例えば、円の面積を数値として記述する必要があるときに、「Radius」を変数として、
pi*Radius^2
と記述してあれば、それが何の数値か一目瞭然です。同様に、nodeやbodyのラベルを変数にして分かりやすい名前を付けておけば、ラベルが管理しやすくなります。
以上の工夫を用いて書き直した例題1の入力ファイルを下のコード2に示します。いかがでしょうか?コード1よりも読みやすくなっているのではないでしょうか?本チュートリアルでは、今後このようなスタイルで入力ファイルのコードを書いて行きます。勿論、このスタイルが唯一ではありませんし、最善とも限りません。本項で紹介した工夫をヒントに、より良いスタイルを探求してみてください。
# free_falling_body_E.mbd begin: data; problem: initial value; end: data; begin: initial value; initial time: 0.; final time: 1.; time step: 1.e-3; max iterations: 10; tolerance: 1.e-6; end: initial value; begin: control data; structural nodes: 1; rigid bodies: 1; gravity; end: control data; # Design Variables set: real Vy0 = 3.; #[m/s] Initial horizontal speed set: real M = 1.; #[kg] Mass of the ball # Node Labels set: integer Node_Ball = 1; # Body Labels set: integer Body_Ball = 1; begin: nodes; structural: Node_Ball, dynamic, null, # absolute position eye, # absolute orientation 0., Vy0, 0., # absolute velocity null; # absolute angular velocity end: nodes; begin: elements; body: Body_Ball, Node_Ball, M, # mass null, # relative center of mass eye; # inertia matrix gravity: 0., 0., -1., const, 9.81; end: elements;