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, 1define 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: 1plot 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));
endhalfwidth 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.06Fitting 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))] ./ degreeans =
6.6436 11.9363For 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.