Transformation Texture edit page

Parent grain reconstruction asks which parent produced measured children. This page asks the forward question: which child texture does a known parent texture and parent-to-child orientation relationship (OR) predict?

The example first transforms one orientation and then an entire orientation distribution function (ODF). It ends by showing why variant selection must be stated when a predicted texture is compared with a measured one.

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

Define the parent and child phases

During a phase transformation or twinning, a crystal can rapidly change from a parent orientation oriA to a child orientation oriB. An OR describes the fixed angular relation between their lattices. Here both phases are cubic, and the Nishiyama-Wassermann (NW) OR relates austenite to ferrite.

csP = crystalSymmetry('432','mineral','Austenite');
csC = crystalSymmetry('432','mineral','Ferrite');
p2c = orientation.NishiyamaWassermann(csP,csC)
p2c = misorientation (Austenite → Ferrite)
 
 (111) || (011)   [11̅0] || [1̅00]

Transform one parent orientation

Start with an arbitrary austenite orientation.

oriA = orientation.rand(csP)
oriA = orientation (Austenite → y↑→x)
 
  Bunge Euler angles in degree
     phi1       Phi      phi2
  150.128   63.8547 0.0411749

Symmetry means that the OR does not predict only one ferrite orientation. Parent and Child Variants defines a variant and derives how variants removes equivalent candidates. Applying it here returns all distinct NW child variants.

oriB = variants(p2c,oriA);
numChildVariants = length(oriB)
numChildVariants =
    12

The printed result is 12 ferrite variants for this parent orientation. The pole figures show their crystallographic spread.

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

plotPDF(oriB,hC,'MarkerSize',5,'markerColor','black',...
  'figSize','medium');

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)

Black points are poles of the 12 child variants. Red open markers are symmetry-equivalent poles of their one parent. The repeated black clusters show that one sharp parent component produces several symmetrically related child components.

Define a parent texture

An ODF is a normalized density on orientation space. Density is reported in multiples of a random distribution (mrd). We place a 5-degree unimodal austenite ODF around oriA.

odfA = unimodalODF(oriA,'halfwidth',5*degree)

plotPDF(odfA,hP,'figSize','medium')
mtexColorbar('title','mrd')
odfA = SO3FunRBF (Austenite → y↑→x)
 
  unimodal component
  kernel: de la Vallee Poussin, halfwidth 5°
  center: 1 orientations
 
  Bunge Euler angles in degree
     phi1       Phi      phi2    weight
  150.128   63.8547 0.0411749         1

Each pole-density maximum surrounds a pole of the modal parent orientation. The finite halfwidth represents a parent texture component rather than one perfectly sharp orientation.

Approximate the child texture by sampling

A Monte Carlo route draws parent orientations from odfA. Each of the 10,000 draws produces all 12 equally populated child variants.

n = 10000;
oriASim = odfA.discreteSample(n);
oriBSim = variants(p2c,oriASim);
numSimulatedChildren = length(oriBSim)
numSimulatedChildren =
      120000

The 120,000 child orientations approximate the transformed texture. calcDensity turns that discrete set back into an ODF.

odfBSim = calcDensity(oriBSim)

plotPDF(odfBSim,hC,'contourf','figSize','medium');
mtexColorbar('title','mrd')
odfBSim = SO3FunHarmonic (Ferrite → y↑→x)
  bandwidth: 25
  weight: 1

The lobes occupy the same symmetry-related positions as the single-parent variants. Their finite width comes from the parent ODF, while small contour irregularities come from random sampling and density estimation.

Transform the ODF directly

The direct route passes odfA to variants. MTEX averages the parent density over the 12 candidate-parent branches. This calculation therefore assumes equal population of all child variants.

odfB = variants(p2c,odfA)

plotPDF(odfB,hC,'contourf','figSize','medium');
mtexColorbar('title','mrd')
odfB = SO3FunHarmonic (Ferrite → y↑→x)
  bandwidth: 48
  weight: 1

The direct ODF has smooth, sharp lobes at the locations predicted by the discrete calculation. It avoids Monte Carlo noise and the additional density-estimation step, so it is the preferred route when equal variant populations are appropriate.

Quantify the sampling difference

The texture index, or J-index, is the mean square of a normalized ODF. It is 1 for a uniform texture and increases as texture sharpens. ODF Characteristics develops this measure.

meanSampledChildODF = mean(odfBSim)
meanDirectChildODF = mean(odfB)
textureIndexSampled = norm(odfBSim)^2
textureIndexDirect = norm(odfB)^2
meanSampledChildODF =
    1.0000
meanDirectChildODF =
    1.0000
textureIndexSampled =
    3.4814
textureIndexDirect =
   17.4509

Both means print as 1.0000, confirming that the ODFs are normalized. The sampled and direct texture indices are 3.4814 and 17.4509. The earlier page described it as sharper and more detailed; the two texture-index values make that comparison reproducible. calcDensity selected bandwidth 25, while the direct result retains bandwidth 48. The difference therefore includes smoothing as well as Monte Carlo noise; it does not compare two different physical materials.

Model complete variant selection

Equal populations are a crystallographic baseline, not a universal material law. Stress, interfaces, and transformation history can favour some variants. To expose the consequence, assign variant 1 to every sampled parent. This complete selection is deliberately an end member rather than a fitted physical model.

selectedVariantId = ones(n,1);
oriBSelected = variants(p2c,oriASim,selectedVariantId);
odfBSelected = calcDensity(oriBSelected)

plotPDF(odfBSelected,hC,'contourf','figSize','medium');
mtexColorbar('title','mrd')
odfBSelected = SO3FunHarmonic (Ferrite → y↑→x)
  bandwidth: 25
  weight: 1

The selected texture contains one transformed branch instead of the 12-branch superposition. Its stronger, less symmetrically repeated lobes show why measured child textures cannot be interpreted from the OR alone. A variant-population model is also required.

References

Next

Continue with Grain Graph Based Reconstruction to return to the inverse problem. That page uses shared boundaries to decide which measured martensite grains have a common parent.

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/TransformationTexture.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.