8.7  Stress and strain states

Two results from the preceding chapters do not fit into a scalar description. In Chapter 8.4 we found that the same axial load produces different normal and shear stresses depending on the angle of the cut, so a single number cannot be the whole story about the stress at a point. In Chapter 8.5 we found that the strain is the gradient of a displacement field, and once the displacement has more than one component that gradient has more than one entry. Both point to the same conclusion: stress and strain are matrices, not numbers.

This chapter constructs those matrices, derives the equations they satisfy, and shows that the earlier scalar results are what the matrices reduce to in one dimension. Everything that follows in this book, the beam of Chapter 8.14 included, is a special case of what we set up here.

The one-dimensional case as a starting point

For an infinitesimal element of length \(\Delta x\), the displacement at \(x\) is \(u(x)\) and at the other end \(u(x+\Delta x)\), so the strain is the difference divided by the length,

\[ \varepsilon := \frac{\text{elongation}}{\text{original length}} = \frac{u(x+\Delta x) - u(x)}{\Delta x} \longrightarrow \frac{du}{dx} \]

and the stress follows from Hooke’s law \(\sigma = E\varepsilon\).

Figure 8.7.1: An infinitesimal element in one dimension.

Shear is the other elementary deformation. A shear stress \(\tau\) tilts the element through the shear angle \(\gamma\), and the constitutive relation is \(\tau = G\gamma\).

Figure 8.7.2: Pure shear of an infinitesimal element.

The general state of strain

In two dimensions the displacement is a vector field \(\bm u = (u_x, u_y)\) and the element can stretch in two directions while simultaneously shearing. Figure 8.7.3 shows the four independent deformations: two extensions and two contributions to the change of angle.

Figure 8.7.3: The four independent deformations of a two-dimensional element: the two extensions \(\varepsilon_x\) and \(\varepsilon_y\), and the two edge tilts \(\gamma_1\) and \(\gamma_2\) whose sum is the change of the right angle.
Figure 8.7.4: The same element deforming. Both extensions and both tilts happen at once, and each is a difference of displacements divided by the length it acts over.

The extension in the \(x\) direction comes from the variation of \(u_x\) along \(x\), and the extension in the \(y\) direction from the variation of \(u_y\) along \(y\),

\[ \frac{u_x(x+\Delta x, y) - u_x(x,y)}{\Delta x} \longrightarrow \frac{\partial u_x}{\partial x} =: \varepsilon_x, \qquad \frac{u_y(x, y+\Delta y) - u_y(x,y)}{\Delta y} \longrightarrow \frac{\partial u_y}{\partial y} =: \varepsilon_y \]

The shear contribution is the tilt of an originally vertical or horizontal edge. Moving along \(x\), the vertical displacement changes by \(u_y(x+\Delta x, y) - u_y(x,y)\), and trigonometry gives the tilt angle \(\gamma_1\) of the originally horizontal edge as

\[ \tan\gamma_1 = \frac{u_y(x+\Delta x, y) - u_y(x,y)}{\Delta x} \longrightarrow \frac{\partial u_y}{\partial x} \]

Assuming deformations small enough that \(\tan\gamma_1 \approx \gamma_1\), and adding the tilt \(\gamma_2 = \partial u_x/\partial y\) of the originally vertical edge, the total change of the right angle between the two edges is

\[ \gamma_{xy} = \gamma_1 + \gamma_2 = \frac{\partial u_y}{\partial x} + \frac{\partial u_x}{\partial y} \tag{8.7.1}\]

The same reasoning in three dimensions adds one more extension and two more shear angles,

\[ \varepsilon_z = \frac{\partial u_z}{\partial z}, \qquad \gamma_{xz} = \frac{\partial u_x}{\partial z} + \frac{\partial u_z}{\partial x}, \qquad \gamma_{yz} = \frac{\partial u_y}{\partial z} + \frac{\partial u_z}{\partial y} \]

giving six independent strains in total. Collecting them into a matrix, with the tensor shear strains \(\tfrac{1}{2}\gamma\) off the diagonal, gives the strain tensor

\[ \bm\varepsilon = \begin{bmatrix} \varepsilon_x & \tfrac{1}{2}\gamma_{xy} & \tfrac{1}{2}\gamma_{xz}\\[4pt] \tfrac{1}{2}\gamma_{xy} & \varepsilon_y & \tfrac{1}{2}\gamma_{yz}\\[4pt] \tfrac{1}{2}\gamma_{xz} & \tfrac{1}{2}\gamma_{yz} & \varepsilon_z \end{bmatrix} \tag{8.7.2}\]

All six entries follow from the single index-notation definition

\[ \boxed{\varepsilon_{ij} = \frac{1}{2}\left(\frac{\partial u_i}{\partial x_j} + \frac{\partial u_j}{\partial x_i}\right)} \tag{8.7.3}\]

or in direct notation \(\bm\varepsilon = \tfrac{1}{2}\left(\nabla\bm u + \nabla\bm u^\mathsf{T}\right)\), the symmetric part of the displacement gradient. Checking a diagonal entry, \(\varepsilon_{11} = \tfrac{1}{2}(\partial u_1/\partial x_1 + \partial u_1/\partial x_1) = \partial u_x/\partial x\), recovers \(\varepsilon_x\). Checking an off-diagonal entry, \(\varepsilon_{12} = \tfrac{1}{2}(\partial u_1/\partial x_2 + \partial u_2/\partial x_1) = \tfrac{1}{2}\gamma_{xy}\), gives half the engineering shear strain.

Why the off-diagonal entries carry a factor of one half

There are two reasons for it, and they are the same reason seen from different sides.

The first is that the displacement gradient contains something that is not strain at all. Every matrix splits uniquely into a symmetric and an antisymmetric part,

\[ \nabla\bm u = \underbrace{\tfrac{1}{2}\left(\nabla\bm u + \nabla\bm u^\mathsf{T}\right)}_{\bm\varepsilon} + \underbrace{\tfrac{1}{2}\left(\nabla\bm u - \nabla\bm u^\mathsf{T}\right)}_{\bm\omega} \tag{8.7.4}\]

and in two dimensions the antisymmetric part has the single entry \(\omega_{xy} = \tfrac{1}{2}(\gamma_1 - \gamma_2)\), which is an infinitesimal rigid rotation of the element. Rotating a body does not strain it, so whatever we call strain must be what is left after \(\bm\omega\) is removed, and that is \(\bm\varepsilon\) by construction. The one half is what taking the symmetric part of a matrix means.

Reading 8.7.4 entry by entry says something concrete about the two edge tilts of Figure 8.7.3. The engineering shear strain \(\gamma_{xy} = \gamma_1 + \gamma_2\) is the total change of the right angle, while \(\varepsilon_{xy} = \tfrac{1}{2}(\gamma_1 + \gamma_2)\) is the average tilt of the two edges. Only the average is a property of the deformation itself. An element in which the bottom edge tilts by \(\gamma\) while the side stays put, and one in which each edge tilts by \(\gamma/2\), are the same deformation viewed from frames that differ by a rigid rotation of \(\gamma/2\). Both have \(\gamma_{xy} = \gamma\) and both have \(\varepsilon_{xy} = \gamma/2\), and it is the averaged quantity that survives the change of viewpoint.

The second reason is what that survival buys us. A quantity that deserves to be called a tensor must transform under a rotation \(\bm Q\) of the frame as \(\bm\varepsilon' = \bm Q^\mathsf{T} \bm\varepsilon \bm Q\), which is exactly what makes the eigenvalue construction later in this chapter meaningful. The test is to compute a strain in a direction two ways: once from the geometry directly, and once from the matrix.

Take a simple shear, \(\bm u = (\gamma y,\, 0)\), and ask how much a material line along the diagonal of a unit square stretches. Geometrically, the deformed image of a unit vector \(\bm m\) is \((\bm I + \nabla\bm u)\bm m\), and the strain along that line is the relative change in its length.

gamma = sp.symbols('gamma', positive=True)

grad_u = sp.Matrix([[0, gamma],
                    [0, 0]])                     # simple shear

mm = sp.Matrix([1, 1])/sp.sqrt(2)                # unit vector along the diagonal

stretched = (sp.eye(2) + grad_u)*mm
strain_geometric = sp.series(stretched.norm() - 1, gamma, 0, 2).removeO()

ltx(r"\text{stretched length} &=", sp.simplify(stretched.norm()),
    r"\\ \text{strain along } \bm m &=", strain_geometric, r"+ O(\gamma^2)", aligned=True)

\[ \begin{aligned}\text{stretched length} &=\dfrac{\sqrt{2 \left(\gamma + 1\right)^{2} + 2}}{2}\\ \text{strain along } \bm m &=\dfrac{\gamma}{2}+ O(\gamma^2)\end{aligned} \]

The diagonal stretches by \(\gamma/2\), and that is the answer any correct strain measure must reproduce. Now ask the two candidate matrices. The normal strain in a direction \(\bm m\) is the quadratic form \(\bm m^\mathsf{T}\bm\varepsilon\,\bm m\), and we evaluate it both for the symmetric part of the gradient and for the naive array that puts the full engineering shear strain off the diagonal.

eps_correct = (grad_u + grad_u.T)/2                          # with the factor 1/2
eps_naive = sp.Matrix([[0, gamma], [gamma, 0]])              # full gamma off-diagonal

# A cell renders only its last expression, so both rows go in one call.
ltx(r"\bm\varepsilon =", eps_correct,
    r"&\;\Rightarrow\;\; \bm m^\mathsf{T}\bm\varepsilon\,\bm m =", sp.simplify((mm.T*eps_correct*mm)[0]),
    r"\\ \text{naive} =", eps_naive,
    r"&\;\Rightarrow\;\; \bm m^\mathsf{T}(\cdot)\,\bm m =", sp.simplify((mm.T*eps_naive*mm)[0]),
    aligned=True)

\[ \begin{aligned}\bm\varepsilon =\left[\begin{matrix}0 & \dfrac{\gamma}{2}\\\dfrac{\gamma}{2} & 0\end{matrix}\right]&\;\Rightarrow\;\; \bm m^\mathsf{T}\bm\varepsilon\,\bm m =\dfrac{\gamma}{2}\\ \text{naive} =\left[\begin{matrix}0 & \gamma\\\gamma & 0\end{matrix}\right]&\;\Rightarrow\;\; \bm m^\mathsf{T}(\cdot)\,\bm m =\gamma\end{aligned} \]

The symmetric part returns \(\gamma/2\) and agrees with the geometry. The naive array returns \(\gamma\) and is wrong by a factor of two. Since the principal strains are nothing but the extreme values of that same quadratic form, using the naive array would report principal strains twice their true size, and the error would propagate into every principal stress and every Mohr’s circle drawn from them.

⚠ Note

Engineering shear strain \(\gamma_{xy}\) and tensor shear strain \(\varepsilon_{xy} = \tfrac{1}{2}\gamma_{xy}\) differ by a factor of two. Use \(\gamma\) with \(\tau = G\gamma\) and with handbook formulas; use \(\varepsilon_{xy}\) inside the tensor, in any rotation or eigenvalue calculation, and in 8.8.7. Strain gauge rosettes report \(\gamma\), finite element post-processors are split between the two, so check before trusting a number.

The stress tensor

The stresses are collected the same way, with normal stresses on the diagonal and shear stresses off it,

\[ \bm\sigma = \begin{bmatrix} \sigma_x & \tau_{xy} & \tau_{xz}\\ \tau_{xy} & \sigma_y & \tau_{yz}\\ \tau_{xz} & \tau_{yz} & \sigma_z \end{bmatrix} \tag{8.7.5}\]

where \(\sigma_x\) is the normal stress on the face whose normal points along \(x\), and \(\tau_{xy}\) is the stress on that same face acting in the \(y\) direction. Reading the matrix by rows therefore gives, for each face of the element, the full traction vector acting on it.

Equilibrium of an infinitesimal element

The stresses cannot be arbitrary functions of position. Equilibrium of a small block of material relates their derivatives to the body force. Consider the element in Figure 8.7.5, of size \(\Delta x\) by \(\Delta y\), loaded by a body force per unit volume \(\bm f\).

Figure 8.7.5: Stresses on the faces of an infinitesimal element.

Summing forces in the \(x\) direction, each stress is multiplied by the area of the face it acts on, and the body force by the volume of the element,

\[ \sum F_x = 0: \quad \Delta\sigma_x\, \Delta y + \Delta\tau_{yx}\, \Delta x + f_x\, \Delta x \Delta y = 0 \]

which written out in full reads

\[ \left(\sigma_x(x+\Delta x, y) - \sigma_x(x,y)\right)\Delta y + \left(\tau_{yx}(x, y+\Delta y) - \tau_{yx}(x,y)\right)\Delta x + f_x\,\Delta x \Delta y = 0 \]

Dividing by \(\Delta x \Delta y\) and letting the element shrink turns the differences into partial derivatives. Doing the same in the \(y\) direction gives the pair

\[ \begin{array}{l} -\dfrac{\partial \sigma_x}{\partial x} - \dfrac{\partial \tau_{yx}}{\partial y} = f_x\\[8pt] -\dfrac{\partial \tau_{xy}}{\partial x} - \dfrac{\partial \sigma_y}{\partial y} = f_y \end{array} \tag{8.7.6}\]

Each line is the divergence of one row of the stress tensor. Recalling the gradient operator

\[ \nabla = \begin{bmatrix} \dfrac{\partial}{\partial x} \\[8pt] \dfrac{\partial}{\partial y}\end{bmatrix} \]

the two equations collapse into the single statement

\[ \boxed{-\nabla \cdot \bm\sigma = \bm f} \tag{8.7.7}\]

which is the equilibrium equation of continuum mechanics. It is the direct descendant of \(\sum F_i = 0\) from statics, written for a body in which the internal force varies continuously from point to point. Every structural problem in this book is 8.7.7 together with a constitutive law and a set of boundary conditions, and the various beam and rod and truss theories are what 8.7.7 becomes once a particular geometry is assumed.

Symmetry of the stress tensor

Force equilibrium is not the only condition. Taking moments about the midpoint of the element, the shear stresses on opposite faces each contribute a couple,

\[ \tau_{xy}(x+\Delta x, y)\,\Delta y\,\tfrac{1}{2}\Delta x + \tau_{xy}(x,y)\,\Delta y\,\tfrac{1}{2}\Delta x - \tau_{yx}(x,y+\Delta y)\,\Delta x\,\tfrac{1}{2}\Delta y - \tau_{yx}(x,y)\,\Delta x\,\tfrac{1}{2}\Delta y = 0 \]

The factors \(\tfrac{1}{2}\Delta x \Delta y\) are common to all four terms and cancel, leaving

\[ \tau_{xy}(x+\Delta x, y) + \tau_{xy}(x,y) = \tau_{yx}(x, y+\Delta y) + \tau_{yx}(x,y) \]

and in the limit \(\Delta x \to 0\), \(\Delta y \to 0\) both sides become twice the value at the point, so \(\tau_{xy} = \tau_{yx}\). The same argument about the other two axes gives \(\tau_{yz} = \tau_{zy}\) and \(\tau_{xz} = \tau_{zx}\). The stress tensor is symmetric, and of its nine components only six are independent. Symmetry is what lets us diagonalise it later, and it is the reason the strain tensor was constructed symmetric to match.

Boundary traction

Equilibrium governs the interior. At the surface, the stress in the material must balance whatever is applied from outside. Let \(\Omega\) denote the body and \(\partial\Omega\) its boundary, and let an external force \(\bm t\) act on part of that boundary. This force is a traction, measured in force per unit length in two dimensions and force per unit area in three.

Figure 8.7.6: A traction applied to the boundary of a body.

Cut a small triangular wedge from the boundary, as in Figure 8.7.7, with the traction acting on the hypotenuse of length \(\Delta s\) and the two straight legs lying along the coordinate directions. The leg with outward normal \(-\bm e_x\) has length \(\Delta y\) and the leg with outward normal \(-\bm e_y\) has length \(\Delta x\), and the outward unit normal of the hypotenuse has components

\[ n_x = \frac{\Delta y}{\Delta s}, \qquad n_y = \frac{\Delta x}{\Delta s} \]

Figure 8.7.7: Equilibrium of a boundary wedge.

Force equilibrium of the wedge in the two coordinate directions gives

\[ \begin{array}{l} t_x\, \Delta s = \sigma_x\, \Delta y + \tau_{xy}\, \Delta x\\[4pt] t_y\, \Delta s = \tau_{xy}\, \Delta y + \sigma_y\, \Delta x \end{array} \]

and dividing through by \(\Delta s\) replaces the lengths by the components of the normal,

\[ \left.\begin{array}{l} \sigma_x n_x + \tau_{xy} n_y = t_x\\ \tau_{xy} n_x + \sigma_y n_y = t_y \end{array}\right\} \quad\Longleftrightarrow\quad \begin{bmatrix} \sigma_x & \tau_{xy}\\ \tau_{xy} & \sigma_y\end{bmatrix} \begin{bmatrix} n_x \\ n_y \end{bmatrix} = \begin{bmatrix} t_x \\ t_y \end{bmatrix} \]

which is Cauchy’s formula

\[ \boxed{\bm\sigma \cdot \bm n = \bm t} \tag{8.7.8}\]

The tensor is now doing exactly the job we asked of it at the start of the chapter. Feed it any direction \(\bm n\) and it returns the traction acting across a cut with that normal. The stress at a point is not a number and not even a list of three numbers, it is the linear map that turns cut directions into tractions.

Example 1: Recovering the inclined cut

In Chapter 8.4 we computed the normal and shear stress on a cut inclined at an angle \(\varphi\) to the axis of a bar in uniaxial tension, and obtained 8.4.2 by writing equilibrium for that particular cut. Cauchy’s formula should reproduce the result without any new free body diagram, and it does.

A bar pulled along \(x\) with \(\sigma_0 = P/A\) has the stress tensor \(\bm\sigma = \operatorname{diag}(\sigma_0, 0)\): nothing acts in \(y\), and there is no shear in this frame. A cut at angle \(\varphi\) to the bar axis has unit normal \(\bm n = (\sin\varphi, -\cos\varphi)\) and unit tangent \(\bm m = (\cos\varphi, \sin\varphi)\). The traction on the cut is \(\bm t = \bm\sigma \bm n\), and its normal and tangential components are the projections of \(\bm t\) onto \(\bm n\) and \(\bm m\).

sigma_0, varphi = sp.symbols('sigma_0 varphi', real=True)

sigma_uniaxial = sp.Matrix([[sigma_0, 0],
                            [0,       0]])

nn = sp.Matrix([sp.sin(varphi), -sp.cos(varphi)])   # normal of the cut
mm = sp.Matrix([sp.cos(varphi),  sp.sin(varphi)])   # tangent of the cut

tt = sigma_uniaxial * nn
sigma_phi = sp.simplify((tt.T * nn)[0])
tau_phi   = sp.simplify((tt.T * mm)[0])

ltx(r"\bm t &=", tt,
    r"\\ \sigma_\varphi &=", sigma_phi,
    r"\\ \tau_\varphi &=", sp.simplify(sp.expand_trig(tau_phi)), aligned=True)

\[ \begin{aligned}\bm t &=\left[\begin{matrix}\sigma_{0} \sin{\left(\varphi \right)}\\0\end{matrix}\right]\\ \sigma_\varphi &=\sigma_{0} \sin^{2}{\left(\varphi \right)}\\ \tau_\varphi &=\dfrac{\sigma_{0} \sin{\left(2 \varphi \right)}}{2}\end{aligned} \]

The results are \(\sigma_\varphi = \sigma_0\sin^2\varphi\) and \(\tau_\varphi = \sigma_0\sin\varphi\cos\varphi\), identical to 8.4.2 with \(\sigma_0 = P/A\). The earlier derivation needed a free body diagram for each new cut angle. The tensor needs none: one object encodes the response to every possible cut, and Cauchy’s formula extracts the answer for whichever cut we ask about.

Principal stress and strain

Consider a plate in pure tension along \(x\), as in Figure 8.7.8. Aligned with the load, the stress tensor is diagonal, with a normal stress along the load, some transverse component, and no shear at all.

Figure 8.7.8: Frame aligned with the load
Figure 8.7.9: Frame rotated relative to the load

Rotate the frame of reference without touching the plate or the load, and shear stresses appear, exactly as they did in Example 1. Nothing physical changed, only our description of it. Reversing the question gives something useful: given a stress tensor with shear in it, is there a rotation that removes the shear entirely? The directions in which it vanishes are the principal directions, and the normal stresses in those directions are the principal stresses.

Figure 8.7.10: Rotating the frame changes the components while the state stays the same.

The shear on a cut vanishes when the traction is parallel to the normal, that is when

\[ \bm t = \lambda \bm n \]

for some scalar \(\lambda\). Substituting Cauchy’s formula 8.7.8 gives

\[ \bm\sigma \cdot \bm n = \lambda \bm n \quad\Longleftrightarrow\quad (\bm\sigma - \lambda \bm I)\cdot \bm n = \bm 0 \tag{8.7.9}\]

which is an eigenvalue problem. The principal stresses are the eigenvalues of the stress tensor and the principal directions are its eigenvectors. Because the tensor is symmetric, the eigenvalues are real and the eigenvectors are mutually orthogonal, so the principal directions always form a proper coordinate frame.

Non-trivial solutions require the matrix to be singular, \(\det(\bm\sigma - \lambda\bm I) = 0\), which in two dimensions expands to

\[ \begin{vmatrix} \sigma_x - \lambda & \tau_{xy} \\ \tau_{xy} & \sigma_y - \lambda \end{vmatrix} = (\sigma_x - \lambda)(\sigma_y - \lambda) - \tau_{xy}^2 = 0 \]

or, collecting terms,

\[ \lambda^2 - \underbrace{(\sigma_x + \sigma_y)}_{\operatorname{tr}\bm\sigma}\lambda + \underbrace{\sigma_x\sigma_y - \tau_{xy}^2}_{\det\bm\sigma} = 0 \tag{8.7.10}\]

whose roots are the two principal stresses. The coefficients are the trace and the determinant, both of which are unchanged by rotation, which is the algebraic statement of the physical fact that the principal stresses do not depend on the frame we happened to start in. Solving the quadratic gives the closed form

\[ \sigma_{1,2} = \frac{\sigma_x + \sigma_y}{2} \pm \sqrt{\left(\frac{\sigma_x - \sigma_y}{2}\right)^2 + \tau_{xy}^2} \tag{8.7.11}\]

and the identical construction applied to the strain tensor gives the principal strains, with \(\tfrac{1}{2}\gamma_{xy}\) in place of \(\tau_{xy}\),

\[ \varepsilon_{1,2} = \frac{\varepsilon_x + \varepsilon_y}{2} \pm \sqrt{\left(\frac{\varepsilon_x - \varepsilon_y}{2}\right)^2 + \left(\frac{\gamma_{xy}}{2}\right)^2} \tag{8.7.12}\]

Let us confirm 8.7.11 by solving the eigenvalue problem symbolically.

Code
sigma_x, sigma_y, tau_xy = sp.symbols('sigma_x sigma_y tau_xy', real=True)

S = sp.Matrix([[sigma_x, tau_xy],
               [tau_xy,  sigma_y]])

eigs = sp.simplify(sp.Matrix(sorted(S.eigenvals().keys(), key=sp.default_sort_key)))
ltx(r"\lambda_{1,2} =", eigs)

\[ \lambda_{1,2} =\left[\begin{matrix}\dfrac{\sigma_{x}}{2} + \dfrac{\sigma_{y}}{2} - \dfrac{\sqrt{\sigma_{x}^{2} - 2 \sigma_{x} \sigma_{y} + \sigma_{y}^{2} + 4 \tau_{xy}^{2}}}{2}\\\dfrac{\sigma_{x}}{2} + \dfrac{\sigma_{y}}{2} + \dfrac{\sqrt{\sigma_{x}^{2} - 2 \sigma_{x} \sigma_{y} + \sigma_{y}^{2} + 4 \tau_{xy}^{2}}}{2}\end{matrix}\right] \]

Effective stress and the von Mises criterion

A design check needs a single number to compare against the yield strength, and a stress state has six components. Reducing them to one number requires a hypothesis about what causes yielding. The hypothesis that works best for ductile metals is that yielding is driven by distortion rather than by volume change, which is the von Mises criterion. In terms of the three principal stresses it reads

\[ \sigma_{\text{vM}} = \sqrt{\tfrac{1}{2}\left[(\sigma_1 - \sigma_2)^2 + (\sigma_2 - \sigma_3)^2 + (\sigma_3 - \sigma_1)^2\right]} \tag{8.7.13}\]

or, in terms of the components in any frame,

\[ \sigma_{\text{vM}} = \sqrt{\tfrac{1}{2}\left[(\sigma_x - \sigma_y)^2 + (\sigma_y - \sigma_z)^2 + (\sigma_z - \sigma_x)^2 + 6(\tau_{xy}^2 + \tau_{yz}^2 + \tau_{zx}^2)\right]} \tag{8.7.14}\]

The two expressions give the same number, since 8.7.13 is written in the principal frame where the shear terms vanish. Note that adding the same pressure to all three normal stresses leaves \(\sigma_{\text{vM}}\) unchanged, because only differences of principal stresses appear. Hydrostatic pressure does not cause yielding, which is why material deep in the ocean does not yield under its own ambient pressure.

For plane stress, where \(\sigma_z = \tau_{yz} = \tau_{zx} = 0\), 8.7.14 simplifies to

\[ \boxed{\sigma_{\text{vM}} = \sqrt{\sigma_x^2 - \sigma_x\sigma_y + \sigma_y^2 + 3\tau_{xy}^2}} \tag{8.7.15}\]

which is the form that appears in most hand calculations, and the quantity that a finite element post-processor plots by default.

Example 2: Evaluating a plane stress state

A point in a loaded plate is in the plane stress state \(\sigma_x = 120~\text{MPa}\), \(\sigma_y = -40~\text{MPa}\), \(\tau_{xy} = 50~\text{MPa}\). Determine the principal stresses, the principal directions, the maximum shear stress and the von Mises stress. The material yields at \(250~\text{MPa}\): is the point safe?

S_num = sp.Matrix([[120, 50],
                   [50, -40]])

eig = S_num.eigenvects()
principal = sorted([sp.nsimplify(e[0]) for e in eig], reverse=True)
directions = [e[2][0].normalized() for e in sorted(eig, key=lambda e: -e[0])]

ltx(r"\sigma_1 &=", float(principal[0]), r"~\text{MPa}, \qquad \bm n_1 =", directions[0].evalf(3),
    r"\\ \sigma_2 &=", float(principal[1]), r"~\text{MPa}, \qquad \bm n_2 =", directions[1].evalf(3),
    aligned=True)

\[ \begin{aligned}\sigma_1 &=134.34~\text{MPa}, \qquad \bm n_1 =\left[\begin{matrix}0.961\\0.276\end{matrix}\right]\\ \sigma_2 &=-54.34~\text{MPa}, \qquad \bm n_2 =\left[\begin{matrix}-0.276\\0.961\end{matrix}\right]\end{aligned} \]

The principal stresses are \(\sigma_1 = 134~\text{MPa}\) in tension and \(\sigma_2 = -54~\text{MPa}\) in compression. The first principal direction makes an angle of about \(16^\circ\) with the \(x\) axis, which is the amount the frame must be rotated for the shear to disappear.

The maximum shear stress in the plane is half the difference of the principal stresses, a result that follows from 8.4.2 applied to the principal frame. A plane stress state has a third principal stress of zero out of the plane, and the largest shear stress over all planes is half the difference between the largest and the smallest of the three. The von Mises stress follows from 8.7.15.

Code
tau_max_plane = (principal[0] - principal[1])/2
principal_3d = sorted([principal[0], principal[1], sp.Integer(0)], reverse=True)
tau_max_abs = (principal_3d[0] - principal_3d[-1])/2

sx, sy, txy = 120, -40, 50
sigma_vm = sp.sqrt(sx**2 - sx*sy + sy**2 + 3*txy**2)

ltx(r"\tau_{\max,\text{plane}} &=", float(tau_max_plane), r"~\text{MPa}",
    r"\\ \tau_{\max,\text{abs}} &=", float(tau_max_abs), r"~\text{MPa}",
    r"\\ \sigma_{\text{vM}} &=", float(sigma_vm), r"~\text{MPa}",
    r"\\ \eta &=", float(250/sigma_vm), aligned=True)

\[ \begin{aligned}\tau_{\max,\text{plane}} &=94.34~\text{MPa}\\ \tau_{\max,\text{abs}} &=94.34~\text{MPa}\\ \sigma_{\text{vM}} &=168.23~\text{MPa}\\ \eta &=1.49\end{aligned} \]

The von Mises stress is \(168~\text{MPa}\) against a yield strength of \(250~\text{MPa}\), so the point is elastic with a factor of safety of \(1.49\). The two shear values coincide here because \(\sigma_2\) is negative, so the in-plane pair already spans the largest and smallest of the three principal stresses. Had both in-plane principal stresses been positive, the out-of-plane zero would have set the absolute maximum and the two numbers would differ. Observe also that the largest principal stress, \(134~\text{MPa}\), is smaller than the effective stress. A check based on the largest normal stress alone would have reported a factor of safety of \(1.9\) and been optimistic by a quarter. Combined stress states have to be reduced through a failure criterion, not by picking the largest component.

What comes next

We now have a complete kinematic description in 8.7.3, a complete equilibrium statement in 8.7.7, and a boundary condition in 8.7.8. What is missing is the link between stress and strain in more than one dimension. Hooke’s law \(\sigma = E\varepsilon\) relates one component to one component; the generalisation to tensors is the subject of Chapter 8.8, and with it in hand the continuum model is closed and can be specialised to any geometry we like.