Расчет общего времени моделирования Modelica и инициализация уравнения

Я хотел бы измерить общее время моделирования и инициализации системы DAE. Меня интересует время настенных часов (например, указанное в Matlab функцией tic-toc).

Я заметил, что в Modelica есть разные флаги для времени моделирования, но на самом деле время, которое я получаю, очень мало по сравнению со временем, прошедшим с момента нажатия кнопки моделирования до конца моделирования (примерно измеряется часами моего телефона).

Я предполагаю, что это короткое время - всего лишь время, необходимое для моделирования, и оно не включает инициализацию системы эквалайзеров.

Есть ли способ рассчитать это общее время?

Огромное спасибо заранее,

Габриэле


Уважаемый Марко, Большое спасибо за чрезвычайно подробный и полезный ответ!

На самом деле я использую OpenModelica, а не Dymola, поэтому, к сожалению, мне нужно создать функцию, которая делает это за меня, и я очень новичок в языке OpenModelica.

Пока у меня есть модель, имитирующая физическое поведение на основе DAE. Теперь я пытаюсь построить то, что вы предлагаете здесь:

С помощью get time () вы можете создать функцию, которая: считывает системное время, когда t_start переводит модель, и моделирует в течение 0 секунд, снова считывает системное время, а поскольку t_stop вычисляет разницу между t_start и t_stop.

Не могли бы вы дать мне более подробную информацию: какую команду я могу использовать для чтения системы в момент t_start и для ее моделирования в течение 0 секунд? Чтобы сделать это как для t_start, так и для t_stop, мне нужны разные функции?

Должен ли я после этого вызывать функцию (или функции) внутри модели OpenModelica, время которой я хочу знать?

Еще раз большое спасибо за вашу бесценную помощь!

С наилучшими пожеланиями, Габриэле


person Gabriele Galli    schedule 22.04.2020    source источник
comment
связанные: Claytex.com/blog/modelica-based-tic -toc-functions-dymola   -  person Priyanka    schedule 23.04.2020
comment
Я бы посоветовал позвонить Димоле из Python и установить время на Python.   -  person Priyanka    schedule 23.04.2020
comment
Что касается вашего редактирования: я предлагаю вам создать дополнительный вопрос. Иначе сложно уследить. См. meta.stackoverflow.com/questions/290746/   -  person marco    schedule 04.05.2020
comment
Спасибо, Марко, за совет, я только что создал дополнительный вопрос. Это ссылка: stackoverflow.com/questions/61593521/   -  person Gabriele Galli    schedule 04.05.2020


Ответы (1)


В зависимости от имеющегося у вас инструмента это может означать много работы.

Первая проблема заключается в том, что MSL позволяет получить системное время, но в нем нет ничего, что позволяло бы легко вычислять дельты времени. Поэтому в библиотеке тестирования в Dymola есть записи операторов DateTime и Duration. Обратите внимание, что планируется интегрировать их в будущие версии MSL, но на данный момент это доступно только через библиотеку тестирования для пользователей Dymola.

Вторая проблема заключается в том, что не существует стандартизированного способа перевода и моделирования моделей. У каждого инструмента есть свой способ сделать это из скриптов. Поэтому, не зная, какой инструмент вы используете, невозможно дать точный ответ.

Что Modelica предлагает в MSL

В текущей стандартной библиотеке 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;

Вы видите, что он дает текущую системную дату и время через 7 возвращаемых значений. С этими переменными не очень приятно иметь дело, если вы хотите вычислить временную дельту, поскольку в итоге вы получите 14 переменных, каждая со своим диапазоном значений.

Как измерить время перевода и моделирования в целом

С gettime() вы можете создать функцию, которая:

  1. читает системное время как t_start
  2. переводит модель и моделирует в течение 0 секунд
  3. снова читает системное время и как t_stop
  4. вычисляет разницу t_start и t_stop.

Шаг 2 зависит от инструмента. В Дымолу вы бы позвонили

DymolaCommands.SimulatorAPI.simulateModel("path-to-model", 0, 0);

который переводит вашу модель и моделирует ее в течение 0 секунд, поэтому запускается только секция инициализации.

Для пользователей Dymola

Библиотека тестирования содержит функцию Testing.Utilities.Simulation.timing, которая делает почти то, что вам нужно.

Чтобы перевести и смоделировать вашу модель, назовите ее следующим образом:

Testing.Utilities.Simulation.timing(
  "Modelica.Blocks.Examples.PID_Controller", 
  task=Testing.Utilities.Simulation.timing.Task.fullTranslate_simulate, 
  loops=3);

Это переведет вашу модель и проведет симуляцию в течение 1 секунды три раза и вычислит среднее значение.

Чтобы смоделировать для 0 с, продублируйте функцию и измените это

if simulate then
  _ :=simulateModel(c);
end if;

to

if simulate then
  _ :=simulateModel(c, 0, 0);
end if;
person marco    schedule 23.04.2020
comment
Где я могу найти библиотеку тестирования? - person Jack; 24.04.2020
comment
Он поставляется как часть установки Dymola. - person Dietmar Winkler; 25.04.2020