Потоковые данные из 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 объекты, смотрите Потоковые Сигналы Индивидуума Использовать Объекты 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 функционируйте, чтобы запустить симуляцию для каждого теста. Когда у вас есть Parallel Computing Toolbox™, parsim функционируйте параллельные симуляции запусков. Без Parallel Computing Toolbox, parsim функционируйте запускает симуляции в сериале.

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

out = parsim(in);
[29-Jan-2020 23:15:25] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
[29-Jan-2020 23:16:23] Starting Simulink on parallel workers...
[29-Jan-2020 23:16:53] Configuring simulation cache folder on parallel workers...
[29-Jan-2020 23:16:53] Loading model on parallel workers...
[29-Jan-2020 23:17:24] Running simulations...
[29-Jan-2020 23:17:35] Completed 1 of 20 simulation runs
[29-Jan-2020 23:17:35] Completed 2 of 20 simulation runs
[29-Jan-2020 23:17:35] Completed 3 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 4 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 5 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 6 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 7 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 8 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 9 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 10 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 11 of 20 simulation runs
[29-Jan-2020 23:17:36] Completed 12 of 20 simulation runs
[29-Jan-2020 23:17:40] Completed 13 of 20 simulation runs
[29-Jan-2020 23:17:40] Completed 14 of 20 simulation runs
[29-Jan-2020 23:17:40] Completed 15 of 20 simulation runs
[29-Jan-2020 23:17:41] Completed 16 of 20 simulation runs
[29-Jan-2020 23:17:41] Completed 17 of 20 simulation runs
[29-Jan-2020 23:17:41] Completed 18 of 20 simulation runs
[29-Jan-2020 23:17:41] Completed 19 of 20 simulation runs
[29-Jan-2020 23:17:41] Completed 20 of 20 simulation runs
[29-Jan-2020 23:17:41] 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 результаты в Инспекторе Данных моделирования.

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

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

delete(gcp('nocreate'));

Похожие темы

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

Данные логов к персистентному устройству хранения данных

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