Ticket #5421: FMU-WORKING-EXAMPLE.txt

File FMU-WORKING-EXAMPLE.txt, 5.7 KB (added by FBXon2ROX, 6 years ago)

FMU access working session

Line 
1
2This little file is an illustration of a working case of the treatment of a fmu object in COMMON-LISP.
3This is working on a 64bits Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux
4SBCL 1.3.14.debian
5; SLIME 2.23
6
7;;************************************************************************************************************
8;; First we load the package that I have called cl-fmi.
9CL-USER> (in-package :cl-fmi)
10#<PACKAGE "CL-FMI">
11;;************************************************************************************************************
12;; Then we define a parameter containing the path to the fmu file.
13FMI> (defparameter test-fmu-file-path-64 "/home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/Modelica_Blocks_Continuous_SecondOrder_64bits.fmu")
14TEST-FMU-FILE-PATH-64
15
16;; The following is the instantiation of the fmu-info object of the class fmi2-information I have defined elsewhere.
17;; The instantiation method unzip the fmu file, goes through the xml file and dispatch info in the class slots.
18;; We also in this identifies the library location.
19FMI> (defparameter fmu-info (make-fmi2-information test-fmu-file-path-64 :unzip t))
20
21"unzip"
22"/home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/unzip-3763774181/"
23 UNZIP DIRECTORY : /home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/unzip-3763774181/
24
25"unzip finished" UPDATE OF *foreign-library-directories*
26FMU PATHNAME : /home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/Modelica_Blocks_Continuous_SecondOrder_64bits.fmu
27FMU DIRECTORY : /home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/
28UNZIP FLAG : T
29UNZIP DIRECTORY : /home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/unzip-3763774181/
30INPUT LIB DIR FLAG : NIL
31IDENTIFIED LIB DIR FLAG : /home/frederic/quicklisp/local-projects/cl-fmi/test/linux64/unzip-3763774181/binaries/linux64/
32FMU-INFO
33
34;; Small confirmation that the instance is indeed a fmi2-information class
35FMI> (class-of fmu-info)
36#<STANDARD-CLASS CL-FMI::FMI2-INFORMATION>
37
38;;************************************************************************************************************
39;; Then we generate the fmu-test object , instance of an instance-me model exchange class I have defined elsewhere.
40FMI> (defparameter fmu-test (make-instance-me fmu-info ))
41FMU-TEST
42
43FMI> (class-of fmu-test)
44#<STANDARD-CLASS CL-FMI::INSTANCE-ME>
45
46;;************************************************************************************************************
47;; At this stage we can talk to it ... and the library was indeed accessed in this case.
48;; Pre initialization stage
49;; Here we reset the object
50FMI> (fmi2reset (p fmu-test))
51:FMI2OK
52;; We can set the time ... notice the accessor (p fmu-test) to the process pointer.
53FMI> (fmi2settime (p fmu-test) 0.0d0)
54:FMI2OK
55;; We can set the experimental plan ... notice the fmi2 boolean variables
56FMI> (fmi2SetupExperiment (p fmu-test) fmi2True 1.0d-5 0.0d0 fmi2True 1.0d0)
57:FMI2OK
58
59;; Initialization stage
60FMI>(fmi2enterinitializationmode (p fmu-test))
61:FMI2OK
62;; The fmu-info helps us locate the variables
63;; At this moment we need to identify the parameters and variables to initialize
64;; We only access the fmu-info object so no status message here
65FMI> (fmi2-print-variables fmu-info :index t :variability t :causality t :type t)
66---------------
67MODEL VARIABLES
68 y 0 continuous Real by Default output
69 yd 1 continuous Real by Default output
70 der(y) 2 continuous Real by Default local
71 der(yd) 3 continuous Real by Default local
72 u 4 continuous Real by Default input
73 D 5 fixed Real by Default parameter
74 k 6 fixed Real by Default parameter
75 w 7 fixed Real by Default parameter
76 y_start 8 fixed Real by Default parameter
77 yd_start 9 fixed Real by Default parameter
78 initType 10 fixed Modelica.Blocks.Types.Init calculatedParameter
79---------------
80MODEL STRUCTURE
81---------------
82INDEX of OUTPUT VARIABLES : (1 2)
83---------------
84INDEX of DERIVATIVE VARIABLES : (3 4)
85NIL
86;; TO Ease the readability we can assign some values to parameters
87FMI> (defparameter D 0.7d0)
88(defparameter k 1.0d0)
89(defparameter w 100.0d0)
90(defparameter y_start 0.0d0)
91(defparameter yd_start 0.0d0)
92;; And send them to the real parameters of the FMU object
93FMI> (fmi2-set-real (p fmu-test) '(5 6 7 8 9) (list D k w y_start yd_start))
94:FMI2OK
95;; And check that it worked.
96FMI> (fmi2-get-real (p fmu-test) '(1 2 3 4 5 6 7 8))
97:FMI2OK
98((1 0.0d0) (2 0.0d0) (3 0.0d0) (4 0.0d0) (5 0.7d0) (6 1.0d0) (7 100.0d0)
99 (8 0.0d0))
100
101;; Let us get out of initialization
102FMI> (fmi2ExitInitializationMode (p fmu-test))
103:FMI2OK
104
105;;************************************************************************************************************
106;; Let us enter the continuous mode
107FMI> (fmi2entercontinuoustimemode (p fmu-test))
108:FMI2OK
109;; At this stage we can set variables and see the impact for example on the derivatives
110;; Once we can do this we can exploit the model and feed it to a solver.
111;; u is the variable 4 it is an input
112FMI> (fmi2-set-real (p fmu-test) '(4) '(1.0d-2))
113:FMI2OK
114;; We can set time also at this stage ... as an input to the get derivatives
115;; It was already done but we can do it.
116FMI> (fmi2settime (p fmu-test) 0.0d0)
117:FMI2OK
118;; First let us set the states variables
119;; Setting of the State variables (here there are two )
120FMI> (fmi2-set-continuous-states (p fmu-test) '(0.0d0 0.0d0))
121:FMI2OK
122;; Getting the value of the Derivatives of the State variables
123FMI> (fmi2-get-derivatives (p fmu-test) 2 )
124:FMI2OK
125((1 0.0d0) (2 100.0d0))
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147