在翻译时确定 Modelica 模型中特定组件的数量(使用 Dymola)
Determine the number of a specific component in a Modelica model at translation (using Dymola)
您如何确定翻译时此模型中给定 class 的实例数。此大小用于设置向量的大小。
model ModelToBeCounted
end ModelToBeCounted;
model Example
ModelToBeCounted A;
ModelToBeCounted B;
ModelToBeCounted C;
end Example;
所以在这个例子中我想确定 ModelToBeCounted
的实例数。这些实例也可以在其他 classes 的实例中。可以更改顶层的代码来执行此操作,并且 ModelToBeCounted
也可以更改。
我尝试使用外部对象,但是我找不到一种方法来确保在用于报告外部对象总数的函数 运行 之前创建了所有外部对象。
有什么想法吗?
谢谢
ModelManagement
图书馆可以做到这一点。
事实上,正是您需要的功能可用:
ModelManagement.Structure.Instantiated.CountUsedModels("Example", {"ModelToBeCounted"});
= {3}
该库随 Dymola 一起安装,并可通过标准许可证使用。
您只需从 库 菜单中打开它。
一个问题可能是,这个函数必须翻译你的模型。我不确定这是否能满足您的要求:
This size is to be used to set the size of a vector.
如果你可以修改模型ModelToBeCounted
你可以使用inner/outer
:
connector C
Real totalNum;
flow Real addNum;
end C;
model InnerObjectCounter
C c;
equation
c.totalNum+c.addNum=0 "Correct sign";
annotation(missingInnerMessage="Add inner component to count objects");
end InnerObjectCounter;
model FlowSource
C c;
equation
c.addNum=1;
end FlowSource;
model AddCounter
outer InnerObjectCounter objectCounter;
final Integer totalNum=integer(flowSource.c.totalNum);
FlowSource flowSource;
equation
connect(flowSource.c, objectCounter.c);
end AddCounter;
model ModelToBeCounted
AddCounter c;
end ModelToBeCounted;
所有组件都使用inner/outer-mechanism自动连接到内部对象,它们的流量为 1 并加在一起。
如果你不能修改模型ModelToBeCounted
,并且你愿意使用non-standarized方法你可以设置标志:
Hidden.AllowAutomaticInstanceOf=true;
然后使用:
final parameter Integer m=sum(1 for m in P.ModelToBeCounted);
来自:
https://github.com/modelica/ModelicaSpecification/blob/MCP/0021/RationaleMCP/0021/
您如何确定翻译时此模型中给定 class 的实例数。此大小用于设置向量的大小。
model ModelToBeCounted
end ModelToBeCounted;
model Example
ModelToBeCounted A;
ModelToBeCounted B;
ModelToBeCounted C;
end Example;
所以在这个例子中我想确定 ModelToBeCounted
的实例数。这些实例也可以在其他 classes 的实例中。可以更改顶层的代码来执行此操作,并且 ModelToBeCounted
也可以更改。
我尝试使用外部对象,但是我找不到一种方法来确保在用于报告外部对象总数的函数 运行 之前创建了所有外部对象。
有什么想法吗?
谢谢
ModelManagement
图书馆可以做到这一点。
事实上,正是您需要的功能可用:
ModelManagement.Structure.Instantiated.CountUsedModels("Example", {"ModelToBeCounted"});
= {3}
该库随 Dymola 一起安装,并可通过标准许可证使用。 您只需从 库 菜单中打开它。
一个问题可能是,这个函数必须翻译你的模型。我不确定这是否能满足您的要求:
This size is to be used to set the size of a vector.
如果你可以修改模型ModelToBeCounted
你可以使用inner/outer
:
connector C
Real totalNum;
flow Real addNum;
end C;
model InnerObjectCounter
C c;
equation
c.totalNum+c.addNum=0 "Correct sign";
annotation(missingInnerMessage="Add inner component to count objects");
end InnerObjectCounter;
model FlowSource
C c;
equation
c.addNum=1;
end FlowSource;
model AddCounter
outer InnerObjectCounter objectCounter;
final Integer totalNum=integer(flowSource.c.totalNum);
FlowSource flowSource;
equation
connect(flowSource.c, objectCounter.c);
end AddCounter;
model ModelToBeCounted
AddCounter c;
end ModelToBeCounted;
所有组件都使用inner/outer-mechanism自动连接到内部对象,它们的流量为 1 并加在一起。
如果你不能修改模型ModelToBeCounted
,并且你愿意使用non-standarized方法你可以设置标志:
Hidden.AllowAutomaticInstanceOf=true;
然后使用:
final parameter Integer m=sum(1 for m in P.ModelToBeCounted);
来自: https://github.com/modelica/ModelicaSpecification/blob/MCP/0021/RationaleMCP/0021/