如何在 Modelica 中存储和插入多维可变大小数组?
How to store and interpolate multidimensional, varibale size arrays in Modelica?
我有至少 3 个维度(比如 b、c、d)的大表(A1、A2、...),可以如图所示表示,其中数组大小 n_b , n_c 和 n_d 是可变的。
package Arrays
record A
extends Modelica.Icons.Record;
parameter Real b[:] "base array";
parameter Arrays.Baseclasses.B b_target[:] "target array";
end A;
package Baseclasses
record D
extends Modelica.Icons.Record;
parameter Real E[:];
parameter Real F[:];
end D;
record C
extends Modelica.Icons.Record;
parameter Real d[:] "base array";
parameter Arrays.Baseclasses.D d_target[:] "target array";
end C;
record B
extends Modelica.Icons.Record;
parameter Real c[:] "base array";
parameter Arrays.Baseclasses.C c_target[:] "target array";
end B;
end Baseclasses;
package Example
model A
Arrays.A a(b={1}, b_target={Arrays.Baseclasses.B(c={2}, c_target={
Arrays.Baseclasses.C(d={3,4}, d_target={Arrays.Baseclasses.D(E={4,5},
F={5,8}),Arrays.Baseclasses.D(E={2,3}, F={3,4})})})});
end A;
end Example;
annotation (uses(Modelica(version="3.2.2")));
end Arrays;
对于这种类型的结构,我得到以下错误:
Current version of the Modelica translator can only handle
array of components with fixed size.
But component a.b_target[1].c_target[1].d_target had non-fixed array dimensions [:].
In file: C:/....../Arrays.mo
All variables used in size expressions must be declared as constants or parameters.
Could not find member c_target[1] in record expression Arrays.Baseclasses.B(
{2},
{Arrays.Baseclasses.C(
{3, 4},
{Arrays.Baseclasses.D({4, 5}, {5, 8}), Arrays.Baseclasses.D({2, 3}, {3, 4})})}).
Could not find member c_target[1] in record expression Arrays.Baseclasses.B(
{2},
{Arrays.Baseclasses.C(
{3, 4},
{Arrays.Baseclasses.D({4, 5}, {5, 8}), Arrays.Baseclasses.D({2, 3}, {3, 4})})}).
The model contained invalid expressions.
Check of class aborted.
WARNINGS have been issued.
ERRORS have been issued.
我的一个观察是,当我将 n_d 值设置为常量时,例如:
record C
extends Modelica.Icons.Record;
parameter Real d[2] "base array";
parameter Arrays.Baseclasses.D d_target[2] "target array";
错误消失了。这是否意味着 Modelica 翻译器允许可变大小的数组直到二维,超过二维数组大小需要固定?如果是这样,有没有办法用多维可变大小数组记录?
我会说你遇到了一个错误。
数组可以有超过二维且大小未知,正如这个小例子所展示的(它在 Dymola 中运行良好,但由于某种原因在 OpenModelica 中运行不正常...)
model MultDim
Real A[:,:,:,:] = {B, B};
Real B[:,:,:] = {C};
Real C[:,:] = {D, D, D, D};
Real D[:] = {1, 2, 3};
end MultDim;
在你的情况下,你有一个记录向量,其中每个记录包含另一个记录向量,依此类推 - 所以问题比上面的问题更复杂。不只是多维度未知大小的问题
我将您的代码简化为具有相同问题的最小示例。
这可能有助于其他人更快地理解问题。
请注意,当您使用中间变量时,问题已经出现在 B 级。
package Arrays2
record A
parameter B b[:];
end A;
record B
parameter C c[:];
end B;
record C
parameter D d[:];
end C;
record D
end D;
model Example_ok
B b( c={ C( d={ D() }) });
end Example_ok;
model Example_fail
A a(b={ B( c={ C(d={ D() }) }) });
end Example_fail;
model Example_fail2
// if we use intermediate variables,
// the example already fails at B-level.
B b = B(c={ c });
C c = C(d={ D() });
end Example_fail2;
end Arrays2;
我有至少 3 个维度(比如 b、c、d)的大表(A1、A2、...),可以如图所示表示,其中数组大小 n_b , n_c 和 n_d 是可变的。
package Arrays
record A
extends Modelica.Icons.Record;
parameter Real b[:] "base array";
parameter Arrays.Baseclasses.B b_target[:] "target array";
end A;
package Baseclasses
record D
extends Modelica.Icons.Record;
parameter Real E[:];
parameter Real F[:];
end D;
record C
extends Modelica.Icons.Record;
parameter Real d[:] "base array";
parameter Arrays.Baseclasses.D d_target[:] "target array";
end C;
record B
extends Modelica.Icons.Record;
parameter Real c[:] "base array";
parameter Arrays.Baseclasses.C c_target[:] "target array";
end B;
end Baseclasses;
package Example
model A
Arrays.A a(b={1}, b_target={Arrays.Baseclasses.B(c={2}, c_target={
Arrays.Baseclasses.C(d={3,4}, d_target={Arrays.Baseclasses.D(E={4,5},
F={5,8}),Arrays.Baseclasses.D(E={2,3}, F={3,4})})})});
end A;
end Example;
annotation (uses(Modelica(version="3.2.2")));
end Arrays;
对于这种类型的结构,我得到以下错误:
Current version of the Modelica translator can only handle
array of components with fixed size.
But component a.b_target[1].c_target[1].d_target had non-fixed array dimensions [:].
In file: C:/....../Arrays.mo
All variables used in size expressions must be declared as constants or parameters.
Could not find member c_target[1] in record expression Arrays.Baseclasses.B(
{2},
{Arrays.Baseclasses.C(
{3, 4},
{Arrays.Baseclasses.D({4, 5}, {5, 8}), Arrays.Baseclasses.D({2, 3}, {3, 4})})}).
Could not find member c_target[1] in record expression Arrays.Baseclasses.B(
{2},
{Arrays.Baseclasses.C(
{3, 4},
{Arrays.Baseclasses.D({4, 5}, {5, 8}), Arrays.Baseclasses.D({2, 3}, {3, 4})})}).
The model contained invalid expressions.
Check of class aborted.
WARNINGS have been issued.
ERRORS have been issued.
我的一个观察是,当我将 n_d 值设置为常量时,例如:
record C
extends Modelica.Icons.Record;
parameter Real d[2] "base array";
parameter Arrays.Baseclasses.D d_target[2] "target array";
错误消失了。这是否意味着 Modelica 翻译器允许可变大小的数组直到二维,超过二维数组大小需要固定?如果是这样,有没有办法用多维可变大小数组记录?
我会说你遇到了一个错误。
数组可以有超过二维且大小未知,正如这个小例子所展示的(它在 Dymola 中运行良好,但由于某种原因在 OpenModelica 中运行不正常...)
model MultDim
Real A[:,:,:,:] = {B, B};
Real B[:,:,:] = {C};
Real C[:,:] = {D, D, D, D};
Real D[:] = {1, 2, 3};
end MultDim;
在你的情况下,你有一个记录向量,其中每个记录包含另一个记录向量,依此类推 - 所以问题比上面的问题更复杂。不只是多维度未知大小的问题
我将您的代码简化为具有相同问题的最小示例。 这可能有助于其他人更快地理解问题。 请注意,当您使用中间变量时,问题已经出现在 B 级。
package Arrays2
record A
parameter B b[:];
end A;
record B
parameter C c[:];
end B;
record C
parameter D d[:];
end C;
record D
end D;
model Example_ok
B b( c={ C( d={ D() }) });
end Example_ok;
model Example_fail
A a(b={ B( c={ C(d={ D() }) }) });
end Example_fail;
model Example_fail2
// if we use intermediate variables,
// the example already fails at B-level.
B b = B(c={ c });
C c = C(d={ D() });
end Example_fail2;
end Arrays2;