source: trunk/Python/src/tests_jmodelica/files/Modelica/ExtFunctionTests.mo @ 13703

Last change on this file since 13703 was 13703, checked in by Christian Andersson, 2 months ago

Reverted changeset:13700. Related to ticket:5837

File size: 34.7 KB
Line 
1package ExtFunctionTests
2
3model ExtFunctionTest1
4 Real a(start=1) = 1;
5 Real b(start=2) = 2;
6 Real c(start=2);
7
8equation
9  c = add(a,b);
10
11end ExtFunctionTest1;
12
13function add
14 input Real a;
15 input Real b;
16 output Real c;
17
18 external "C" annotation(Library="addNumbers",
19                         Include="#include \"addNumbers.h\"");
20end add;
21
22model ExtFunctionTest2
23   
24function extFunc1
25    input Real m;
26    input Real[:,:,:] a;
27    input Integer[size(a,1),size(a,2),size(a,3)] b;
28    input Boolean[size(a,1),size(a,2)] c;
29    output Real sum;
30    output Real[size(a,1),size(a,2),size(a,3)] o;
31    output Real[size(a,1)*size(a,2)*size(a,3)] step;
32    external "C" annotation(
33        Library="arrayFunctions",
34        Include="#include \"arrayFunctions.h\"");
35end extFunc1;
36
37Real[3,3,3] x;
38Real s;
39Real[27] step;
40
41constant Real arg1 = 3.14;
42constant Real[3,3,3] arg2 = {{{1e1,1e2,1e3},{1e4,1e5,1e6},{1e7,1e8,1e9}},{{1,1,1},{1,1,1},{1,1,1}},{{1e-1,1e-2,1e-3},{1e-4,1e-5,1e-6},{1e-7,1e-8,1e-9}}};
43constant Integer[3,3,3] arg3 = {{{1,2,3},{4,5,6},{7,8,9}},{{11,12,13},{14,15,16},{17,18,19}},{{21,22,23},{24,25,26},{27,28,29}}};
44constant Boolean[3,3] arg4 = {{true,true,true},{true, false, true},{false,true,false}};
45equation
46    (s,x,step) = extFunc1(arg1, arg2, arg3, arg4);
47
48end ExtFunctionTest2;
49
50model ExtFunctionBool
51   
52function copyBoolArray
53    input Boolean[:] a;
54    output Boolean[size(a,1)] b;
55    external "C" annotation(
56        Library="arrayFunctions",
57        Include="#include \"arrayFunctions.h\"");
58end copyBoolArray;
59
60constant Boolean[8] arg = {true,true,true,false,true,false,false,true};
61Boolean[8] res;
62equation
63    res = copyBoolArray(arg);
64end ExtFunctionBool;
65
66model ExtFunctionRecord
67    record R
68        Real x;
69    end R;
70    function fRecord
71        input R r;
72        output R y;
73      external "C" fRecord(r,y) annotation(
74        Library="externalFunctionsC",
75        Include="#include \"externalFunctionsC.h\"");
76    end fRecord;
77    R y = fRecord(R(time));
78end ExtFunctionRecord;
79
80model ExtFunctionRecordCeval
81    record R
82        Real x;
83    end R;
84    function fRecord
85        input R r;
86        output R y;
87      external "C" fRecord(r,y) annotation(
88        Library="externalFunctionsC",
89        Include="#include \"externalFunctionsC.h\"");
90    end fRecord;
91    constant R y1 = fRecord(R(3));
92    R y2 = fRecord(R(3));
93end ExtFunctionRecordCeval;
94
95model ExtFunctionRecordObj
96    record R1
97        R2 r2;
98    end R1;
99    record R2
100        Real x;
101    end R2;
102   
103    model EO
104        extends ExternalObject;
105        function constructor
106            input R1 r1;
107            output EO eo;
108            external "C" eo=eo_constructor_record(r1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
109        end constructor;
110        function destructor
111            input EO eo;
112            external "C" eo_destructor_record(eo) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
113        end destructor;
114    end EO;
115   
116    function f
117        input EO eo;
118        output Real y;
119        external "C" y=eo_use_record(eo) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
120    end f;
121   
122    parameter EO eo = EO(R1(R2(3)));
123    parameter Real y = f(eo);
124end ExtFunctionRecordObj;
125
126model ExtFunctionRecordObjCeval
127    extends ExtFunctionRecordObj;
128    parameter Integer n = integer(y);
129    Real[:] x = 1:n;
130end ExtFunctionRecordObjCeval;
131
132model ExtFunctionTest3
133 Real a(start=10);
134 Real b;
135   
136 equation
137   b = testModelicaMessages(5);
138   testModelicaErrorMessages();
139   testModelicaAllocateStrings();
140   der(a) = a;
141 
142end ExtFunctionTest3;
143
144function testModelicaMessages
145input Real a;
146output Real b;
147    external "C" annotation(Include="#include \"testModelicaUtilities.c\"");
148end testModelicaMessages;
149
150function testModelicaErrorMessages
151    external "C" annotation(Include="#include \"testModelicaUtilities.c\"");
152end testModelicaErrorMessages;
153
154function testModelicaAllocateStrings
155    external "C" annotation(Include="#include \"testModelicaUtilities.c\"");
156end testModelicaAllocateStrings;
157
158model ExtFunctionTest4
159    Integer[3] myArray = {1,2,3};
160    Integer[3] myResult = doubleArray(myArray);
161   
162end ExtFunctionTest4;
163
164function doubleArray
165    input Integer[3] arr;
166    output Integer[3] res;
167
168    external "C" multiplyAnArray(arr, res, 3, 2) annotation(Include="#include \"addNumbers.h\"", Library="addNumbers");
169end doubleArray;
170
171class FileOnDelete
172    extends ExternalObject;
173   
174    function constructor
175        input String name;
176        output FileOnDelete out;
177        external "C" out = constructor_string(name) 
178            annotation(Library="extObjects", Include="#include \"extObjects.h\"");
179    end constructor;
180   
181    function destructor
182        input FileOnDelete obj;
183        external "C" destructor_string_create_file(obj) 
184            annotation(Library="extObjects", Include="#include \"extObjects.h\"");
185    end destructor; 
186end FileOnDelete;
187
188function use_FOD
189    input FileOnDelete obj;
190    output Real x;
191    external "C" x = constant_extobj_func(obj) 
192        annotation(Library="extObjects", Include="#include \"extObjects.h\"");
193end use_FOD;
194
195model ExternalObjectTests1
196    FileOnDelete obj = FileOnDelete("test_ext_object.marker");
197    Real x = use_FOD(obj);
198end ExternalObjectTests1;
199
200model ExternalObjectTests2
201    FileOnDelete myEOs[2] = { FileOnDelete("test_ext_object_array1.marker"), FileOnDelete("test_ext_object_array2.marker")};
202    Real z;
203
204 function get_y
205    input FileOnDelete eos[:];
206    output Real y;
207 algorithm
208    y := use_FOD(eos[1]);
209 end get_y;
210 
211equation
212    z = get_y(myEOs); 
213end ExternalObjectTests2;
214
215class ConstructorSingleCall
216    extends ExternalObject;
217   
218    function constructor
219        input String name;
220        output ConstructorSingleCall out;
221        external "C" out = constructor_error_multiple_calls(name) 
222            annotation(Library="extObjects", Include="#include \"extObjects.h\"");
223    end constructor;
224   
225    function destructor
226        input ConstructorSingleCall obj;
227        external "C" destructor(obj) 
228            annotation(Library="extObjects", Include="#include \"extObjects.h\"");
229    end destructor; 
230end ConstructorSingleCall;
231
232model ConstructorSingleCallTest
233    ConstructorSingleCall obj = ConstructorSingleCall("test_ext_object.marker");
234end ConstructorSingleCallTest;
235
236model ConstructorSingleCallDepTest
237    parameter String s = "test_ext_object.marker";
238    ConstructorSingleCall obj = ConstructorSingleCall(s);
239end ConstructorSingleCallDepTest;
240
241model ExternalInfinityTest
242function whileTrue
243    input Real a;
244    output Real b;
245    external "C" annotation(
246        Library="arrayFunctions",
247        Include="#include \"arrayFunctions.h\"");
248end whileTrue;
249    Real x;
250equation
251    x = whileTrue(1);
252end ExternalInfinityTest;
253
254model ExternalInfinityTestCeval
255function whileTrue
256    input Real a;
257    output Real b;
258    external "C" annotation(
259        Library="arrayFunctions",
260        Include="#include \"arrayFunctions.h\"");
261end whileTrue;
262    constant Real x = whileTrue(1);
263end ExternalInfinityTestCeval;
264
265package CEval
266  package C
267    model RealTest
268      function fRealScalar
269        input  Real x_in;
270        output Real x_out;
271      external "C" annotation(
272        Library="externalFunctionsC",
273        Include="#include \"externalFunctionsC.h\"");
274      end fRealScalar;
275     
276      function fRealArray
277        input  Real[2] x_in;
278        output Real[size(x_in,1)] x_out;
279      external "C" annotation(
280        Library="externalFunctionsC",
281        Include="#include \"externalFunctionsC.h\"");
282      end fRealArray;
283     
284      function fRealArrayUnknown
285        input  Real[:] x_in;
286        output Real[size(x_in,1)] x_out;
287      external "C" fRealArray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
288        Library="externalFunctionsC",
289        Include="#include \"externalFunctionsC.h\"");
290      end fRealArrayUnknown;
291
292      constant Real    xScalar        = fRealScalar(3);
293      constant Real[2] xArray         = fRealArray({4,5});
294      constant Real[2] xArrayUnknown  = fRealArrayUnknown({6,7});
295    end RealTest;
296   
297    model IntegerTest
298      function fIntegerScalar
299        input  Integer x_in;
300        output Integer x_out;
301      external "C" annotation(
302        Library="externalFunctionsC",
303        Include="#include \"externalFunctionsC.h\"");
304      end fIntegerScalar;
305     
306      function fIntegerArray
307        input  Integer[2] x_in;
308        output Integer[size(x_in,1)] x_out;
309      external "C" annotation(
310        Library="externalFunctionsC",
311        Include="#include \"externalFunctionsC.h\"");
312      end fIntegerArray;
313     
314      function fIntegerArrayUnknown
315        input  Integer[:] x_in;
316        output Integer[size(x_in,1)] x_out;
317      external "C" fIntegerArray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
318        Library="externalFunctionsC",
319        Include="#include \"externalFunctionsC.h\"");
320      end fIntegerArrayUnknown;
321
322      constant Integer    xScalar        = fIntegerScalar(3);
323      constant Integer[2] xArray         = fIntegerArray({4,5});
324      constant Integer[2] xArrayUnknown  = fIntegerArrayUnknown({6,7});
325    end IntegerTest;
326   
327    model BooleanTest
328      function fBooleanScalar
329        input  Boolean x_in;
330        output Boolean x_out;
331      external "C" annotation(
332        Library="externalFunctionsC",
333        Include="#include \"externalFunctionsC.h\"");
334      end fBooleanScalar;
335     
336      function fBooleanArray
337        input  Boolean[2] x_in;
338        output Boolean[size(x_in,1)] x_out;
339      external "C" annotation(
340        Library="externalFunctionsC",
341        Include="#include \"externalFunctionsC.h\"");
342      end fBooleanArray;
343     
344      function fBooleanArrayUnknown
345        input  Boolean[:] x_in;
346        output Boolean[size(x_in,1)] x_out;
347      external "C" fBooleanArray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
348        Library="externalFunctionsC",
349        Include="#include \"externalFunctionsC.h\"");
350      end fBooleanArrayUnknown;
351
352      constant Boolean    xScalar        = fBooleanScalar(true);
353      constant Boolean[2] xArray         = fBooleanArray({false,false});
354      constant Boolean[2] xArrayUnknown  = fBooleanArrayUnknown({false,true});
355    end BooleanTest;
356   
357    model StringTest
358      function fStringScalar
359        input  String x_in;
360        output String x_out;
361      external "C" annotation(
362        Library="externalFunctionsC",
363        Include="#include \"externalFunctionsC.h\"");
364      end fStringScalar;
365     
366      function fStringScalarLit
367        input  String x_in;
368        output String x_out;
369      external "C" annotation(
370        Library="externalFunctionsC",
371        Include="#include \"externalFunctionsC.h\"");
372      end fStringScalarLit;
373     
374      function fStringArray
375        input  String[2] x_in;
376        output String[size(x_in,1)] x_out;
377      external "C" annotation(
378        Library="externalFunctionsC",
379        Include="#include \"externalFunctionsC.h\"");
380      end fStringArray;
381     
382      function fStringArrayUnknown
383        input  String[:] x_in;
384        output String[size(x_in,1)] x_out;
385      external "C" fStringArray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
386        Library="externalFunctionsC",
387        Include="#include \"externalFunctionsC.h\"");
388      end fStringArrayUnknown;
389     
390      function fStrlen
391        input String s;
392        output Integer n;
393      external "C" n = fStrlen(s) annotation(
394        Library="externalFunctionsC",
395        Include="#include \"externalFunctionsC.h\"");
396      end fStrlen;
397
398      constant Integer   len            = fStrlen("abcde");
399      constant String    xScalar        = fStringScalar("abcde");
400      constant String    xScalarLit     = fStringScalarLit("abcde");
401      constant String[2] xArray         = fStringArray({"abc","def"});
402      constant String[2] xArrayUnknown  = fStringArrayUnknown({"abc","def"});
403    end StringTest;
404   
405    model EnumTest
406      type E = enumeration(E1,E2);
407      function fEnumScalar
408        input  E x_in;
409        output E x_out;
410      external "C" annotation(
411        Library="externalFunctionsC",
412        Include="#include \"externalFunctionsC.h\"");
413      end fEnumScalar;
414     
415      function fEnumArray
416        input  E[2] x_in;
417        output E[size(x_in,1)] x_out;
418      external "C" annotation(
419        Library="externalFunctionsC",
420        Include="#include \"externalFunctionsC.h\"");
421      end fEnumArray;
422   
423      function fEnumArrayUnknown
424        input  E[:] x_in;
425        output E[size(x_in,1)] x_out;
426      external "C" fEnumArray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
427        Library="externalFunctionsC",
428        Include="#include \"externalFunctionsC.h\"");
429      end fEnumArrayUnknown;
430     
431      constant E    xScalar        = fEnumScalar(E.E1);
432      constant E[2] xArray         = fEnumArray({E.E2,E.E1});
433      constant E[2] xArrayUnknown  = fEnumArrayUnknown({E.E1,E.E2});
434    end EnumTest;
435   
436    model ShortClass
437        function f1
438            input Real x;
439            output Real y;
440          external y = fRealScalar(x) annotation(
441            Library="externalFunctionsC",
442            Include="#include \"externalFunctionsC.h\"");
443        end f1;
444        function f2 = f1(x(min=1));
445        function f3 = f2;
446        function f4 = f3(x(max=2));
447        constant Real a1 = f1(1) + f2(2) + f3(3) + f4(4);
448    end ShortClass;
449   
450    model PackageConstantTest
451      constant Real[2] c = {4,5};
452     
453      function f
454        output Real[2] x_out;
455      external "C" fRealArray(c, size(c,1), x_out, size(x_out,1)) annotation(
456        Library="externalFunctionsC",
457        Include="#include \"externalFunctionsC.h\"");
458      end f;
459   
460      constant Real[2] x  = f();
461    end PackageConstantTest;
462   
463  end C;
464 
465  package Fortran
466    model RealTest
467      function frealscalar
468        input  Real x_in;
469        output Real x_out;
470      external "FORTRAN 77" annotation(
471        Library="externalFunctionsFortran");
472      end frealscalar;
473     
474      function frealarray
475        input  Real[2] x_in;
476        output Real[size(x_in,1)] x_out;
477      external "FORTRAN 77" annotation(
478        Library="externalFunctionsFortran");
479      end frealarray;
480   
481      function frealarrayunknown
482        input  Real[:] x_in;
483        output Real[size(x_in,1)] x_out;
484      external "FORTRAN 77" frealarray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
485        Library="externalFunctionsFortran");
486      end frealarrayunknown;
487     
488      constant Real    xScalar        = frealscalar(3);
489      constant Real[2] xArray         = frealarray({4,5});
490      constant Real[2] xArrayUnknown  = frealarrayunknown({6,7});
491    end RealTest;
492   
493    model RealTestMatrix
494      function frealmatrix
495        input  Real[:,:] x_in;
496        output Real[size(x_in,1), size(x_in,2)] x_out;
497      external "FORTRAN 77" frealmatrix(size(x_in,1), size(x_in,2), x_in, x_out) annotation(
498        Library="externalFunctionsFortran");
499      end frealmatrix;
500     
501      constant Real[1,1] y1  = frealmatrix({{1}});
502      constant Real[2,2] y2  = frealmatrix({{6,7},{8,9}});
503    end RealTestMatrix;
504   
505    model IntegerTest
506      function fintegerscalar
507        input  Integer x_in;
508        output Integer x_out;
509      external "FORTRAN 77" annotation(
510        Library="externalFunctionsFortran");
511      end fintegerscalar;
512     
513      function fintegerarray
514        input  Integer[2] x_in;
515        output Integer[size(x_in,1)] x_out;
516      external "FORTRAN 77" annotation(
517        Library="externalFunctionsFortran");
518      end fintegerarray;
519   
520      function fintegerarrayunknown
521        input  Integer[:] x_in;
522        output Integer[size(x_in,1)] x_out;
523      external "FORTRAN 77" fintegerarray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
524        Library="externalFunctionsFortran");
525      end fintegerarrayunknown;
526     
527      constant Integer    xScalar        = fintegerscalar(3);
528      constant Integer[2] xArray         = fintegerarray({4,5});
529      constant Integer[2] xArrayUnknown  = fintegerarrayunknown({6,7});
530    end IntegerTest;
531   
532    model BooleanTest
533      function fbooleanscalar
534        input  Boolean x_in;
535        output Boolean x_out;
536      external "FORTRAN 77" annotation(
537        Library="externalFunctionsFortran");
538      end fbooleanscalar;
539     
540      function fbooleanarray
541        input  Boolean[2] x_in;
542        output Boolean[size(x_in,1)] x_out;
543      external "FORTRAN 77" annotation(
544        Library="externalFunctionsFortran");
545      end fbooleanarray;
546   
547      function fbooleanarrayunknown
548        input  Boolean[:] x_in;
549        output Boolean[size(x_in,1)] x_out;
550      external "FORTRAN 77" fbooleanarray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
551        Library="externalFunctionsFortran");
552      end fbooleanarrayunknown;
553     
554      constant Boolean    xScalar        = fbooleanscalar(true);
555      constant Boolean[2] xArray         = fbooleanarray({false,false});
556      constant Boolean[2] xArrayUnknown  = fbooleanarrayunknown({false,true});
557    end BooleanTest;
558
559    model EnumTest
560      type E = enumeration(E1,E2);
561      function fenumscalar
562        input  E x_in;
563        output E x_out;
564      external "FORTRAN 77" annotation(
565        Library="externalFunctionsFortran");
566      end fenumscalar;
567     
568      function fenumarray
569        input  E[2] x_in;
570        output E[size(x_in,1)] x_out;
571      external "FORTRAN 77" annotation(
572        Library="externalFunctionsFortran");
573      end fenumarray;
574   
575      function fenumarrayunknown
576        input  E[:] x_in;
577        output E[size(x_in,1)] x_out;
578      external "FORTRAN 77" fenumarray(x_in, size(x_in,1), x_out, size(x_in,1)) annotation(
579        Library="externalFunctionsFortran");
580      end fenumarrayunknown;
581     
582      constant E    xScalar        = fenumscalar(E.E1);
583      constant E[2] xArray         = fenumarray({E.E2,E.E1});
584      constant E[2] xArrayUnknown  = fenumarrayunknown({E.E1,E.E2});
585    end EnumTest;
586  end Fortran;
587 
588  package Utility
589    model LogTest
590      function func_with_ModelicaError
591        input  Real x_in;
592        output Real x_out;
593      external "C" annotation(Library="useModelicaError",
594                         Include="#include \"useModelicaError.h\"");
595      end func_with_ModelicaError;
596
597      Real xLog   = func_with_ModelicaError(1.1);
598      Real xError = func_with_ModelicaError(2.1);
599    end LogTest;
600  end Utility;
601 
602  package Advanced
603    model DgelsxTest
604      function dgelsx
605        "Computes the minimum-norm solution to a real linear least squares problem with rank deficient A"
606        input Real A[3, 2];
607        input Real B[size(A, 1), 3];
608        input Real rcond=0.0 "Reciprocal condition number to estimate rank";
609        output Real X[max(size(A, 1), size(A, 2)), size(B, 2)]=cat(
610                1,
611                B,
612                zeros(max(nrow, ncol) - nrow, nrhs))
613        "Solution is in first size(A,2) rows";
614        output Integer info;
615        output Integer rank "Effective rank of A";
616      protected
617        Integer nrow=size(A, 1);
618        Integer ncol=size(A, 2);
619        Integer nx=max(nrow, ncol);
620        Integer nrhs=size(B, 2);
621        Real work[max(min(size(A, 1), size(A, 2)) + 3*size(A, 2), 2*min(size(A, 1),
622          size(A, 2)) + size(B, 2))];
623        Real Awork[size(A, 1), size(A, 2)]=A;
624        Integer jpvt[size(A, 2)]=zeros(ncol);
625      external"FORTRAN 77" dgelsx(
626                nrow,
627                ncol,
628                nrhs,
629                Awork,
630                nrow,
631                X,
632                nx,
633                jpvt,
634                rcond,
635                rank,
636                work,
637                info);
638      end dgelsx;
639     
640      Real[3,3] out;
641      Real a;
642      Real b;
643    equation
644      (out,a,b) = dgelsx({{1,2},{3,4}, {5,6}},{{7,8,9},{10,11,12}, {13,14,15}});
645     
646    end DgelsxTest;
647    package Os
648    model Obj1
649        extends ExternalObject;
650        function constructor
651            input Real x;
652            input Integer y;
653            input Boolean b;
654            input String s;
655            output Obj1 o1;
656            external "C" o1 = my_constructor1(x,y,b,s)
657                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
658        end constructor;
659        function destructor
660            input Obj1 o1;
661            external "C"
662                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
663        end destructor;
664    end Obj1;
665    end Os;
666    model Obj2
667        extends ExternalObject;
668        function constructor
669            input Real[:] x;
670            input Integer[2] y;
671            input Boolean[:] b;
672            input String[:] s;
673            output Obj2 o2;
674            external "C" my_constructor2(x,y,o2,b,s)
675                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
676        end constructor;
677        function destructor
678            input Obj2 o2;
679            external "C"
680                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
681        end destructor;
682    end Obj2;
683    model Obj3
684        extends ExternalObject;
685        function constructor
686            input Os.Obj1 o1;
687            input Obj2[:] o2;
688            output Obj3 o3;
689            external "C" my_constructor3(o1,o2,o3)
690                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
691        end constructor;
692        function destructor
693            input Obj3 o3;
694            external "C"
695                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
696        end destructor;
697    end Obj3;
698    model ExtObjTest1
699        function use1
700            input  Os.Obj1 o1;
701            output Real x;
702            external annotation(Library="extObjects", Include="#include \"extObjects.h\"");
703        end use1;
704        Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
705        Real x = use1(o1); 
706    end ExtObjTest1;
707    model ExtObjTest2
708        function use2
709            input  Obj2 o2;
710            output Real x;
711            external annotation(Library="extObjects", Include="#include \"extObjects.h\"");
712        end use2;
713        Obj2 o2 = Obj2({3.13,3.14}, {3,4}, {false, true}, {"A message 1", "A message 2"});
714        constant Real x = use2(o2); 
715    end ExtObjTest2;
716    model ExtObjTest3
717        function use3
718            input  Obj3 o3;
719            output Real x;
720            external annotation(Library="extObjects", Include="#include \"extObjects.h\"");
721        end use3;
722        Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
723        Obj2 o2 = Obj2({3.13,3.14}, {3,4}, {false, true}, {"A message 1", "A message 2"});
724        Obj3 o3 = Obj3(o1,{o2,o2});
725        constant Real x = use3(o3); 
726    end ExtObjTest3;
727   
728    model UnknownInput
729      // Should fail
730      function f
731        input  Real x;
732        input  Real t;
733        output Real y = t;
734        output Real dummy=1;
735      external "C" y=fRealScalar(x) annotation(
736        Library="externalFunctionsC",
737        Include="#include \"externalFunctionsC.h\"");
738      end f;
739     
740      Real y;
741    equation
742      (y, ) = f(3, time);
743    end UnknownInput;
744  end Advanced;
745 
746  package Caching
747    model CacheExtObj
748        model EO
749            extends ExternalObject;
750            function constructor
751                input Integer x;
752                output EO o1;
753                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
754            end constructor;
755            function destructor
756                input EO o1;
757                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
758            end destructor;
759        end EO;
760        function use
761            input  EO o1;
762            output Integer x;
763            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
764        end use;
765        parameter EO o1 = EO(1);
766        parameter Integer n1 = use(o1);
767        parameter Integer n2 = use(o1);
768        parameter Integer n3 = n1 + n2;
769        Real[n3] x = (1:n3)*time;
770        Integer nn1,nn2,nn3;
771      equation
772        nn1 = use(o1);
773        nn2 = use(o1);
774        nn3 = nn1 + nn2;
775    end CacheExtObj;
776   
777    model CacheExtObjLimit
778        model EO
779            extends ExternalObject;
780            function constructor
781                input Integer x;
782                output EO o1;
783                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
784            end constructor;
785            function destructor
786                input EO o1;
787                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
788            end destructor;
789        end EO;
790        function use1
791            input  EO o1;
792            output Integer x;
793            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
794        end use1;
795        function use2
796            input  EO o1;
797            output Integer x;
798            external x = inc_int_use2(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
799        end use2;
800        parameter EO o1 = EO(1);
801        parameter EO o2 = EO(1);
802        parameter Integer n1 = use1(o1) + use2(o1) + use1(o2) + use2(o1);
803        parameter Integer n2 = use2(o2) + use2(o1) + use2(o2) + use1(o1);
804        parameter Integer n3 = n1 + n2;
805        Real[n3] x = (1:n3)*time;
806    end CacheExtObjLimit;
807   
808    model ConError
809        model EO
810            extends ExternalObject;
811            function constructor
812                input Integer x;
813                output EO o1;
814                external "C" o1 = error_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
815            end constructor;
816            function destructor
817                input EO o1;
818                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
819            end destructor;
820        end EO;
821        function use
822            input  EO o1;
823            output Integer x;
824            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
825        end use;
826        parameter EO o1 = EO(1) annotation(Evaluate=true);
827        parameter Integer n1 = use(o1);
828        parameter Integer n2 = use(o1);
829        parameter Integer n3 = n1 + n2;
830    end ConError;
831   
832    model DeconError
833        model EO
834            extends ExternalObject;
835            function constructor
836                input Integer x;
837                output EO o1;
838                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
839            end constructor;
840            function destructor
841                input EO o1;
842                external "C" error_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
843            end destructor;
844        end EO;
845        function use
846            input  EO o1;
847            output Integer x;
848            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
849        end use;
850        parameter EO o1 = EO(1) annotation(Evaluate=true);
851        parameter Integer n1 = use(o1);
852        parameter Integer n2 = use(o1);
853        parameter Integer n3 = n1 + n2;
854    end DeconError;
855   
856    model UseError
857        model EO
858            extends ExternalObject;
859            function constructor
860                input Integer x;
861                output EO o1;
862                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
863            end constructor;
864            function destructor
865                input EO o1;
866                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
867            end destructor;
868        end EO;
869        function use
870            input  EO o1;
871            output Integer x;
872            external x = error_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
873        end use;
874        parameter EO o1 = EO(1) annotation(Evaluate=true);
875        parameter Integer n1 = use(o1);
876        parameter Integer n2 = use(o1);
877        parameter Integer n3 = n1 + n2;
878    end UseError;
879   
880    model ConCrash
881        model EO
882            extends ExternalObject;
883            function constructor
884                input Integer x;
885                output EO o1;
886                external "C" o1 = crash_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
887            end constructor;
888            function destructor
889                input EO o1;
890                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
891            end destructor;
892        end EO;
893        function use
894            input  EO o1;
895            output Integer x;
896            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
897        end use;
898        parameter EO o1 = EO(1) annotation(Evaluate=true);
899        parameter Integer n1 = use(o1);
900        parameter Integer n2 = use(o1);
901        parameter Integer n3 = n1 + n2;
902    end ConCrash;
903   
904    model DeconCrash
905        model EO
906            extends ExternalObject;
907            function constructor
908                input Integer x;
909                output EO o1;
910                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
911            end constructor;
912            function destructor
913                input EO o1;
914                external "C" crash_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
915            end destructor;
916        end EO;
917        function use
918            input  EO o1;
919            output Integer x;
920            external x = inc_int_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
921        end use;
922        parameter EO o1 = EO(1) annotation(Evaluate=true);
923        parameter Integer n1 = use(o1);
924        parameter Integer n2 = use(o1);
925        parameter Integer n3 = n1 + n2;
926    end DeconCrash;
927   
928    model UseCrash
929        model EO
930            extends ExternalObject;
931            function constructor
932                input Integer x;
933                output EO o1;
934                external "C" o1 = inc_int_con(x) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
935            end constructor;
936            function destructor
937                input EO o1;
938                external "C" inc_int_decon(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
939            end destructor;
940        end EO;
941        function use
942            input  EO o1;
943            output Integer x;
944            external x = crash_use(o1) annotation(Library="extObjects", Include="#include \"extObjects.h\"");
945        end use;
946        parameter EO o1 = EO(1) annotation(Evaluate=true);
947        parameter Integer n1 = use(o1);
948        parameter Integer n2 = use(o1);
949        parameter Integer n3 = n1 + n2;
950    end UseCrash;
951  end Caching;
952end CEval;
953
954model PrintsControlCharacters
955    "This model prints some control characters using ModelicaMessage during compilation"
956    function f
957        input Real i;
958        output Real o;
959        external "C" o = f(i) annotation(Include="double f(double i) {ModelicaMessage(\"\\1\\2\\3\\4\");return i;}");
960    end f;
961    constant Real c = f(2);
962end PrintsControlCharacters;
963
964model StructuralAsserts
965    function f
966        output Integer n;
967        external "C" n = get_time() annotation(Library="externalFunctionsC", Include="#include \"externalFunctionsC.h\"");
968    end f;
969   
970    parameter Integer n = f() annotation(Evaluate=true);
971end StructuralAsserts;
972
973
974model TestString
975    import Modelica.Utilities.Strings.*;
976    function Str1
977        input  Real x;
978        output Real y;
979    protected
980        String str;
981    algorithm
982        str := Str2(x);
983        y := length(str);
984        assert(str == "Hej", "Failed to provide the correct string, was: "+str);
985        annotation(Inline=false);
986    end Str1;
987    function Str2
988        input  Real x;
989        output String str;
990    algorithm
991        str := fStringScalarLit("jeH");
992        assert(str == "Hej", "Failed to provide the correct string, was: "+str);
993        annotation(Inline=false);
994    end Str2;
995    function fStringScalarLit
996        input  String x_in;
997        output String x_out;
998      external "C" annotation(
999        Library="externalFunctionsC",
1000        Include="#include \"externalFunctionsC.h\"");
1001      end fStringScalarLit;
1002    parameter Real x(fixed=false);
1003initial equation
1004    x = Str1(1.0);
1005end TestString;
1006
1007
1008model ExternalObjectTests3
1009    class ModelicaMsgOnDelete
1010        extends ExternalObject;
1011       
1012        function constructor
1013            input String name;
1014            output ModelicaMsgOnDelete out;
1015            external "C" out = constructor_modelica_msg(name) 
1016                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
1017        end constructor;
1018       
1019        function destructor
1020            input ModelicaMsgOnDelete obj;
1021            external "C" destructor_modelica_msg(obj) 
1022                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
1023        end destructor; 
1024    end ModelicaMsgOnDelete;
1025
1026    function use_MMOD
1027        input ModelicaMsgOnDelete obj;
1028        output Real x;
1029        external "C" x = constant_extobj_func(obj) 
1030            annotation(Library="extObjects", Include="#include \"extObjects.h\"");
1031    end use_MMOD;
1032   
1033    ModelicaMsgOnDelete obj = ModelicaMsgOnDelete("test_ext_object.marker");
1034    Real x = use_MMOD(obj);
1035end ExternalObjectTests3;
1036
1037model MultiUse1
1038    function f1
1039        input Real x;
1040        output Real y;
1041        external "C" y = add(x,1) annotation(Library="addNumbers",
1042                                           Include="#include \"addNumbers.h\"");
1043    end f1;
1044    function f2
1045        input Real x;
1046        output Real y;
1047        external "C" y = add(x,2) annotation(Library="addNumbers",
1048                                           Include="#include \"addNumbers.h\"");
1049    end f2;
1050   
1051    Real y = f1(1) + f2(1);
1052end MultiUse1;
1053
1054end ExtFunctionTests;
Note: See TracBrowser for help on using the repository browser.