Потоковые данные из 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);
[22-Feb-2019 02:10:02] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
[22-Feb-2019 02:10:37] Starting Simulink on parallel workers...
[22-Feb-2019 02:11:26] Configuring simulation cache folder on parallel workers...
[22-Feb-2019 02:11:27] Loading model on parallel workers...
[22-Feb-2019 02:11:41] Running simulations...
[22-Feb-2019 02:11:57] Completed 1 of 20 simulation runs
[22-Feb-2019 02:11:58] Completed 2 of 20 simulation runs
[22-Feb-2019 02:11:58] Completed 3 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 4 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 5 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 6 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 7 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 8 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 9 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 10 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 11 of 20 simulation runs
[22-Feb-2019 02:11:59] Completed 12 of 20 simulation runs
[22-Feb-2019 02:12:04] Completed 13 of 20 simulation runs
[22-Feb-2019 02:12:04] Completed 14 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 15 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 16 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 17 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 18 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 19 of 20 simulation runs
[22-Feb-2019 02:12:05] Completed 20 of 20 simulation runs
[22-Feb-2019 02:12:05] 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