可以使用 inner/outer 全局设置类型并且可以替换吗?
Can a type be set globally using inner/outer and be replaceable?
问题描述
我想在经济建模(例如系统动力学)中使用非 SI 单位表示时间。虽然我当然可以使用 seconds (s) 然后使用 displayUnit
据我所知没有很好的方法来修改 displayUnit for time in System Modeler,我主要使用它。
因此,在编写一个库时,我希望用户选择一个名为 ModelTime
的全局 type
,理想情况下它会被声明为 inner
和 replaceable
在一些顶级 class。然后模型中的任何组件都可以使用全局 type
来一致地处理任何与时间相关的变量。
最小示例
下面的例子展示了我想如何实现它。
package Units
声明了两种非 SI 单位类型(Time_year
、Time_month
)
package Interfaces
包含部分模型 class GenericSimulationModel
,它将成为使用该库编写的任何模型的顶级范围。它应该提供 type ModelTime
作为 inner
和 replaceable
class
package Components
定义了一个简单的 block
class,它通过 outer
定义使用 ModelTime
来定义其 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 中编译一切都没有错误,但不幸的是它没有成功:在上面给出的 Example
模型中的组件 c 中没有使用重新声明的类型。
我可以做些什么来实现我想做的事情?
我从 Wolfram MathCore 的某个人(System Modeler 的开发人员)那里收到了一些 feedback on Wolfram Community:
The behavior you see for MinimalExample.example and MinimalLibrary.Example are bugs, and from what I can see they should work, I have forwarded them to a developer working on these things.
问题描述
我想在经济建模(例如系统动力学)中使用非 SI 单位表示时间。虽然我当然可以使用 seconds (s) 然后使用 displayUnit
据我所知没有很好的方法来修改 displayUnit for time in System Modeler,我主要使用它。
因此,在编写一个库时,我希望用户选择一个名为 ModelTime
的全局 type
,理想情况下它会被声明为 inner
和 replaceable
在一些顶级 class。然后模型中的任何组件都可以使用全局 type
来一致地处理任何与时间相关的变量。
最小示例
下面的例子展示了我想如何实现它。
package Units
声明了两种非 SI 单位类型(Time_year
、Time_month
)package Interfaces
包含部分模型 classGenericSimulationModel
,它将成为使用该库编写的任何模型的顶级范围。它应该提供type ModelTime
作为inner
和replaceable
classpackage Components
定义了一个简单的block
class,它通过outer
定义使用ModelTime
来定义其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 中编译一切都没有错误,但不幸的是它没有成功:在上面给出的 Example
模型中的组件 c 中没有使用重新声明的类型。
我可以做些什么来实现我想做的事情?
我从 Wolfram MathCore 的某个人(System Modeler 的开发人员)那里收到了一些 feedback on Wolfram Community:
The behavior you see for MinimalExample.example and MinimalLibrary.Example are bugs, and from what I can see they should work, I have forwarded them to a developer working on these things.