Error utilizing parfor loops with MTEX calcGrains function
10 views (last 30 days)
Show older comments
Hi All,
I am segmenting regions within my ebsd data under the mtex toolbox, and then using the parallel computing toolbox (parfor loop) to utilize calcGrains within each segmented region. I am able to run the calcGrains function within the command window, or within separate code, but when I include it in my parfor loop, it throws some odd errors.
**Here is my code:**
%% Specify Crystal and Specimen Symmetries
% crystal symmetry
CS = {...
'notIndexed',...
crystalSymmetry('m-3m', [4 4 4], 'mineral', 'Aluminum'),...
'notIndexed',...
'notIndexed'};
%% convention
% plotting convention
setMTEXpref('xAxisDirection','east');
setMTEXpref('zAxisDirection','intoPlane');
%% Specify File Names
% path to files
pname = 'C:\Users\Cole\Desktop\Code\6061_EBSD_Analysis';
% which files to be imported
fname = [pname '\Retreating.ctf'];
%% Import the Data
% create an EBSD variable containing the data
ebsd = EBSD.load(fname,CS,'interface','ctf',...
'convertEuler2SpatialReferenceFrame');
%% convention
% plotting convention
setMTEXpref('xAxisDirection','east');
setMTEXpref('zAxisDirection','intoPlane');
%% Segment Regions
% Define the dimensions of the entire data set
totalWidth = 1300; % in microns
totalHeight = 3000; % in microns
% Define the step size
stepSize = 100; % in microns
% Calculate the number of regions
numRegions = floor(totalHeight / stepSize);
% Initialize a cell array to store the EBSD regions
ebsdRegions = cell(1, numRegions);
% Iterate over the regions
for regionIndex = 1:numRegions
% Calculate the ymin and ymax for the current region
ymin = (regionIndex - 1) * stepSize;
ymax = regionIndex * stepSize;
% Define the region of interest
region = [400 ymin 1300 (ymax - ymin)];
% Use inpolygon to conditionally select data within the region
condition = inpolygon(ebsd, region);
% Create a new EBSD data set containing data within the region
ebsdRegion = ebsd(condition);
% Store the ebsdRegion in a variable with the desired syntax
variableName = ['ebsd' num2str(ymin)];
eval([variableName ' = ebsdRegion;']);
% Store the ebsdRegion in the cell array
ebsdRegions{regionIndex} = ebsdRegion;
end
%% Compute Grains for each 100 um region
% Set the number of iterations
N = 30;
stepSize = 100; % Step size in microns
% Preallocate arrays to store the results
grains = cell(1, N);
grainIds = cell(1, N);
% Store ebsd variables in a cell array
ebsdData = cell(1, N);
for i = 1:N
ymin = (i - 1) * stepSize; % Calculate the ymin for the current region
variableName = ['ebsd' num2str(ymin)];
ebsdData{i} = evalin('base', variableName); % Retrieve the EBSD region
end
%% Parallel loop
% Preallocate arrays to store the results
tempGrains = cell(1, N);
% Parallel loop
parfor i = 1:N
ymin = (i - 1) * stepSize; % Calculate the ymin for the current region
ebsdRegion = ebsdData{i}; % Retrieve the EBSD region
ebsdRegion = ebsdRegion('Aluminum'); % Apply necessary filters
% Perform calculations in parallel
tempGrains{i} = calcGrains(ebsdRegion);
end
% Assign the results to the cell array
grains = cell(1, N);
parfor i = 1:N
grains{i} = tempGrains{i};
end
% Access the results from grains and grainIds arrays
for i = 1:N
ymin = (i - 1) * stepSize; % Calculate the ymin for the current region
variableName = ['grains' num2str(ymin)];
assignin('base', variableName, grains{i});
end
**Here is the error that is thrown:**
Error using euler2quat
Invalid default value for property 'CS' in class 'orientation':
SWITCH expression must be a scalar or a character vector.
Error in rotation.byEuler (line 27)
q = euler2quat(varargin{:});
Error in symmetry/calcQuat (line 186)
rot = {rotation.byEuler(0,0,0)};
Error in crystalSymmetry (line 158)
if isempty(rot), rot = symmetry.calcQuat(id,axes); end
Error in gbc_angle (line 4)
d = angle(orientation(q(Dl),CS),orientation(q(Dr),CS));
Error in EBSD/calcGrains/doSegmentation (line 210)
connect(ndx) = feval(['gbc_' gbc],...
Error in EBSD/calcGrains (line 74)
[A_Db,I_DG] = doSegmentation(I_FD,ebsd,varargin{:});
Error in Retreating_Grain_Step (line 100)
parfor i = 1:N
I would really appreciate any help. Thank-you
0 Comments
Answers (1)
Walter Roberson
on 8 Jul 2023
parfor operates in a different process that does not have access to the base workspace established by the client.
2 Comments
Walter Roberson
on 9 Jul 2023
No. There is no way to give parfor access to shared memory (other than to use operating system facilities to create shared memory segments... or perhaps memmap a file)
If you need variables from the base workspace to be available to the workers then use parfevalOnAll() to run a function that initializes the local base workspaces with appropriate values.
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!