exponenta event banner

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

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

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

Можно также передавать данные для отдельных сигналов в параллельное моделирование, выполняемое с помощью parsim использование matlab.io.datastore.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 объекты. 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 для выполнения моделирования для каждого тестового случая. При наличии Toolbox™ параллельных вычислений parsim функция выполняет моделирование параллельно. Без панели инструментов параллельных вычислений parsim функция запускает моделирование в серийном формате.

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 результаты моделирования с использованием Диспетчера моделирования. Для просмотра результатов в Диспетчере моделирования используйте ShowSimulationManager пара имя-значение для parsim. Диспетчер моделирования позволяет контролировать ход выполнения прогонов, просматривать данные моделирования и отображать parsim результаты в инспекторе данных моделирования.

Закрыть параллельных работников

После завершения параллельного моделирования можно закрыть пул работников.

delete(gcp('nocreate'));

Связанные темы

Загрузка больших данных для моделирования

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

Запустить параллельное моделирование с помощью синтаксического анализа