Может ли тип быть установлен глобально, используя внутренний / внешний и быть заменяемым?

описание проблемы

Я хотел бы использовать не-СИ-единицы для времени в экономическом моделировании (например, системная динамика). Хотя, конечно, я мог идти в течение нескольких секунд, а затем использоватьdisplayUnitНасколько мне известно, нет хорошего способа изменить displayUnit для времени в System Modeler, который я в основном использую.

Итак, при написании библиотеки я бы хотел, чтобы пользователь сделал глобальный выбор. type называется ModelTime который в идеале был бы объявлен как inner а также replaceable в каком-то классе на высшем уровне. Тогда любой компонент в модели может использовать глобальный type последовательно относиться к любым временным переменам.

Минимальный пример

Следующий пример показывает, как я хотел бы реализовать это.

  • package Units объявляет два типа модулей не-SI (Time_year, Time_month)
  • package Interfaces содержит частичный класс модели GenericSimulationModel которая будет областью верхнего уровня для любой модели, написанной с использованием библиотеки. Предполагается обеспечить type ModelTime как inner а также replaceable класс
  • package Components определяет простое block класс, который использует ModelTime через outer определение, чтобы определить его output y это просто шоу time в глобально выбранных единицах времени
  • model Example связывает все это вместе, чтобы дать пример того, как должна работать любая модель, использующая библиотеку

Вот код:

model MinimalExample

  package Units
    type Time_year = Real(final quantity = "Time", final unit = "yr");    
    type Time_month = Real(final quantity = "Time", final unit = "mo");
  end Units;

  package Interfaces
    partial model GenericSimulationModel "Top-level model scope providing global vars"
      inner replaceable type ModelTime = Years "Set to : Months, Years";
    protected
      type Years = Units.Time_year;
      type Months = Units.Time_month;
    end GenericSimulationModel;
  end Interfaces;

  package Components
    block ComponentUsingTime
      outer type ModelTime = MinimalExample.Units.Time_year;
      output ModelTime y;
    equation
      y = time;
    end ComponentUsingTime;
  end Components;

  model Example
    extends Interfaces.GenericSimulationModel(
      redeclare replaceable type ModelTime = Months
    );
    Components.ComponentUsingTime c;
  end Example;
equation

end MinimalExample;

Хотя все компилируется без ошибок в System Modeler и OpenModelica, это, к сожалению, не работает: объявленный тип не используется в компоненте c в Example Модель приведена выше.

Что я могу сделать, чтобы достичь того, что я хочу сделать?

1 ответ

Решение

Я получил некоторые отзывы о сообществе Wolfram от кого-то из Wolfram MathCore (разработчики System Modeler):

Поведение, которое вы видите для MinimalExample.example и MinimalLibrary.Example, является ошибками, и, насколько я вижу, они должны работать, я отправил их разработчику, работающему над этими вещами.

Другие вопросы по тегам