Main Content

Stream Logging Data to Disk

When you log simulation data, you can either store the data in a workspace variable, or stream the data to a temporary file on disk and have the workspace variable point to that temporary file. In either case, you interact with the logged simulation data through the simulation log variable.

Saving data to the workspace consumes memory. Streaming logged data to disk significantly increases the data logging capacity, because you are no longer limited by the system memory.

To enable streaming data to disk for all models, on the MATLAB® Toolstrip, click Preferences. In the left pane of the Preferences dialog box, select Simscape, then select the Stream data to temporary disk directory check box.

When this preference is turned on, the simulation data, in the form of a simlog object generated during simulation, is stored in a file in a temporary folder under your user name. The workspace variable of type simscape.logging.Node, named as specified by the Workspace variable name configuration parameter, gets created, but instead of storing all the simulation data it references the simlog object in the temporary file. The temporary file persists as long as there is a logging variable name in the workspace that references it.

You view and analyze logged simulation data by accessing the simulation log variable, exactly the same way as if the simulation data was stored inside it. All the interaction between the workspace variable and the stored object happens behind the scenes. Therefore, you can use the Simscape™ Results Explorer, as well as all the methods associated with the simscape.logging.Node and simscape.logging.Series classes to query, plot, and analyze logged simulation data.

The following limitations apply when streaming data to disk:

  • The Limit data points and Data history (last N steps) configuration parameters are ignored. However, you can use the Decimation parameter to limit the number of logged data points. For more information, see Data Logging Options.

  • When you pause model simulation and step back and then forward, all the time points are logged on disk. This is different from storing the data directly in the workspace variable, where the log data is rolled back in this case.

Streaming to Disk and parfor Loop

If you have a Parallel Computing Toolbox™ license, then, when you simulate a model inside the parfor loop, the temporary file is generated within the address space of the worker threads. To access the simulation data outside the parfor loop, export the data and then import the exported file outside the parfor loop.

parfor i=1:2 
   model = 'my_dcmotor' 
   load_system(model); 
   set_param(model, 'SimulationMode', 'normal'); 
   set_param(model, 'SimscapeLogType', 'all', 'SimscapeLogName', 'simlog'); 
   simOut = sim(model, 'ReturnWorkspaceOutputs', 'on'); 

   % save to a different file by appending the index 
   file = ['fileName_' num2str(i) '.mldatx']; 
   simscape.logging.export(simOut.get('simlog'), file); 
end

% import the exported files 
var = simscape.logging.import('fileName_1.mldatx');
...
 

Streaming to Disk with parsim

If you have a Parallel Computing Toolbox license, simulating a model with the parsim command provides additional functionality, compared to using the parfor loop. The following example shows how you can use the parsim command when streaming logged simulation data to disk.

Before running the script, make sure that streaming to disk is enabled: open the Preferences dialog box, select Simscape, then select the Stream data to temporary disk directory check box.

model = 'my_dcmotor';
% Create array of inputs to run multiple simulations
num = 10;
in(1:num) = Simulink.SimulationInput(model);

% Specify any directory where the MLDATX files will be created for every run
logDir=fullfile(cd, 'tmp'); % current directory
mkdir(logDir)
for i = 1:num
    % This will only work with local pools
    in(i).PostSimFcn = @(x) locHandleSimscapeLTF(model, x, logDir, i);
end

out = parsim(in);

for idx = 1:numel(out)
    simlog = simscape.logging.import(out(idx).SimscapeFileName);
    sscexplore(simlog);
end

function newOut = locHandleSimscapeLTF(model, out, dirName, runId)
    % All the logged variables along with simlog should be part of 'newOut' object
    loggedVars = out.who;
    newOut = struct;
    for i = 1 : numel(loggedVars)
        loggedData = out.(loggedVars{i});
        if isa(loggedData, 'simscape.logging.Node')
            % Specify any file name with .mldatx extension
            filename = [model '_simlog_file_' num2str(runId) '.mldatx'];
            simscapeFileName = fullfile(dirName, filename);

            % Export simlog to MLDATX file
            simscape.logging.export(loggedData, simscapeFileName);
            newOut.SimscapeFileName = simscapeFileName;
        else
            newOut.(loggedVars{i}) = out.(loggedVars{i});
        end
    end
end
 

See Also

Related Topics