Modelica расчет общего времени моделирования и инициализации уравнения - PullRequest
5 голосов
/ 23 апреля 2020

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

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

Полагаю, это короткое время время, необходимое для моделирования, и оно не включает инициализацию системы уравнений.

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

Заранее большое спасибо,

Габриэле


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

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

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

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

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

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

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

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

1 Ответ

5 голосов
/ 23 апреля 2020

В зависимости от того, какой инструмент у вас есть, это может означать большую работу.

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

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

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

В текущей версии 3.2.3 Стандартной библиотеки Modelica вы можете прочитать текущее системное время через 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 зависит от инструмента. В Dymola вы вызываете

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

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

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

The Testing Библиотека содержит функцию 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;

на

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