Newer
Older
Nicola Vigano
committed
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();
Nicola Vigano
committed
symm = gtCrystGetSymmetryOperators(parameters.cryst.crystal_system);
end
if (~exist('biunivocal','var') || isempty(biunivocal))
Nicola Vigano
committed
biunivocal = false;
end
if (~exist('cellarray','var') || isempty(cellarray))
Nicola Vigano
committed
cellarray = false;
end
if (biunivocal && (length(r_vectors1) ~= length(r_vectors2)))
Nicola Vigano
committed
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);
Nicola Vigano
committed
mis.dis_angle = [mis.dis_angle{:}];
Nicola Vigano
committed
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);
Nicola Vigano
committed
else
if (cellarray)
mis = cell(0,1);
Nicola Vigano
committed
% calculate the misorientation angle and axis between each grain from 1 with
% all the grains from 2
Nicola Vigano
committed
[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 = [];
Nicola Vigano
committed
% 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