Я хотел бы иметь пакет, расширяющий другой базовый пакет. Базовый пакет содержит тип вектора и постоянные целые числа с именем для каждого порядкового номера вектора. Он также содержит векторную константу, которая дает каждому элементу значение (описывающее некоторое свойство элемента). В расширенном пакете я хотел бы добавить один элемент векторного типа и добавить одно новое имя для нового индекса, а также добавить к векторной константе один элемент с определенным значением (описывающим какое-то свойство вещества).
Используя технику с replaceable - extend - redeclare, можно напрямую расширить векторный тип с помощью элемента, а также добавить в пакет новое постоянное целое число для добавляемого элемента. Но я не уверен, как добавить к постоянному вектору новый элемент.
Приведенный ниже код работает в JModelica (2.4), но включает как повторное объявление, так и копирование значений из исходного базового пакета. Однако в Medium3 JModelica не принимает четвертый оператор повторного объявления для постоянного вектора mw. Но если вместо этого я сделаю оператор redeclare первой строкой после завершения расширения, он действительно сработает (см. Раздел 4.3.1 Фритцсона). Однако повторное объявление должно быть подтипом оригинала, а Real3] не является подтипом Real [2], но компилятор, похоже, все равно справится.
Когда я пробую тот же код в OpenModelica (1.13), я получаю сообщение об ошибке из-за того, что я повторно объявляю константу, и ошибка уже при первом повторном объявлении в Medium3. Я не уверен, что это правильное сообщение об ошибке, и оно не отображается в JModelica.
В противном случае OpenModelica (и JModelica) принимает оба Medium2 без каких-либо предупреждений или ошибок. И эти тесты, просто меняя среду, используемую в LiquidCon.
Мой главный вопрос: есть ли здесь более прямое решение для расширения среднего пакета с одним веществом, как описано выше, чем мой код, и это более стандартно (и, конечно, работает как с JModelica, так и с OpenModelica и Modelica в целом) ).
Конечно, интересно разобраться, что здесь говорится в стандарте Modelica, и затем мы можем передать эту информацию организациям, стоящим за JModelica и OpenModelica, в виде отчетов об ошибках.
Был бы признателен за ваш вклад / Ян Питер
Ниже фрагмент пакета DEMO_v8
package Medium2
replaceable constant String name = "Two components" "Medium name";
replaceable constant Integer nc = 2 "Number of substances";
replaceable type Concentration = Real[nc] "Substance conc";
replaceable constant Real[nc] mw = {10, 20} "Substance weight";
constant Integer A = 1 "Substance index";
constant Integer B = 2 "Substance index";
end Medium2;
package Medium3
import M2 = DEMO_v8.Medium2;
extends M2
(redeclare constant String name="Three components" "Medium name",
redeclare constant Integer nc=3 "Number of substances",
redeclare type Concentration = Real[nc] "Substance conc");
redeclare constant Real[nc] mw = cat(1,M2.mw,{30}) "Substance weight";
constant Integer C = 3 "Substance index";
end Medium3;
connector LiquidCon
replaceable package medium=DEMO_v8.Medium3;
medium.Concentration c "Substance conc";
flow Real F (unit="m3/s") "Flow rate";
end LiquidCon;