Modelicaとは何か、また、OpenModelicaで何が出来るか

 本記事では、Modelicaそのものが何かを紹介する.
 なお、情報は2024年1月時点のものである.
 また、こちらの記事でModelicaを用いて実施する1DCAE, MBDの魅力・意義について紹介しているので、併せてお読み頂きたい.

Modelicaとは何か

    Modelicaは言語、固有のツールの事ではない

     まず初めに端的に述べると、Modelicaは言語である.言語とは言っても英語や日本語といった人間が用いる自然言語の類ではなく、C++やFortranといったプログラミング言語の延長にあるものである.また、何か特定の解析ツールを指すものでもない.
     Wikipediaに記事があり、そこには下記のように掛かれている.
      
     オブジェクト指向のマルチドメイン・モデリング言語である。多分野に跨る複雑なシステム(例えば、機械、電気、電子、油圧、熱、制御、電力、プロセス指向のサブコンポーネントを含むシステム)のモデリングに適しており、特に物理現象を表現するモデルの構築で使われている。
      
     恐らく、これを読んだだけで掴める人はまずいないだろうと思うが、まず知って頂きたいのはコンピュータ上で使う言語であるという点である.
     これを計算ソフトウェア/科学計算用のプラットフォームであると誤解されていた経験があるのだが、「Modelica」自体は、例えばソフトウェア開発ツール「Eclipse」のようなツールを指すものではない.

    物理を描くために作られている

     言語の仕様が、物理モデルを作る目的のものとなっており、下記の特徴を持つ.

      代入処理ではなく、方程式を書く

       一般的なプログラミング言語ではコードに記述するのは変数への値/計算式の結果の代入であり、右辺の内容を左辺の変数に代入する処理である.
       一方Modelica言語では、基本的に成り立たせたい代数方程式、微分方程式をコードに記述する.
       下記に例を示す.これは電気抵抗のポーネントのコード(記述内容は代数方程式のみ).
      	equation
      	R_actual = R*(1 + alpha*(T_heatPort - T_ref));
      	v = R_actual*i;
      	LossPower = v*i;	
      
       方程式なので左辺が変数になっている必要はなく、下記のような記述も可能
       また、記述する方程式の順番も原則気にしなくて良い.
       これらにより、一般的なプログラミング言語に比べて、物理計算のコードを作成しやすい.
      	equation
      	R*(1 + alpha*(T_heatPort - T_ref)) = R_actual;
      	R_actual*i = v;
      	v*i = LossPower;	
      
        
       なお、上で、”基本的に”方程式を書くと書いたが、プログラミング言語のように代入処理を記述すること、in/outが明示された関数を作成することも可能である.
        

      input/outputの組み換えが簡単

       前項と被るところがある話なのだが、因/果、input/outputを入れ替えた計算モデル作るのがプログラミング言語に比べて非常に簡単である.
       下に配管の計算モデル2つを示す.上側は両端の圧力をinputして流量をoutput、下側は上流の圧力と通過質量流量をinputして下流の圧力をoutputとするモデルである.
       見ての通り、接続する境界条件コンポーネントを変えるだけで、input/outputが逆のモデルを作れる.配管コンポーネント自体には何も手を加える必要が無い.
       
        

      「解く」処理を言語利用者は記述しない

       基本、言語を使って物理モデルのコンポーネントを使う人も、それらを使って何等かのシステムモデルを組む人も、解くための処理を書く場面がほぼ皆無となる.
       一般に、収束計算のための処理はModelica言語の仕様を満たす対応うツールが備えるようになっている.物理モデルと数値処理の可能な限りの分離が図られている.
       そのため、利用者は物理モデルを構築する事、それを使って設計活動を行うことにより注力出来る.
        

      使いまわしが効く:オブジェクト指向

       クラスの継承を書ける.
       これにより、多数のモデルで共通の変数、方程式を既定クラスに記述しておくという事ができる.
       下図に例を示す.
       ここでは、圧縮性流体のノズルの式が記述される流路抵抗のBaseクラスがあり、それを継承してinputが定義された2つの異なるコンポーネントを定義している.
       Baseのクラス内には必要な変数の定義と方程式だけが記述してあり、それらのうちどれをinputとするかは未定義としている.それを使い道ごとに継承する.
       左のクラスは流路面積を外部信号からinputし、通過質量流量が計算結果となる.一方で右のクラスは通過質量流量を外部信号から受け取り、必要な流路面積が算出される.左が設計での流量予測に、右が試験データから設計変数を逆解析するのに使うことを想定したもの.
       このように継承を使うと、in/outが異なるのに対して式を変形して全く別のルーチンを作ったり、外側に収束ループを入れて逆計算に対応させたりといった手間が不要になり、かつ、同じ方程式を使うことを担保できる.
       更に、この例では流量係数の与え方をBaseクラスでは定義せず、2つの継承後クラスでは固定値を与えている.この部分の与え方/計算式を継承後クラス毎に変える事で、計算式の一部が異なる複数の物理モデルをより少ない手間で作ることができる.例えば、一方はエルボの流量係数を算出する変数と式を与えてエルボモデルに、他方はオリフィスの流量係数の変数と式を与えてオリフィスモデルに派生させる、といったことができる.
        
       *Modelica言語のみの特徴ではなく、オブジェクト指向言語全てに当てはまる特徴ではある.しかし、Baseクラスで等式だけ定義し、使い道に応じて継承クラスでin/outを定義するという実装の仕方は、方程式を書けるModelicaの特徴であり、一般プログラミング言語では実現できない.
        

      ものを接続するという処理を書ける

       コンポーネント(Modelicaの中ではmodelというclass)で定義された計算処理モジュール間を接続する処理を書く事が出来る.(これは、GUIベースでアイコンを線で繋いでモデル構築した場合、背後で自動で記述される)
       例として下図のような入熱を伴う配管流路のモデルを示す.
        
       ソースコードは下記のようになる(annotationの中にはGUI上の表示の情報が書かれるだけのため省略している).
       見ての通り、connect()文とその中に繋がれるべきconnectorインスタンスが書かれるだけのコード.
       例えば、volumeとpipeの間では圧力、質量流量、流体組成(質量割合)、比エンタルピが受け渡される(等式が成り立つ)が、それらを1つ1つ記述する必要は無い.両コンポーネントに接続用に共通のfluid port connectorが定義され、それらをconnect文で結ぶだけで情報を受け渡す事が出来る.
      これにより、システムモデルを組んだソースコードが格段にシンプルで解り易い.
      equation
        connect(volume1.ports[2], boundary1.ports[1]) annotation(...);
        connect(pipe.port_b, volume1.ports[1]) annotation(...);
        connect(volume.ports[2], pipe.port_a) annotation(...);
        connect(boundary.ports[1], volume.ports[1]) annotation(...);
        connect(ramp_heat.y, gain1.u) annotation(...);
        connect(gain1.y, replicator1.u) annotation(...);
        connect(replicator1.y, prescribedHeatFlow1.Q_flow) annotation(...);
        connect(prescribedHeatFlow1.port, pipe.heatPorts) annotation(...);
      				
        
       *ただ、多くの非Modelicaの1DCAE/MBDツールでも実装されている機能ではあり、Modelica特有のものではない.

    コードベースとグラフィカルベースのモデル作成に対応

     ここまでに既に登場しているが、ソースコードをプログラミングのように書くスタイルと、アイコンを繋ぎ合わせてグラフィック上でモデルを組み立てていくスタイルの両方に対応している.
     何らかの複雑なシステムのモデルを組む場合、多くはグラフィックベースの方が組み立てたり、後に編集したりが行いやすい.一方で、コンポーネントそのものの中身を記述したり、”部品の組み合わせ”で成り立っていない計算問題を解きたい場合、ソースコードを直接書く方が好ましい.Modelicaは原則としてその両方に対応している.
     
    ・アイコンベースで流体システムを組み立てた例:
     なお、結果をグラフィック上に数値と色で表示させるコンポーネントも存在する/作成することが出来る.下図では、各部の温度を色表示している.
      
     
    ・ソースコードで、2体問題(軌道力学の一番基礎の問題)を記述した例(equationの部分のみ抜粋):
     このような問題はソースコードを書く方がグラフィックベースより格段に作成しやすい.
    equation
      m1= m1_par;
      m2= m2_par;
      
      mu = Modelica.Constants.G*(m1 + m2);
      
      mag_r1 = (r1[1]^2 + r1[2]^2 + r1[3]^2)^(0.5);
      mag_r2 = (r2[1]^2 + r2[2]^2 + r2[3]^2)^(0.5);
      mag_r1_2 = (r1_2[1]^2 + r1_2[2]^2 + r1_2[3]^2)^(0.5);
      Alt= mag_r1_2 - rM1;
      v1Abs= (v1[1]^2 + v1[2]^2 + v1[3]^2 )^(0.5);
      v2Abs= (v2[1]^2 + v2[2]^2 + v2[3]^2 )^(0.5);
      v1_2Abs= (v1_2[1]^2 + v1_2[2]^2 + v1_2[3]^2 )^(0.5);
      a1Abs= (a1[1]^2 + a1[2]^2 + a1[3]^2 )^(0.5);
      a2Abs= (a2[1]^2 + a2[2]^2 + a2[3]^2 )^(0.5);
      a1_2Abs= (a1_2[1]^2 + a1_2[2]^2 + a1_2[3]^2 )^(0.5);
      //-----
      for i in 1:3 loop
        r1_2[i]= r2[i] - r1[i];
        v1_2[i]= v2[i] - v1[i];
        a1_2[i]= a2[i] - a1[i];
        
        der(r1[i]) = v1[i];
        der(r2[i]) = v2[i];
        der(v1[i]) = a1[i];
        der(v2[i]) = a2[i];
        
        Fg1[i]= Modelica.Constants.G*m1*m2/(mag_r1_2^3.0)*r1_2[i];
        Fg2[i]= Modelica.Constants.G*m1*m2/(mag_r1_2^3.0)*(-1.0)*r1_2[i];
        
        a1[i]= Fg1[i]/m1;
        a2[i]= Fg2[i]/m2;
        
      end for;
    		
      

    言語の仕様が公共規格化されている=複数の解析ツールで使える

     Modelica言語の仕様は非営利団体Modelica Associationが公共規格のように策定・維持している.
     このため、その仕様を満たすように作られた多数の解析ツールで、同じModelicaのモデルが共通して使える.商用ツールでは、Dymola, SimulationX, Amesim, Modelon Impactなどが対応しており、フリーではOpenModelicaが対応している.(ScilabのXcosもModelica言語を内部に記述できるブロックがあるが、前述の各ツールとは異なり、ブロックの中にModelica言語が使えるという程度のもの)
     したがって、フリーのOpenModelicaで作成したモデルを、商用ソフトで使うということができる.大規模なモデルは作らない場合やコンポーネントを作成する程度の利用にはOpenModelicaを使い、大規模なモデルを安定に動かしたい場合や商用ソフトにしかない強力なプレ・ポスト機能を使いたい場合には商用ソフトを使う、といった使い方が出来る.
      

    コンポーネント・ライブラリを自作できる

     前項から、当然の事ではあるが、標準ライブラリ(+商用ツールなら付属してくるライブラリ)で提供されているもの以外に、自身が作りたい物理モデル、コンポーネント、それらを集めたライブラリを自由に作る事が出来る.
     Modelicaを用いたもの以外の商用ソフトでは、コンポーネントを自作するのが難しい・制約が課されている事がある.が、Modelica準拠のツールの場合は基本的に自由にモデルやコンポーネントを作れる.
      
     *「作れる」というよりは、「自分で作ることを前提としている」の方が正しいかもしれない.Modelica Standard Libraryに収められているコンポーネント群は、各物理分野のコンポーネント作成のフレームワークを揃えてくれているだけに近く、モデルのラインナップは最低限のものといえる.
      

    オープンソースライブラリが豊富

     自由に作成できるということは、当然、商用ソフト付属のライブラリ以外に、フリー/オープンソースのライブラリが数多作られている.
     個人製作のものから、アメリカエネルギー省の研究所のような機関まで様々なContributorがライブラリを公開しており、多くのものは無償で商用利用まで出来る.
     使いたい機能のものが直接存在していなくても、モデルの作り方/コードの書き方で参考に出来る場合も数多有る.
     下記にライブラリがリストアップされたページを2つ紹介しておくので活用されたい.
    1. Modelica協会のライブラリリストページ
    2. github Modelica 3rd party libraries
      

OpenModelicaの特徴、出来る事

 続いて、OpenModelicaとは何か、どのような事が出来るかなど特徴を紹介する.
 言ってしまうと、「無償利用でき、上記の特徴をすべて備えた解析ツール」である.

    Modelica言語を扱えるソフトの1つ

     Modelica言語を取り扱える解析ツールである.GPLv3で公開され、誰でも商用/非商用を問わず無償で利用できる.
     オープンソースであり、無償なだけでなく、ソースコードも開示されコンソーシアムで開発が続けられている.意志と能力があれば、貴方が開発に参画することも可能だ.
     学術用、個人趣味用に留まるものではなく、下記に示すように、企業内in-houseツールの中にOpenModelicaが取り込まれてる例や、OpenModelicaを取り扱うCAEサービス企業が複数在る.
      

    Package managerで主要な3rd partyライブラリを簡単にインストールできる.

     オープンソースのライブラリが数多有ると述べたが、それらの多くをOpenModelicaのソフト内の操作で簡単にインストールできるようになっている.
     *package managerにリストアップされていないものについては、手動でgithubのものをローカルにクローンして読込設定する必要がある.
      

    コードベースとグラフィカルベースの両方でモデリング出来る

     当然、ソースコードを直接書くモデリングと、コンポーネントアイコンを並べて繋ぐシステムモデル構築の両方に対応しており、自由に使い分けられる
     コンポーネントモデル自体を自作する際、アイコンの外見、コネクタの位置取りも作成できる.
      
      

    計算結果をすぐにy-t plot, y-x plot表示させられる

     計算実行が完了すると、自動でplot viewという表示に切り替わり、すぐに結果をplot表示させる体制となる.
     下図のように一覧からplot表示させたい変数を選択するだけで、すぐに変数-vs.-timeまたは,変数-vs.-変数のグラフを表示させる事が出来る.このため、最低限の確認と評価を行うのに、ポスト処理を行う手間・時間を掛けずに済む.
      

    簡単にparameterを変更して再計算を行うことができる

     plot表示画面から、簡単にparameter(シミュレーション中値が固定の入力)の値を変更して再計算、再表示させる事が出来る
     plot viewのvariable browserにはparameterが表示されており、そこの値を書き換えて計算を再実行させられる.これにより、操作したい値を変えtry & errorを手軽に行える.
     なお、ここでparameterの値を変更しても、一時的なもので、モデルにデフォルトとして設定される値はmodeling viewに戻って入力値を変えないと変更されない.try & errorを繰り返しても、最初に設定しておいた値は保護されている.
      

    計算結果を時系列csvに出力可

     計算結果はcsvファイルに出力できる.
     従って、パラスタした結果を残しておくことや、OpenModelica上での表示だけでなくExcel棟の別ソフトで結果を整理したりすることが可能である.
      

    計算結果をモデル作成の図上に表示させる機能に対応

     下図の例のように、計算結果をモデル構築時のダイアグラムそのものの上に表示させる機能に対応している.下図では、重要箇所の温度を数値と色で表示している.
     *計算後にポスト処理として表示を付けるのではなく、アイコン上に数字、色、メーター、バー等を表示させる機能を持つコンポーネントを作り(または公開されているものを使い)、それをモデル構築時に使う.そして、OpenModelicaで計算を実行すると、すぐにその結果を図表示させられるようになっている.
     複雑なシステムで、境界条件/動作条件やparameterを変化させて各所の挙動が変わるのを観たい場合に、非常に解りやすい.
     また、Modelica Standard Libraryに備わるcsv時系列データを読み込むコンポーネントを組み合わせれば、試験の時系列データを可視化するツールとしても活用出来る.(物理計算を含めずに、データ読込コンポーネント、表示コンポーネント、図だけでモデルを組む.)
      

    計算結果のアニメーション表示に対応

     見てもらうのが一番解り易い.
     multibody libraryや筆者が公開しているAircraftDynamics libraryのように計算結果を3Dアニメーションで表示させるのに対応したコンポーネントを使ってシミュレーションを実行すると、その結果をアニメーション表示させられる.その機能にOpenModelicaは対応している.



      

    実行ファイルが生成される =OpenModelica無しでモデルを動作させられる

     OpenModelicaでモデルをコンパイル&実行すると、その際にローカル上の作業ディレクトリに実行ファイルとParametersの設定が記述されたXMLファイルが生成される.
     これらのファイルはOpenModelicaを閉じた後も残り、OpenModelicaを起動することなく計算を実行できる.Parametersを記述したXMLファイルの数値を書き換えればParameterを変更してパラスタや境界条件の異なる計算を実施することも可能.このとき計算結果ファイルは、同ディレクトリに出力される.
     *コンパイル時、出力ファイル形式がデフォルトのMATになっているとOpenModelicaを介さないと読み込めないバイナリ形式になってしまい、出力をCSVにしてコンパイルを掛けておく必要がある点に注意が必要となる.
     *C言語に変換され、それが実行ファイル化されているので、流石にInput/Outputを入れ替えたり、モデルの中身を繋ぎ変えたりはできない.Boolean演算や信号切替器のようなコンポーネントを駆使して、parameterの値に応じて上手くinput/outputやコンポーネントの繋ぎが切り替わるようにモデルを組めば不可能では無いが.
      

    操作用のPythonライブラリが作られている

     Parameter書き換え等のPre処理、モデルのコンパイル、コンパイル済モデルの実行などを行えるPythonライブラリが提供されている.(OMPython)
     前項と繋がる話だが、これを使えば、一度作成、コンパイルしたモデルに対して、parameter変更、計算実行、matplotlibなどを駆使してpost処理といった、モデルを使った解析・設計の作業をOpenModelicaを立ち上げずに実施する事が出来る.
     *OMShellというものをPythonが動かすので、OpenModelicaがインストールされた環境である必要はある.
      
     OpenModelicaは、予め用意した値にParameterや境界条件を振って何十もマルチケースの計算を連続実行するような、設計パラスタや多条件網羅計算のような使い方には対応していないが、これを駆使すればそのような計算は難無く実施できる.
     実際に筆者は、Excelでcsvファイルにparameters/境界条件/初期条件の値を書き込み、数百単位のケースを一気に連続計算を回し、その結果を表示させる処理を実施しており、それ用のPythonコードを記したJupyterNoteをgithubに公開しているので、参考にする/流用して活用されたい.
     *モデルのコンパイルはOpenModelica行い、CSVで定義した計算ケースの実行と結果読込・可視化は別々のJupyterNoteに分けて処理実行している.上記は、実行を行う用のJupyterNote.
     *残念ながら、記事化が未だ.
      

    作成したモデルをFMU化してエクスポート出来る.

     FMIという、モデルを実行ファイル化し、それらを異なるツールで取り込み・実行するための共通規格がある(詳細は省略).OpenModelicaはモデルをそれに準拠した形「FMU」でエクスポートする機能を備えている.
     製作物をModelica対応以外の解析ツールにも取り込んで使える訳である.これにより、OpenModelicaで作成したモデルを、近年流行りのmulti-domainの連成計算に供する事が出来る.
     なお、FMUのインポートも出来るようだが、筆者が調べた範囲では、インポートよりもエクスポートの機能の方が優秀に出来ている可能性が高い.エクスポートしたものは難なく別ソフトで動作させれたが、インポートしたものを動作させるのは上手くいかなかった.(計算が上手く回らなかった.これは、モデルの内容に起因している可能性も有る.)
      

    Windows, Linux両方で提供されている.

     OpenModelicaは常にWindows版とLinux版が更新・提供されている.なので、同じものがLinuxでも使える.
     解析用サーバなどを運用している環境を持っていると、重要となってくる.
     例えば、筆者は普段使いのPCはWindowsであるが、VPSでリモート操作用のLinuxサーバを運用しており、多ケース計算を実施したり、処理が重い計算を実施する際にモデル作成とテスト動作まではWindowsで実施し、計算実行はLinuxサーバで実行するという事をしばしば行う.こういった場合、windowsとlinuxで常に同じものが利用出来るのは非常に便利である.
      
以上

コメント

タイトルとURLをコピーしました