Opened 11 years ago
Last modified 11 years ago
#3182 new defect
dimension size of function calls
| Reported by: | Volker Waurich | Owned by: | somebody |
|---|---|---|---|
| Priority: | high | Milestone: | Future |
| Component: | Frontend | Version: | trunk |
| Keywords: | functions, array dimension | Cc: | Per Östlund, Martin Sjölund, Adrian Pop, Niklas Worschech |
Description
Hi,
The dimension of an array-equation with (external) functions can occasionally be evaluated. See example model:
package funcTest
function func
input Real[n] arrIn;
input Integer n;
output Real[n] arrOut;
external "C" foo(arrIn,arrOut);
end func;
model funcDimension
parameter Integer n1 = 2;
Real x[n1], x1[n1];
Real y;
equation
for i in 1:n1 loop
x1[i] = time;
end for;
x = func(x1,n1);
der(y) = x[1];
end funcDimension;
end funcTest;
+d=dumpSimCode tells us that
8: x=funcTest.func(x1, 2)[Real[:] ]
the dimension of the arrayequation is unknown but actually, this could be evaluated with the help of the function declaration to n i.e. n1 and even 2 (if we evaluate parameter).
Change History (2)
follow-up: 2 comment:1 by , 11 years ago
comment:2 by , 11 years ago
Replying to rfranke:
How do you use dumpSimCode? Can you post a command line call? I tried
$ omc +d=dumpSimCode -i=funcTest.funcDimension funcTest.moand got nothing but the regular flattened model.
Btw. Modelica libraries typically use the size operator. Some even overuse the size operator (maybe hoping for better tool support); see e.g.
Modelica.Math.Matrices.continuousLyapunov. The best practice seems to be to use the size operator for I/O arguments, but not for internal variables, see e.g.Modelica.Math.Matrices.exp.
function func input Real[:] arrIn; output Real[size(arrIn,1)] arrOut; external "C" foo(arrIn,arrOut); end func;
+d=dumpSimCode outputs the objects used for the templates. If you only instantiate your class with -i then the Compiler will not generate the simCode structure.
You could activate the simulation codegen. Add -s to your command line call.

How do you use dumpSimCode? Can you post a command line call? I tried
and got nothing but the regular flattened model.
Btw. Modelica libraries typically use the size operator. Some even overuse the size operator (maybe hoping for better tool support); see e.g.
Modelica.Math.Matrices.continuousLyapunov. The best practice seems to be to use the size operator for I/O arguments, but not for internal variables, see e.g.Modelica.Math.Matrices.exp.