【问题标题】:Replacement of deprecated function cardinality(c) in Modelica替换 Modelica 中已弃用的函数基数(c)
【发布时间】:2019-11-21 15:01:50
【问题描述】:

documentation 中指出,cardinality() 函数已弃用且不应再使用。但是,它仍然在 ThermoSysPro 等库中使用。

例如

if (cardinality(C) == 0) then
 some code
end if;

其中CFluidInletFluidOutlet

谁能举一个简单的例子来说明如何替换它?

【问题讨论】:

    标签: modelica openmodelica jmodelica


    【解决方案1】:

    通常的解决方案是使连接器有条件,如果启用,您需要连接它。

    对于物理连接器,您可以查看如何处理热端口和支持: Modelica.Electrical.Analog.Interfaces.ConditionalHeatPort Modelica.Mechanics.Rotational.Interfaces.PartialElementaryOneFlangeAndSupport2

    对于控制信号,您可以查看p_inh_in 等是如何处理的 Modelica.Fluid.Sources.Boundary_pT Modelica.Fluid.Sources.Boundary_ph

    但是,ThermoSysPro 的连接器不属于这两个类别,理想情况下也应该清理。

    【讨论】:

      【解决方案2】:

      我知道的唯一可以在这方面使用的是connectorSizing 注释。它在MLS 第 18.7 章中有描述。

      它在 Modelica 标准库中被多次使用,例如通过参数nuModelica.Blocks.Math.MinMax 中。使用时,工具会根据连接数自动为nu设置修饰符。

        parameter Integer nu(min=0) = 0 "Number of input connections"
          annotation (Dialog(connectorSizing=true));
        Modelica.Blocks.Interfaces.RealVectorInput u[nu];
      

      在下面的示例中,nu=2 在图形层中创建连接时由 Dymola 自动生成。我已经删除了图形注释,使代码更具可读性。

      model ExCS
        Modelica.Blocks.Math.MinMax minMax(nu=2);
        Modelica.Blocks.Sources.Sine sine(freqHz=6.28);
        Modelica.Blocks.Sources.Constant const(k=0.5);
      
      equation 
        connect(sine.y, minMax.u[1]);
        connect(const.y, minMax.u[2]);
      end ExCS;
      

      【讨论】:

        【解决方案3】:

        cardinality() 运算符在 Modelica.Fluid.Sources.BaseClasses.PartialSource 中使用,在其他流体库(IBSPAAixLibBuildingsBuildingSystemsIDEAS)中以类似的方式使用,形式为

          // Only one connection allowed to a port to avoid unwanted ideal mixing
          for i in 1:nPorts loop
            assert(cardinality(ports[i]) <= 1,"
              each ports[i] of boundary shall at most be connected to one component.
              If two or more connections are present, ideal mixing takes
              place with these connections, which is usually not the intention
              of the modeller. Increase nPorts to add an additional port.
             ");
           end for;
        

        我偶尔会收到一些用户的模型,他们以某种方式最终与ports[i] 建立了多个连接。这是如何发生的尚不清楚,但我发现使用cardinality() 有助于捕捉此类情况,否则可能会导致用户无意且难以检测到的流体端口混合。

        【讨论】:

        • 我也觉得这个功能比较好用,但是已经贬值了,以后会去掉,方便我理解。如果开发人员决定删除它,那么背后一定有一些真正的理由。虽然听到它会很有趣。
        猜你喜欢
        • 2019-12-20
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        • 2020-10-22
        • 2013-01-13
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多