gpt4 book ai didi

function - 如何在其他函数中调用Medium函数?

转载 作者:行者123 更新时间:2023-12-02 21:49:11 26 4
gpt4 key购买 nike

考虑以下 MWE,其中模型具有可替换函数,可以从多个选项中选择如何计算介质比热容,有些使用介质模型中的函数,有些则不使用。因此,使用一个包来收集所有特定的热容函数。

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;

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

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 函数,则会出现错误:

Function Medium.specificHeatCapacity is not known in (function Library.FunctionPackage.realCp)

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

我知道在 Model 内声明 FunctionPackage 中的函数会将它们置于与 Medium 相同的作用域中,使我能够在内部调用它功能没有任何问题。尽管这样做会让我失去可替换功能的下拉功能,但我确实需要在这里拥有它,所以失去它不是一个选择。

顺便说一句,不知道这个问题是否有任何用处,但我在 Windows 10 64 位下使用 Dymola 2017(32 位)。

最佳答案

您不能直接将 Medium-package 作为普通函数输入传递。

一种解决方案如下:

添加Medium作为LibraryFunction的可替换包

package FunctionPackage
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
...

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

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;

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

  function realCp
extends baseCp;
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
algorithm
cp := Medium.specificHeatCapacityCp(p, T);
end realCp;

并用作:

function cp = FunctionPackage.realCp(redeclare package Medium=Medium);

关于function - 如何在其他函数中调用Medium函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51247315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com