Main Content

並列シミュレーションの入力としての 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 ファイルを各ワーカーに送信できます。parsimAttachedFiles の名前と値のペアを指定すると、ファイルのコピーが各ワーカーに送信されますが、ファイルが大きいと時間がかかることがあります。大きなファイルから入力データをストリーミングする場合は、コピーを作成して送信しなくてもファイルにアクセスできるローカル ワーカーの方が処理が高速になります。リモート ワーカーを使用する際は、すべてのリモート ワーカーからアクセスできる場所に 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

Figure contains an axes object. The axes object with title Response of a 3-DoF Suspension Model contains 20 objects of type line. These objects represent Run 1, Run 2, Run 3, Run 4, Run 5, Run 6, Run 7, Run 8, Run 9, Run 10, Run 11, Run 12, Run 13, Run 14, Run 15, Run 16, Run 17, Run 18, Run 19, Run 20.

parsim のシミュレーション結果はシミュレーション マネージャーを使用して表示することもできます。シミュレーション マネージャーで結果を表示するには、parsimShowSimulationManager の名前と値のペアを使用します。シミュレーション マネージャーを使用すると、実行の進捗を監視したり、シミュレーション データを表示したり、parsim の結果をシミュレーション データ インスペクターで表示したりできます。

並列ワーカーを閉じる

並列シミュレーションの実行が終了したら、ワーカー プールを閉じることができます。

delete(gcp('nocreate'));

関連するトピック

シミュレーションのためのビッグ データの読み込み

永続ストレージへのデータの記録

家の熱モデルの parsim を使用した並列シミュレーションの実行