首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在其他函数中调用中介函数?

如何在其他函数中调用中介函数?
EN

Stack Overflow用户
提问于 2018-07-09 13:55:32
回答 2查看 325关注 0票数 4

考虑下面的MWE,其中一个模型有一个可折叠的函数,可以从多个选项中选择如何计算介质比热容,有些使用来自介质模型的函数,有些则没有,因此使用一个软件包来收集所有的比热容函数。

代码语言:javascript
复制
package Library
      model Model
        replaceable package Medium =
            Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation(choicesAllMatching=true);
        replaceable function cp = FunctionPackage.baseCp annotation(choicesAllMatching=true);
        parameter Real M;
        parameter Real V;
        parameter Real Qflow;
        Real T;
        Real p;
      equation 
        M*cp(p,T)*der(T) = Qflow;
        p*V = M*Medium.R_gas*T;
      end Model;

    package FunctionPackage
        partial function baseCp
            input Real p;
            input Real T;
            output Real cp;
        end baseCp;

        function realCp
            extends baseCp;
        algorithm 
            cp := Medium.specificHeatCapacity(p, T);
        end realCp;

        function linearCp
            extends baseCp;
        algorithm 
            cp :=0.1*T + 1000;
        end linearCp;
    end FunctionPackage;
end Library;

如果我要在另一个模型中模拟Model,我必须选择要计算cp的函数:

代码语言:javascript
复制
model Simulation
  Library.Model Model(
    redeclare package Medium = Modelica.Media.Air.SimpleAir,
    M=1,
    Qflow=1,
    V=0.1,
    redeclare function cp = Library.FunctionPackage.linearCp);
end Simulation;

但是,如果我选择realCp函数,那么错误就会上升:

代码语言:javascript
复制
Function Medium.specificHeatCapacity is not known in (function Library.FunctionPackage.realCp)

这对我来说并不奇怪,我知道在FunctionPackage中声明的函数“不知道”在Model模型中声明的中介包。因此,我的问题是:我如何使他们意识到?是否可以将媒体作为函数的输入传递?

我知道,在FunctionPackage中声明Model中的函数会将它们放在与Medium相同的范围内,使我能够在函数中调用它,而不会出现任何问题。虽然这样做使我失去了replaceable function的下拉功能,但我在这里确实需要这样做,因此失去它不是一种选择。

顺便说一句,我不知道这个问题是否有用,但我在Windows 1064位下使用Dymola2017 (32位)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-10 08:16:45

您不能将媒体包直接作为普通函数输入传递.

一种解决办法如下:

添加介质作为LibraryFunction的可替换包

代码语言:javascript
复制
package FunctionPackage
  replaceable package Medium =
      Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
      choicesAllMatching=true);
  ...

并在需要它的地方创建一个新的FunctionPackage:

代码语言:javascript
复制
model Model
  replaceable package Medium =
      Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
      choicesAllMatching=true);
  replaceable function cp = MyFunctionPackage.baseCp annotation (
      choicesAllMatching=true);
  package MyFunctionPackage = FunctionPackage (redeclare package Medium =
          Medium);
  ...

model Simulation
  package MyFunctionPackage = Library.FunctionPackage(redeclare package Medium=
          Modelica.Media.Air.SimpleAir);
Library.Model Model(
  redeclare package Medium = Modelica.Media.Air.SimpleAir,
  ...
  redeclare function cp = MyFunctionPackage.linearCp);
end Simulation;

另一个变体是在函数中将它作为可替换的包,如下所示(更短,但我发现它更令人困惑):

代码语言:javascript
复制
  function realCp
    extends baseCp;
    replaceable package Medium =
      Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
      choicesAllMatching=true);
  algorithm 
    cp := Medium.specificHeatCapacityCp(p, T);
  end realCp;

并用作:

代码语言:javascript
复制
function cp = FunctionPackage.realCp(redeclare package Medium=Medium);
票数 2
EN

Stack Overflow用户

发布于 2018-07-10 13:22:35

不是一个完整的答案,但下面是一个可模拟的模型(在Dymola 2019中测试),它基于最初的问题和Hans的答案(使用变式2):

代码语言:javascript
复制
package Library
  model Model
    replaceable package myMedium = Modelica.Media.Air.SimpleAir constrainedby 
      Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
      choicesAllMatching=true);

    function funMach = FunctionPackage.Mach(redeclare package funMedium=myMedium);

    Real Mach;
    parameter Modelica.SIunits.Temperature T=293.15;
    parameter Modelica.SIunits.Pressure p=101325;
  protected 
    Real TempTime = T + time;
  equation 
    Mach = funMach(state=myMedium.setState_pT(p,TempTime), velo=300);
  end Model;

  package FunctionPackage
    function Mach
      replaceable package funMedium = Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
      choicesAllMatching=true);
      input funMedium.ThermodynamicState state;
      input Modelica.SIunits.Velocity velo;
      output Real Mach;
    protected 
      Modelica.SIunits.Velocity souvel;
    algorithm 
      souvel := funMedium.velocityOfSound(state);
      Mach := velo/souvel;
    end Mach;
  end FunctionPackage;
end Library;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51247315

复制
相关文章

相似问题

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