Dymola BlockTimers для симуляции, которая была остановлена
У меня есть симуляция, которая очень медленная в определенные моменты времени (в моем примере, показанном ниже во время =358,65). в eventlog.txt
а также dslog.txt
на этот раз нет записей В качестве следующего шага я установил для GenerateTimers и GenerateBlockTimers значение true, но мне пришлось остановить симуляцию, и кажется, что в этом случае результаты таймера не могут быть просмотрены!?
- Первый вопрос: могу ли я как-нибудь увидеть результаты таймера для прерванных симуляций? Они хранятся в каком-то файле?
- Второй вопрос: есть ли другие способы узнать, на что Димола тратит так много времени?
После 8E4 секунд (22 ч) времени процессора я остановил симуляцию.
Во время моделирования 358.65 никаких событий не произошло, но было много предупреждений, связанных с отрицательными температурами и отрицательными давлениями, поэтому я предполагаю, что нелинейный решатель как-то движется в неправильном направлении!? Итак, я хотел бы определить систему уравнений, которую так сложно решить в момент времени =358,65.
1 ответ
Первый вопрос: это странно, для меня после остановки симуляции я могу открыть оба, dslog.txt
а также eventlog.txt
и они содержат соответствующую информацию.
Второй вопрос: есть несколько способов исследовать производительность модели. Я предполагаю, что вы использовали некоторые из них, но я тем не менее перечислю их для полноты, перейдя от простых к более сложным (любой может свободно расширяться, если я что-то забыл):
- Активируйте флажок "Включить переменную для затраченного времени ЦП во время моделирования" в настройке моделирования (вкладка "Перевод"). Это даст вам две дополнительные переменные, а именно "CPUtime" и "EventCounter" в вашем результате. Это помогает указать, когда много времени расходуется (время ЦП) и возможная причина этого (EventCounter). В качестве альтернативы вы можете установить
OutputCPUtime = true;
из командной строки. - Проверьте в журнале моделирования "количество событий ххх", тогда как большие числа (> 1000) для событий состояния и шага особенно важны.
- Поскольку у вас много событий (и ваша симуляция очень медленная в определенное время) имеет смысл прервать симуляцию, открыв командное окно, в котором выполняется симуляция (dymosim.exe), и дважды нажмите CTRL+C. Затем вы можете включить ведение журнала событий, введя
le = true
и продолжите симуляцию, введяc
, Выходные данные должны указывать, происходят ли события быстро. Если происходит много событий, а время не наступает, проблема, скорее всего, "болтается". - Если это не так, проблема может быть трудно решить системы. Это можно исследовать, активировав флаг "Какие состояния доминируют над ошибкой" в настройке моделирования (вкладка "Отладка"). Это будет указывать, какое состояние часто ограничивает размер шага или вызывает доминирующую ошибку. Если это только одно или несколько состояний, вы можете подумать об их упрощении или удалении.
- Использование профилирования путем настройки
Advanced.GenerateTimers=true
Advanced.Define.PrecisionTiming=true
Advanced.DymosimRealTimePriority=true
- будет генерировать
plotTiming.mos
в вашем рабочем каталоге. Это определит матрицу, которую можно построить, набрав RunScript("plotTiming.mos",true)
plotArray(times[:,1],times[:,2],-1);
- Более расширенное профилирование может быть сделано путем настройки
RunScript("plotTiming.mos",true)
plotArray(times[:,1],times[:,2],-1);
- для которых результаты показаны в журнале моделирования.
- Для понимания этого
dsmodel.c
должно помочь (если у вас есть лицензия на создание исходных файлов из вашей модели)
- Начиная с Dymola 2018FD01, вы сможете щелкнуть правой кнопкой мыши результат моделирования и выбрать "Анализ чисел", открывая диалоговое окно, которое должно быть само за себя.
Для вашего конкретного случая я думаю, что пункты 1-4 должны помочь. Для 5 и 6 вы должны иметь больше информации в разделе 5.7.5 Руководства по Dymola.