Может ли тип быть установлен глобально, используя внутренний / внешний и быть заменяемым?
описание проблемы
Я хотел бы использовать не-СИ-единицы для времени в экономическом моделировании (например, системная динамика). Хотя, конечно, я мог идти в течение нескольких секунд, а затем использовать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, является ошибками, и, насколько я вижу, они должны работать, я отправил их разработчику, работающему над этими вещами.