Modelica - как расширить (минимальный) средний пакет

Я хотел бы иметь пакет, расширяющий другой базовый пакет. Базовый пакет содержит тип вектора и постоянные целые числа с именем для каждого порядкового номера вектора. Он также содержит векторную константу, которая дает каждому элементу значение (описывающее некоторое свойство элемента). В расширенном пакете я хотел бы добавить один элемент векторного типа и добавить одно новое имя для нового индекса, а также добавить к векторной константе один элемент с определенным значением (описывающим какое-то свойство вещества).

Используя технику с 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;

person janpeter    schedule 05.03.2019    source источник


Ответы (1)


Вы можете (начиная с Modelica Language 3.2 - это было незаконно в 3.1) просто изменить значение константы следующим образом:

package Demo_v8

  package Medium2
    replaceable constant String name="Two components" "Medium name";
    constant Integer nc=2 "Number of substances";
    replaceable type Concentration = Real[nc] "Substance conc";
    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(
      name="Three components" "Medium name",
      nc=3 "Number of substances",
      mw=cat(1, M2.mw, {30}),
      redeclare type Concentration = Real[nc] "Substance conc");
    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;
end Demo_v8;

Однако я не проверял, могут ли JModelica.org или OpenModelica справиться с этим.

Кстати: сообщение об ошибке правильное, поскольку повторное объявление константы было незаконным, начиная с Modelica 1.2.

person Hans Olsson    schedule 05.03.2019
comment
Хороший. Ваше упрощение работает для JModelica v2.4. Но для OpenModelica v1.13.0 я получаю сообщение об ошибке Ошибка перевода - Невозможно создать экземпляр DEMO_v9 из-за специализации класса PACKAGE. - person janpeter; 05.03.2019
comment
Билет OpenModelica № 5375 - person janpeter; 05.03.2019
comment
Тикет OpenModelica № 5375 разрешен и возник из-за того, что я неправильно понял тексты ошибок и предупреждений, и даже если он выделен красным, код можно было запустить. Но, кстати, мы обнаружили гораздо более фундаментальный недостаток, связанный с другим моим сообщением о том, как структурировать приложение-библиотеку кода для среды. - person janpeter; 05.03.2019