Returning a record from a function call doesn't work if the record
includes adjustable arrays. I'm not sure that's even allowed in a
record. This approach fails in both Dymola and OpenModelica. I'm back
to square 1...

  record outRec2
    parameter Integer n(fixed = false);
    Real y[n](each fixed = false);
    Real z(fixed = false);
  end outRec2;

  function fun3
    parameter input Integer n(fixed = false);
    input Real x;
    output outRec2 out(n = n);
  algorithm
    out.y:=fill(x ^ 2, n);
    out.z:=x ^ 3;
  end fun3;

  model m7
    parameter Real a = 3;
    parameter outRec2 p = fun3(2, a);
  end m7;


On Thu, Feb 9, 2012 at 2:40 PM, Tom Short <[email protected]> wrote:
> Adrian, that wouldn't work in my more detailed model. This formulation
> might (this simple case works):
>
> model m5
>  parameter Real a = 3;
>  parameter outRec p=fun2(a);
> end m5;
>
> On Thu, Feb 9, 2012 at 2:22 PM, Adrian Pop <[email protected]> wrote:
>>
>> Hi,
>>
>> You could try as a workaround:
>> initial equation
>>  p =  outRec(a^2, a^3);
>>
>> Cheers,
>> Adrian Pop/
>>
>>
>> On 2012-02-09 19:46, Tom Short wrote:
>>>
>>> Thanks, Lennart. My initialization involves a few variables in nested
>>> for loops, so a function call or an algorithm makes the most sense. I
>>> also tried packaging up return values in a record, but my attempt at
>>> that also failed in OpenModelica (it worked in Dymola).
>>>
>>> package testInitialAlgorithm
>>>   record outRec
>>>     Real y(fixed = false);
>>>     Real z(fixed = false);
>>>   end outRec;
>>>
>>>   function fun2
>>>     input Real x;
>>>     output outRec out;
>>>   algorithm
>>>     out.y := x^2;
>>>     out.z := x^3;
>>>   end fun2;
>>>
>>>   model m5
>>>     parameter Real a = 3;
>>>     parameter outRec p;
>>>   initial equation
>>>     p =  fun2(a);
>>>   end m5;
>>>
>>> end testInitialAlgorithm;
>>>
>>>
>>> On Thu, Feb 9, 2012 at 12:02 PM, Lennart Ochel
>>> <[email protected]>  wrote:
>>>>
>>>> Hello,
>>>>
>>>> currently we do not support initial algorithms at all.
>>>>
>>>> As an workaround you can try to convert your initial
>>>> algorithm into an initial equation. This will help for
>>>> testInitialAlgorithm.m1 and testInitialAlgorithm.m2.
>>>>
>>>> Tomorrow I will take a closer look on how to provide
>>>> initial algorithms and functions with multiple return-values.
>>>>
>>>> Best regards,
>>>> Lennart Ochel
>>>>
>>>>
>>>>
>>>> -----Ursprüngliche Nachricht----- From: Tom
>>>> Short<[email protected]>
>>>> Reply-to: [email protected]
>>>> To: [email protected]
>>>> Subject: Initialization issues during simulation
>>>> Date: Thu, 09 Feb 2012 09:45:03 -0500
>>>>
>>>>
>>>> Hello,
>>>>
>>>> I'm working on a package where I would eventually like to support both
>>>> Dymola and OpenModelica. One part relies on quite a bit of
>>>> pre-processing to initialize several parameters before models are
>>>> simulated. I haven't found a good way to do this in OpenModelica. The
>>>> following example shows several ways I've tried to initialize
>>>> parameters. The first two (m1 and m2) simulate, but the parameters are
>>>> not initialized properly. The second two (m3 and m4) fail when
>>>> generating code. Does anyone see errors in my code or know of
>>>> workarounds for this? All models seem to flatten properly and pass
>>>> check (except for m4).
>>>>
>>>> package testInitialAlgorithm
>>>>  model m1
>>>>   parameter Real a = 3;
>>>>   parameter Real b(fixed = false);
>>>>  initial algorithm
>>>>   b:=a ^ 2;
>>>>  end m1;
>>>>
>>>>  model m2
>>>>   m1 m(a = 4);
>>>>   Real c;
>>>>  equation
>>>>   c = m.b + 1.0;
>>>>  end m2;
>>>>
>>>>  function fun
>>>>   input Real x;
>>>>   output Real y;
>>>>   output Real z;
>>>>  algorithm
>>>>   y:=x ^ 2;
>>>>   z:=x ^ 3;
>>>>  end fun;
>>>>
>>>>  model m3
>>>>   parameter Real a = 3;
>>>>   parameter Real b(fixed = false);
>>>>   parameter Real c(fixed = false);
>>>>  initial equation
>>>>   (b,c) = fun(a);
>>>>  end m3;
>>>>
>>>>  model m4
>>>>   parameter Real a = 3;
>>>>   parameter Real b(fixed = false);
>>>>   parameter Real c(fixed = false);
>>>>  initial algorithm
>>>>   (b,c):=fun(a);
>>>>  end m4;
>>>> end testInitialAlgorithm;
>>>>
>>>> The model m3 fails with the following error:
>>>>
>>>>   CodegenC.tpl: Template error: Unknown expression: (b,c)
>>>>
>>>> The model m4 fails with the following error:
>>>>
>>>>  Tuple assignment only allowed when rhs is function call (in
>>>> testInitialAlgorithm.fun(a))
>>>>
>>>> I tested this on r11033 on 64-bit win7 and r11047 on ubuntu.
>>>>
>>>> - Tom
>>>>
>>>>
>>>
>>

Reply via email to