modelica: изменение параметра массива в массиве компонентов - PullRequest
0 голосов
/ 26 декабря 2018

Здравствуйте. Я хочу иметь возможность внести следующие изменения:

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 голосов
/ 26 декабря 2018

Вот два возможных решения, которые могут быть достаточными для ваших целей.Как описано в синтаксисе вашего вопроса, есть пакет 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;
...