首页 > 解决方案 > 如何在 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 翻译器允许可变大小的数组直到二维和超出该数组大小需要固定?如果是这样,有没有办法用多维可变大小数组记录?

标签: modelicadymolaopenmodelica

解决方案


我会说你遇到了一个错误。

正如这个小例子所展示的那样,数组可以有两个以上尺寸未知的维度(在 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;

推荐阅读