Modelica - как расширить (минимальный) средний пакет - PullRequest
0 голосов
/ 05 марта 2019

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

Используя технику с replaceable - extend - redeclare, очень просто расширить векторный тип с помощью элемента, а также добавить в пакет новое целое число константы для добавленного элемента.Но я не уверен, как добавить вектор константы с новым элементом.

Приведенный ниже код работает в JModelica (2.4), но включает в себя как повторную декларацию, так и копирование значений из исходного базового пакета.Однако в Medium3 JModelica не принимает четвертое выражение redeclare для вектора константы mw.Но если я вместо этого сделаю оператор redeclare в качестве первой строки после расширения, это сработает (см. Раздел Fritzson 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;

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете (начиная с 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 могут обрабатыватьit.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...