Hello Jorge!
Just a little comment on your model. A function in Modelica should always
return the same value given the same argument, so a function with no
arguments is a constant. Since i is not involved in any integration
nothing tells the compiler when to call f(). A tool could chose to
evaluate it only once during compile time. I you want to implement a
random function I would suggest keeping the random seed in a Modelica
variable and passing it to the random function and also let the random
function return an updated value for the seed variable. Something like
this:
class E
discrete Real y;
discrete Real seed;
equation
when sample(0,0.1) then
(y, seed) = f(pre(seed));
end when;
end E;
which would give y a new value 10 times per sec. I'm not sure though if
functions with multiple return values are supported yet.
In any case if you call f() from within a when-clause you have control of
how often it is called so you can get away with just passing time as an
argument since we know it will only be called once per time instant.
class E
discrete Real y;
discrete Real seed;
equation
when sample(0,0.1) then
y = f(time);
end when;
end E;
Functions in the continues part might be called both forward and backward
in time depending on the solver so it is important that they give the same
result every time.
Best regards,
HÃ¥kan
-------------------
> Greeting foot people.
>
> I was creating a external function to create a normal distributed
> source signal, but i found myself in a little problem, look at this:
>
> f.c:
> #include <stdlib.h>
>
> double f(void)
> {
> return random();
> }
>
> f.h:
> double f(void);
>
> f.mo:
> function f
> output Real y;
> external
> annotation(Library="/tmp/f.o", Include="#include \"/tmp/f.h\"");
> end f;
>
>
> class A
> Real x;
> initial equation
> x = 20;
> equation
> der(x) = -x;
> end A;
>
>
> class B
> Real x;
> Real y;
> initial equation
> x = 20;
> equation
> der(x) = -x;
> y = 0;
> end B;
>
> class C
> Real x(fixed=false);
> Real y;
> initial equation
> x = 20;
> equation
> der(x) = -x;
> y = 0;
> end C;
>
> class D
> Real x(fixed=false);
> Real y;
> initial equation
> x = 20;
> equation
> der(x) = -x;
> y = f();
> end D;
>
> class E
> Real y;
> equation
> y = f();
> end E;
>
> class F
> Real x;
> Real y;
> initial equation
> x = 20;
> equation
> der(x) = -x;
> y = f();
> end F;
>
> well, copy this to /tmp and in a OMShell-terminal:
> [EMAIL PROTECTED]:/tmp$ OMShell-terminal
> Open Source Modelica Terminal Shell
> Copyright 1997-2007, PELAB, Linkoping University
>
> To get help on using Mosh and OpenModelica, type "help()" and press
enter
> Started server using:/usr/share/omc-omshell/bin/omc +d=interactive >
> /tmp/error.log 2>&1 &
> res = 0
> >>> loadModel(Modelica)
> true
> >>> loadFile("/tmp/f.mo")
> true
> >>> system("gcc -c -o /tmp/f.o /tmp/f.c")
> 0
> >>> simulate(A,timeStop=10)
> record
> resultFile = "A_res.plt"
> end record
> >>> plot(x)
> true
> >>> simulate(B,timeStop=10)
> record
> resultFile = "B_res.plt"
> end record
> >>> plot({x,y})
> true
> >>> simulate(C,timeStop=10)
> record
> resultFile = "C_res.plt"
> end record
> >>> plot({x,y})
> true
> >>> simulate(D,timeStop=10)
> record
> resultFile = "D_res.plt"
> end record
> >>> plot({x,y})
> true
> >>> simulate(E,timeStop=10)
> record
> resultFile = "E_res.plt"
> end record
> >>> plot(y)
> true
> >>> simulate(F,timeStop=10)
> record
> resultFile = "F_res.plt"
> end record
> >>> plot({x,y})
> true
>
>
> Well, the class A only has a variable and decrease from 20 to 0,
> that's ok. The class B has two variables, one should decrease from 20
> to 0 and the other one should be constant on 0, but both of them are
> 0s. At the class C, i declare the x variable with fixed=false, and
> that work great. At class D, i declard that y is the returned value
> form f, which return a random number, but the simulation stop silently
> without error, but without data. At class E, i had deleted the x
> variable, and then the simulation work great and y has random values,
> and in class F i declared again the variable, but without fixed and
> the simulation works but x is not initialized at 20, so, it is a
> constant 0.
>
> I don't know if i just missing something here, what i need is work
> with the random generator, and initializa other variables with
> "initial equation".
>
> What can i do to deal whit this?
>
> PD: If you need some hands to type some lines of code of OpenModelica,
> just say, i will be happy to help with it.
>
> --
> Jorge Eduardo Cardona
> [EMAIL PROTECTED]
> jorgeecardona.blogspot.com
> ------------------------------------------------
> Linux registered user #391186
> Registered machine #291871
> ------------------------------------------------
>