首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Modelica中存储和内插多维、可变大小的数组?

如何在Modelica中存储和内插多维、可变大小的数组?
EN

Stack Overflow用户
提问于 2020-03-31 07:07:16
回答 1查看 163关注 0票数 2

我有很大的表格(A1,A2,...)至少有3个维度(比如b、c、d),如图所示,其中数组大小n_b、n_c和n_d是可变的。

代码语言:javascript
代码运行次数:0
运行
复制
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;

对于这种类型的结构,我得到以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
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值设为常量时,例如:

代码语言:javascript
代码运行次数:0
运行
复制
    record C
      extends Modelica.Icons.Record;
      parameter Real d[2] "base array";
      parameter Arrays.Baseclasses.D d_target[2] "target array";

错误就会消失。这是否意味着Modelica translator允许可变大小的数组,直到二维,超过二维的数组大小需要固定?如果是这样的话,有没有一种方法可以用多维可变大小的数组来记录呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 15:19:18

我会说你遇到了一个bug。

数组可以有两个以上的维度,但大小未知,如下面的小示例所示(它在Dymola中运行良好,但由于某种原因在OpenModelica中不能运行...)

代码语言:javascript
代码运行次数:0
运行
复制
model MultDim
  Real A[:,:,:,:] = {B, B};
  Real B[:,:,:] = {C};
  Real C[:,:] = {D, D, D, D};
  Real D[:] = {1, 2, 3};
end MultDim;

在你的例子中,你有一个记录的向量,其中每个记录包含另一个记录的向量,依此类推-所以问题比上面的问题更复杂。这不仅仅是未知大小的多维问题。

我将您的代码简化为具有相同问题的最小示例。这可能有助于其他人更快地了解问题。请注意,当您使用中间变量时,问题已经在B级发生了。

代码语言:javascript
代码运行次数:0
运行
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60940971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档