Modelica——如何扩展一个(最小的)中型包
Modelica - how to extend a (minimal) medium package
我想要一个从另一个基本包扩展而来的包。基本包包含一个向量类型和常量整数,其中包含向量的每个索引号的名称。它还包含一个向量常量,为每个元素赋予一个值(描述元素的一些属性)。在扩展包中我想添加一个向量类型的元素并为新索引添加一个新名称,并向向量常量添加一个具有特定值的元素(描述一些属性的物质) .
使用可替换的技术 - 扩展 - 重新声明可以直接用元素扩展矢量类型,并为附加元素向包附加一个新的常量整数。但是我不确定如何用新元素附加常量向量。
下面的代码适用于 JModelica (2.4),但涉及重新声明和原始基本包中值的复制。但是在 Medium3 中,JModelica 不接受常量向量 mw 的第四个重新声明语句。但是,如果我改为在扩展完成后将 redeclare 语句作为第一行,它确实有效(参见 Fritzson 第 4.3.1 节)。但是,重新声明应该是原始类型的子类型,而 Real3] 不是 Real[2] 的子类型,但编译器似乎可以管理。
当我在 OpenModelica (1.13) 中尝试相同的代码时,我收到错误消息,因为我重新声明了一个常量,并且在 Medium3 中的第一次重新声明时已经出错。我不确定这是一条正确的错误消息,并且没有出现在 JModelica 中。
否则 OpenModelica(和 JModelica)会同时接受 Medium2 而不会出现任何警告或错误。而这些测试只需改变 LiquidCon 中使用的介质。
我的主要问题是这里是否有比我的代码更直接的解决方案来使用上述一种物质扩展中型包,并且更标准(并且可以同时使用 JModelica 和 OpenModelica 和当然,通常是 Modelica)。
理清 Modelica 标准在这里所说的内容当然很有趣,然后我们可以将该信息作为错误报告提供给 JModelica 和 OpenModelica 背后的组织。
感谢您的意见/Jan Peter
下面是包的摘录 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;
您可以(因为 Modelica 语言 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 可以处理它。
顺便说一句:错误消息是正确的,因为从 Modelica 1.2 开始重新声明常量是非法的。
我想要一个从另一个基本包扩展而来的包。基本包包含一个向量类型和常量整数,其中包含向量的每个索引号的名称。它还包含一个向量常量,为每个元素赋予一个值(描述元素的一些属性)。在扩展包中我想添加一个向量类型的元素并为新索引添加一个新名称,并向向量常量添加一个具有特定值的元素(描述一些属性的物质) .
使用可替换的技术 - 扩展 - 重新声明可以直接用元素扩展矢量类型,并为附加元素向包附加一个新的常量整数。但是我不确定如何用新元素附加常量向量。
下面的代码适用于 JModelica (2.4),但涉及重新声明和原始基本包中值的复制。但是在 Medium3 中,JModelica 不接受常量向量 mw 的第四个重新声明语句。但是,如果我改为在扩展完成后将 redeclare 语句作为第一行,它确实有效(参见 Fritzson 第 4.3.1 节)。但是,重新声明应该是原始类型的子类型,而 Real3] 不是 Real[2] 的子类型,但编译器似乎可以管理。
当我在 OpenModelica (1.13) 中尝试相同的代码时,我收到错误消息,因为我重新声明了一个常量,并且在 Medium3 中的第一次重新声明时已经出错。我不确定这是一条正确的错误消息,并且没有出现在 JModelica 中。
否则 OpenModelica(和 JModelica)会同时接受 Medium2 而不会出现任何警告或错误。而这些测试只需改变 LiquidCon 中使用的介质。
我的主要问题是这里是否有比我的代码更直接的解决方案来使用上述一种物质扩展中型包,并且更标准(并且可以同时使用 JModelica 和 OpenModelica 和当然,通常是 Modelica)。
理清 Modelica 标准在这里所说的内容当然很有趣,然后我们可以将该信息作为错误报告提供给 JModelica 和 OpenModelica 背后的组织。
感谢您的意见/Jan Peter
下面是包的摘录 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;
您可以(因为 Modelica 语言 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 可以处理它。
顺便说一句:错误消息是正确的,因为从 Modelica 1.2 开始重新声明常量是非法的。