【问题标题】:Modelica - how to extend a (minimal) medium packageModelica - 如何扩展(最小)中型包
【发布时间】:2019-03-05 08:23:33
【问题描述】:

我想要一个从另一个基本包扩展而来的包。基本包包含向量类型和常量整数,其中包含向量的每个索引号的名称。它还包含一个向量常数,为每个元素赋予一个值(描述元素的某些属性)。在扩展包中,我想添加一个向量类型的元素并为新索引添加一个新名称,并在向量常量中添加一个具有特定值(描述物质的某些属性)的元素。

使用可替换 - 扩展 - 重新声明的技术,可以直接用一个元素扩展向量类型,并为附加元素附加一个新的常量整数到包中。但是我不确定如何在常量向量中添加一个新元素。

下面的代码在 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 openmodelica jmodelica


    【解决方案1】:

    您可以(因为 Modelica Language 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 v2.4。但是对于 OpenModelica v1.13.0,我收到错误消息“翻译错误 - 由于类专业化包而无法实例化 DEMO_v9。”
    • OpenModelica 票证 #5375
    • OpenModelica 票证#5375 已解决,是由于我对错误和警告文本的误解,即使是红色代码也可以运行。但顺便说一句,我们发现了一个更根本的缺陷,并且与我的另一篇文章有​​关如何构建媒体代码库应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多