-
Nicola Vigano authored
Signed-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
Nicola Vigano authoredSigned-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
gtMathsMisorientation.m 4.14 KiB
function mis = gtMathsMisorientation(r_vectors1, r_vectors2, symm, biunivocal, cellarray, varargin)
% GTMATHSMISORIENTATION Computes misorientation angle and axis between all the
% grains from the two datasets, given the corresponding r_vectors.
%
% mis = gtMathsMisorientation(r_vectors1, r_vectors2, [symm], [biunivocal], [cellarray], varargin)
% ------------------------------------------------------------------------------------------------
% INPUT:
% r_vectors1 = <double Nx3> R_vectors for dataset 1
% r_vectors2 = <double Mx3> R_vectors for dataset 2
% symm = <struct array> symmetry operators list from gtCrystGetSymmetryOperators
% biunivocal = <logical> if true only biunivocal matches are
% performed, by means of same index into
% the two datasets {false}
% cellarray = <logical> output as cell array if true,
% otherwise it is one structure with field arrays
% varargin = Options for gtDisorientation
%
% OUTPUT:
% mis = <cell> Length of all the combinations between grains of dataset 1
% and 2
% .dis_angle = <double> misorientation angle
% .dis_axis = <double> misorientation axis
% .id1 = <double> grain index from list 1
% .id2 = <double> grain index from list 2
%
%
% Version 002 04-06-2013 by LNervo
% Updated version
if (~exist('symm','var') || isempty(symm))
parameters = gtLoadParameters();
symm = gtCrystGetSymmetryOperators(parameters.cryst.crystal_system);
end
if (~exist('biunivocal','var') || isempty(biunivocal))
biunivocal = false;
end
if (~exist('cellarray','var') || isempty(cellarray))
cellarray = false;
end
if (biunivocal && (length(r_vectors1) ~= length(r_vectors2)))
gtError('gtMathsMisorientation:wrongArgument','Different length of r_vector lists... Wrong value for the flag ''biunivocal''.')
end
if (biunivocal)
[mis.dis_angle, mis.dis_axis, ~] = arrayfun(...
@(num)gtDisorientation(r_vectors1(num, :).', r_vectors2(num, :).', symm, varargin{:}), ...
1:length(r_vectors1), 'UniformOutput', false);
mis.dis_angle = [mis.dis_angle{:}];
mis.dis_axis = reshape([mis.dis_axis{:}], 3, []);
mis.id1 = 1:length(mis.dis_angle);
mis.id2 = 1:length(mis.dis_angle);
mis.biunivocal = biunivocal;
mis.n_grain1 = length(r_vectors1);
mis.n_grain2 = length(r_vectors2);
else
if (cellarray)
mis = cell(0,1);
for ii = 1:size(r_vectors1, 1)
% calculate the misorientation angle and axis between each grain from 1 with
% all the grains from 2
for jj = 1:size(r_vectors2, 1)
[dis_angle, dis_axis, ~] = gtDisorientation(r_vectors1(ii,:).', r_vectors2(jj,:).', symm, varargin{:});
mis{end+1}.dis_angle = dis_angle;
mis{end}.dis_axis = dis_axis;
mis{end}.id1 = ii;
mis{end}.id2 = jj;
end
end
else
mis.dis_angle = [];
mis.dis_axis = [];
mis.id1 = [];
mis.id2 = [];
for ii = 1:length(r_vectors1)
% calculate the misorientation angle and axis between each grain from 1 with
% all the grains from 2
[dis_angles, dis_axes, ~] = arrayfun(@(num) ...
gtDisorientation(r_vectors1(ii,:).', r_vectors2(num,:).', symm, varargin{:}),...
1:size(r_vectors2,1), 'UniformOutput', false);
dis_angles = [dis_angles{:}];
dis_axes = reshape([dis_axes{:}],3,[]);
mis.dis_angle(1,:,ii) = dis_angles;
mis.dis_axis(3,:,ii) = dis_axes;
mis.id1(1,:,ii) = repmat(ii,1,length(r_vectors2));
mis.id2(1,:,ii) = 1:length(r_vectors2);
end
mis.biunivocal = biunivocal;
mis.n_grain1 = length(r_vectors1);
mis.n_grain2 = length(r_vectors2);
end
end
end