Transformation Texture edit page

Transformation Texture

During phase transformation or twinning the orientation of a crystal rapidly flips from an initial state oriA into a transformed state oriB. This relationship between the initial and transformed state can be described by an orientation relationsship OR. To make the situation more precise, we consider the phase transformation from austenite to ferrite via the Nishiyama Wassermann orientation relationship

% parent and child crystal symmetry
csP = crystalSymmetry('432','mineral','Austenite');
csC = crystalSymmetry('432','mineral','Ferrite');

% the orientation relationship
p2c = orientation.NishiyamaWassermann(csP,csC);

Now an arbitrary Austenite orientation

oriA = orientation.rand(csP)
oriA = orientation (Austenite → xyz)
 
  Bunge Euler angles in degree
     phi1     Phi    phi2
  265.859 67.5885  74.076

is transformed in one of the following Ferrite orientations

oriB = variants(p2c,oriA)
oriB = orientation (Ferrite → xyz)
  size: 1 x 12
 
  Bunge Euler angles in degree
     phi1     Phi    phi2
  133.421 103.843 27.5401
  336.097 149.406 61.9742
  64.0023 71.8827 289.081
  357.606 59.5182 249.643
  215.094 53.6437 186.433
  84.0733 66.6251   101.9
  217.332 73.0137 5.41418
  126.898 147.392 138.223
  130.516 42.9577 318.756
  90.2652  158.15 285.282
  17.3372 67.7702 60.7902
  124.538 86.4803  206.73

These 12 Ferrite orientations are called variants of the orientation relationship. Lets visualize them in a pole figure plot

hC = Miller({1,1,1},{1,1,0},csC);
hP = Miller({1,1,0},{1,0,0},csP);

% plot the child variants
plotPDF(oriB,hC,'MarkerSize',5,'markerColor','black','figSize','medium');

% and on top the parent orientation
opt = {'MarkerFaceColor','none','MarkerEdgeColor','darkred','linewidth',3};
for k = 1:2
  nextAxis(k)
  hold on
  plot(oriA * hP(k).symmetrise ,opt{:})
  xlabel(char(hP(k),'latex'),'Color','red','Interpreter','latex')
  hold off
end
drawNow(gcm)

In case we have multiple parent orientations following some initial orientation distribution function odf

% define a model ODF
odfA = unimodalODF(oriA,'halfwidth',5*degree)

plotPDF(odfA,hP,'figSize','medium')
mtexColorbar
odfA = SO3FunRBF (Austenite → xyz)
 
  <strong>unimodal component</strong>
  kernel: de la Vallee Poussin, halfwidth 5°
  center: 1 orientations
 
  Bunge Euler angles in degree
     phi1     Phi    phi2  weight
  265.859 67.5885  74.076       1

We can draw some random orientations according this model ODF and apply the same commands variants to compute all transfomed orientations in one step

% number of discrete orientations
n = 10000;
oriASim = odfA.discreteSample(n)

% transform the orientations
oriBSim = variants(p2c,oriASim)

% show the result
plotPDF(oriBSim,hC,'contourf','figSize','medium');
mtexColorbar
oriASim = orientation (Austenite → xyz)
  size: 10000 x 1
 
oriBSim = orientation (Ferrite → xyz)
  size: 10000 x 12

An alternative and better approach is to directly use odfA as an input to the function variants. In this case the output is the orientation distribution function of the transformed material

% compute the child ODF
odfB = variants(p2c,odfA)

% plot
plotPDF(odfB,hC,'contourf','figSize','medium');
mtexColorbar
odfB = SO3FunHarmonic (Ferrite → xyz)
  bandwidth: 48
  weight: 1

We observe that the transformed ODF computed by the latter approach is sharper and shows more details when compared with the ODF computed from discrete orientations. We may quantify this difference by computing the texture index of both ODFs

% texture index of the transformed ODF computed from discrete orientations
odfBSim = calcDensity(oriBSim)
textureindex(odfBSim)
odfBSim = SO3FunHarmonic (Ferrite → xyz)
  bandwidth: 25
  weight: 1
 
Warning: The command textureindex is depreciated! Please use squared norm
instead. 
ans =
    3.4863
% texture index of the directly computed transformed ODF
textureindex(odfB)
Warning: The command textureindex is depreciated! Please use squared norm
instead. 
ans =
   17.4509