An applied tension does not shear every slip system equally. The Schmid factor measures how much of that loading geometry acts along a slip direction within its slip plane. This page starts with one crystal and then applies the same calculation to every grain in a map.
import numpy as np
from mtex import *
Read the loading geometry
Consider nickel with one representative fcc slip system \([01\bar1](111)\) and a uniaxial tension direction \(\mathbf r=[001]\). All three directions are initially expressed in the crystal frame.
cs = crystalFrame('cubic', [3.523, 3.523, 3.523], mineral='Nickel')
sS = slipSystem.fcc(cs)
r = Miller(0, 0, 1, cs)
sS
slipSystem (Nickel)
u v w | h k l CRSS
0 1 -1 1 1 1 1
The blue arrow is the Burgers vector \(\mathbf b\), the black arrow is the plane normal \(\mathbf n\), and the red arrow is the tension direction.
cS = crystalShape.cube(cs)
plot(cS, faceAlpha=0.5)
hold(True)
plot(cS, sS, faceColor='blue', label='b')
arrow3d(0.4 * normalize(sS.n), faceColor='black', lineWidth=2, label='n')
plottingConvention.default3D.setView()
arrow3d(0.4 * normalize(r), faceColor='red', lineWidth=2, label='r')
hold(False)

The red arrow is perpendicular to neither the blue arrow nor the black arrow. The loading therefore has a nonzero component that shears this plane along \(\mathbf b\).
Define the Schmid factor
For uniaxial tension, the signed Schmid factor \(m\) is the product of two direction cosines:
\[m = \cos\angle(\mathbf r,\mathbf n)\, \cos\angle(\mathbf r,\mathbf b).\]A zero factor means that \(\mathbf r\) is perpendicular to either \(\mathbf b\) or \(\mathbf n\). The system then receives no resolved shear. The sign selects the shear sense; activation comparisons usually use \(|m|\) when opposite Burgers-vector signs are identified.
m = np.cos(angle(r, sS.n, symmetry=False)) * np.cos(angle(r, sS.b, symmetry=False))
m
array([-0.4082])
The SchmidFactor method performs the same
calculation. Both routes give \(m=-0.4082\) for this signed system.
sS.SchmidFactor(r)
-0.4082
Map one system over every tension direction
If the tension direction is omitted, SchmidFactor returns an
S2FunHarmonic spherical function. It can be plotted or searched without
first constructing a direction grid.
SF = sS.SchmidFactor()
plot(SF)
SFMax, pos = max(SF)
annotate(pos)
SF
S2FunHarmonic (Nickel)
bandwidth: 2
mean : -2.65e-17
antipodal: true

SFMax
0.5000
pos
vector3d (Nickel)
antipodal: true
h k l
-1.4386 -3.1997 0.3227
The positive and negative lobes record opposite shear senses. The annotated direction has the theoretical maximum \(m=0.5\): it lies halfway between the slip direction and the plane normal.
Use a general stress tensor
A loading state may instead be supplied as a stressTensor. Here the
uniaxial tensor is expressed in the same crystal frame as the system.
sigma = stressTensor.uniaxial(r)
sigma
stressTensor (Nickel)
rank: 2 (3 × 3)
0 0 0
0 0 0
0 0 1
sS.SchmidFactor(sigma)
-0.4082
For a stress tensor, SchmidFactor contracts the Schmid tensor with the
stress after normalizing by the difference between its largest and
smallest principal stresses. The result is dimensionless and lies between
\(-0.5\) and \(0.5\). Multiplying by that stress difference gives the resolved
shear stress \(\tau\).
Compare all equivalent systems
A crystal contains the symmetry-equivalent systems, not only the chosen
representative. The 'antipodal' option identifies opposite Burgers
vectors as the two shear senses of the same geometric system.
sSAll = sS.symmetrise(antipodal=True)
sSAll
slipSystem (Nickel)
size: 12
u v w | h k l CRSS
0 1 -1 1 1 1 1
0 1 -1 -1 1 1 1
1 0 -1 1 1 1 1
1 0 -1 1 -1 1 1
-1 0 -1 -1 1 1 1
-1 0 -1 -1 -1 1 1
1 -1 0 1 1 1 1
1 -1 0 -1 -1 1 1
1 1 0 -1 1 1 1
1 1 0 1 -1 1 1
0 -1 -1 -1 -1 1 1
0 -1 -1 1 -1 1 1
The twelve panels show the twelve geometric fcc systems for the fixed red loading direction. Only the plane and Burgers vector change between them.
newMtexFigure(layout=[3, 4])
for k in range(len(sSAll)):
# the panels are filled column by column
nextAxis(k % 3, k // 3)
plot(cS, faceAlpha=0.5)
mtexTitle(f'{k + 1}: ' + sSAll[k].char('latex'))
hold(True)
plot(cS, sSAll[k], faceColor='blue')
plottingConvention.default3D.setView()
arrow3d(0.4 * normalize(r), faceColor='red', lineWidth=3)
hold(False)

A vectorized call returns one signed factor per system. Taking the largest absolute value finds the system best aligned with this tension axis.
tau = sSAll.SchmidFactor(r)
tau
array([-0.4082, -0.4082, -0.4082, -0.4082, -0.4082, -0.4082, 0. ,
0. , 0. , 0. , -0.4082, -0.4082])
id = np.argmax(np.abs(tau))
tauMax = np.abs(tau)[id]
tauMax
0.4082
sSAll[id]
slipSystem (Nickel)
u v w | h k l CRSS
-1 0 -1 -1 1 1 1
The maximum is \(0.4082\) for tension along \([001]\). If systems have
different critical resolved shear stresses (CRSS), the option relative
divides each factor by its CRSS before the comparison.
tauRelative = sSAll.SchmidFactor(r, relative=True)
Map the preferred system
The same vectorized calculation accepts many crystal directions. Rows of
tau correspond to directions and columns correspond to slip systems.
rGrid = plotS2Grid(cs, upper=True, resolution=0.5 * degree)
tau = sSAll.SchmidFactor(rGrid)
tauMax, id = np.abs(tau).max(axis=-1), np.abs(tau).argmax(axis=-1) + 1
contourf(rGrid, tauMax)
mtexColorbar()

The maximum factor repeats with cubic symmetry. Each curved region is the set of tension directions that selects one member of the slip family.
pcolor(rGrid, id)
mtexColorMap(vega20(12))

Colour now identifies the selected system rather than the factor itself. The selected index remains constant within each fundamental region. Label the symmetry-related sector centres with their active systems.
rCenter = symmetrise(cs.fundamentalSector().center(), cs)
rCenter = rCenter[rCenter.z >= 0]
tau = sSAll.SchmidFactor(rCenter)
idCenter = np.abs(tau).argmax(axis=-1)
hold(True)
for k in range(len(rCenter)):
text(rCenter[k], sSAll[idCenter[k]].char('latex'), fontSize=10)
hold(False)

Spherical-function arithmetic gives the same maximum-factor map directly.
Omitting r returns one function for each of the twelve systems.
tauFun = sSAll.SchmidFactor()
contourf(max(abs(tauFun), axis=0), upper=True)
mtexColorbar()
tauFun
S2FunHarmonic (Nickel)
size : 12
bandwidth: 2
antipodal: true

This plot has the same symmetry and extrema as the explicit grid map. Use the grid when the individual direction samples are needed, and use the spherical function for evaluation, plotting, or further arithmetic.
Apply specimen stress to an EBSD map
So far, the stress and slip systems have shared the crystal frame. In an EBSD map, the applied stress is usually expressed in the specimen frame, while each slip system starts in its phase’s crystal frame. An orientation maps between those frames.
ebsd = mtexdata('csl')
ebsd = ebsd[ebsd.inpolygon([0, 0, 200, 50])]
grains = calcGrains(ebsd)
grains = smoothBoundary(grains, 5)
plot(ebsd, ebsd.orientations, micronbar='off')
hold(True)
plot(grains.boundary, lineWidth=2)
hold(False)

The black outlines delimit grains. Each grain has one mean orientation, which is the frame map used for its Schmid-factor calculation.
sS = slipSystem.fcc(ebsd.CS)
sS = sS.symmetrise()
Rotate the systems into the specimen frame
Calling symmetrise without 'antipodal' retains both Burgers-vector
signs. The following product makes one row per grain and one column per
symmetrically equivalent slip system, all expressed in the specimen frame;
MATLAB’s outer product ori * sS is a column of orientations times a row of
systems.
sSLocal = grains.meanOrientation.reshape(-1, 1) * sS
sigma = stressTensor.uniaxial(vector3d.Z)
SFSpecimen = sSLocal.SchmidFactor(sigma)
SFMax, active = SFSpecimen.max(axis=1), SFSpecimen.argmax(axis=1)
plot(grains, SFMax, micronbar='off', lineWidth=2)
mtexColorbar('southoutside')
sigma
stressTensor (y↓→x)
rank: 2 (3 × 3)
0 0 0
0 0 0
0 0 1

Bright grains have a slip system well aligned with specimen \(z\) tension. Dark grains require more applied stress to reach the same CRSS.
sSActive = grains.meanOrientation * sS[active]
hold(True)
quiver(grains, sSActive.trace(), color='b')
quiver(grains, sSActive.b, color='r')
hold(False)

Blue arrows show the surface traces of the active slip planes, and red arrows show the Burgers vectors. They align when the Burgers vector lies in the map surface. A mismatch shows that the slip direction has a component out of the surface.
Alternatively, rotate the stress into each crystal frame
The equivalent route leaves the systems in their crystal frame and maps the specimen stress back with the inverse grain orientations.
sigmaLocal = inv(grains.meanOrientation) * sigma
SFCrystal = sS.SchmidFactor(sigmaLocal)
Both inputs now share a crystal frame. The two routes agree to numerical roundoff, so either may be chosen according to the next calculation.
np.abs(SFCrystal - SFSpecimen).max()
4.9960e-16
SFMax, active = SFCrystal.max(axis=1), SFCrystal.argmax(axis=1)
plot(grains, SFMax, micronbar='off', lineWidth=2)
mtexColorbar('southoutside')
sSActive = grains.meanOrientation * sS[active]
hold(True)
quiver(grains, sSActive.trace(), color='b')
quiver(grains, sSActive.b, color='r')
hold(False)

This final map and its arrows reproduce the specimen-frame result. A frame mismatch instead raises an error, because the resulting factors would have no physical meaning.
References
- U. F. Kocks, C. N. Tomé and H.-R. Wenk, Texture and Anisotropy, Cambridge University Press, 1998, derives Schmid’s law and relates resolved shear stress to slip-system activation.
Next
Schmid analysis selects systems under an imposed stress. Continue with Taylor Model to find the combination of slip systems that accommodates an imposed strain.
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/SchmidFactor_py.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.