在嵌套模型模型中,还有其他优雅的方式来重新划分类型和值

发布于 2025-01-25 09:10:49 字数 976 浏览 3 评论 0原文

我有一组嵌套的型号和子模型以及记录。这是一个简单的示例:

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 ta h ,其中具有不同类型的实例。这样,我发现听起来很重,通过不同的变量传递了两种记录及其内容。当我有2个级别时,没问题,我可以使用重新列出的很好。当我有两个以上的嵌套类(假设5)时,我不知道如何同时通过类型和实例。请注意,在 h 中, m 受到保护。 虽然以不同的方式做吗?

I have a set of nested models and sub-models, as well as records. Here is the simple example:

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;

They are 3 sets of nested records (A, B, C), and 3 nested models (R, H, M). I want to pass an instance of a record from R to M through H, with instances having different types. That way of doing I found sounds heavy, passing both type of record AND its content through a different variable. When I have 2 levels, no problem, I can use redeclare that is fine. When I have more than two levels of nested classes (let say 5), I don't know how to pass both Type and instance at the same time. Note, in H, m is protected.
Any though on doing in a different way ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花开半夏魅人心 2025-02-01 09:10:49

我想提出另一个答案的轻微变化,然后解释它通常是如何解决的。

变化是您可以在重新列表中修改值和类别,而无需明确的记录声明。

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内部时,我们会发现即使模型是合法的,也无法使用新参数。因此,更正常的情况是,它是模型,其中一些参数导致:

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;

I want to present a slight variation of the other answer and then explain how it is often solved.

The variation is that you can modify value and class in the redeclare without having explicit record declarations.

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;

However, when looking inside H we see that even if the model is legal the new parameters cannot be used. Thus a more normal case is that it is a model with some parameters in it leading to:

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;
小…红帽 2025-02-01 09:10:49

我发现的一种解决方案是传递记录封装记录的实例(在Modelica术语中称为组件)。新代码是:

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 参数b bb(b = 5,a = 2.0); 到各种子模型,一个通过记录 bb
包含 b 的值,

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

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

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

One solution I found is by passing a record encapsulating an instance of record (called component in Modelica terminology). The new code is:

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;

The main difference being instead of passing a component B parameter B bb(b=5, a=2.0); to the various sub-models, one passes a record BB
containing values of B

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

One then have to redeclare the record in the sub-classe definition, which can be repetated again and again.

Dummy values have to defined in the base record A, let say a=0.0 for Dymola to accept the code, while OpenModelica and SimulationX does not need it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文