Skip to content
Snippets Groups Projects
Commit 38d7f284 authored by Laura Nervo's avatar Laura Nervo
Browse files

gtMisorientation : very simple function to compute the misorientation angle...

gtMisorientation : very simple function to compute the misorientation angle and axis between two r_vectors, by given symmetry operators and lattice parameters.

Signed-off-by: default avatarLaura Nervo <laura.nervo@esrf.fr>
parent f49d2097
No related branches found
No related tags found
No related merge requests found
function [mis_angle, mis_axis, Gsymm] = gtMisorientation(r_vector1, r_vector2, symm, latticepar)
% GTMISORIENTATION Easy function to calculate the misorientation angle and axis
% between two R_vectors
%
% [mis_angle, mis_axis, Gsymm] = gtMisorientation(r_vector1, r_vector2, symm, [latticepar])
% -----------------------------------------------------------------------------------------
% INPUT:
% r_vector1 = <double> R_vector for grain 1 (1x3)
% r_vector2 = <double> R_vector for grain 2 (1x3)
% symm = <struct array> symmetry operators list from gtCrystGetSymmetryOperators
% latticepar = <double> lattice parameters in case of hexagonal
% crystals (1x6)
%
% OUTPUT:
% mis_angle = <double> misorientation angle between the grains
% mis_axis = <double> misorientation axis (1x4 if hexagonal)
% notation)
% Gsymm = <struct> misorientation matrices, angles and axes
% using symm (extra info)
%
% The result has been checkes and confirmed with the same calculation from the
% xfab package in fable.
%
%
% Version 002 04-06-2013 by LNervo
% Simplified function and optimized speed
if isempty(r_vector1) || isempty(r_vector2)
gtError('gtMisorientation:missingArgument','One r_vector is empty...please give two valid r_vectors.');
end
if ~exist('symm', 'var') || isempty(symm)
gtError('gtMisorientation:missingArgument','Symmetry operators are missing... Use gtCrystGetSymmetryOperators to calculate them')
end
if size(r_vector1,2) == 4
r_vector1 = r_vector1(2:4);
end
if size(r_vector2,2) == 4
r_vector2 = r_vector2(2:4);
end
% orientation matrices : Vc = g*Vs
g1 = gtMathsRod2OriMat(r_vector1');
g2 = gtMathsRod2OriMat(r_vector2');
% net rotation : g2 * symm().g3 * (inv(g1))
netGs = arrayfun(@(num) g2*(symm(num).g3*g1'), 1:length(symm), 'UniformOutput', false);
% calculate the misorientation angle and axis between these grains
mis_angles = arrayfun(@(num) acosd((trace(netGs{num})-1)/2), 1:length(symm));
%calculate eigen-vectors to find misorientation axis
[eigVecs, eigVals] = arrayfun(@(num) eig(netGs{num}), 1:length(symm), 'UniformOutput', false);
% choose the only one real
misorientation_axes = arrayfun(@(num2) eigVecs{num2}(:,arrayfun(@(num) isreal(eigVecs{num2}(:,num)), 1:3))', 1:length(symm), 'UniformOutput', false);
eigVals = arrayfun(@(num2) eigVals{num2}( arrayfun(@(num) isreal(eigVecs{num2}(:,num)),1:3), arrayfun(@(num) isreal(eigVecs{num2}(:,num)),1:3) ), 1:length(symm) );
% choose the minimum mis_angle
dummy = find(min(mis_angles));
mis_angle = mis_angles(dummy);
if nargout > 1
mis_axis = misorientation_axes{dummy};
if exist('latticepar', 'var') && ~isempty(latticepar)
mis_axis = gtCart2Hex(mis_axis, latticepar);
end
if nargout > 2
Gsymm.r1 = r_vector1;
Gsymm.r2 = r_vector2;
Gsymm.g1 = g1;
Gsymm.g2 = g2;
for ii=1:length(symm)
symm(ii).netG = netGs{ii};
symm(ii).mis_angle = mis_angles(ii);
symm(ii).mis_axis = misorientation_axes{ii};
end
Gsymm.symm = symm;
end
end % end of function
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment