В этом примере показано, как использовать 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'));
Загрузка Больших данных для симуляций