在Dymola/Modelica中基于CPU时间停止模拟

3
在Dymola中,我可以像这样做:
when time > 100 then
    assert(false,"Simulation taking too long");
end when;

停止基于时间变量本身的模拟。

然而,我想要的是基于已经消耗的CPU时间停止模拟。Dymola有一种输出CPU时间的方法,并且在结果中显示为CPUtime,但我不知道如何访问该变量。换句话说,我想要做的事情是这样的,但是CPUtime变量不在范围内:

when CPUtime > 100 then
    assert(false,"Simulation taking too long");
end when;

有没有办法访问CPU时间,或者其他解决方案可以基于CPU时间结束模拟?

Dymola 2022可以根据最大挂钟时间(而不是CPU时间)停止模拟,也许这对您有用?https://www.3ds.com/products-services/catia/products/dymola/latest-release/ - Priyanka
或者,您可以使用系统调用来获取墙钟时间并编写自己的tic-toc函数。然后使用terminate()运算符来终止模拟。 - Priyanka
相关:https://dev59.com/yrroa4cB1Zd3GeqPmIjs - Priyanka
相关链接:https://dev59.com/trbna4cB1Zd3GeqPhdIn - Priyanka
是的,新的Dymola 2022功能看起来非常完美,感谢您指出。我也尝试了tic/toc类型的解决方案,但我只能在交互式环境(比如脚本环境)中让它工作,而不能将其作为模型嵌入到仿真中。也许需要再试一次。 - Matt
1个回答

2

如前所述:

您可以在Dymola 2022的模拟设置中进行设置,或者通过设置Advanced.Simulation.MaxRunTime来进行设置。

这是墙钟时间,这意味着如果您有一个并行模拟,它将在经过10秒后停止,而不是当核心共同花费10秒时停止,并且如果您因某种奇怪的原因在模型中有一个长时间的休眠调用,它仍将结束。

(这已经在评论中指出 - 感谢Priyanka。但是,stackoverflow出于某种原因警告说评论中的答案可能会丢失。)


这样一个“奇怪的原因”可能是一个不正确的外部函数或FMU没有正确返回。 - Dag B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接