用于仿真的Dymola BlockTimers已停止

时间:2019-01-15 13:34:01

标签: logging dymola

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

  • 第一个问题:我能以某种方式查看中断模拟的计时器结果吗?它们存储在某个文件中吗?
  • 第二个问题:还有其他方法可以找出Dymola花了那么多时间的时间吗?

enter image description here 在CPU时间8E4秒(22小时)后,我停止了仿真。
在仿真时间358.65,没有事件发生,但是与负温度和负压力有关的警告很多,因此我认为非线性求解器的方向不正确!因此,我想确定在time = 358.65时很难求解的方程组。

1 个答案:

答案 0 :(得分:3)

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

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

  1. 激活模拟设置(“转换”选项卡)中的标志“包括模拟过程中已用CPU时间的变量”。这将为您提供两个附加变量,即结果中的“ CPUtime”和“ EventCounter”。这有助于指出何时消耗了大量时间(CPU时间)以及可能的原因(EventCounter)。或者,您可以从命令行设置OutputCPUtime = true;
  2. 检查模拟日志中的“ xxx个事件数”,而状态和步进事件的大数(> 1000)尤为重要。
  3. 鉴于您有很多事件(并且在特定时间模拟非常慢),因此可以通过打开运行模拟的命令窗口(dymosim.exe)并按两次CTRL + C来中断模拟。然后,您可以通过输入le = true来启用事件记录,并通过输入c来继续模拟。输出应指示事件是否迅速发生。如果发生了很多事件并且时间不提前,则问题很可能“震颤”。
  4. 如果不是这种情况,则可能很难解决该问题。可以通过激活Simulation Setup(调试选项卡)中的“控制错误的状态”标记来进行调查。这将表明哪个状态通常会限制步长或导致主要错误。如果这只是一个或几个州,您可以考虑简化或删除它们。
  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开始,您应该能够右键单击模拟结果,然后选择“ Analyze Numerics”以提供一个不言自明的对话框。

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