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 symmetry operators tmp = gtCrystGetSymmetryOperators([], spacegroup); symm = {tmp.g3}; % loop through the boundaries for ii=1:size(boundaries_structure, 2) if boundaries_structure(ii).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 grain1=boundaries_structure(ii).grain1; grain2=boundaries_structure(ii).grain2; if grain1==0 g1=[]; g1equiv=[]; elseif grain1==-1 continue; else R1= r_vectors(grain1,2:4); boundaries_structure(ii).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(ii).grain2_R_vector=R2; g2=Rod2g(R2); end % 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*symm maybe should be symm*g') for jj=1:length(symm) g1equiv = g1*symm(jj); netg = g1equiv\g2; rot_offset(jj) = acos((trace(netg)-1)/2); end dummy = find(rot_offset ==min(rot_offset)); g1equiv = g1*symm(dummy); 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(ii).eigVal=eigVal(p,p); end end boundaries_structure(ii).misorientation_axis=misorientation_axis'; boundaries_structure(ii).misorientation_angle=misorientation_angle; else boundaries_structure(ii).misorientation_axis=[]; boundaries_structure(ii).misorientation_angle=[]; boundaries_structure(ii).eigVal=[]; 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(ii).gb_norm = gb_normal'; boundaries_structure(ii).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(ii).gb_norm_grain1=plane1'; boundaries_structure(ii).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(ii).gb_norm_hex_grain1=hkil; else boundaries_structure(ii).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(ii).gb_norm_hex_grain2=hkil; else boundaries_structure(ii).gb_norm_hex_grain2=[]; end if ~isempty(boundaries_structure(ii).misorientation_axis) hkl=boundaries_structure(ii).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(ii).misorientation_axis_hex=hkil; end else disp('crystallography not supported!') end end % skip small boundaries end save('boundaries_structure.mat', 'boundaries_structure') end % end of function