Opened 7 years ago
Closed 6 years ago
#4541 closed defect (fixed)
connect last array element using [end]
Reported by: | m.thorade@… | Owned by: | adrpo |
---|---|---|---|
Priority: | high | Milestone: | 2.1.0 |
Component: | New Instantiation | Version: | |
Keywords: | Cc: | perost |
Description
I took the example Modelica.Electrical.Analog.Examples.HeatingResistor and removed the graphical part and renamed it, this gives me:
model End_connect Modelica.Electrical.Analog.Basic.HeatingResistor heatingResistor(R_ref=100, alpha=1e-3, T_ref=293.15, i(start=0)); Modelica.Electrical.Analog.Basic.Ground G; Modelica.Electrical.Analog.Sources.SineVoltage SineVoltage1(V=220, freqHz=1); Modelica.Thermal.HeatTransfer.Components.ThermalConductor thermalConductor(G=50); Modelica.Thermal.HeatTransfer.Celsius.FixedTemperature fixedTemperature(T=20); equation connect(SineVoltage1.n, G.p); connect(heatingResistor.heatPort, thermalConductor.port_a); connect(SineVoltage1.p, heatingResistor.p); connect(G.p, heatingResistor.n); connect(thermalConductor.port_b, fixedTemperature.port); annotation (experiment(StopTime=5)); end End_connect;
This checks, translates and simulates just fine.
Now, I made every component an array and connect them as below:
model End_connect parameter Integer nEle=5; Modelica.Electrical.Analog.Basic.HeatingResistor heatingResistor[nEle](each R_ref=100, each alpha=1e-3, each T_ref=293.15, each i(start=0)); Modelica.Electrical.Analog.Basic.Ground G[nEle]; Modelica.Electrical.Analog.Sources.SineVoltage SineVoltage1[nEle](each V=220, each freqHz=1); Modelica.Thermal.HeatTransfer.Components.ThermalConductor thermalConductor[nEle](each G=50); Modelica.Thermal.HeatTransfer.Celsius.FixedTemperature fixedTemperature[nEle](each T=20); equation // connect first connect(SineVoltage1[1].n, G[1].p); connect(heatingResistor[1].heatPort, thermalConductor[1].port_a); connect(SineVoltage1[1].p, heatingResistor[1].p); connect(G[1].p, heatingResistor[1].n); connect(thermalConductor[1].port_b, fixedTemperature[1].port); // connect middle for i in 2:nEle-1 loop connect(SineVoltage1[i].n, G[i].p); connect(heatingResistor[i].heatPort, thermalConductor[i].port_a); connect(SineVoltage1[i].p, heatingResistor[i].p); connect(G[i].p, heatingResistor[i].n); connect(thermalConductor[i].port_b, fixedTemperature[i].port); end for; //connect last connect(SineVoltage1[end].n, G[end].p); connect(heatingResistor[end].heatPort, thermalConductor[end].port_a); connect(SineVoltage1[end].p, heatingResistor[end].p); connect(G[end].p, heatingResistor[end].n); connect(thermalConductor[end].port_b, fixedTemperature[end].port); annotation (experiment(StopTime=5)); end End_connect;
This checks, translates and simulates just fine in Dymola, but not in OpenModelica.
Is this syntax wrong and should be fixed in my model? How?
Or is it a bug in OpenModelica?
Note: The same error appears e.g. here:
https://libraries.openmodelica.org/branches/master/BuildingSystems/files/BuildingSystems_BuildingSystems.Technologies.ThermalStorages.Examples.FluidStorage.err
Change History (8)
comment:1 Changed 7 years ago by sjoelund.se
- Cc perost added
- Component changed from *unknown* to Frontend
- Owner changed from somebody to adrpo
- Status changed from new to assigned
comment:2 Changed 7 years ago by sjoelund.se
@perost just showed me a 3.4 spec draft where they are parameter expressions. So yes, this seems to be an OM bug.
comment:3 Changed 7 years ago by anonymous
Thanks for clarifying.
The link to th eModelica trac is broken, this is a working one:
https://trac.modelica.org/Modelica/ticket/2206
https://trac.modelica.org/Modelica/ticket/1082
Relevant sections in the 3.4 Spec:
section 3.8.2 and section 10.5.2
https://modelica.org/news_items/release_of_modelica_3_4
https://modelica.org/documents/ModelicaSpec34.pdf
comment:4 Changed 7 years ago by Matthis Thorade <m.thorade@…>
We re-wrote the one single model in our library that used [end] in connect equations (which was easy, because the arrays were declared using a variable already).
Leaving this ticket open though, assuming you want to support usage of [end] in connect equations in the future.
comment:5 Changed 7 years ago by Matthis Thorade <m.thorade@…>
Found another model with the same error message here:
https://libraries.openmodelica.org/branches/master/BuildingSystems/files/BuildingSystems_BuildingSystems.Technologies.SolarThermal.Examples.BigCollectorInstallationWithStorage.err
That is now also rewritten.
comment:6 Changed 6 years ago by casella
- Component changed from Frontend to New Instantiation
- Milestone changed from Future to 2.0.0
comment:7 Changed 6 years ago by casella
- Milestone changed from 2.0.0 to 2.1.0
comment:8 Changed 6 years ago by perost
- Resolution set to fixed
- Status changed from assigned to closed
Using end in connect equations works just fine in the new frontend, so I guess this can be considered fixed.
But end is not a parameter expression according to the specification (seems to be an error). Neither is size(X,N), but that works if you want something equivalent in your model (although more clunky to write).
Implementation note: The problem is that connectors use some special function instead of the general-purpose expression elaboration (I assume for performance reasons), and Expression.fromAbsynExp cannot represent end in any meaningful way since it needs type information to be evaluated (which this function lacks)... It could be represented by size(X,N) here (but only if the name of the variable and the dimension were passed along and the dimension has integer size).
I created m:#2206 to clarify what is allowed in the spec.