用于已停止模拟的 Dymola BlockTimers

Dymola BlockTimers for simulation that has been stopped

我有一个模拟在某些时候非常慢(在下面显示的示例中,时间=358.65)。在 eventlog.txtdslog.txt 中没有这个时间的条目。作为下一步,我将 GenerateTimers 和 GenerateBlockTimers 设置为 true,但我不得不停止模拟,在这种情况下似乎无法查看定时器结果!?

在 8E4 秒(22 小时)的 CPU 时间后我停止了模拟。
在模拟时间 358.65 没有发生任何事件,但是有很多与负温度和负压力相关的警告,所以我假设非线性求解器以某种方式朝着错误的方向前进!?所以,我想找出在时间=358.65时很难求解的方程组。

第一个问题:这很奇怪,对我来说,停止模拟后我可以同时打开 dslog.txteventlog.txt,它们包含各自的信息。

第二个问题:有几种方法可以调查模型的性能。我假设你使用了其中的一些,但为了完整起见,我还是会列出它们,从简单的到更高级的(如果我忘记了什么,任何人都可以随意扩展):

  1. 在模拟设置(翻译选项卡)中激活标志 "Include a variable for elapsed CPU time during simulation"。这将为您提供两个额外的变量,即结果中的 "CPUtime" 和 "EventCounter"。这有助于指示何时消耗了大量时间 (CPUtime) 以及可能的原因 (EventCounter)。或者,您可以从命令行设置 OutputCPUtime = true;
  2. 检查 "number of xxx events" 的模拟日志,而状态和步骤事件的大数字 (> 1000) 尤其重要。
  3. 鉴于你有很多事件(并且你的模拟在某个时间非常慢)通过打开命令中断模拟是有意义的 window 运行 模拟(dymosim.exe) 并按 CTRL+C 两次。然后您可以通过输入 le = true 启用事件记录并通过输入 c 继续模拟。输出应指示事件是否快速发生。如果发生许多事件并且时间没有提前,则问题很可能 "chattering"。
  4. 如果不是这样,系统的问题可能很难解决。这可以通过在模拟设置(调试选项卡)中激活标志 "Which states that dominate error" 来调查。这将指示哪个状态通常会限制步长或导致显性错误。如果这只是一个或几个状态,您可以考虑简化或删除它们。
  5. 通过设置使用分析
    • Advanced.GenerateTimers=true
    • Advanced.Define.PrecisionTiming=true
    • Advanced.DymosimRealTimePriority=true
    • 将在您的工作目录中生成 plotTiming.mos。这将定义一个可以通过键入
    • 绘制的矩阵
    • RunScript("plotTiming.mos",true)
    • createPlot(grid=true, leftTitle="Execution time for step", bottomTitle="Simulation time");
    • plotArray(times[:,1],times[:,2],-1);
    • 这将创建一个图表,其中每个步骤的执行时间显示在 y 轴上,而模拟时间显示在 x 轴上。因此,如果您定义了 1ms 的步长并且想要实时模拟,则应确保现在有超过 1ms 的标记。
  6. 可以通过设置来完成更高级的分析
    • Advanced.GenerateTimers=true
    • Advanced.GenerateBlockTimers=true
    • 其结果显示在模拟日志中。
    • 对于理解这个 dsmodel.c 应该有所帮助(如果您有从您的模型创建源文件的许可)。 c 文件包含指向日志输出中提到的部分的链接。
  7. 从 Dymola 2018FD01 开始,您应该能够右键单击模拟结果,然后 select "Analyze Numerics" 给出一个不言自明的对话框。

对于您的具体情况,我认为第 1-4 点应该有所帮助。对于 5 和 6,您应该在 Dymola 手册第 5.7.5 节中获得更多信息。