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
  103.458 81.0307 255.501

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
  143.932 103.027 342.984
  29.5529 117.889 105.651
  104.528 35.2193 258.928
  342.555 35.6626 300.692
   237.22 96.8512 183.732
  133.289 42.8352 56.3508
  238.607 116.278 4.13322
  102.687 126.844   79.34
  187.472 58.6349 265.373
  80.2033 121.065 246.654
  17.4192 30.0954  91.113
  149.557  84.375 163.352

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
  103.458 81.0307 255.501       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
 
ans =
    3.4882
% texture index of the directly computed transformed ODF
textureindex(odfB)
ans =
   17.4509