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);
[20-May-2020 08:58:17] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[20-May-2020 08:59:10] Starting Simulink on parallel workers...
[20-May-2020 08:59:50] Configuring simulation cache folder on parallel workers...
[20-May-2020 08:59:50] Loading model on parallel workers...
[20-May-2020 09:00:02] Running simulations...
[20-May-2020 09:00:18] Completed 1 of 20 simulation runs
[20-May-2020 09:00:18] Completed 2 of 20 simulation runs
[20-May-2020 09:00:18] Completed 3 of 20 simulation runs
[20-May-2020 09:00:18] Completed 4 of 20 simulation runs
[20-May-2020 09:00:19] Completed 5 of 20 simulation runs
[20-May-2020 09:00:19] Completed 6 of 20 simulation runs
[20-May-2020 09:00:21] Completed 7 of 20 simulation runs
[20-May-2020 09:00:21] Completed 8 of 20 simulation runs
[20-May-2020 09:00:21] Completed 9 of 20 simulation runs
[20-May-2020 09:00:21] Completed 10 of 20 simulation runs
[20-May-2020 09:00:21] Completed 11 of 20 simulation runs
[20-May-2020 09:00:21] Completed 12 of 20 simulation runs
[20-May-2020 09:00:24] Completed 13 of 20 simulation runs
[20-May-2020 09:00:24] Completed 14 of 20 simulation runs
[20-May-2020 09:00:24] Completed 15 of 20 simulation runs
[20-May-2020 09:00:24] Completed 16 of 20 simulation runs
[20-May-2020 09:00:24] Completed 17 of 20 simulation runs
[20-May-2020 09:00:24] Completed 18 of 20 simulation runs
[20-May-2020 09:00:27] Completed 19 of 20 simulation runs
[20-May-2020 09:00:27] Completed 20 of 20 simulation runs
[20-May-2020 09:00:27] 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 のシミュレーション結果はシミュレーション マネージャーを使用して表示することもできます。シミュレーション マネージャーで結果を表示するには、parsimShowSimulationManager の名前と値のペアを使用します。シミュレーション マネージャーを使用すると、実行の進捗を監視したり、シミュレーション データを表示したり、parsim の結果をシミュレーション データ インスペクターで表示したりできます。

並列ワーカーを閉じる

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

delete(gcp('nocreate'));

関連するトピック

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

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

parsim を使用した並列シミュレーションの実行