例題1の入力ファイル「free_falling_body.mbd」の内容をあらためてコード1に示します。本項では、この入力ファイルの内容を少しづつ紐解いて行くことにしましょう。
# 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;
まず、全体の構成に注目してみましょう。コード1を見ると、いくつかのまとまりに分けられていることが分かります。これらのまとまりをブロック(block)と呼びます。基本的に、入力ファイルは次の5つのブロックで構成されます。
各ブロックは、beginステートメントで始まり、endステートメントで終わります。
begin: <block> ; ... end: <block>;
各ブロックにはそれぞれ異なる役割があり、そこに記述すべきデータも異なります。各ブロックの役割について、以下で簡単に説明します。
このブロックでは、解きたい問題の種類を指定します。現時点でサポートされている問題は、初期値問題(initial value problem)のみです。将来的には、現在開発途中の逆動力学問題(inverse dynamics problem)もサポートが期待されます。
このブロックでは、dataブロックで指定した問題の数値解析に関わる諸条件を設定します。現時点では初期値問題(initial value problem)のみサポートされているので、ブロックの記述は次のようになります。
begin: initial value; ... end: initial value;
初期値問題に対しては、例えば次のような条件を設定します。
このブロックには主に、シミュレーションモデル全体に共通する情報を記述します。特定のグローバルパラメータの値はここで設定します。また、どの種類の要素(nodeやelement)をそれぞれいくつ使うのかをここであらかじめ宣言します。
このブロックでは、“node”を定義します。nodeはシミュレーションモデルの自由度を担う要素です。
このブロックでは、“element”を定義します。elementはシミュレーションモデルを組み立てる構成要素です。例えば、剛体、ジョイント、力、重力などがelementに含まれます。
― 以上をまとめると、シミュレーションモデル自体はnodesブロックとelementsブロックで定義される“node”と“element”によって構成され、control dataブロックはモデルに関する補足的な情報を持ち、数値解析はdataブロックと<problem>ブロックの条件に従って行われるということになります。
さて、入力ファイルの基本構成が分かったところで、次はコード1の入力ファイルに書かれている内容を上から順番に見て行きましょう。
まず、第1行めには次のように書かれています。
# free_falling_body_1.mbd
これはコメントです。一般に、記号「#」からその行が終わるまでの間に書かれた文字はすべてコメントとみなされ、MBDynの処理上は無視されます。コメントを挿入する別の(特にコメントが複数行に渡る場合に便利な)方法として、「/*」と「*/」で挟む方法もあります。コメントは入力ファイル中のどこにでも挿入することができます。
次に、dataブロックを見てみましょう。
begin: data; problem: initial value; end: data;
ここでは、初期値問題(initial value problem)を解くことが宣言されています。
ところで、
problem: initial value;
のようなまとまりをステートメントと呼び、「problem」の部分をカード(card)、「initial value」の部分を引数(argument)と呼びます。一般に、ステートメントの構文は次のようになります。
<card> : <argument> ;
カードと引数の間にはコロン「:」が入り、ステートメントは必ずセミコロン「;」で終わります。引数は1つとは限りません。カードによっては、引数が無い場合もあれば、複数存在する場合もあります。引数が無い場合にはコロン「:」は必要ありません。また、引数が複数存在する場合には、コンマ「,」で区切って記述します。入力ファイルはステートメントの羅列によって構成されています。
次は、<problem>ブロックです。
begin: initial value; initial time: 0.; final time: 1.; time step: 1.e-3; max iterations: 10; tolerance: 1.e-6; end: initial value;
ここでは、初期値問題(initial value problem)を数値積分によって解く際に必要な諸条件が設定されています。この例の場合、時刻0秒から時刻1秒まで、時間刻み1e-3(=0.001)秒で数値積分するように設定されています。time step、max iterations、toleranceなどの条件は通常、計算コストと計算精度のトレードオフを考慮しながら設定します。この他にも様々な条件が設定可能ですが、詳細については公式のInput manualを参照してください。
ところで、数値を記述している箇所で、数に少数点(ピリオド「.」)が付いている場合と付いていない場合があることに気付くでしょう。これは、MBDynでは整数(integer)と実数(real)が厳密に区別されるためです。一般的なルールとしては、実数として処理したい数値には小数点を付け、整数として処理したい数値には小数点を付けません。この区別は数学演算を伴う場合に特に重要です。例えば、3./5.は0.6として処理され、3/5は0として処理されます。
では次に、control dataブロックに進みましょう。
begin: control data; structural nodes: 1; rigid bodies: 1; gravity; end: control data;
ここでは、次に来るnodesブロックとelementsブロックで定義するnodeとelementの種類と数をあらかじめ宣言します。この例では、“structural node”と“rigid body”を1つずつ、そして重力(gravity)を使用することを宣言しています。
さて、ここまでで例題1の入力ファイル「free_falling_body.mbd」のdataブロック、<problem>ブロック、control dataブロックの内容を解説しました。残りのnodesブロックとelementsブロックの内容については次項で解説します。