Поток данных из MAT-файла как вход для параллельной симуляции

В этом примере показано, как использовать Simulink.SimulationData.DatasetRef объекты и parsim функция для потоковой передачи входных данных из MAT-файла версии 7.3 для параллельных симуляций. Примите во внимание следование шагам, описанным в этом примере, когда входы для вашей симуляции слишком большие, чтобы загрузиться в память. Например, можно использовать данные, записанные в постоянное хранилище из одного набора параллельных симуляций, в качестве входных данных для другого.

Этот пример использует parsim чтобы запустить несколько симуляций модели, с каждой симуляцией с использованием уникальных входных данных. Модель основана на модели sldemo_suspn_3dof, измененной, чтобы использовать блоки Inport в качестве источника для входов вместо блока Редактор. Модель моделирует реакцию системы подвески на различные дорожные условия. MAT-файл, используемый в этом примере, содержит несколько Simulink.SimulationData.Dataset объекты, представляющие различные дорожные условия. В примере используются DatasetRef объекты для потоковой передачи содержимого всего ссылочного Dataset объект как вход симуляции.

Можно также транслировать данные для отдельных сигналов в параллельные симуляции, выполняемые с parsim использование matlab.io.datastore.SimulationDatastore объекты. Для получения дополнительной информации о создании SimulationDatastore объекты, см. Поток отдельных сигналов с использованием объектов SimulationDatastore.

Загрузка модели и доступ к входным данным

Загрузите ex_sldemo_suspn_3dof_parsim_stream модель. Модель получает входные данные через два блока Inport и каждый Dataset объект, используемый в качестве входов симуляции, содержит два элемента: по одному для каждого Inport.

mdl = 'ex_sldemo_suspn_3dof_parsim_stream';
open_system(mdl)

Можно использовать Simulink.SimulationData.DatasetRef.getDatasetVariableNames функция для оценки содержимого MAT-файла, содержащего входные данные, без загрузки данных в память. Функция возвращает массив ячеек, который содержит элементы для имени каждого Simulink.SimulationData.Dataset переменная, содержащаяся в файле. Используйте функцию для доступа к именам переменных и определения количества тестов в файле.

varNames = Simulink.SimulationData.DatasetRef.getDatasetVariableNames('suspn_3dof_test_cases.mat');
numTestCases = numel(varNames);

Можно передать данные теста в модель с помощью Simulink.SimulationData.DatsetRef объекты. The DatasetRef объект ссылается на переменную в файле, используемом для ее создания, и загружает данные переменной постепенно. Создайте DatasetRef объект для каждого Simulink.SimulationData.Dataset объект в файле тестов.

for idx1 = 1:numTestCases
    inputData(idx1) = Simulink.SimulationData.DatasetRef('suspn_3dof_test_cases.mat',...
                                                            varNames{idx1});
end

Сконфигурируйте и запустите параллельные симуляции

Чтобы использовать набор входов теста в качестве входных параметров для набора параллельных симуляций, создайте массив Simulink.SimulationInput объекты, которые можно передать в parsim функция. Используйте setExternalInput функция для задания Simulink.SimulationData.DatasetRef объект, соответствующий тесту, как данные для потока в качестве входов симуляции.

in(1:numTestCases) = Simulink.SimulationInput(mdl);

for idx2 = 1:numTestCases
    in(idx2) = setExternalInput(in(idx2),inputData(idx2));
end

Используйте parsim функция для запуска симуляции для каждого теста. Когда у вас есть Parallel Computing Toolbox™, parsim функция запускает параллельные симуляции. Без Parallel Computing Toolbox, parsim функция запускает симуляции последовательно.

The parsim функция создает рабочий пул на основе строения Parallel Computing Toolbox. По умолчанию parsim использует локальный пул. Если вы используете удаленные работники, можно использовать AttachedFiles Пара "имя-значение" для отправки MAT-файла, содержащего тест входных данных, каждому работнику. Когда вы задаете AttachedFiles Пара "имя-значение", parsim отправляет копию файла каждому работнику, что может занять некоторое время для больших файлов. Для потоковой передачи входных данных из большого файла локальные работники могут быть быстрее, потому что работники имеют доступ к файлу, не создавая и не отправляя копии. Когда вы используете удаленные рабочие места, рассмотрите хранение MAT-файла в месте, к которому могут получить доступ и создать все удаленные рабочие DatasetRef объекты, которые ссылаются на копию файла.

out = parsim(in);
[08-Sep-2020 23:20:23] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[08-Sep-2020 23:21:00] Starting Simulink on parallel workers...
[08-Sep-2020 23:21:34] Configuring simulation cache folder on parallel workers...
[08-Sep-2020 23:21:35] Loading model on parallel workers...
[08-Sep-2020 23:21:41] Running simulations...
[08-Sep-2020 23:21:53] Completed 1 of 20 simulation runs
[08-Sep-2020 23:21:53] Completed 2 of 20 simulation runs
[08-Sep-2020 23:21:53] Completed 3 of 20 simulation runs
[08-Sep-2020 23:21:53] Completed 4 of 20 simulation runs
[08-Sep-2020 23:21:53] Completed 5 of 20 simulation runs
[08-Sep-2020 23:21:53] Completed 6 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 7 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 8 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 9 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 10 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 11 of 20 simulation runs
[08-Sep-2020 23:21:56] Completed 12 of 20 simulation runs
[08-Sep-2020 23:21:58] Completed 13 of 20 simulation runs
[08-Sep-2020 23:21:59] Completed 14 of 20 simulation runs
[08-Sep-2020 23:21:59] Completed 15 of 20 simulation runs
[08-Sep-2020 23:21:59] Completed 16 of 20 simulation runs
[08-Sep-2020 23:21:59] Completed 17 of 20 simulation runs
[08-Sep-2020 23:21:59] Completed 18 of 20 simulation runs
[08-Sep-2020 23:22:01] Completed 19 of 20 simulation runs
[08-Sep-2020 23:22:01] Completed 20 of 20 simulation runs
[08-Sep-2020 23:22:01] Cleaning up parallel workers...

Просмотр результатов симуляции

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

if isempty(out(1).ErrorMessage)
    legend_labels = cell(1,numTestCases);
    for i = 1:numTestCases
        if isempty(out(i).ErrorMessage)
            simOut = out(i);
            ts = simOut.logsout.get('vertical_disp').Values;
            ts.plot;
            legend_labels{i} = ['Run ' num2str(i)]; 
        end
            hold all
    end
    title('Response of a 3-DoF Suspension Model')
    xlabel('Time (s)');
    ylabel('Vehicle vertical displacement (m)');
    legend(legend_labels,'Location','NorthEastOutside');
end

Можно также просмотреть parsim результаты симуляции с помощью Simulation Manager. Чтобы просмотреть результаты в Simulation Manager, используйте ShowSimulationManager Пара "имя-значение" для parsim. С помощью Simulation Manager можно контролировать прогресс запусков, просматривать данные моделирования и показывать parsim результаты в Данные Моделирования Inspector.

Закройте параллельные рабочие

Когда вы завершили выполнение параллельных симуляций, можно закрыть пул рабочих.

delete(gcp('nocreate'));

Похожие темы

Загрузка Больших данных для симуляций

Журнал данных в постоянное хранилище

Выполняйте параллельные симуляции с использованием parsim