首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套的modelica模型中是否有其他优雅的方法来重新声明类型和值?

在嵌套的modelica模型中是否有其他优雅的方法来重新声明类型和值?
EN

Stack Overflow用户
提问于 2022-05-02 06:36:19
回答 2查看 62关注 0票数 0

我有一套嵌套模型和子模型,以及记录。下面是一个简单的例子:

代码语言:javascript
复制
package Unnamed1
  record A
    Real a;
  end A;

  record B
    extends A;
    Real b;
  end B;

  record C
    extends B;
    Real c;
  end C;

  model M
    replaceable record Data = A;
    parameter Data data;
  end M;

  model H
    replaceable record Data = A;
    parameter Data data;
    protected
    M m(redeclare replaceable record Data = Data, data=data);
  end H;

  model R
    parameter B bb(b=5, a=2.0);
    parameter A aa(a=4.0);
    parameter C cc(a=0.0, b=0.2, c=0.8);
    H h(redeclare record Data = B, data=bb);
    H g(redeclare record Data = A, data = aa);
    H f(redeclare record Data = C, data = cc);
  end R;
end Unnamed1;

它们是3组嵌套记录(A,B,C)和3个嵌套模型(R,H,M)。我想将一个记录的实例从R传递到M到H,其中的实例具有不同的类型。这样做,我发现听起来很沉重,通过一个不同的变量传递记录的类型和内容。当我有两个等级,没有问题,我可以使用重新声明,这是好的。当我有两个以上级别的嵌套类(假设为5个)时,我不知道如何同时传递Type和实例。注意,在H中,m是受保护的。有什么不同的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2022-05-02 15:32:59

我发现的一个解决方案是传递一个记录,封装记录的实例(在Modelica术语中称为component )。新的守则是:

代码语言:javascript
复制
package Unnamed1
  record A
    Real a=0.0; // value for Dymola... don't know why yet
  end A;

  record B
    extends A;
    Real b;
  end B;

  record C
    extends B;
    Real c;
  end C;

  model M
    replaceable record Data = A;
    Data data;
  end M;

  model H
    replaceable record Data = A;
    M m(redeclare record Data = Data);
  end H;

  model R
    record AA
        extends A(a=5);
    end AA;

    record BB
        extends B(b=5, a=2.0);
    end BB;

    record CC
      extends C(a=0.0, b=0.2, c=0.8);
    end CC;

    H f(redeclare record Data = AA);
    H g(redeclare record Data = BB);
    H h(redeclare record Data = CC);
  end R;
end Unnamed1;

主要的区别不是将组件B parameter B bb(b=5, a=2.0);传递给各个子模型,而是传递包含B值的record BB

代码语言:javascript
复制
record BB
    extends B(b=5, a=2.0);
end BB;

然后,必须在子类定义中重新声明记录,可以一次又一次地重复该定义。

虚拟值必须在基本记录A中定义,假设是Dymola接受代码的a=0.0,而OpenModelica和SimulationX不需要它。

票数 2
EN

Stack Overflow用户

发布于 2022-05-03 07:42:23

我想给出另一个答案的一个细微的变化,然后解释它是如何经常被解决的。

变化是,您可以修改重声明中的值和类,而不需要显式的记录声明。

代码语言:javascript
复制
package Unnamed1
  record A
    parameter Real a;
  end A;

  record B
    extends A;
    parameter Real b;
  end B;

  record C
    extends B;
    parameter Real c;
  end C;

  model M
    replaceable record Data = A;
    parameter Data data;
  end M;

  model H
    replaceable record Data = A;
  protected 
    M m(redeclare replaceable record Data = Data);
  end H;

  model R
    H h(redeclare record Data = B(b=5,a=2.0));
    H g(redeclare record Data = A(a=4.0));
    H f(redeclare record Data = C(a=0, b=0.2, c=0.8));
  end R;
end Unnamed1;

然而,当查看H内部时,我们发现即使模型是合法的,也不能使用新的参数。因此,一个更正常的情况是,它是一个包含一些参数的模型,导致:

代码语言:javascript
复制
package Unnamed2
  partial model SO
    output Real y;
  end SO;

  model Constant
    extends SO;
    parameter Real b;
  equation 
    y=b;
  end Constant;

  model Ramp
    extends SO;
    parameter Real b;
    parameter Real k;
  equation 
    y=b+time*k;
  end Ramp;

  model Other
    extends SO;
    parameter Real offset;
  equation 
    y=time+offset;
  end Other;

  model M
    replaceable model Source = SO;
    Source source;
  protected 
    Real x;
  equation 
    der(x)=source.y;
  end M;

  model H
    replaceable model Source = SO;
  protected 
    M m(redeclare replaceable model Source = Source);
  end H;

  model R
    H h(redeclare model Source = Constant(b=5));
    H g(redeclare model Source = Other(offset=4.0));
    H f(redeclare model Source = Ramp(b=0.2, k=0.8));
  end R;
end Unnamed2;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72083111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档