我想测量 DAE 系统的总模拟和初始化时间。我对挂钟时间很感兴趣(就像 Matlab 中函数 tic-toc 给出的那样)。
我注意到在 Modelica 中模拟时间有不同的标志,但实际上我得到的时间与我按下模拟按钮到模拟结束所经过的时间相比非常小(大约用我的手机时钟测量)。
我猜这个短时间只是模拟所需的时间,它不包括eqs系统的初始化。
有没有办法计算这个总时间?
非常感谢你提前,
加布里埃莱
亲爱的 Marco, 非常感谢您非常详细和有用的回复!
我实际上使用的是 OpenModelica 而不是 Dymola,所以不幸的是,我必须构建为我执行此操作的函数,而且我对 OpenModelica 语言非常陌生。
到目前为止,我有一个基于 DAE 模拟物理行为的模型。现在,我正在尝试构建您在这里建议的内容:
使用 get time(),您可以构建一个函数:在 t_start 转换模型并模拟 0 秒时读取系统时间,再次读取系统时间,并且 t_stop 计算 t_start 和 t_stop 之间的差异。
请给我更多详细信息:我可以使用哪个命令在 t_start 时间读取系统并模拟它 0 秒?要对 t_start 和 t_stop 执行此操作,我是否需要不同的功能?
完成此操作后,是否必须调用 OpenModelica 模型中的函数(或多个函数),我想知道其时间?
再次感谢您的宝贵帮助!
最好的问候,加布里埃尔
根据您拥有的工具,这可能意味着很多工作。
第一个问题是 MSL 允许您检索系统时间,但没有包含任何内容来轻松计算时间增量。因此,Dymola 中的测试库具有操作员记录DateTime和Duration. 请注意,计划将它们集成到未来的 MSL 版本中,但目前这只能通过 Dymola 用户的测试库使用。
第二个问题是没有标准化的方法来翻译和模拟模型。每个工具都有自己的方法来从脚本中做到这一点。因此,在不知道您使用的是什么工具的情况下,不可能给出准确的答案。
在当前的 Modelica 标准库版本 3.2.3 中,您可以通过Modelica.Utilities.System.getTime().
这个小例子展示了如何使用它:
function printSystemTime
protected
Integer ms, s, min, h, d, mon, a;
algorithm
(ms, s, min, h, d, mon, a) := Modelica.Utilities.System.getTime();
Modelica.Utilities.Streams.print("Current time is: "+String(h)+":"+String(min)+":"+String(s));
end printSystemTime;
Run Code Online (Sandbox Code Playgroud)
您会看到它通过 7 个返回值提供当前系统日期和时间。如果您想计算时间增量,这些变量不太好处理,因为您最终会得到 14 个变量,每个变量都有自己的值范围。
有了gettime()你可以建立一个函数:
步骤 2 取决于工具。在 Dymola 你会打电话
DymolaCommands.SimulatorAPI.simulateModel("path-to-model", 0, 0);
Run Code Online (Sandbox Code Playgroud)
它会转换您的模型并对其进行 0 秒的模拟,因此它只运行初始化部分。
测试库包含函数Testing.Utilities.Simulation.timing,它几乎完全符合您的要求。
要翻译和模拟您的模型,请按如下方式调用它:
Testing.Utilities.Simulation.timing(
"Modelica.Blocks.Examples.PID_Controller",
task=Testing.Utilities.Simulation.timing.Task.fullTranslate_simulate,
loops=3);
Run Code Online (Sandbox Code Playgroud)
这将转换您的模型并模拟 1 秒 3 次并计算平均值。
要模拟 0,请复制该函数并更改它
if simulate then
_ :=simulateModel(c);
end if;
Run Code Online (Sandbox Code Playgroud)
到
if simulate then
_ :=simulateModel(c, 0, 0);
end if;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |