modelica:修改组件数组中的数组参数
modelica: modifying array parameter in array of components
您好,我希望能够进行如下修改:
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}
.
结果应该是:
多区域[1].nMONOL[2] = {5,4}
多区域[2].nMONOL[3] = {6,7,8,9}
但是上面的修改不起作用。有没有办法让它工作?
亲切的问候
K
这里有两种可能足以满足您的目的的解决方案。正如您问题的语法所述,有一个包 Zone
,其中包含一个模型 ZONE
。 example
模型就是您问题中提出的模型。
方法 #1
几个笔记
fixed=false
允许在初始 algorithm/equation 部分中定义 nMONOL
sum(nSURFS[1:i-1])
泛指指定的nSURFS
个数
而不是指定 nZones 你可以让它依赖于 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;
生成所需结果:
多区域[1].nMONOL[2] = {5,4}
多区域[2].nMONOL[4] = {6,7,8,9}
方法 #2
与朋友交谈以获得替代方法的启发。
第二种方法是尝试绕过类型数组具有相同长度的语言限制(至少当您尝试内联定义它们时)。为此,依赖于矩阵,其中 0
或其他一些有意义的值填充矩阵。在模型内部,您可以有一个内部 (_int
) 参数来帮助阐明您使用的是什么。但这不是必需的,只要您确保任何循环等都被键入从 1:nSURFS 开始(即永远不会使用 0 值。
此外,如果需要,方法 #1 中有关 nZones 的说明仍然适用。
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;
生成所需结果:
多区域[1].nMONOL[4] = {5,4,0,0}
多区域[1].nMONOL_int[2] = {5,4}
多区域[2].nMONOL[4] = {6,7,8,9}
多区域[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;
您好,我希望能够进行如下修改:
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}
.
结果应该是:
多区域[1].nMONOL[2] = {5,4}
多区域[2].nMONOL[3] = {6,7,8,9}
但是上面的修改不起作用。有没有办法让它工作? 亲切的问候 K
这里有两种可能足以满足您的目的的解决方案。正如您问题的语法所述,有一个包 Zone
,其中包含一个模型 ZONE
。 example
模型就是您问题中提出的模型。
方法 #1
几个笔记
fixed=false
允许在初始 algorithm/equation 部分中定义 nMONOLsum(nSURFS[1:i-1])
泛指指定的nSURFS
个数而不是指定 nZones 你可以让它依赖于
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;
生成所需结果:
多区域[1].nMONOL[2] = {5,4}
多区域[2].nMONOL[4] = {6,7,8,9}
方法 #2
与朋友交谈以获得替代方法的启发。
第二种方法是尝试绕过类型数组具有相同长度的语言限制(至少当您尝试内联定义它们时)。为此,依赖于矩阵,其中 0
或其他一些有意义的值填充矩阵。在模型内部,您可以有一个内部 (_int
) 参数来帮助阐明您使用的是什么。但这不是必需的,只要您确保任何循环等都被键入从 1:nSURFS 开始(即永远不会使用 0 值。
此外,如果需要,方法 #1 中有关 nZones 的说明仍然适用。
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;
生成所需结果:
多区域[1].nMONOL[4] = {5,4,0,0}
多区域[1].nMONOL_int[2] = {5,4}
多区域[2].nMONOL[4] = {6,7,8,9}
多区域[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;