Package 内の Model のシミュレーションを実行する

Modelicaのクラスの概要 の ClassExample2.mo の中のモデル MassB のシミュレーションを実行します。

このモデルは、質点の運動状態を表すレコード State を定義して、ClassExample1.mo の ModelA を書き直したものです。

Modelica のコードをMagicコマンド %%writefile で出力します。

In [1]:
%%writefile ClassExample2.mo
package ClassExample2 // package

  constant Acceleration g = -9.8;
  
  // type
  type Acceleration = Real(quantity = "Acceleration", unit = "m/s2");
  type Mass = Real(quantity = "Mass", unit = "kg");
  type Force = Real(quantity = "Force", unit = "N");
  type Velocity = Real(quantity = "Velocity", unit = "m/s");
  type Position = Real(quantity = "Length", unit = "m");
  
  // record
  record State
    Position x;
    Velocity v;
  end State;
  
  // model
  model MassB
    parameter Mass m = 1.0;
    parameter Force f = m * g;
    parameter State s0(x = 0, v = 5);
    State s(x(start = s0.x), v(start = s0.v));
  equation
    s.v = der(s.x);
    f = m * der(s.v);
  end MassB;

end ClassExample2;

クラス MassB をコンパイルして FMU を作成します。

In [2]:
# Import the function for compilation of models and the load_fmu method
from pymodelica import compile_fmu
from pyfmi import load_fmu
# Compile model
fmu_name = compile_fmu("ClassExample2.MassB","ClassExample2.mo")
# Load model
model = load_fmu(fmu_name)

シミュレーションを実行します。オプション ncp は Number of communication points で、ソルバーとFMUが通信する回数を表しています。これを 0 にするとソルバー内部の時間ステップになります。オプションの詳細は JModelica User Guide - Version 2.10 P.26-29 を参照してください。

In [3]:
opts = model.simulate_options()
opts['ncp']=500
res = model.simulate(final_time=1.,options=opts)
Final Run Statistics: --- 

 Number of steps                                 : 15
 Number of function evaluations                  : 19
 Number of Jacobian evaluations                  : 1
 Number of function eval. due to Jacobian eval.  : 2
 Number of error test failures                   : 0
 Number of nonlinear iterations                  : 15
 Number of nonlinear convergence failures        : 0

Solver options:

 Solver                   : CVode
 Linear multistep method  : BDF
 Nonlinear solver         : Newton
 Linear solver type       : DENSE
 Maximal order            : 5
 Tolerances (absolute)    : 1e-06
 Tolerances (relative)    : 0.0001

Simulation interval    : 0.0 - 1.0 seconds.
Elapsed simulation time: 0.0147721767426 seconds.

シミュレーション結果をプロットします。

In [4]:
%matplotlib notebook
# Import the plotting library
import matplotlib.pyplot as plt 
x = res['s.x']
v = res['s.v']
t = res['time']

plt.figure(1)
plt.subplot(2,1,1)
plt.plot(t, x)
plt.ylabel('Position (m)')
plt.subplot(2,1,2)
plt.plot(t,v)
plt.ylabel('velocity (m/s)')
plt.xlabel('Time (s)')
plt.show()
In [ ]: