【PyFMI】最小構成のMBD事例 第2章 その102【ダミーFMU④】

【PyFMI】最小構成のMBD事例 第2章 その102【ダミーFMU④】 事例
【PyFMI】最小構成のMBD事例 第2章 その102【ダミーFMU④】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はDummy_FMUModelCS2を題材として掘り下げ。
FMUModelCS2を継承したクラスであり、
そこからメソッドをオーバーライドしているようである。
特に重要なのがdo_step。

このdo_stepをオーバーライドしている理由と
その重要性を解説する。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

do_stepをオーバーライドしている理由

太郎くん
太郎くん

前回出てきた、do_stepだけど、
まずなんでオーバーライドしているかってところを知りたいかな。

フクさん
フクさん

そうだね。
前回もちょっと触れたけど
継承元のFMUModelCS2に於いてのdo_stepはcpdefとして定義されている。
cpdefはCythonによってPythonからC言語に変換するメソッドを指定するものになる。

太郎くん
太郎くん

イキナリでてきたCythonがわからん。

フクさん
フクさん

Wikipediaから引用。

Cython(サイソン)は、C言語によるPythonの拡張モジュールの作成の労力を軽減することを目的として開発されたプログラミング言語である。その言語仕様はほとんどPythonのものと同じ (上位互換) だが、Cの関数を直接呼び出したり、C言語の変数の型やクラスを宣言できるなどの拡張が行われている。Cythonの処理系ではソースファイルをCのコードに変換し、コンパイルすればPythonの拡張モジュールになるようにして出力する。

Wikipediaより(https://ja.wikipedia.org/wiki/Cython)
太郎くん
太郎くん

つまりPythonだけど、実態はC言語になるってことか。

フクさん
フクさん

そうだね。
処理の高速化目的で使用されることが多い。
FMU制御なんかは速度が重要なことが多いから、PyFMIでも使用されているのだろう。

太郎くん
太郎くん

でも、このままだとdo_stepを外部から上書きできないから
一旦、Dummy_FMUModelCS2へ継承して、継承先のDummy_FMUModelCS2でオーバーライドする。
そしたらdo_step自体はDummy_FMUModelCS2のPythonとしてのメソッドになるから、
Python上からメソッドの上書きが可能になる。
ってことか。

フクさん
フクさん

正解だ。

do_stepの重要性

太郎くん
太郎くん

次はなぜdo_stepを内部処理を上書きする必要があるのかってところか。

フクさん
フクさん

これはmasterモジュールの中のdo_stepを呼び出しているところを見た方が早いだろう。

cdef perform_do_step_serial(list models, dict time_spent, double cur_time, double step_size, bool new_step):
    """
    Perform a do step on all the models.
    """
    cdef double time_start = 0.0
    cdef int status = 0
    
    for model in models: 
        time_start = timer()
        status = model.do_step(cur_time, step_size, new_step)
        time_spent[model] += timer() - time_start
太郎くん
太郎くん

これは、登録した全モデルのメソッドであるdo_stepをシミュレーションステップ毎に呼び出しているってことかな?

フクさん
フクさん

その通り。
つまり、モデル側のdo_stepを書き換えるとシミュレーションステップ毎に呼び出されるメソッドを上位側でコントロールできるってことになる。

太郎くん
太郎くん

なんとなくわかってきたぞ!

do_stepがmasterモジュールからシミュレーションステップ毎に呼び出される

do_stepの中でシミュレーション時間が実時間に追いつくまで強制的に待たせる。

太郎くん
太郎くん

これをやりたいってことか!

フクさん
フクさん

大正解だ。

フクさん
フクさん

まぁホントにうまく行くかはまだ分からないから実験する必要はあるだろう。

まとめ

フクさん
フクさん

まとめだよ。

  • do_stepをオーバーライドしている理由の説明。
    • Cythonによる静的関数でそのままではPython側からの上書きができない。
  • do_stepの重要性の説明。
    • masterモジュールからシミュレーションステップ毎に呼ばれるメソッドだから。
    • これを自由に書き換えられれば時間制御ができる。
    • 実時間に追いつくまで待たせる。

バックナンバーはこちら。

コメント

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