modelica:修改组件数组中的数组参数

时间:2018-12-26 11:58:12

标签: arrays modelica

您好,我希望能够进行以下修改:

Zone.ZONE[nZones] MultiZone(
    nMONOL={{nMONOL[i] for i in (1:nSURFS[j])} for j in 1:nZones});

nZones = 2

nSURFS = {2,4}

使用nMONOL = {5,4,6,7,8,9}

结果应为:

MultiZone [1] .nMONOL [2] = {5,4}

MultiZone [2] .nMONOL [3] = {6,7,8,9}

但是上面的修改不起作用。有办法使它起作用吗? 亲切的问候 K

1 个答案:

答案 0 :(得分:1)

有两种可能的解决方案,它们可能足以满足您的目的。如您的问题的语法所述,有一个包Zone,其中包含模型ZONE。那么example模型就是您所提出的问题。

方法1

一些注意事项

  • fixed=false允许在初始算法/方程部分中定义nMONOL
  • sum(nSURFS[1:i-1])与指定的nSURFS的数量通用。
  • 您不必指定nZone,而是依赖于nSURFS。视情况而定,这取决于代码中实际发生的情况。

    parameter Integer nZones = size(nSURFS,1)

代码如下:

package Zone

  model ZONE

    parameter Integer nSURFS = 2;
    parameter Integer nMONOL[nSURFS](fixed=false); // Notice the modification

  end ZONE;

  model example

    parameter Integer nZones=2;
    parameter Integer nSURFS[nZones]={2,4};
    parameter Integer nMONOL[sum(nSURFS)]={5,4,6,7,8,9};

    Zone.ZONE[nZones] MultiZone(nSURFS=nSURFS);

  initial algorithm // or initial equation 

    for i in 1:nZones loop
      for j in 1:nSURFS[i] loop
        MultiZone[i].nMONOL[j] := nMONOL[j + sum(nSURFS[1:i-1])];
      end for;
    end for;

  end example;

end Zone;

产生所需的结果:

MultiZone [1] .nMONOL [2] = {5,4}

MultiZone [2] .nMONOL [4] = {6,7,8,9}

方法2

与朋友交谈,获得了另一种方法的启发。

第二种方法是尝试避开语言限制,即类型数组具有相同的长度(至少在尝试内联定义时)。为此,请使用0或其他有意义的值填充矩阵的矩阵。在模型内部,您可以使用一个内部(_int)参数来帮助阐明您使用的是什么。但这不是必须的,只要您确保将任何循环等设为从1:nSURFS开始的键即可(即永远不会使用0值。

如果需要,方法1中有关nZone的注释仍然适用。

package Zone
  model ZONE

    parameter Integer nSURFS = integer(if Modelica.Math.Vectors.find(0,nMONOL) == 0 then size(nMONOL,1) else Modelica.Math.Vectors.find(0,nMONOL)-1);
    parameter Integer nMONOL[:];
    final parameter Integer nMONOL_int[nSURFS] = {nMONOL[i] for i in 1:nSURFS};

  end ZONE;

  model example

    parameter Integer nZones=2;
    parameter Integer nMONOL[nZones,:]={{5,4,0,0},{6,7,8,9}};

    Zone.ZONE[nZones] MultiZone(nMONOL = nMONOL);

  end example;
end Zone;

产生所需的结果:

MultiZone [1] .nMONOL [4] = {5,4,0,0}

MultiZone [1] .nMONOL_int [2] = {5,4}

MultiZone [2] .nMONOL [4] = {6,7,8,9}

MultiZone [2] .nMONOL_int [4] = {6,7,8,9}

方法3

方法#2的简化版本。请注意,在以ZONE类型使用nMONOL时,请确保在nSURFS上循环,或创建一个内部变量以免使用0值。

package Zone
  model ZONE

    parameter Integer nSURFS;
    parameter Integer nMONOL[:];

  end ZONE;

  model example

    parameter Integer nZones=2;
    parameter Integer nSURFS[:] = {2, 4};
    parameter Integer nMONOL[nZones,max(nSURFS)]={{5,4,0,0},{6,7,8,9}};

    Zone.ZONE[nZones] MultiZone(nSURFS = nSURFS, nMONOL = nMONOL);

  end example;
end Zone;