Fiber ODFs edit page

A fibre ODF is an ODF that is constant along a fibre in orientation space and decays away from it. It is the natural model whenever one crystal direction is fixed in the specimen while the crystal is free to rotate about it - the classical example being wire drawing, where a \(\left<111\right>\) direction aligns with the drawing axis.

Defining a fibre ODF

A fibre is represented in MTEX by a variable of type fibre. Many of the named fibres of rolling textures are built in.

cs = crystalSymmetry('cubic')
cs = crystalSymmetry
 
  symmetry: m3̅m   
  elements: 48     
  a, b, c : 1, 1, 1

define the fibre to be the beta fibre

f = fibre.beta(cs)
f = fibre (m3̅m → y↓→x)
 
  h || r: (12 6 11) || (-1,-1,4)
 o1 → o2: (180°,35.3°,45°) → (270°,62.8°,45°)

The fibre ODF is then created by fibreODF, with a halfwidth that controls how quickly the density decays away from the fibre.

odf = fibreODF(f,'halfwidth',10*degree)
odf = SO3FunCBF (m3̅m → y↓→x)
 
  kernel: de la Vallee Poussin, halfwidth 10°
  fibre : (12 6 11) || -1,-1,4
  weight: 1

plot the odf in 3d

plot3d(odf)

Plotting a fibre ODF

Along the fibre itself the ODF is constant, which is easiest to see in a sigma section plot - the fibre shows up as a curve of constant intensity

plotSection(odf,'sigma')
mtexColorbar

and in the pole figures of the directions defining the fibre it collapses to a point, while all other pole figures show a ring

plotPDF(odf,Miller({1,0,0},{1,1,0},{1,1,1},cs),'contourf')
mtexColorbar

The effect of the halfwidth

The halfwidth is the only shape parameter. Sharper fibres are stronger, which is directly visible in the texture index

for hw = [5 10 20]*degree
  odfHw = fibreODF(f,'halfwidth',hw);
  fprintf('halfwidth %4.1f degree : texture index %6.2f, maximum %6.2f\n',...
    hw./degree, norm(odfHw)^2, max(odfHw));
end
halfwidth  5.0 degree : texture index   6.98, maximum  13.86
halfwidth 10.0 degree : texture index   2.34, maximum   3.86
halfwidth 20.0 degree : texture index   1.26, maximum   2.06

Fitting a fibre to data

The inverse problem - given an ODF or a set of orientations, which fibre describes it best - is solved by fibre.fit

rng(0)
ori = discreteSample(odf,1000);

fFit = fibre.fit(ori)
fFit = fibre (m3̅m → y↓→x)
 
  h || r: (41̅2̅) || (0,4,9)
 o1 → o2: (332.5°,95.7°,114.8°) → (332.5°,95.7°,114.8°)

Two warnings are in order here. The first is that the fit always returns a fibre, whether the data follow one or not - on a unimodal ODF it will happily report the fibre through the mode. Section dispersion axes shows how the eigenvalues returned by fibre.fit can be used to judge how fibre like the data really are.

The second is that for highly symmetric groups the global search behind fibre.fit is not reliable. Comparing the mean angular distance of the sample to the true and to the fitted fibre shows that on this cubic example the fit is clearly worse than the fibre we started from

[mean(angle(ori,f)), mean(angle(ori,fFit))] ./ degree
ans =
    6.6436   11.9363

For low symmetry, or when a good starting guess is available, the result is much better. Treat a cubic fibre fit as a starting point for a manual inspection rather than as an answer.