目的
本記事が目的としていることは下記の通り.
- OpenModelicaを用いて,GUIベースで,1Dシステムモデルを作成し,シミュレーションを行うまでの一巡の流れを示す.
- GUIベース故,GUIで扱える状態に整えられた既存のコンポーネントを用いる事を前提とする.
- OpenModelicaの機能上,一部にModelica言語のプログラムコードを直接記述する箇所が存在する.(記事執筆時点最新のverではGUIからの取扱が可能では有るが,動作が重いため敢えて避ける.)
- windowsにインストールしたOpenModelica1.19の利用を前提とする.
OpenModelicaによる1Dモデリング&シミュレーションの基本手順
下記が基本手順となる.モデリング対象とするシステムの物理領域、形態、因と果の設定が異なっても、使うコンポーネント・プログラミングされている支配方程式・注目する物理量が異なるだけで、これらの手順・考え方は共通のものとなる.
大まかなモデル像のスケッチ、物理現象整理
先ずは、作成しようとしているシステムの概念図を書く.必須作業ではないが、慣れるまでは、作ろうとしているものを一度図に書き出す習慣を持っておこう.Modelicaではグラフィカルにコンポーネントを配置・接続してシステムモデルを組立られるが、モデリング・離散化の都合で物理的な実物の形から大きく離れた見た目のものが出来てしまうことがよく起きる.そうなった時に、作るモノのイメージを一度具体化しておかないと、何を作っているのか自分で見失ってしまう事が起きてしまう為だ.
対象物の形、要素要素の相互の繋がり、モデルに入れ込めたい物理現象、実装したい数式、など自身で必要と思うものを書き出そう.ここで書き出す情報の詳細度は人によって違いが出るところだと思う.ただし、どこまで書き出すのが正しと言うものは無い.因みに筆者の場合は慣れも有るので非常に大雑把だ.
Modelファイル作成
モデルファイル(.mo)を新規作成する.「File」→「New Modelica Class」で新規モデル作成ウィンドウが現れる.あとはウィンドウの表示項目通りに必要事項を入力するだけ.
毎回真っ新なモデルファイルを作成する必要は無い.既に似た構成のモデルが存在している場合は、それをコピーし、そこから追加・変更を行うことをお勧めする.手間を減らせるのと、作成したモデルで計算が回らなくなった場合に原因を特定し易いからだ.
library browser上でコピー元にしたいモデルを右クリックして”Duplicate”を選ぶとコピー後のモデル名とパス(どのパッケージ下に作成するか)を設定するウィンドウが現れる.あとはモデルを配置したいpackageと新規モデルの名前を指定しよう.(package下に置くのは必須ではない.)
*下記2.3項からの4項は,順不同,と言うか適宜必要に応じて順番を入れ替えて進めて構わない.
Diagram Viewでコンポーネント配置
1Dモデリングの主作業の1つ.左に表示されるlibrary browserから任意のコンポーネントを中央のdiagram viewにdrag & dropして並べてゆく.C++等オブジェクト指向プログラミング言語でいうところの、クラスのインスタンスを宣言する作業だ.
作業自体は非常に簡単だが、ここで何を配置するかの選択が1Dモデリングの肝の一つだ.連載のチュートリアルで扱う例題ではなく自前で0からモデリングを行う際には最も頭を使う過程となるので、例題に臨む際には各コンポーネントが何を表現しているのか/何のために配置されているのかを常に考え,解釈を持ちながら進めて欲しい.
この時,PowerPoint等のオートシェイプよろしく,コンポーネントのアイコンは大きさを自在に変えられる.重要な物理現象を示す/重要な機器を大きく,センサや計算の為だけに必要なものは小さくと言ったように,そのコンポーネントの持つ意味に応じて大小コントラストを持たせると,可読性が高くなる.
OpenModelicaの標準設定では、コンポーネントを配置する際にインスタンス命名ウィンドウがデフォルト名と共に現れる.特に拘りが無ければデフォルト名のままにしておいて大丈夫だし、判り易い名前を与えても良い.必要に応じて使い分けよう.
尚、インスタンス名は後からでも自由に変更できるので、最初から深く気にしなくてもOKである.
コンポーネント同士を接続
流体流れ、電流、力、トルク、信号などの物理量の移動/繋がりに合わせて、配置が済んだコンポーネントのconnectorr同士を結線で繋ぐ.connectorをクリックするとカーソルが十字マークに変わりそのconnectorを始点に線が生成され、別のconnector上でもう一度クリックするとその点を終点として線が繋がる.因みに、connectorではない所でクリックすることで、線をその位置で折り曲げることが出来る.
このプロセスで,必ずしも総てのconnectorを結線で埋める必要は無い.コンポーネントのモード設定等により,使われない状態でも構わないconnectorも有る.
例えば,Fluidライブラリ内の境界条件コンポーネントが有する圧力信号入力connector.これは,圧力入力をparameterからに設定して使う場合は何とも繋がずに空いている状態で構わない.
この辺りで,概念的な機能・意味だけでなく,コンポーネントの仕様や,具体的な機能・内部処理を多少は知っておく事が必要になる.
parameter設定
こちらも1Dモデリングの主作業の1つ.各コンポーネント(のインスタンス)のparameter(= 固定値のインプット)に具体的な値を設定する.
コンポーネントをダブルクリックするか、右クリックして「parameters」を選択すると、parameter設定ウィンドウが現れるので、ウィンドウ内のボックスに値を設定する.
ここも,総ての項目を入力する必要は無い.計算モードのようなスイッチの設定(例,直観を円管と定義して直径を入力するか,非円管と定義して流路断面積,水力径を入力するか)に依っては入力不要なものも有る.ここでもコンポーネントの機能・仕様を知っておく事が必要となる.
システムの形態・構成が決まって、要求仕様を満たすための値決めの設計解析でシミュレーションを行うフェイズ(例,最適な流路面積の決定)で、これらparameterの値を何度も繰り返す事になる.その場合は,このdiagram viewでparameterウィンドウをコンポーネント毎に開いて値を設定し直すというのは効率が悪く,推奨しない.後述するが,コンパイル・計算実行後にparameterを変更して計算を実行し直す事は別途可能なので,別法でparameter変更が出来る事は憶えておいて欲しい.
Text Viewでソースコード直書き(GUI操作では設定できないもの)
GUIの操作だけでは設定できないものがあり、それらだけはソースコードを直接書き込む.(下図の朱色ハイライト部.)
例としては,遠心ポンプコンポーネントの特性カーブ情報や,FluidライブラリのコンポーネントのMedia package設定(呼び出す流体物性の指定).
FluidコンポーネントのMedia package設定は,実はOpenModelica ver1.16以降はGUIからMediumをドロップダウンメニューで選択できる機能が搭載されており,ソースコードの直書きは必要無い.しかし,この機能を有効化するとOpenModelicaの動作が非常に重くなるため,本連載ではver1.16より前に執っていた手順同様にソースコードの直書きを行う事を標準手順として解説する.
ソースコードチェック
Variablesとequationsの数が一致しないなどの致命的誤りが無いか、Media packageの設定し損じが無いか等,シミュレーションモデルとして破綻が無いかを確認する.シミュレーションセットアップ&実行を行い,コンパイルに進んでもソースコードチェックを行えるが、「Check Model」機能でmodelをチェックした方が、処理が速いのと(規模の大きなシステムでないと違いは出ないが),表示されるエラーメッセージの量が少なく済む.
ここでerrorが表示されず,variablesとequationsの数が等しいとのメッセージが出ればコンパイルに進む.もし,立式に不足拘束・過拘束が有れば,コンパイルは確実に通らないので作成したモデルに破綻の有る箇所を探し修正する.
時々,ソースチェックではvariablesとequationsが釣り合っているのに,コンパイルしようとすると釣り合っていないとのエラーが出る事も有るが,恐らく既存のコンポーネントを使ってシステムを組立てる上では遭遇しないと考えられる.(筆者は自作ライブラリの作成途上で,条件分岐を含む複雑なモデルにてそれに遭遇した.)
尚,warningが表示される事も有るが,多くの場合対応は必須ではないので,目を通す程度で次手順に移る事を勧める.
コンパイル&シミュレーション実行
シミュレーション設定ウィンドウでシミュレーション時間や結果記録インターバル、そしてソルバなどの諸設定(特別理由が無ければデフォルト設定で済む筈.)を行い、シミュレーションを実行する.
ウィンドウ下端の”OK”を押すと直ぐにシミュレーションが始まる.”設定を保存してウィンドウを閉じる”ではない点に注意.
Modelica言語がC/C++/Fortran(デフォルトではC)に変換され,exeへとコンパイルされ,そのまま間を開けずにシミュレーションが実行される.尚、ここで要する時間の大部分はコンパイルであり、シミュレーションは短時間で終了する(勿論,シミュレーション実行時間長さを長大に設定したり,モデルが非常に複雑だとシミュレーション実行も時間が掛かる.).
結果表示&評価&考察,そして必要に応じて計算繰り返し
シミュレーション開始段階で,自動でplottingウィンドウへ移行する.シミュレーションが完了したら,結果ファイルのデータが自動で読み込まれる.
結果ファイルのロードまで完了し,Plottingウィンドウで操作が行えるようになったら,右側に表示されるvariablesウィンドウから表示させたいvariableを選び,チェックボックスにマークを付ける事で,その変数の時間履歴をplot表示する.表示させられるのは時間履歴plotだけでなく,parametric plotと呼ばれる,variable vs. variableのものも表示できる(ただ,線表示しか出来ず,散布図に出来ないのが残念な所).
過渡応答や,過渡応答中のvariable間の相関には興味は余りなく,静定状態での計算結果の値のみにしか興味が無い場合も多々あると思う.(むしろ設計解析・評価だとそちらの方が多いのではないか)そう言う場合は,variableウィンドウには最終時刻の各variableの値が表示されるので,そちらを見れば良い.
結果を見て,設計変数を変更して結果がどう変化するかをQuickに見たくなることもあるだろう.そのためにdiagramウィンドウに戻り,parameterウィンドウから値を設定し直し,再コンパイルを行う必要は無い.このvariableウィンドウで,parameterを変更して再計算を行う事が出来る.
variablesのリストの中で,parameterは枠で囲われてて数値を変更できる.値を変更して左上のシミュレーション再実行ボタンを押下すると計算が再実行される.この処理は生成済みのexeが呼び出されるだけなので,コンパイルは行われない.なので上述のシミュレーション実行時に比べて圧倒的に短い時間で済ませられる.生成済みexeを呼び出すだけではあるが,シミュレーション時間や,記録時間刻みと言った設定は変更できる.
なお,元のモデルのModelicaコード(.moファイル)に書き込まれているparameterの値はこの操作では書き変わらないので,Modelingウィンドウから再コンパイ&シミュレーションを実行するとparameter設定は元に戻っている.
また,再計算をかける度にparameter設定が書き込まれたデータファイル(.xmlのフォーマット)と結果を記録した.mat/.csvは上書きされるので,値を丁寧に変更し,input&outputを残して記録・整理して設計検討を実施したい場合はこの機能は不適.その用途にはOMshellやpythonからの実行を駆使して真面目に多ケースデータを残して計算実行しよう.今後,そのやり方についても汎用ツールの制作・公開,および解説が出来ればと考えている.(ある程度の事が出来るjupyterのnotebookは既にあり,githubにオープンソースでアップロード済み)
後書き:Modelicaを学ぶ方々へのメッセージ
最後に余談として,Modelicaを学ぼうとされる方にメッセージを記しておく.
入門本、チュートリアルなど色々な学習方法が有るが、筆者は下記が自由自在にモデリング出来るようになるための最短コースと考えている.
そして、そのように学習を進める上でのコツは以下だ.
- 何を作るかを決める段階では、「手元に有るライブラリで作れるか」を考えない.
- 「作って愉しいもの」を選ぶ.長期学習のモチベーション維持の為に重要.
- 「無いもの」「判らないもの」は素晴らしい学習題材.
- 足りないと判ったコンポーネント/ライブラリは自分で作る.
- 自作を行うと、知らないこと・調べないと判らない事に意外に頻繁に出会える.
- コンポーネント自作時は、MSL・その他既存ライブラリにあるportなどの規格化されたパーツを流用する.
- 車輪の再発明の手間を省ける.
- 既存ライブラリとの互換性を確保できる.
- 最初からゴールのシステムを完成させようとしない.
- 部分部分から作成し、段階的をそれらを組み合わせてゆく.例えば、筆者はturbojet過渡モデルを作成目標に置いたが、「Compressorだけ」「排気ノズルだけ」といった部分モデルを幾つも作成した.
- 派生ものや関連ものを思いついたら、迷わずゴールポストを遠ざける.
- 学習題材が増える分にマイナスなことは無い.例えば、筆者はturbojetの過渡挙動が飛行機の挙動にどのように現れるか気になって、「AircraftDynamics」ライブラリの作成も開始した.そして、航空力学を勉強し直す機会にも繋がった.
以上
コメント