Theory of Misorientations edit page

An orientation says how one crystal sits in the specimen. A misorientation says how two crystals sit relative to each other. It is a coordinate transform from one crystal frame into the other, so the specimen frame drops out.

Misorientations describe grain boundaries, twins, phase transformations, and orientation gradients inside a deformed grain. The two crystals may belong to the same phase or to different phases.

This page assumes that orientations map crystal coordinates to specimen coordinates. Review Orientations as Coordinate Transforms if the order of composed transforms is unfamiliar.

plottingConvention.default('y↑→x');

Two Grains to Work With

The example is an EBSD map of magnesium containing extension twins. The map first has to be divided into grains.

mtexdata twins silent

% use only proper symmetry operations, which are rotations
ebsd('M').CS = ebsd('M').CS.properGroup;

% compute and smooth the grains
grains = calcGrains(ebsd,'threshold',5*degree,'minPixel',5);
grains = smoothBoundary(grains,5);
CS = grains.CS;

The two labelled grains share the white boundary. Their adjacency makes the relative orientation a grain-boundary misorientation.

plot(grains,grains.meanOrientation,'ipfDirection',zvector,'micronbar','off')

hold on
plot(grains([57,58]).boundary,'edgecolor','w','linewidth',2)
hold off

text(grains([57,58]),{'1','2'})

Their mean orientations are the two inputs used below.

ori1 = grains(57).meanOrientation;
ori2 = grains(58).meanOrientation;

Misorientation Angle and Disorientation

The smallest rotation angle separating the two crystal orientations is

disorientationAngle = angle(ori1,ori2) ./ degree
disorientationAngle =
   85.7299

A crystal orientation has many symmetrically equivalent descriptions. MTEX compares all proper-symmetry pairs and returns the smallest angle. This minimum is the disorientation angle.

ori2Equivalent = ori2.symmetrise('proper');
symmetryAwareRange = [min(angle(ori1,ori2Equivalent)),...
  max(angle(ori1,ori2Equivalent))] ./ degree
symmetryAwareRange =
   85.7299   85.7299

Every symmetry-aware comparison therefore returns the same value. If symmetry is ignored, the same representatives span many rotation angles.

rawAngleRange = [min(angle(ori1,ori2Equivalent,'noSymmetry')),...
  max(angle(ori1,ori2Equivalent,'noSymmetry'))] ./ degree
rawAngleRange =
   85.7299  179.8286

The Directed Misorientation

A full misorientation contains an axis as well as an angle, and it has a direction. Since ori1 and ori2 both map crystal coordinates to specimen coordinates, the product below maps coordinates of grain 2 into grain 1.

mori = inv(ori1) * ori2
mori = misorientation (Magnesium → Magnesium)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2
  149.583 94.2717 150.165

The displayed object is one representative of all equivalent rotations. Its raw angle is not necessarily the disorientation angle.

rawRepresentativeAngle = angle(mori,'noSymmetry') ./ degree
rawRepresentativeAngle =
  107.9164

project2FundamentalRegion chooses the representative in the fundamental region, where each physical relationship appears once.

disori = project2FundamentalRegion(mori);
fundamentalRegionAngle = angle(disori,'noSymmetry') ./ degree
fundamentalRegionAngle =
   85.7299

The raw representative is about \(107.9^\circ\), whereas the representative in the fundamental region has the \(85.7^\circ\) disorientation angle.

Applying mori to a plane normal expressed in grain 2 returns that normal expressed in grain 1. Here \(\{11\bar20\}\) of grain 2 is parallel to \(\{2\bar1\bar10\}\) of grain 1.

round(mori * Miller(1,1,-2,0,CS))
ans = Miller (Magnesium)
  h  k  i  l
  2 -1 -1  0

The inverse misorientation maps from grain 1 back into grain 2.

round(inv(mori) * Miller(2,-1,-1,0,CS))
ans = Miller (Magnesium)
  h  k  i  l
  1  1 -2  0

Coincident Lattice Planes

The relationship lies near several coincidences between major lattice planes. The large markers are planes of grain 2 mapped into grain 1. The small labelled markers are planes already expressed in grain 1.

m = Miller({1,-1,0,0},{1,1,-2,0},{-1,0,1,1},{0,0,0,1},CS);

% plot the major planes of grain 2 in the frame of grain 1
close all
for im = 1:length(m)
  plot(mori * m(im).symmetrise,'MarkerSize',10,...
    'DisplayName',char(m(im),'LaTex'),'noLabel',...
    'upper','textBelowMarker')
  hold on
end
hold off

% label the corresponding planes of grain 1
mm = round(unique(mori*m.symmetrise,'noSymmetry'),'maxHKL',6);
annotate(mm,'labeled','MarkerSize',5,'textBelowMarker')

legend({},'location','southoutside','FontSize',13,'Interpreter','latex','numColumns',4);

Two pairs lie almost on top of each other: \(\{11\bar20\}\) on \(\{11\bar20\}\) and \(\{\bar1011\}\) on \(\{\bar1011\}\). Their angular separations are about half a degree and a fifth of a degree.

nearCoincidenceError = [...
  angle(mori*Miller(1,1,-2,0,CS),Miller(1,1,-2,0,CS));...
  angle(mori*Miller(-1,0,1,1,CS),Miller(-1,0,1,1,CS))] ./ degree
nearCoincidenceError =
    0.4592
    0.1766

Two further pairs are close without coinciding. The prism plane \(\{1\bar100\}\) maps near the basal plane \((0001)\), and the basal plane maps near the prism plane. Both separations are about \(4.3^\circ\).

crossPlaneError = [...
  angle(mori*Miller(1,-1,0,0,CS),Miller(0,0,0,1,CS));...
  angle(mori*Miller(0,0,0,1,CS),Miller(1,-1,0,0,CS))] ./ degree
crossPlaneError =
    4.2748
    4.2919

A Useful 90 Degree Approximation

The exact relationship that forces the first two chosen correspondences is the transform taking \(\{11\bar20\}\) to \(\{2\bar1\bar10\}\) and \([0001]\) to \([01\bar10]\).

coincidenceMori = orientation.map(...
  Miller(1,1,-2,0,CS),Miller(2,-1,-1,0,CS),...
  Miller(0,0,0,1,CS,'uvw'),Miller(0,1,-1,0,CS,'uvw'))
coincidenceMori = misorientation (Magnesium → Magnesium)
 
 (0001) || (011̅0)   [11̅00] || [0001]

It is a rotation by exactly \(90^\circ\) about a prism axis.

round(coincidenceMori.axis)
ans = Miller (Magnesium)
  h  k  i  l
  2 -1 -1  0
coincidenceAngle = coincidenceMori.angle ./ degree
coincidenceAngle =
    90

In the corresponding plot, the pairs forced by the construction now coincide exactly. This is a useful geometric approximation, but it is not the ideal magnesium extension-twin relationship.

% plot the approximation in place of the measured misorientation
close all
for im = 1:length(m)
  plot(coincidenceMori * m(im).symmetrise,'MarkerSize',10,...
    'DisplayName',char(m(im),'LaTex'),'noLabel','upper')
  hold on
end
hold off

% label the corresponding planes in the other crystal
mm = round(unique(coincidenceMori*m.symmetrise,'noSymmetry'),'maxHKL',6);
annotate(mm,'labeled','MarkerSize',5)

legend({},'location','southoutside','FontSize',13,'Interpreter','latex','numColumns',4);

The Magnesium Extension Twin

The physical twin relationship is defined by a twin plane and an in-plane direction. Its disorientation is \(86.3^\circ\) about a prism axis.

twinning = orientation.map(...
  Miller(1,-1,0,1,CS),Miller(1,0,-1,-1,CS),...
  Miller(0,1,-1,1,CS,'uvw'),Miller(1,-1,0,1,CS,'uvw'))
twinning = misorientation (Magnesium → Magnesium)
 
 (101̅1̅) || (011̅1)   [011̅1] || [11̅01]
twinAxis = round(twinning.axis)
twinAxis = Miller (Magnesium)
  h  k  i  l
  1  1 -2  0
twinAngle = twinning.angle ./ degree
twinAngle =
   86.2992

A textbook may instead describe this twin as a \(180^\circ\) rotation about the twin axis. That is a symmetrically equivalent representative of the same misorientation, obtained by asking for the largest rotation angle.

twinMaximumAngle = angle(twinning,'max') ./ degree
twinMaximumAngle =
   180

The measured grain pair is \(0.7^\circ\) from the ideal twin. The 90 degree coincidence approximation is \(3.7^\circ\) from it.

twinDeviation = [angle(mori,twinning),...
  angle(coincidenceMori,twinning)] ./ degree
twinDeviation =
    0.7322    3.7008

Finding the Twin Boundaries

A boundary close to the ideal relationship is a candidate twin boundary. The threshold is an analyst choice and compares the complete misorientation, including its axis, rather than the angle alone.

% select only magnesium to magnesium grain boundaries
gB = grains.boundary('Magnesium','Magnesium');

% test the complete misorientation against the ideal twin
isTwinning = angle(gB.misorientation,twinning) < 5*degree;

% plot the grains and highlight candidate twin boundaries
plot(grains,grains.meanOrientation,'ipfDirection',zvector,'micronbar','off')
hold on
plot(gB(isTwinning),'edgecolor','w','linewidth',2)
hold off

The white traces follow the thin lamellae visible in the orientation map. This spatial agreement supports the crystallographic classification, but a threshold match alone does not prove the deformation mechanism. Twinning Analysis shows how to infer the ideal relationship from a boundary population instead of assuming it.

Segment counts depend on how a boundary was sampled, so the fraction is weighted by trace length. Candidate twins make up about half the boundary length in this map.

twinLengthFraction = sum(gB(isTwinning).segLength) ./ sum(gB.segLength)
twinLengthFraction =
    0.4902

Reading a Population of Misorientations

The misorientations of all boundary segments can be reduced to an angle distribution. The sharp peak just below \(90^\circ\) is the twin population found above.

close all
plotAngleDistribution(gB.misorientation,'figSize','small')

This boundary distribution is correlated because only neighbouring grains are paired. Angle Distribution compares it with the uncorrelated distribution from the texture and with the distribution expected for uniformly random orientations.

The same population can instead be reduced to its axes.

plotAxisDistribution(gB.misorientation,'contourf')

The axes concentrate on \(\left<\bar12\bar10\right>\), the prism-axis family of the ideal twin. These axes are expressed in crystal coordinates; Axis Distribution also explains axes in specimen coordinates and the random reference distribution.

Misorientations Between Two Phases

A phase transformation relates crystals with different symmetries. The first symmetry of the misorientation belongs to the parent phase and the second belongs to the child phase.

CS_Mag = loadCIF('Magnetite');
CS_Hem = loadCIF('Hematite');

A reported magnetite-to-hematite relationship has \(\{111\}_{m} \parallel \{0001\}_{h}\) and \(\{\bar101\}_{m} \parallel \{10\bar10\}_{h}\). These two parallelisms are exactly the input expected by orientation.map.

Mag2Hem = orientation.map(...
  Miller(1,1,1,CS_Mag),Miller(0,0,0,1,CS_Hem),...
  Miller(-1,0,1,CS_Mag),Miller(1,0,-1,0,CS_Hem))
Mag2Hem = misorientation (Magnetite → Hematite)
 
 (011̅) || (01̅10)   [111] || [0001]

Consider one magnetite parent orientation.

ori_Mag = orientation.byEuler(0,0,0,CS_Mag);

Applying every symmetrically equivalent parent description creates 48 child descriptions, but only 8 child orientations are distinct. The duplicates come from symmetry operations that leave the \(\{111\}\) axis in place and therefore do not create a new child orientation.

allChildDescriptions = symmetrise(ori_Mag) * inv(Mag2Hem);
variantCounts = [length(allChildDescriptions),...
  length(unique(allChildDescriptions))]
variantCounts =
    48     8

A variant is one crystallographically equivalent child orientation predicted from a single parent orientation through a known orientation relationship. variants removes duplicate descriptions directly.

childVariants = variants(Mag2Hem,ori_Mag)
childVariants = orientation (Hematite → y↑→x)
  size: 1 × 8
 
  Bunge Euler angles in degree
  phi1     Phi    phi2
   135 54.7356      60
   315 125.264     120
    45 54.7356     300
   225 125.264     240
   225 54.7356      60
    45 125.264     120
   135 125.264       0
   315 54.7356     180

The pole figure contains eight discrete child orientations rather than one. A transformed parent grain may therefore contain several child orientations related by the same parent-to-child relationship.

plotPDF(childVariants,...
  Miller({1,0,-1,0},{1,1,-2,0},{0,0,0,1},CS_Hem))

The Maths Behind the Transform

Let \(\mathbf{G}_1\) and \(\mathbf{G}_2\) be the matrices of ori1 and ori2. A direction with crystal-2 components \(\mathbf{h}_2\) has specimen components \(\mathbf{r}=\mathbf{G}_2\mathbf{h}_2\). Its components in the frame of crystal 1 are therefore

\[ \mathbf{h}_1 = \mathbf{G}_1^{-1}\mathbf{r} = \mathbf{G}_1^{-1}\mathbf{G}_2\mathbf{h}_2. \]

This is why inv(ori1) * ori2 maps crystal 2 into crystal 1. Reversing the order gives the inverse map.

Proper symmetry operations may multiply this transform from both sides without changing the physical crystal relationship. The fundamental region retains one representative from that equivalent set. For a same-phase grain boundary, swapping the two grains also replaces the transform by its inverse; grain exchange symmetry develops that additional equivalence.

References

Next

The next page explains Grain Exchange Symmetry. A whole distribution of misorientations, represented as a density rather than a list, is the Misorientation Distribution Function. Applying a parent-to-child relationship throughout a map leads to Parent Grain Reconstruction.

Citing this page. This page is part of the documentation of MTEX, a free and open source MATLAB toolbox for analyzing and modeling crystallographic textures. It was written by The MTEX Developers and is published at https://mtex-toolbox.github.io/MisorientationTheory.html. If you use MTEX, or reuse text or figures from this page, in your research, please cite

F. Bachmann, R. Hielscher, H. Schaeben: Texture Analysis with MTEX - Free and Open Source Software Toolbox, Solid State Phenomena 160 (2010), 63-68. 10.4028/www.scientific.net/SSP.160.63

BibTeX
@article{bachmann2010mtex,
  author  = {F. Bachmann and R. Hielscher and H. Schaeben},
  title   = {Texture Analysis with MTEX - Free and Open Source Software Toolbox},
  journal = {Solid State Phenomena},
  volume  = {160},
  pages   = {63-68},
  year    = {2010},
  doi     = {10.4028/www.scientific.net/SSP.160.63},
  url     = {https://doi.org/10.4028/www.scientific.net/SSP.160.63}
}

Other papers describing specific MTEX methods are listed under Publications — please cite the one that best fits your application. The MTEX source code is licensed under the GNU General Public License v2.0; the text and figures of this documentation are licensed under CC BY 4.0, which permits reuse — including by automated systems — provided The MTEX Developers and this page are credited.