-
Signed-off-by:
Laura Nervo <laura.nervo@esrf.fr> git-svn-id: https://svn.code.sf.net/p/dct/code/trunk@640 4c865b51-4357-4376-afb4-474e03ccb993
Signed-off-by:
Laura Nervo <laura.nervo@esrf.fr> git-svn-id: https://svn.code.sf.net/p/dct/code/trunk@640 4c865b51-4357-4376-afb4-474e03ccb993
gtReadBoundaryProperties.m 7.95 KiB
function gtReadBoundaryProperties(phaseid, boundaries_structure, vol_out, r_vectors)
% gtReadBoundaryProperties(phaseid, boundaries_structure, vol_out, r_vectors)
disp('have changed this to axis convention matlab1 // instX , matlab2 // instY, matlab3 // instZ')
disp('AK, 11/8/2010')
pause(3)
%
%continue to add to boundaries_structure.mat - orientations,
%disorientation, r-vectors etc.
parameters=[];
load('parameters.mat');
spacegroup=parameters.cryst(phaseid).spacegroup;
%find the max grainID - ugly but ca va
maxgrain=0;
for i=1:length(boundaries_structure)
maxgrain=max(maxgrain, boundaries_structure(i).grain1);
maxgrain=max(maxgrain, boundaries_structure(i).grain2);
end
%get sym operators
if spacegroup==225 || spacegroup==229
% cubic material
sym = gtGetCubicSymOp();
elseif spacegroup==167 || spacegroup==663 || spacegroup==194
% hexagonal material - 4x4 element sym operators
sym = gtGetHexagonalSymOp_sab();
else
disp('unrecognised spacegroup! quitting...')
return
end
% loop through the boundaries
for i=1:size(boundaries_structure, 2)
if boundaries_structure(i).count<4 %can still be useful to calc index planes where we have only one of the grains
continue
else
%Read in the r-vector data for the two grains
i
grain1=boundaries_structure(i).grain1;
grain2=boundaries_structure(i).grain2;
if grain1==0
g1=[];
g1equiv=[];
elseif grain1==-1
continue
else
R1= r_vectors(grain1,2:4);
boundaries_structure(i).grain1_R_vector=R1;
g1=Rod2g(R1);
end
if grain2==0
g2=[];
elseif grain2==-1
continue
else
R2= r_vectors(grain2,2:4);
boundaries_structure(i).grain2_R_vector=R2;
g2=Rod2g(R2);
end
% this only works for cubic systems until someone works out how to pdo te
% permutations of the g1 for the hexagonal system
if spacegroup==225 || spacegroup==229
% calculate the misorientation angle and axis between these grains
if ~isempty(g1) && ~isempty(g2)
%if we have both grains
%need to search symmetry equivelents for the minimum misorientation
rot_offset=[];
% warning('g*sym.g maybe should be sym.g*g')
for j=1:24
g1equiv = g1*sym(j).g;
netg = g1equiv\g2;
rot_offset(j) = acos((trace(netg)-1)/2);
end
dummy = find(rot_offset ==min(rot_offset));
g1equiv = g1*sym(dummy).g;
netg = g1equiv\g2;
misorientation_angle = acosd((trace(netg)-1)/2);
[eigVec, eigVal]=eig(netg);
for p=1:3
if isreal(eigVec(:,p)) %find the real eigenvector - should be just one
misorientation_axis=eigVec(:,p);
end
end
boundaries_structure(i).misorientation_axis=misorientation_axis';
boundaries_structure(i).misorientation_angle=misorientation_angle;
else
boundaries_structure(i).misorientation_axis=[];
boundaries_structure(i).misorientation_angle=[];
end
elseif spacegroup==167 || spacegroup==663 || spacegroup==194
% same calculation but using hexagonal sym operations
% calculate the misorientation angle and axis between these grains
if ~isempty(g1) && ~isempty(g2)
%if we have both grains
%need to search symmetry equivelents for the minimum misorientation
rot_offset=[];
% warning('g*sym.g maybe should be sym.g*g')
for j=1:length(sym)
g1equiv = g1*sym(j).g3;
netg = g1equiv\g2;
rot_offset(j) = acos((trace(netg)-1)/2);
end
dummy = find(rot_offset ==min(rot_offset));
g1equiv = g1*sym(dummy).g3;
netg = g1equiv\g2;
misorientation_angle = acosd((trace(netg)-1)/2);
[eigVec, eigVal]=eig(netg);
for p=1:3
if isreal(eigVec(:,p)) %find the real eigenvector - should be just one
misorientation_axis=eigVec(:,p);
boundaries_structure(i).eigVal=eigVal(p,p);
end
end
boundaries_structure(i).misorientation_axis=misorientation_axis';
boundaries_structure(i).misorientation_angle=misorientation_angle;
else
boundaries_structure(i).misorientation_axis=[];
boundaries_structure(i).misorientation_angle=[];
boundaries_structure(i).eigVal=[];
end
end
%even if we have only one grain, can deal with the boundary plane
test = vol_out==i;
[x,y,z]=ind2sub(size(test), find(test));
[origin, a]=lsplane([x y z]);
gb_normal=a;
% gb_normal(3)=-gb_normal(3);
boundaries_structure(i).gb_norm = gb_normal';
boundaries_structure(i).gb_centre = origin';
if ~isempty(g1equiv)
plane1=g1equiv\gb_normal;
elseif ~isempty(g1)
plane1=g1\gb_normal;
else
plane1=[];
end
if ~isempty(g2)
plane2=g2\gb_normal;
else
plane2=[];
end
if spacegroup==225 || spacegroup==229
% if cubic then this is the index plane
boundaries_structure(i).gb_norm_grain1=plane1';
boundaries_structure(i).gb_norm_grain2=plane2';
elseif spacegroup==167 || spacegroup==663 || spacegroup==194
% if hexagonal, keep cartesian vector, but also
% convert the cartesian plane normal to hexagonal four index notation
% ditto for misorientation axis
boundaries_structure(i).gb_norm_grain1=plane1';
boundaries_structure(i).gb_norm_grain2=plane2';
if ~isempty(plane1)
hkl=plane1;
hkil=[];
hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
hkil(2) = (2/sqrt(3))*hkl(2);
hkil(3) = -(hkil(1) + hkil(2));
hkil(4) = hkl(3);
% account for lattice vector lengths
hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst.latticepar(1)));
hkil(4) = hkil(4) / (1/parameters.cryst.latticepar(3));
boundaries_structure(i).gb_norm_hex_grain1=hkil;
else
boundaries_structure(i).gb_norm_hex_grain1=[];
end
if ~isempty(plane2)
hkl=plane2;
hkil=[];
hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
hkil(2) = (2/sqrt(3))*hkl(2);
hkil(3) = -(hkil(1) + hkil(2));
hkil(4) = hkl(3);
% account for lattice vector lengths
hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst.latticepar(1)));
hkil(4) = hkil(4) / (1/parameters.cryst.latticepar(3));
boundaries_structure(i).gb_norm_hex_grain2=hkil;
else
boundaries_structure(i).gb_norm_hex_grain2=[];
end
%
% if ~isempty(boundaries_structure(i).misorientation_axis)
% hkl=misorientation_axis';
%
% hkil=[];
% hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
% hkil(2) = (2/sqrt(3))*hkl(2);
% hkil(3) = -(hkil(1) + hkil(2));
% hkil(4) = hkl(3);
% % account for lattice vector lengths
% hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst.latticepar(1)));
% hkil(4) = hkil(4) / (1/parameters.cryst.latticepar(3));
% boundaries_structure(i).misorientation_axis_hex=hkil;
% end
else
disp('crystallography not supported!')
end
end % skip small boundaries
end
save('boundaries_structure.mat', 'boundaries_structure')