用于已停止模拟的 Dymola BlockTimers
Dymola BlockTimers for simulation that has been stopped
我有一个模拟在某些时候非常慢(在下面显示的示例中,时间=358.65)。在 eventlog.txt
和 dslog.txt
中没有这个时间的条目。作为下一步,我将 GenerateTimers 和 GenerateBlockTimers 设置为 true,但我不得不停止模拟,在这种情况下似乎无法查看定时器结果!?
- 第一个问题:我能否以某种方式查看中断模拟的计时器结果?它们存储在某个文件中吗?
- 第二个问题:是否有其他方法可以找出 Dymola 花费这么多时间在什么上?
在 8E4 秒(22 小时)的 CPU 时间后我停止了模拟。
在模拟时间 358.65 没有发生任何事件,但是有很多与负温度和负压力相关的警告,所以我假设非线性求解器以某种方式朝着错误的方向前进!?所以,我想找出在时间=358.65时很难求解的方程组。
第一个问题:这很奇怪,对我来说,停止模拟后我可以同时打开 dslog.txt
和 eventlog.txt
,它们包含各自的信息。
第二个问题:有几种方法可以调查模型的性能。我假设你使用了其中的一些,但为了完整起见,我还是会列出它们,从简单的到更高级的(如果我忘记了什么,任何人都可以随意扩展):
- 在模拟设置(翻译选项卡)中激活标志 "Include a variable for elapsed CPU time during simulation"。这将为您提供两个额外的变量,即结果中的 "CPUtime" 和 "EventCounter"。这有助于指示何时消耗了大量时间 (CPUtime) 以及可能的原因 (EventCounter)。或者,您可以从命令行设置
OutputCPUtime = true;
。
- 检查 "number of xxx events" 的模拟日志,而状态和步骤事件的大数字 (> 1000) 尤其重要。
- 鉴于你有很多事件(并且你的模拟在某个时间非常慢)通过打开命令中断模拟是有意义的 window 运行 模拟(dymosim.exe) 并按 CTRL+C 两次。然后您可以通过输入
le = true
启用事件记录并通过输入 c
继续模拟。输出应指示事件是否快速发生。如果发生许多事件并且时间没有提前,则问题很可能 "chattering"。
- 如果不是这样,系统的问题可能很难解决。这可以通过在模拟设置(调试选项卡)中激活标志 "Which states that dominate error" 来调查。这将指示哪个状态通常会限制步长或导致显性错误。如果这只是一个或几个状态,您可以考虑简化或删除它们。
- 通过设置使用分析
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 的标记。
- 可以通过设置来完成更高级的分析
Advanced.GenerateTimers=true
Advanced.GenerateBlockTimers=true
- 其结果显示在模拟日志中。
- 对于理解这个
dsmodel.c
应该有所帮助(如果您有从您的模型创建源文件的许可)。 c 文件包含指向日志输出中提到的部分的链接。
- 从 Dymola 2018FD01 开始,您应该能够右键单击模拟结果,然后 select "Analyze Numerics" 给出一个不言自明的对话框。
对于您的具体情况,我认为第 1-4 点应该有所帮助。对于 5 和 6,您应该在 Dymola 手册第 5.7.5 节中获得更多信息。
我有一个模拟在某些时候非常慢(在下面显示的示例中,时间=358.65)。在 eventlog.txt
和 dslog.txt
中没有这个时间的条目。作为下一步,我将 GenerateTimers 和 GenerateBlockTimers 设置为 true,但我不得不停止模拟,在这种情况下似乎无法查看定时器结果!?
- 第一个问题:我能否以某种方式查看中断模拟的计时器结果?它们存储在某个文件中吗?
- 第二个问题:是否有其他方法可以找出 Dymola 花费这么多时间在什么上?
在模拟时间 358.65 没有发生任何事件,但是有很多与负温度和负压力相关的警告,所以我假设非线性求解器以某种方式朝着错误的方向前进!?所以,我想找出在时间=358.65时很难求解的方程组。
第一个问题:这很奇怪,对我来说,停止模拟后我可以同时打开 dslog.txt
和 eventlog.txt
,它们包含各自的信息。
第二个问题:有几种方法可以调查模型的性能。我假设你使用了其中的一些,但为了完整起见,我还是会列出它们,从简单的到更高级的(如果我忘记了什么,任何人都可以随意扩展):
- 在模拟设置(翻译选项卡)中激活标志 "Include a variable for elapsed CPU time during simulation"。这将为您提供两个额外的变量,即结果中的 "CPUtime" 和 "EventCounter"。这有助于指示何时消耗了大量时间 (CPUtime) 以及可能的原因 (EventCounter)。或者,您可以从命令行设置
OutputCPUtime = true;
。 - 检查 "number of xxx events" 的模拟日志,而状态和步骤事件的大数字 (> 1000) 尤其重要。
- 鉴于你有很多事件(并且你的模拟在某个时间非常慢)通过打开命令中断模拟是有意义的 window 运行 模拟(dymosim.exe) 并按 CTRL+C 两次。然后您可以通过输入
le = true
启用事件记录并通过输入c
继续模拟。输出应指示事件是否快速发生。如果发生许多事件并且时间没有提前,则问题很可能 "chattering"。 - 如果不是这样,系统的问题可能很难解决。这可以通过在模拟设置(调试选项卡)中激活标志 "Which states that dominate error" 来调查。这将指示哪个状态通常会限制步长或导致显性错误。如果这只是一个或几个状态,您可以考虑简化或删除它们。
- 通过设置使用分析
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 的标记。
- 可以通过设置来完成更高级的分析
Advanced.GenerateTimers=true
Advanced.GenerateBlockTimers=true
- 其结果显示在模拟日志中。
- 对于理解这个
dsmodel.c
应该有所帮助(如果您有从您的模型创建源文件的许可)。 c 文件包含指向日志输出中提到的部分的链接。
- 从 Dymola 2018FD01 开始,您应该能够右键单击模拟结果,然后 select "Analyze Numerics" 给出一个不言自明的对话框。
对于您的具体情况,我认为第 1-4 点应该有所帮助。对于 5 和 6,您应该在 Dymola 手册第 5.7.5 节中获得更多信息。