#4157 closed defect (fixed)
Problems with complex numbers
Reported by: | Owned by: | Andreas Heuermann | |
---|---|---|---|
Priority: | blocker | Milestone: | 1.14.0 |
Component: | Backend | Version: | |
Keywords: | Complex numbers | Cc: | Karim Adbdelhak, Andreas Heuermann |
Description
Two problems which concern operations with complex numbers have been encountered with OpenModelica.
You will find attached two models which enables to reproduce the errors encountered.
1- The model called "when_init_complex": The somme of complex numbers doesn't work correctly in this case.
2- The model called "if_complex_if_expression": A problem is encountered while using the "if expression". However, if we use the "if clause", the model works correctly.
I Thank you in advance for the information you can provide us concerning these problems and for the updates of Open Modelica.
The version of OpenModelica that I use is : OMEdit V1.9.5 connected to OpenModelica v1.9.6.
Attachments (1)
Change History (17)
by , 8 years ago
Attachment: | Tests_OM_pour_OM.mo added |
---|
comment:2 by , 8 years ago
Usage of complex numbers in Modelica is very important for extensive usage of MSL QuasiStationary Library.
I have a full family of systems for which QuasiStationary is the right solution: electric AC lines feeding trains. I'm researching a lot on this topic.
I've come across several cases in which OM has issues with complex numbers, but the two in this ticket are very basic ones, so they should get top priority for me.
I would be very grateful if these two issues are addressed in the near future. After they are, I can try to see whether some of my models containing complex numbers start to work. In case they do not I could contribute with further tickets.
comment:3 by , 8 years ago
Component: | *unknown* → Backend |
---|---|
Owner: | changed from | to
Fixed the front-end part of the issues with dd5fb2/OMCompiler.
Added flattening tests in b00c93/OpenModelica-testsuite.
The when model does not work yet to simulate, the if one works fine now.
comment:4 by , 8 years ago
@lochel: can you see why the when model does not work to build? Or at least point me into the right direction.
As far as I can see we need to expand the complex equation (which is transformed into BackendDAE.ASSIGN
) into each of the scalar components.
If I move the when equation outside when and remove the when equation then it works fine:
model when_init_complex Real a_re; Real a_im; Complex Eo; equation a_re = 10; a_im = 0; Eo = Complex(a_re, a_im) + Complex(10, 0); end when_init_complex;
comment:5 by , 8 years ago
One more piece of info, when I change the when equation in a when algorithm it works fine:
model when_init_complex Real a_re; Real a_im; Complex Eo; equation a_re = 10; a_im = 0; algorithm when initial() then Eo := Complex(a_re, a_im) + Complex(10, 0); end when; end when_init_complex;
comment:6 by , 8 years ago
There are several tickets open regarding Complex numbers.
At least the following ones: #4055, #4157, #4297, #4354, All from different people.
I think that this means some enhancement on how OM deals with with them is highly needed.
I myself I'm working a lot on models relying on complex matrices, but I'm forced to use another tool (dymola), which has issues with complex numbers as well, but is more manageable.
Among these tickets, the priority of #4055 is already critical, the others' are High.
May I ask the developers to raise the priority of this ticket #4157 as well?
In fact this ticket shows very basic issues since they do not involve arrays nor algorithms. Therefore it seems to be a good starting point on the way to enhance OM complex number managing capability.
THKX
comment:7 by , 7 years ago
Regarding the test cases reported here, I get the following results.
Model when_init_complex
now fails with
Tests_OM_pour_OM.when_init_complex.c: In function 'Tests_OM_pour_OM_when_init_complex_eqFunction_4': Tests_OM_pour_OM.when_init_complex.c:77:5: error: '$PEo' undeclared (first use in this function) $PEo = omc_Complex(threadData, 20.0, 0.0);
Could be related to #3276.
Model if_complex_if_expression
now fails with
[Tests_OM_pour_OM: 21:5-21:98]: Internal error function createNonlinearResidualEquations failed for equation: Complex(E.re - V.re, E.im - V.im) = if model_type then Complex(0.0, 0.0) else Complex(Z.re, Z.im) [C:/dev/OpenModelica64bit/OMCompiler/Compiler/SimCode/SimCodeUtil.mo: 5939:7-5939:46]: Internal error complex equations currently only supported on form v = functioncall(...). Equation: Complex(E.re - V.re, E.im - V.im) = if model_type then Complex(0.0, 0.0) else Complex(Z.re, Z.im) solve for {V.im,V.re}
One possible solution is sketched in #4354
comment:8 by , 6 years ago
Status update with 1.14.0-dev7, using the new front-end
when_init_complex
fails during compilation of C-code with
Tests_OM_pour_OM.when_init_complex.c: In function 'Tests_OM_pour_OM_when_init_complex_eqFunction_4': Tests_OM_pour_OM.when_init_complex.c:83:5: error: '$PEo' undeclared (first use in this function) $PEo = tmp0; ^ Tests_OM_pour_OM.when_init_complex.c:83:5: note: each undeclared identifier is reported only once for each function it appears in
while if_complex_if_expression
fails in the SimCode phase with
[2] 11:01:18 Translation Error [C:/dev/OM64bit/OMCompiler/Compiler/SimCode/SimCodeUtil.mo: 2499:7-2499:46]: Internal error function createNonlinearResidualEquationsComplex failed for: Complex(E.re - V.re, E.im - V.im) = if model_type then Complex(0.0, 0.0) else Complex(Z.re, Z.im)
In both cases it seems that the problem is that the Complex equation is not split into its scalar constituents; the output with -d=newInst,optdaedump
is
Equations (1, 2) ======================================== 1/1 (2): Complex(E.re - V.re, E.im - V.im) = if model_type then Complex(0.0, 0.0) else Complex(Z.re, Z.im) [dynamic |0|0|0|0|] Equations (1, 2) ======================================== 1/1 (2): when false then Eo := Complex(10.0 + a_re, a_im);
My educated guess is that equations inside when statements are not subject to a call to lowerExtendedRecordEqn
, similarly to what previously happened to initial equations, see ticket:5236#comment:6.
@perost, can you please check that and fix it?
Thanks!
comment:9 by , 6 years ago
Component: | Backend → New Instantiation |
---|---|
Milestone: | Future → 2.0.0 |
Owner: | changed from | to
Status: | new → assigned |
comment:10 by , 6 years ago
if_complex_if_expression
now works fine with the NF.
when_init_complex
still fails as in comment:7
follow-up: 13 comment:11 by , 6 years ago
Cc: | added |
---|---|
Component: | New Instantiation → Backend |
Owner: | changed from | to
When compiling when_init_complex
with the NF, the C code compilation fails with
when_init_complex.c: In function 'when_init_complex_eqFunction_4': when_init_complex.c:92:5: error: '_omcQuot_456F' undeclared (first use in this function) _omcQuot_456F = tmp0; ^ when_init_complex.c:92:5: note: each undeclared identifier is reported only once for each function it appears in
Looking at the optdaedump
output, the when equation shows up correctly as
Variables (2) ======================================== 1: Eo.im:DISCRETE() "Imaginary part of complex number"when_init_complex, Complex type: Real 2: Eo.re:DISCRETE() "Real part of complex number"when_init_complex, Complex type: Real Equations (1, 2) ======================================== 1/1 (2): when initial() then Eo := Complex(10.0 + a_re, a_im); end when; [dynamic |0|0|0|0|]
for a number of steps. Then it shows up for a few steps as
Variables (4) ======================================== 1: a_im:VARIABLE() = 0.0 when_init_complex type: Real 2: a_re:VARIABLE() = 10.0 when_init_complex type: Real 3: Eo.im:DISCRETE(fixed = false ) "Imaginary part of complex number"when_init_complex, Complex type: Real 4: Eo.re:DISCRETE(fixed = false ) "Real part of complex number"when_init_complex, Complex type: Real Equations (3, 4) ======================================== 1/1 (2): Eo = Complex(10.0 + a_re, a_im) [dynamic |0|0|0|0|] 2/3 (1): a_im = 0.0 [initial |0|0|0|0|] 3/4 (1): a_re = 10.0 [initial |0|0|0|0|]
and finally as
Variables (2) ======================================== 1: Eo.im:DISCRETE() "Imaginary part of complex number"when_init_complex, Complex type: Real 2: Eo.re:DISCRETE() "Real part of complex number"when_init_complex, Complex type: Real Equations (1, 2) ======================================== 1/1 (2): when false then Eo := Complex(10.0 + a_re, a_im); end when; [dynamic |0|0|0|0|]
The way it is handled in the last two steps seems plain wrong to me, but maybe I simply do not understand well the optdaedump. Lennart, Karim, Andreas, can you please check?
comment:12 by , 6 years ago
Milestone: | 2.0.0 → 1.14.0 |
---|---|
Priority: | high → blocker |
Marking this as a blocker for 1.14.0, we should get Complex numbers to work with that release.
comment:13 by , 6 years ago
Owner: | changed from | to
---|
comment:14 by , 6 years ago
Replying to casella:
Variables (2) ======================================== 1: Eo.im:DISCRETE() "Imaginary part of complex number"when_init_complex, Complex type: Real 2: Eo.re:DISCRETE() "Real part of complex number"when_init_complex, Complex type: Real Equations (1, 2) ======================================== 1/1 (2): when false then Eo := Complex(10.0 + a_re, a_im); end when; [dynamic |0|0|0|0|]The way it is handled in the last two steps seems plain wrong to me, but maybe I simply do not understand well the optdaedump. Lennart, Karim, Andreas, can you please check?
The way we are handling initial()
function is strange (but not wrong though). For the initialization problem everything gets generated right. While simulating the when condition is set to false
. Hence this equation.
I made a pull request to fix the problem. Complex equations in when assignments need to be handled seperatly. Every sort of comlpex equation in a when statment should have failed at the momen.
comment:15 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Models to reproduce errors with complex numbers