Вот два возможных решения, которые могут быть достаточными для ваших целей.Как описано в синтаксисе вашего вопроса, есть пакет Zone
, который содержит модель ZONE
.Модель example
- это то, что было представлено в вашем вопросе.
Подход № 1
Пара замечаний
fixed=false
позволяет определить 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;
Получение желаемого результата:
MultiZone [1] .nMONOL [2] = {5,4}
MultiZone [2] .nMONOL [4] = {6,7,8,9}
Подход № 2
Поговорил с другом, чтобы вдохновиться альтернативным подходом.
ЭтоВторой подход - попытка обойти ограничение языка, согласно которому массивы типов имеют одинаковую длину (по крайней мере, когда вы пытаетесь определить их встроенными).Чтобы сделать это, положитесь на матрицу, где 0
или какое-то другое значение, которое имеет смысл, дополняет матрицу.Внутри модели вы можете иметь внутренний (_int
) параметр, чтобы уточнить, что вы используете.Но в этом нет необходимости, если вы гарантируете, что любые циклы и т. Д. Будут настроены на переход от 1: nSURFS (т. Е. Никогда не будут использоваться значения 0).
Кроме того, примечание о nZones в подходе # 1 по-прежнемуприменяется при желании.
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. Обратите внимание, что прииспользуя nMONOL типа ZONE
, который вы зацикливаете на 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;