並列シミュレーションの入力としての MAT ファイルからのデータのストリーミング
この例では、Simulink.SimulationData.DatasetRef
オブジェクトと関数parsim
を使用して、並列シミュレーションの入力データを Version 7.3 の MAT ファイルからストリーミングする方法を示します。シミュレーションの入力がメモリに読み込めないほど大きい場合、この例で示す手順に従うことを検討してください。たとえば、並列シミュレーションの 1 つのセットから永続ストレージに記録したデータを別のシミュレーションの入力として使用することができます。
この例では、parsim
を使用してモデルの複数のシミュレーションを実行します。各シミュレーションで一意の入力データを使用します。このモデルは、複数のシミュレーション ワークフローのヒント sldemo_suspn_3dof
モデルを基に、入力のソースとして Signal Editor ブロックではなくInport ブロックを使用するように変更したものです。このモデルでは、さまざまな路面状況におけるサスペンション システムの応答をシミュレートします。この例で使用する MAT ファイルには、さまざまな路面状況を表す複数のSimulink.SimulationData.Dataset
オブジェクトが含まれています。この例では、DatasetRef
オブジェクトを使用して、参照される Dataset
オブジェクト全体の内容をシミュレーションの入力としてストリーミングします。
また、matlab.io.datastore.SimulationDatastore
オブジェクトを使用して、parsim
で実行する並列シミュレーションに個々の信号のデータをストリーミングすることもできます。SimulationDatastore
オブジェクトの作成の詳細については、SimulationDatastore オブジェクトを使用した個別の信号のストリーミングを参照してください。
モデルの読み込みと入力データへのアクセス
ex_sldemo_suspn_3dof_parsim_stream
モデルを読み込みます。このモデルでは、2 つの Inport ブロックで入力データを受け取ります。シミュレーションの入力として使用される各 Dataset
オブジェクトに、2 つの Inport のそれぞれに対応する要素が 1 つずつ含まれています。
mdl = 'ex_sldemo_suspn_3dof_parsim_stream';
open_system(mdl)
関数Simulink.SimulationData.DatasetRef.getDatasetVariableNames
を使用すると、入力データを含む MAT ファイルの内容をメモリに読み込まずに評価できます。この関数は、ファイルに含まれる各 Simulink.SimulationData.Dataset
変数の名前に対応する要素を含む cell 配列を返します。この関数を使用して変数名にアクセスし、ファイル内のテスト ケースの数を特定します。
varNames = Simulink.SimulationData.DatasetRef.getDatasetVariableNames('suspn_3dof_test_cases.mat');
numTestCases = numel(varNames);
モデルへのテスト ケース データのストリーミングには Simulink.SimulationData.DatsetRef
オブジェクトを使用できます。DatasetRef
オブジェクトの作成に使用されるファイル内の変数が参照され、その変数データが段階的に読み込まれます。テスト ケース ファイルの各 Simulink.SimulationData.Dataset
オブジェクトについて、対応する DatasetRef
オブジェクトを作成します。
for idx1 = 1:numTestCases inputData(idx1) = Simulink.SimulationData.DatasetRef('suspn_3dof_test_cases.mat',... varNames{idx1}); end
並列シミュレーションの構成と実行
テスト ケースの入力のセットを一連の並列シミュレーションの入力として使用するには、関数 parsim
に渡すことができるSimulink.SimulationInput
オブジェクトの配列を作成します。シミュレーションの入力としてストリーミングするデータとして、テスト ケースに対応する Simulink.SimulationData.DatasetRef
オブジェクトを関数setExternalInput
を使用して指定します。
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 ファイルを各ワーカーに送信できます。parsim
で AttachedFiles
の名前と値のペアを指定すると、ファイルのコピーが各ワーカーに送信されますが、ファイルが大きいと時間がかかることがあります。大きなファイルから入力データをストリーミングする場合は、コピーを作成して送信しなくてもファイルにアクセスできるローカル ワーカーの方が処理が高速になります。リモート ワーカーを使用する際は、すべてのリモート ワーカーからアクセスできる場所に MAT ファイルを格納し、そのファイルのコピーを参照する DatasetRef
オブジェクトを作成することを検討してください。
out = parsim(in);
[05-Nov-2022 19:23:12] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'Processes' profile ... Connected to the parallel pool (number of workers: 8). [05-Nov-2022 19:24:02] Starting Simulink on parallel workers... [05-Nov-2022 19:24:33] Configuring simulation cache folder on parallel workers... [05-Nov-2022 19:24:33] Loading model on parallel workers... [05-Nov-2022 19:24:49] Running simulations... [05-Nov-2022 19:25:03] Completed 1 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 2 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 3 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 4 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 5 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 6 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 7 of 20 simulation runs [05-Nov-2022 19:25:03] Completed 8 of 20 simulation runs [05-Nov-2022 19:25:05] Completed 9 of 20 simulation runs [05-Nov-2022 19:25:05] Completed 10 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 11 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 12 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 13 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 14 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 15 of 20 simulation runs [05-Nov-2022 19:25:06] Completed 16 of 20 simulation runs [05-Nov-2022 19:25:07] Completed 17 of 20 simulation runs [05-Nov-2022 19:25:07] Completed 18 of 20 simulation runs [05-Nov-2022 19:25:07] Completed 19 of 20 simulation runs [05-Nov-2022 19:25:07] Completed 20 of 20 simulation runs [05-Nov-2022 19:25:07] 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
のシミュレーション結果はシミュレーション マネージャーを使用して表示することもできます。シミュレーション マネージャーで結果を表示するには、parsim
で ShowSimulationManager
の名前と値のペアを使用します。シミュレーション マネージャーを使用すると、実行の進捗を監視したり、シミュレーション データを表示したり、parsim
の結果をシミュレーション データ インスペクターで表示したりできます。
並列ワーカーを閉じる
並列シミュレーションの実行が終了したら、ワーカー プールを閉じることができます。
delete(gcp('nocreate'));