Activate で Modelica を使ってみる(その5) - Modelica 言語の初歩(第1回)
Activate で Modelica を使ってみる(その5)
Modelica 言語の初歩 – バネマスモデルの理解(第1回)
今回から3回に分けてModelica 言語の初歩的な知識について紹介します。今回は “その1” の回で作成したバネマスモデル内の Spring コンポーネントがどのように Modelica 言語で構築されているかを説明します。ちなみに、ここでの目的はあくまで Modelica 標準ライブラリの内容を理解することであり、Modelica言語を用いてゼロからコーディングするために必要な知識を紹介することではありません。それゆえ、Modelica 言語を網羅的に紹介するつもりはないことをあらかじめご了承ください。
Modelica コード参照方法
まずは、Modelica ライブラリの各コンポーネントの Modelica ソースコードを Activate から参照する方法を紹介します。Modelica ソースコードは各コンポーネントのヘルプから参照することが可能です。例えば Spring コンポーネントであれば以下のような手順になります。
モデル内の Spring を右クリックし表示されたメニューから “ヘルプ” を選択します。
表示されたヘルプの最下段の “Spring source code” をクリックします。
Spring コンポーネントのソースコードが以下のように表示されます。
ただし、この方法で得られるのは Modelica 標準ライブラリの一部のコンポーネントに対してのみです。全てのコンポーネントの Modelica コードを参照するには Modelica 協会のウェブサイトから MSL(Modelica 標準ライブラリ)のソースコードをダウンロードするようにしてください。
Spring コンポーネントの Modelica コード
Spring コンポーネントの Modelica コードは model(Modelica でのクラスの一種でコンポーネントを定義するためのクラス)として定義されており、model Springで始まり end Springで終わります。
この Modelica コードの中にはシミュレーション結果に影響を及ぼさない、annotation と呼ばれる部分とコメントが多く含まれています。コメントはコードを分かりやすくしたりユーザーインターフェースの表示に使用されたりします。また annotation はコンポーネントのアイコン形状を定義したり、ヘルプのドキュメントを定義したりするのに使用されます。コードを読みやすくするためにこれらのコメントや annotation を削除すると Spring のコードは以下のようにシンプルになります。
ここで、extends ステートメントは他のクラスを継承することを示しています。すなわち、ここでは(Translational ライブラリの中の Interfaces ライブラリに含まれている)PartialCompliant というクラスをそのままここに挿入するのと同じ意味になります。このPartialCompliant の Modelica コードは以下の通りです。
この partial model というのは model と同じくクラスの一種ですが、partial model はそこで定義されている方程式の数が不足していて、それが別のクラスで継承されて方程式が追加されることにより初めて過不足のない model となることができるクラスです。つまり、はじめから継承されることを前提として設計されているクラスであり、単独では model として使用できない不完全なクラスです。
ということで、PartialCompliant のコードを Spring に挿入して整理(equation 部分を統合)すると以下のようになります。
これでようやく Spring の全容が見えるようになりました。ここでまず、
Flange_a flange_a
は、別に定義されている Flange_a というクラスを flange_a という名前で使用する(つまり、flange_a はクラス Flange_a のオブジェクトもしくはインスタンスである)ことを宣言しています。ややこしい話ですが、クラス Flange_a は以下のように単に Flange というクラスを継承しているだけです(Flange_bも同様です)。
ここでの Connector というのはやはりクラスの一種で、コンポーネントのポートを定義するための専用のクラスです。この Flange というクラスのソースコードは以下の通りです(コメントをそのまま残しました)。
ここでは二つの変数、s(変位)と f(力)、が定義されています。これは “その2” で紹介したアクロス変数とスルー変数です。変数定義の前に flow と付記されているのがスルー変数で、何も書かれていないのがアクロス変数です。SI については次回で紹介しますが、
SI.Position s;
は s が Position のインスタンスであることを示しています。同じく、f は Force クラスのインスタンスです。
この Position は type を用いて以下のように定義されています。
この type もクラスの一種で、変数の特性(実数や文字列等)を拡張するのに特化したクラスです。すなわち、Length というクラスは実数で “長さ” という物理量を持ち、単位は “m” であると定義されていて、Position はそれに等しいということになります。
同様に、Force は以下のように定義された実数です。
上述のアクロス変数/スルー変数の定義が、Flange è Flange_a/Flange_b è PartialCompliant è Spring と伝えられることにより、Spring で使われるアクロス変数とスルー変数は変位と力であると定義されていることになります。
Spring の定義に戻ると、次の
SI.Position s_rel(start=0);
SI.Force f;
は、Spring 内のローカルな計算で使用される変数の定義です。s_rel はバネの両端間の相対変位で、f はバネに生じる力です。この定義は前出の s の場合と同じで、s_rel は Position クラスのインスタンスで長さの単位を持つ実数になります。同じく f は force のインスタンスで力の単位を持つ実数です。
ちなみに、ローカルの f はそのままの変数名で方程式の中で使用されますが、flange_a および flange_b を通して使われる f は、それぞれ flange_a.f および flange_b.f として参照されます。この参照方式については SI の説明と併せて次回で紹介する予定です。
次に、Spring の以下の行では2つの定数である c(=TranslationalSpringConstant クラスのインスタンス:バネ定数)と s_rel0(Distanceクラスのインスタンス:バネの初期長)が定義されており、c に対しては最小値がゼロ、ディフォルト値が1、s_rel0 についてはディフォルト値がゼロと定義されています。
parameter SI.TranslationalSpringConstant c(final min=0, start=1);
parameter SI.Distance s_rel0=0;
parameter で定義されている変数は(矛盾した言い方ですが)定数でありシミュレーションの実行中は値が変化しません。ただし、実行開始前に Activate のブロックダイアログを通してその値を指定することができます。指定しなければ、ここで指定されたディフォルト値が使用されます。
equation キーワード以降(以下に再掲)では Spring の挙動を定義するための方程式が定義されています。
この方程式は以下の意味を表しています。
12行目:相対変位=両端の変位の差
13、14行目:両端に発生する力は同じ値で逆の符号
15行目:力=バネ定数*(相対変位ー初期長)
これらの方程式により a 端の力(f:スルー変数)/変位(s:アクロス変数)と b 端の力/変位の関係が定義されることになります。
ここで注意が必要なのは、これらの式は方程式であって代入式ではない、ということです。すなわち、各式では右辺を計算してその結果を左辺に代入している、ということではなく、定義されたモデル全体の方程式を連立して解いています。そのため、モデル全体としての方程式の数と変数の数は必ず一致している必要があります。
次回も今回に引き続き、バネマスモデルを題材にして Modelica の基礎的事項を紹介します。