Newer
Older
function [info, sigma] = gtCrystTwinTest(R1, R2, phaseID, varargin)
% GTCRYSTTWINTEST Tests if the two orientations are from two twins
% [info, sigma] = gtCrystTwinTest(R1, R2, [phaseID], varargin)
% ------------------------------------------------------------
% INPUT:
% R1 and R2 = Rodriguez vectors of the two different orientations
% phaseID = current phase
%
% OPTIONAL INPUT (parse by pairs):
% symm = symmetry operators from gtCrystGetSymmetryOperators {[]}
% sigmas = sigma values from gtCrystGetSigmas {[]}
% merge_angle = a threshold to decide if the angle is small {5}
% convention = hcp crystal axes convention {'X'}
%
% Version 001 13-11-2013 by LNervo
Nicola Vigano
committed
if (~exist('phaseID','var') || isempty(phaseID))
phaseID = 1;
end
Nicola Vigano
committed
conf.symm = [];
conf.sigmas = [];
conf.merge_angle = 5;
conf.convention = 'X';
conf.parameters = [];
conf = parse_pv_pairs(conf, varargin);
Nicola Vigano
committed
if (isempty(conf.parameters))
conf.parameters = gtLoadParameters();
end
Nicola Vigano
committed
crystal_system = conf.parameters.cryst(phaseID).crystal_system;
latticepar = conf.parameters.cryst(phaseID).latticepar;
spacegroup = conf.parameters.cryst(phaseID).spacegroup;
Nicola Vigano
committed
if (isempty(conf.symm))
conf.symm = gtCrystGetSymmetryOperators(crystal_system, spacegroup);
end
if (isempty(conf.sigmas))
conf.sigmas = gtCrystGetSigmas(crystal_system, latticepar, conf.convention);
end
Nicola Vigano
committed
sigmas = conf.sigmas;
Nicola Vigano
committed
sigma = []; % default sigma
switch(crystal_system)
case 'cubic'
[mis_angle, mis_axis, mis_info] = gtDisorientation(R1.', R2.', conf.symm, ...
'latticepar', latticepar, 'sort', 'descend', varargin{:});
if (mis_angle > 90)
mis_angle = 180 - mis_angle;
end
Nicola Vigano
committed
sigmaOr = [];
if (~isempty(mis_axis))
% determine sigma type
test_angle = abs(mis_angle - sigmas(:, 2)) < sigmas(:, 6);
test_axis = abs(acosd(dot(repmat(mis_axis,size(sigmas,1),1), sigmas(:, 3:5), 2))) < sigmas(:, 6);
sigmaOr = sigmas(test_angle | test_axis, :);
sigma = sigmas(test_angle & test_axis, 1);
end
case 'hexagonal'
% In the case of hexagonal crystals
[mis_angle, mis_axis, mis_info] = gtDisorientation(R1.', R2.', conf.symm, ...
'latticepar', latticepar, 'convention', conf.convention, varargin{:});
if (mis_angle > 90)
mis_angle = 180 - mis_angle;
end
Nicola Vigano
committed
sigmaOr = [];
if (~isempty(mis_axis))
% determine sigma type
test_angle = abs(mis_angle - sigmas(:, 2)) < sigmas(:, 7);
test_axis = abs(acosd(dot(repmat(mis_axis,size(sigmas,1),1), sigmas(:, 8:10), 2))) < sigmas(:, 7);
sigmaOr = sigmas(test_angle | test_axis, :);
sigma = sigmas(test_angle & test_axis, :);
end
otherwise
disp('Crystal system is not currently supported... Quitting')
return
end
% add low angle (merge grains) criteria
Nicola Vigano
committed
if (mis_angle < conf.merge_angle)
sigma = -1;
end
info.R1 = R1;
info.R2 = R2;
info.mis_angle = mis_angle;
info.mis_axis = mis_axis;
info.sigmaOr = sigmaOr;
info.sigmaAnd = sigma;
Nicola Vigano
committed
info.sigmas = conf.sigmas;
info.merge_angle = conf.merge_angle;
info.convention = conf.convention;
info = gtAddMatFile(info, mis_info, true, true);