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

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

Я хотел бы использовать не-SI-единицы для времени в экономическом моделировании (например, System Dynamics). Хотя, конечно, я мог бы пойти на секунды ( s ) и затем использовать 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 Ответ

0 голосов
/ 03 июля 2019

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

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

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