Energy: Strain Energy in a Continuum
During the time period of application of the external forces on a deforming body, the external forces perform work that is transmitted into internal energy inside the deforming body. To accurately describe this internal energy stored, the power of those external forces (rate of application of work) is used and then integrated over a small period of time to find the increment of the deformation energy stored inside the body. This concept will be used in the following sections to show that the increment in the deformation energy stored in a continuum arises naturally from the product of the components of the stress tensor and the components of the increments in the small strain tensor:
Deformation Energy of a Continuum-Integral Formulation:
There are different approaches to find the expression for the deformation energy of a continuum. I prefer to start with the equilibrium equation and integrate it over the region of interest. This approach is similar to how the energy was defined in the single degree of freedom page. First, let the current configuration of a material body be represented by the set with the orthonormal basis set such that has coordinates , and . Let be the reference configuration such that an arbitrary element of is denoted by with coordinates , and . Integrals of a function over take the following form:
while integrals of a function over take the following form:
If is the deformation gradient, then, integrals over can be converted to integrals over by utilizing the equality where :
Also, let be the Cauchy stress tensor map at every point and be the velocity and acceleration maps, respectively, at each material point inside the deforming body. Let the vector map of the body forces acting on the continuum body be represented by and the density map be denoted by . We first note that the equilibrium equation (balance of linear momentum) can be applied at any point in the continuum and at any point in time, i.e., :
Or in vector form:
The dot product between the three components of the equilibrium equation and the velocity vector is equal to zero:
or in vector form:
Since this applies to every x, the integral of this quantity over is still equal to zero:
(1)
The second term in Equation 1 can further manipulated using components as follows:
where the equality and the divergence theorem were used, and is the velocity gradient. Substituting back into Equation 1 yields the following:
(2)
The right hand side of Equation 2 gives the total external power (energy per unit time) supplied by the external body forces and external forces acting on the boundary. The first term on the left hand side will be shown to be equal to the rate of change in the kinetic energy of as follows: The kinetic energy is defined as:
The rate of change of the kinetic energy can be calculated as follows:
where the mass balance equation was used. Substituting back into Equation 2 yields:
By invoking the first law of thermodynamics and by assuming the loading is isothermic (temperature is constant), then, the external power supplied to is equal to the rate of change of the kinetic energy and the internal energy. Denoting the internal energy per unit volume by , then, the rate of change of the internal energy per unit volume of is given by:
The term is often referred to as the “stress power”. Because of the symmetry of , we can replace with its symmetric part so that we have:
is related to the small strain tensor as follows:
Therefore, the infinitesimal change in the internal energy can be calculated using the formula:
It is worth mentioning here that there was no need to invoke the “first law of thermodynamics” which is more useful in cases where sources of energy other than mechanical work are present. The argument that the power supplied by the external forces is equal to the rate of change of the kinetic energy plus the stress power in an isothermic process is equivalent to the equilibrium equation as it was directly derived from equilibrium.
Energy Conjugates:
The internal energy per unit volume is calculated by multiplying a measure of stress by a measure of deformation. If the energy per unit volume of the deformed configuration is considered, then the Cauchy stress matrix and the stretch part of the velocity gradient are energy conjugates. If the energy per unit volume of the undeformed configuration is considered, then the first Piola Kirchoff stress and the deformation gradient are energy conjugates as follows:
If we consider the second Piola Kirchhoff stress tensor then either or can be considered as its energy conjugate:
Where the properties of the Trace operator were used along with the symmetry of and .
It is also important to note that since can also be considered as the energy conjugate of . I.e.,
If we integrate from state to state , and since the volume in the reference configuration is constant, we have:
Similarly, either of can be considered as the energy conjugate of . We can see the analogy between the conjugates of and if we denote:
Then:
In other words, the gradient of in the reference configuration is the energy conjugate of while the gradient of in the spatial configuration is the energy conjugate of . To find the total energy using the spatial configuration expression for the energy per unit volume, the rate needs to be integrated over a particular volume, and then integrated from state to state :
Illustrative Example 1: Rotation Followed by Extension
This example serves to clarify the difference between the various stress measures and strain measures studied before. In addition, the energy calculation as the product of components of stresses with the components of the “conjugate” strain measured will be shown. First, assume a block of material that whose length in the reference configuration is , width is , and thickness is . Assume that the block rotates 90 degrees around the edge that is originally parallel to the axis as shown below. Then, a vertical load is applied gradually on the block such that it changes linearly from 0 to during a time period units. Assume that the block deforms linearly with time such that becomes becomes , and becomes . Let , and . The following are the various stress and deformation measures describing the deformation.
The Deformation Gradient
The 90 degrees rotation can be described by the following matrix:
The deformation can be viewed as an extension along the direction a and contractions along the directions and followed by the rotation . The extension and contractions can be described by the matrix :
Therefore, the deformation gradient is given by:
Note that is the right polar decomposition of . Alternatively, the deformation can be viewed as a rotation followed by the same extensions and contractions which can be described by the matrix :
In this case, . Notice how the extension along and the contraction along exchanged positions between the matrices and ! The rate of the deformation gradient is given by:
The Velocity Gradient
The velocity gradient is given by:
As is already symmetric, the stretch tensor is given by:
The spin tensor is given by:
The Green-Lagrange Strain
The Green strain is given by:
Its rate is given by:
The Cauchy Stress Tensor
The Cauchy stress describes the spacial state of stress of the block. In the spacial coordinate system, the Cauchy stress matrix has only one non-zero component and thus at time has the form:
It is important first to note that unlike the load and the deformation are linear in time and thus proportional, the component is nonlinear. In fact, it has an increasing slope (i.e., it is convex). This can easily be shown by noting that the second derivative of with respect to is always positive when :
Piola Kirchhoff Stress Tensors
The first Piola Kirchhoff stress tensor is given by:
is not symmetric. The first column gives the spatial components of the spatial force per unit undeformed area acting on the area perpendicular to the reference axis .
The second Piola Kirchhoff stress tensor is given by:
The first column gives the components in the reference configuration of the force vector acting on the area perpendicular to the reference axis when the force vector is pulled back to the reference configuration. Note that when the force vector is pulled back, it is now acting in the horizontal direction and is scaled down by the factor .
Energy Conjugates
First, the total strain energy due to deformation will be computed. The gradual increase in the force causes a gradual increase in the length to . The force as a function of time is given by while the extension is given by . The total strain energy can be calculated as follows:
The energy per unit volume of the undeformed configuration can be obtained as follows:
Alternatively:
The above two expressions show that arises naturally as the energy conjugate of while arises naturally as the energy conjugate of . The instantaneous change of energy per unit deformed configuration volume can be obtained as follows:
Similarly, arises naturally as the energy conjugate of . It is important to note that the energy per unit deformed configuration volume can only be obtained by first integrating over a particular volume, then integrating over time, and then dividing by the total volume. Simple integration of over time is not conceptually correct, since the volume changes with time.
View Mathematica Code
Q = {{Cos[Pi/2], Sin[Pi/2], 0}, {-Sin[Pi/2], Cos[Pi/2], 0}, {0, 0, 1}}; intx = {xi1, xi2, xi3}; X = {X1, X2, X3}; xi1 = (1 + t*ea) X1; xi2 = (1 - t*eb) X2; xi3 = (1 - t*ec) X3; xi = {xi1, xi2, xi3}; x = Q.xi; x // MatrixForm x /. {t -> 1, X2 -> b, X1 -> a, X3 -> c} // MatrixForm U = Table[D[xi[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["The matrix U appearing in the Right Polar Decomposition of the \ Deformation Gradient F:"] U // MatrixForm Udot = D[U, t]; Udot // MatrixForm Qdot = D[Q, t]; Qdot // MatrixForm F = Table[D[x[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["The Deformation Gradient F:"] F // MatrixForm Print["The matrix V appearing in the Right Polar Decomposition of the \ Deformation Gradient F:"] V = FullSimplify[F.Transpose[Q]]; V // MatrixForm Fdot = FullSimplify[D[F, t]]; Print["Fdot"] Fdot // MatrixForm L = FullSimplify[Fdot.Inverse[F]]; Print["Velocity gradient (L)"] L // MatrixForm Print["Velocity gradient (L) at t=0.5"] FullSimplify[L /. t -> 0.5] // MatrixForm Print["Velocity gradient (L) at t=1"] FullSimplify[L /. t -> 1] // MatrixForm Dd = FullSimplify[1/2 (L + Transpose[L])]; Print["Symmetric part of Velocity gradient"] Dd // MatrixForm Print["D at t=0.5"] FullSimplify[Dd /. t -> 0.5] // MatrixForm Print["D at t=1"] FullSimplify[Dd /. t -> 1] // MatrixForm Elagrange = FullSimplify[1/2 (Transpose[F].F - IdentityMatrix[3])]; Print["Green Strain"] Elagrange // MatrixForm Elagrangedot = FullSimplify[D[Elagrange, t]]; Print["Green Strain Rate"] Elagrangedot // MatrixForm sigmalocal = {{t*f0/(b*c*(1 - t*eb) (1 - t*ec)), 0, 0}, {0, 0, 0}, {0,0, 0}}; Cauchy = FullSimplify[Q.sigmalocal.Transpose[Q]]; Print["Cauchy stress"] Cauchy // MatrixForm sigmalocal /. t -> 0 // MatrixForm; sigmalocal /. t -> 0.5 // MatrixForm; sigmalocal /. t -> 1 // MatrixForm; Print["Cauchy stress at t=0"] Cauchy /. t -> 0 // MatrixForm Print["Cauchy stress at t=0.5"] Cauchy /. t -> 0.5 // MatrixForm Print["Cauchy stress at t=1"] Cauchy /. t -> 1 // MatrixForm P = FullSimplify[Det[F]*Cauchy.Inverse[Transpose[F]]]; Print["P"] P // MatrixForm Print["P at t=0"] P /. t -> 0 // MatrixForm Print["P at t=0.5"] P /. t -> 0.5 // MatrixForm Print["P at t=1"] P /. t -> 1 // MatrixForm S = FullSimplify[Inverse[F].P]; Print["S"] S // MatrixForm Print["S at t=0"] S /. t -> 0 // MatrixForm Print["S at t=0.5"] S /. t -> 0.5 // MatrixForm Print["S at t=1"] S /. t -> 1 // MatrixForm Print["Cauchy"] Cauchy // MatrixForm Print["D"] Dd // MatrixForm Print["D and Cauchy are energy conjugates: dU/dt"] e1 = FullSimplify[Sum[Cauchy[[i, j]]*Dd[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["P"] P // MatrixForm Print["Fdot"] Fdot // MatrixForm Print["P and Fdot are energy conjugates: dW/dt"] e2 = FullSimplify[Sum[P[[i, j]]*Fdot[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["S"] S // MatrixForm Print["E-Green"] Elagrangedot // MatrixForm Print["S and E_Green are energy conugates: dW/dt"] e2 = FullSimplify[Sum[S[[i, j]]*Elagrangedot[[i, j]], {i, 1, 3}, {j, 1, 3}]]
View Python Code
import sympy as sp import numpy as np from sympy import Matrix, simplify, diff, eye, det from matplotlib import pyplot as plt theta = sp.symbols("theta") Q = Matrix([[sp.cos(theta), sp.sin(theta),0], [-sp.sin(theta),sp.cos(theta), 0], [0,0,1]]) Q = Q.subs({theta:sp.pi/2}) display("Q =", Q) X1,X2,X3 = sp.symbols("X_1 X_2 X_3") a,b,c = sp.symbols("a b c") ea,eb,ec,t = sp.symbols("epsilon_a epsilon_b epsilon_c t") f0 = sp.symbols("f_0") xi1 = (1+t*ea)*X1 xi2 = (1-t*eb)*X2 xi3 = (1-t*ec)*X3 xi = Matrix([xi1, xi2, xi3]) x = Q*xi X = Matrix([X1,X2,X3]) U = Matrix([[diff(i,j) for j in X] for i in xi]) display("Matrix U appearing in the Right polar decomposition of the deformation gradient F") display("U =", U) Udot = diff(U,t) display("Udot =",Udot) F = Matrix([[diff(i,j) for j in X] for i in x]) display("Deformation gradient F =",F) V = F*Q.T display("Matrix V appearing in the Right polar decomposition of the deformation gradient F") display("V =",V) Fdot = diff(F,t) display("Fdot =",Fdot) L = Fdot*F.inv() display("L =",L) display("L @t=0.5 = ", L.subs({t:0.5})) display("L @t=1 = ", L.subs({t:1})) Dd = 1/2*(L+L.T) display("Symmetric part of L", Dd) Elagrange = 1/2*(F.T*F-eye(3)) display("Green Strain =",Elagrange) Elagrangedot = diff(Elagrange,t) display("Green Strain Rate =",Elagrangedot) sigmalocal = Matrix([[t*f0/(b*c*(1-t*eb)*(1-t*ec)),0,0],[0,0,0],[0,0,0]]) Cauchy = Q*sigmalocal*Q.T display("Cauchy stress =",Cauchy) display("Cauchy stress @t=0:",Cauchy.subs({t:0})) display("Cauchy stress @t=0.5:",Cauchy.subs({t:0.5})) display("Cauchy stress @t=1:",Cauchy.subs({t:1})) P = simplify(det(F)*Cauchy*F.T.inv()) display("P =",P) display("P @ t=0",P.subs({t:0})) display("P @ t=0.5",P.subs({t:0.5})) display("P @ t=1",P.subs({t:1})) S = F.inv()*P display("S =",S) display("S @ t=0",S.subs({t:0})) display("S @ t=0.5",S.subs({t:0.5})) display("S @ t=1",S.subs({t:1})) # code is the same below e1 = sum([sum([Cauchy[i,j]*Dd[i,j] for i in range(3)]) for j in range(3)]) #e1 = sum([Cauchy[i]*Dd[i] for i in range(9)]) e1 = sum([Cauchy[i]*Dd[i] for i in range(9)]) display("Cauchy",Cauchy,"Dd",Dd) display("D and Cauchy are energy conjugates: dU/dt", e1) e2 = sum([P[i]*Fdot[i] for i in range(9)]) display("P",P,"Fdot",Fdot) display("P and Fdot are energy conjugates: dW/dt", e2) e2 = sum([S[i]*Elagrangedot[i] for i in range(9)]) display("S",S,"E_Green",Elagrangedot) display("S and E_Green are energy conjugates: dW/dt", e2)
Illustrative Example 2: Rotation Accompanied by Extension
Similar to the previous example, assume a block of material that whose length in the reference configuration is , width is , and thickness is . Assume that the block rotates 90 degrees around the edge that is originally parallel to the axis as shown below while a vertical load is applied gradually on the block such that it changes linearly from 0 to during a time period units. Assume that the block deforms linearly with time such that becomes , becomes , and becomes . Let , and . The following are the various stress and deformation measures describing the deformation.
The Deformation Gradient
The 90 degrees rotation can be described by the following matrix:
The deformation can be viewed as an extension along the direction and contractions along the directions and followed by the rotation . The extension and contractions can be described by the matrix :
Therefore, the deformation gradient is given by:
Note that is the right polar decomposition of . Alternatively, the deformation can be viewed as a rotation followed by the same extensions and contractions in the corresponding directions which can be described by the matrix :
The rate of the deformation gradient is given by:
with
and
The Velocity Gradient
The velocity gradient is given by:
While its symmetric part is given by:
The spin tensor is given by:
THE GREEN-LAGRANGE STRAIN
The Green strain is given by:
Its rate is given by:
Note that the Green strain in this example is identical to the Green strain in the previous example! The Green strain gives the strains along the original directions (measured in the undeformed configuration) which are identical for both examples!
THE CAUCHY STRESS TENSOR
In a local coordinate system that is aligned with the main edges of the cube, the Cauchy stress tensor is given by:
Setting , the Cauchy Stress Tensor in the spatial coordinate system is given by:
THE PIOLA KIRCHHOFF STRESS TENSORS
The first Piola Kirchhoff stress tensor is given by:
The first row gives the inclined force (the force in the spatial configuration) per unit original area acting on the area in the undeformed configuration perpendicular to the axis . The second Piola Kirchhoff stress tensor is given by:
The first column gives the components in the reference configuration of the force vector acting on the area perpendicular to the reference axis when the force vector is pulled back to the reference configuration. Note that when the force vector is pulled back, it is now acting in the horizontal direction and is scaled down by the factor . The second Piola Kirchhoff stress tensor is similar to the one obtained in the previous illustrative example!
Energy Conjugates
Similar to the previous illustrative example, the rotation is not accompanied by any strain energy. The extension on the other hand is accompanied by a strain energy component that is equal to:
The energy per unit volume of the undeformed configuration is given by:
The second Piola Kirchhoff stress tensor and the Green strain tensor are energy conjugates of each other. Indeed, can be obtained by integrating the inner product of and :
Alternatively, the same result would be obtained if and are used instead as energy conjugates:
The strain energy rate per unit volume of the deformed configuration can be obtained as the inner product of and :
which is the same result as the previous example! This should not come as a surprise since the two applied load and extension for the two examples are identical.
View Mathematica Code
Q = {{Cos[Pi/2*t], Sin[Pi/2*t], 0}, {-Sin[Pi/2*t], Cos[Pi/2*t], 0}, {0, 0, 1}}; intx = {xi1, xi2, xi3}; X = {X1, X2, X3}; xi1 = (1 + t*ea) X1; xi2 = (1 - t*eb) X2; xi3 = (1 - t*ec) X3; xi = {xi1, xi2, xi3}; x = Q.xi; x // MatrixForm x /. {t -> 1, X2 -> b, X1 -> a, X3 -> c} // MatrixForm U = Table[D[xi[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["The matrix U appearing in the Right Polar Decomposition of the \ Deformation Gradient F:"] U // MatrixForm Udot = D[U, t]; Print["Udot"] Udot // MatrixForm Print["Qdot"] Qdot = D[Q, t]; Qdot // MatrixForm F = Table[D[x[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["The Deformation Gradient F:"] F // MatrixForm Print["The matrix V appearing in the Right Polar Decomposition of the \ Deformation Gradient F:"] V = FullSimplify[F.Transpose[Q]]; V // MatrixForm Fdot = FullSimplify[D[F, t]]; Print["Fdot"] Fdot // MatrixForm L = FullSimplify[Fdot.Inverse[F]]; Print["Velocity gradient (L)"] L // MatrixForm Print["Velocity gradient (L) at t=0.5"] FullSimplify[L /. t -> 0.5] // MatrixForm Print["Velocity gradient (L) at t=1"] FullSimplify[L /. t -> 1] // MatrixForm Dd = FullSimplify[1/2 (L + Transpose[L])]; Print["Symmetric part of Velocity gradient"] Dd // MatrixForm Print["D at t=0.5"] FullSimplify[Dd /. t -> 0.5] // MatrixForm Print["D at t=1"] FullSimplify[Dd /. t -> 1] // MatrixForm Elagrange = FullSimplify[1/2 (Transpose[F].F - IdentityMatrix[3])]; Print["Green Strain"] Elagrange // MatrixForm Elagrangedot = FullSimplify[D[Elagrange, t]]; Print["Green Strain Rate"] Elagrangedot // MatrixForm sigmalocal = {{t*f0/(b*c*(1 - t*eb) (1 - t*ec)), 0, 0}, {0, 0, 0}, {0, 0, 0}}; Cauchy = FullSimplify[Q.sigmalocal.Transpose[Q]]; Print["Cauchy stress"] Cauchy // MatrixForm sigmalocal /. t -> 0 // MatrixForm; sigmalocal /. t -> 0.5 // MatrixForm; sigmalocal /. t -> 1 // MatrixForm; Print["Cauchy stress at t=0"] Cauchy /. t -> 0 // MatrixForm Print["Cauchy stress at t=0.5"] Cauchy /. t -> 0.5 // MatrixForm Print["Cauchy stress at t=1"] Cauchy /. t -> 1 // MatrixForm P = FullSimplify[Det[F]*Cauchy.Inverse[Transpose[F]]]; Print["P"] P // MatrixForm Print["P at t=0"] P /. t -> 0 // MatrixForm Print["P at t=0.5"] P /. t -> 0.5 // MatrixForm Print["P at t=1"] P /. t -> 1 // MatrixForm S = FullSimplify[Inverse[F].P]; Print["S"] S // MatrixForm Print["S at t=0"] S /. t -> 0 // MatrixForm Print["S at t=0.5"] S /. t -> 0.5 // MatrixForm Print["S at t=1"] S /. t -> 1 // MatrixForm Print["Cauchy"] Cauchy // MatrixForm Print["D"] Dd // MatrixForm Print["D and Cauchy are energy conjugates: dU/dt"] e1 = FullSimplify[Sum[Cauchy[[i, j]]*Dd[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["P"] P // MatrixForm Print["Fdot"] Fdot // MatrixForm Print["P and Fdot are energy conjugates: dW/dt"] e2 = FullSimplify[Sum[P[[i, j]]*Fdot[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["S"] S // MatrixForm Print["E-Green"] Elagrangedot // MatrixForm Print["S and E_Green are energy conugates: dW/dt"] e2 = FullSimplify[ Sum[S[[i, j]]*Elagrangedot[[i, j]], {i, 1, 3}, {j, 1, 3}]]
View Python Code
import sympy as sp import numpy as np from sympy import Matrix, simplify, diff, eye, det from matplotlib import pyplot as plt theta = sp.symbols("theta") X1,X2,X3 = sp.symbols("X_1 X_2 X_3") a,b,c = sp.symbols("a b c") ea,eb,ec,t = sp.symbols("epsilon_a epsilon_b epsilon_c t") f0 = sp.symbols("f_0") Q = Matrix([[sp.cos(theta*t), sp.sin(theta*t),0], [-sp.sin(theta*t),sp.cos(theta*t), 0], [0,0,1]]) Q = Q.subs({theta:sp.pi/2}) display("Q =", Q) xi1 = (1+t*ea)*X1 xi2 = (1-t*eb)*X2 xi3 = (1-t*ec)*X3 xi = Matrix([xi1, xi2, xi3]) x = Q*xi X = Matrix([X1,X2,X3]) U = Matrix([[diff(i,j) for j in X] for i in xi]) display("The matrix U appearing in the Right Polar Decomposition of the Deformation Gradient F:") display("U =", U) Udot = diff(U,t) display("Udot =",Udot) F = Matrix([[diff(i,j) for j in X] for i in x]) display("F =",F) V = simplify(F*Q.T) display("The matrix V appearing in the Right Polar Decomposition of the Deformation Gradient F:") display("Deformation gradient F =",V) Fdot = simplify(diff(F,t)) display("Fdot =",Fdot) L = simplify(Fdot*F.inv()) display("L =",L) display("L @t=0.5 = ",L.subs({t:0.5})) display("L @t=1 = ",L.subs({t:1})) Dd = simplify(1/2*(L+L.T)) display("Symmetric part of L", Dd) Elagrange = simplify(1/2*(F.T*F-eye(3))) display("Green Strain =",Elagrange) Elagrangedot = diff(Elagrange,t) display("Green Strain rate =",Elagrangedot) sigmalocal = Matrix([[t*f0/(b*c*(1-t*eb)*(1-t*ec)),0,0],[0,0,0],[0,0,0]]) Cauchy = simplify(Q*sigmalocal*Q.T) display("Cauchy stress =",Cauchy) display("Cauchy stress @t=0:",Cauchy.subs({t:0})) display("Cauchy stress @t=0.5:",Cauchy.subs({t:0.5})) display("Cauchy stress @t=1:",Cauchy.subs({t:1})) P = simplify(det(F)*Cauchy*F.T.inv()) display("P =",P) display("P @ t=0",P.subs({t:0})) display("P @ t=0.5",P.subs({t:0.5})) display("P @ t=1",P.subs({t:1})) S = simplify(F.inv()*P) display("S =",S) display("S @ t=0",S.subs({t:0})) display("S @ t=0.5",S.subs({t:0.5})) display("S @ t=1",S.subs({t:1})) e1 = sum([Cauchy[i]*Dd[i] for i in range(9)]) display("P",P,"Fdot",Fdot) display("D and Cauchy are energy conjugates: dU/dt", simplify(e1)) e2 = sum([P[i]*Fdot[i] for i in range(9)]) display("P",P,"Fdot",Fdot) display("P and Fdot are energy conjugates: dW/dt", simplify(e2)) e2 = sum([S[i]*Elagrangedot[i] for i in range(9)]) display("S",S,"E_Green",Elagrangedot) display("S and E_Green are energy conjugates: dW/dt", simplify(e2))
Illustrative Example 3: Extension Followed by Rotation
In this example, the extension of the block with dimensions , and is applied first where the force is increased linearly from zero to which is accompanied by a linearly proportional extension and two linearly proportional contractions in the opposite directions and . Afterwards, a rotation of 90 degrees is applied while the force is kept constant but rotating with the block. The force is assumed to be applied in 1 units of time and the rotation is assumed to be applied in 1 units of time. Since the behaviour is time independent, the magnitude of time is redundant. The different stress and strain measures are studied in each step (extension vs. rotation) separately as follows:
Extension
The Deformation Gradient
During the extension phase, the relationship between the deformed coordinates and the reference coordinates are described as follows:
Therefore, the deformation gradient and its rate are given by:
The Velocity Gradient
The velocity gradient is symmetric and is given by:
In this case, the stretch tensor is equal to .
THE GREEN-LAGRANGE STRAIN
The Green strain and its rate are similar to those obtained in both previous examples:
THE CAUCHY STRESS TENSOR
The Cauchy stress describes the spacial state of stress of the block. In the spacial coordinate system, the Cauchy stress matrix has only one non-zero component and thus at time has the form:
It is important first to note that unlike the load and the deformation are linear in time and thus proportional, the component is nonlinear. In fact, it has an increasing slope (i.e., it is convex). This can easily be shown by noting that the second derivative of with respect to is always positive when :
PIOLA KIRCHHOFF STRESS TENSORS
The first Piola Kirchhoff stress tensor is given by:
is not symmetric. The first column gives the spatial components of the spatial force per unit undeformed area acting on the area perpendicular to the reference axis .
The second Piola Kirchhoff stress tensor is given by:
As mentioned before, the first column gives the components in the reference configuration of the force vector acting on the area perpendicular to the reference axis when the force vector is pulled back to the reference configuration. Note that in this example is similar to in both previous examples.
Energy Conjugates
The deformation energy in the extension part is similar to that obtained in the previous two examples:
The energy per unit volume of the undeformed configuration is given by:
The second Piola Kirchhoff stress tensor and the Green strain tensor are energy conjugates of each other. Note that both measures are identical to the ones obtained in the previous examples! Indeed, can be obtained by integrating the inner product of and :
Alternatively, the same result would be obtained if and are used instead as energy conjugates:
The strain energy rate per unit volume of the deformed configuration can be obtained as the inner product of and :
which is the same result as the previous two examples! This should not come as a surprise since the applied load and extension for the examples are identical.
ROTATION
THE DEFORMATION GRADIENT
During the rotation phase, the relationship between the deformed coordinates and the reference coordinates are described as follows:
Where the polar decomposition is arises naturally. Note that is a function of which takes values while is constant during that phase.
Therefore, the deformation gradient and its rate are given by:
THE VELOCITY GRADIENT
The velocity gradient is kewsymmetric and is given by:
In this case, the stretch tensor is equal to zero.
THE GREEN-LAGRANGE STRAIN
The Green strain stays constant with its rate equal to zero!
THE CAUCHY STRESS TENSOR
The Cauchy stress describes the spacial state of stress of the block. In the spacial coordinate system, the Cauchy stress matrix has the form:
Where which, unlike the previous example, is constant in time.
PIOLA KIRCHHOFF STRESS TENSORS
The first Piola Kirchhoff stress tensor is given by:
The second Piola Kirchhoff stress tensor is constant (i.e., not a function of ):
As mentioned before, the first column gives the components in the reference configuration of the force vector acting on the area perpendicular to the reference axis when the force vector is pulled back to the reference configuration.
ENERGY CONJUGATES
The deformation energy in the rotation part is equal to zero, i.e, the rotation is not accompanied by any increase (or decrease in the internal energy). Noting that , the energy calculated using the Cauchy stress matrix or during rotation are both equal to zero. Similarly, the same result would be obtained if and are used instead as energy conjugates:
View Mathematica Code
(*Extension*) Print["Extension"] xe = {xe1, xe2, xe3}; X = {X1, X2, X3}; xe1 = (1 + t*ea) X1; xe2 = (1 - t*eb) X2; xe3 = (1 - t*ec) X3; F = Table[D[xe[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["F"] F // MatrixForm Print["Lagrange Strain"] Elagrange = FullSimplify[1/2 (Transpose[F].F - IdentityMatrix[3])]; Elagrange // MatrixForm Print["Lagrange Strain Rate"] Elagrangedot = FullSimplify[D[Elagrange, t]]; Elagrangedot // MatrixForm Fdot = FullSimplify[D[F, t]]; Print["F dot"] Fdot // MatrixForm L = FullSimplify[Fdot.Inverse[F]]; Print["Velocity gradient (L)"] L // MatrixForm Dd = FullSimplify[1/2 (L + Transpose[L])]; Print["Symmetric part of Velocity gradient"] Dd // MatrixForm Print["Cauchy"] Cauchy = {{t*f0/(b*c*(1 - t*eb) (1 - t*ec)), 0, 0}, {0, 0, 0}, {0, 0, 0}}; Cauchy // MatrixForm Print["First Piola"] P = FullSimplify[Det[F]*Cauchy.Inverse[Transpose[F]]]; P // MatrixForm Print["Second Piola"] S = FullSimplify[Inverse[F].P]; S // MatrixForm Print["Cauchy"] Cauchy // MatrixForm Print["D"] Dd // MatrixForm Print["D and Cauchy are energy conjugates: dU/dt"] e1 = FullSimplify[Sum[Cauchy[[i, j]]*Dd[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["P"] P // MatrixForm Print["F Dot"] Fdot // MatrixForm Print["P and FDot are energy conjugates: dW/dt"] e2 = FullSimplify[Sum[P[[i, j]]*Fdot[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["S"] S // MatrixForm Print["Green Lagrange Strain Rate"] Elagrangedot // MatrixForm Print["S and the Lagrange strain rate are energy conjugates: dW/dt"] e2 = FullSimplify[ Sum[S[[i, j]]*Elagrangedot[[i, j]], {i, 1, 3}, {j, 1, 3}]] (*Rotation*) Print["Rotation"] xe = xe /. t -> 1; Q = {{Cos[Pi/2*(t-1)], Sin[Pi/2*(t-1)], 0}, {-Sin[Pi/2*(t-1)], Cos[Pi/2*(t-1)],0}, {0, 0, 1}}; x = Q.xe; F = Table[D[x[[i]], X[[j]]], {i, 1, 3}, {j, 1, 3}]; Print["F"] F // MatrixForm Print["Lagrange Strain"] Elagrange = FullSimplify[1/2 (Transpose[F].F - IdentityMatrix[3])]; Elagrange // MatrixForm Print["Lagrange Strain Rate"] Elagrangedot = FullSimplify[D[Elagrange, t]]; Elagrangedot // MatrixForm Fdot = FullSimplify[D[F, t]]; Print["F dot"] Fdot // MatrixForm L = FullSimplify[Fdot.Inverse[F]]; Print["Velocity gradient (L)"] L // MatrixForm Dd = FullSimplify[1/2 (L + Transpose[L])]; Print["Symmetric part of Velocity gradient"] Dd // MatrixForm Print["Cauchy"] sigmalocal = Cauchy /. t -> 1; Cauchy = FullSimplify[Q.sigmalocal.Transpose[Q]]; Cauchy // MatrixForm Print["First Piola"] P = FullSimplify[Det[F]*Cauchy.Inverse[Transpose[F]]]; P // MatrixForm Print["Second Piola"] S = FullSimplify[Inverse[F].P]; S // MatrixForm Print["Cauchy"] Cauchy // MatrixForm Print["D"] Dd // MatrixForm Print["D and Cauchy are energy conjugates: dU/dt"] e1 = FullSimplify[Sum[Cauchy[[i, j]]*Dd[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["P"] P // MatrixForm Print["F Dot"] Fdot // MatrixForm Print["P and FDot are energy conjugates: dW/dt"] e2 = FullSimplify[Sum[P[[i, j]]*Fdot[[i, j]], {i, 1, 3}, {j, 1, 3}]] Print["S"] S // MatrixForm Print["Green Lagrange Strain Rate"] Elagrangedot // MatrixForm Print["S and the Lagrange strain rate are energy conjugates: dW/dt"] e2 = FullSimplify[ Sum[S[[i, j]]*Elagrangedot[[i, j]], {i, 1, 3}, {j, 1, 3}]]
View Python Code
import sympy as sp import numpy as np from sympy import Matrix, simplify, diff, eye, det display("Extension") theta = sp.symbols("theta") X1,X2,X3 = sp.symbols("X_1 X_2 X_3") X = Matrix([X1,X2,X3]) a,b,c = sp.symbols("a b c") ea,eb,ec,t = sp.symbols("epsilon_a epsilon_b epsilon_c t") f0 = sp.symbols("f_0") xe1 = (1+t*ea)*X1 xe2 = (1-t*eb)*X2 xe3 = (1-t*ec)*X3 xe = Matrix([xe1, xe2, xe3]) F = Matrix([[diff(i,j) for j in X] for i in xe]) display("F =",F) Elagrange = simplify(1/2*(F.T*F-eye(3))) display("Lagrange Strain =",Elagrange) Elagrangedot = diff(Elagrange,t) display("Lagrange Strain rate =",Elagrangedot) Fdot = simplify(diff(F,t)) display("Fdot =",Fdot) L = simplify(Fdot*F.inv()) display("Velocity gradient (L) =",L) Dd = simplify(1/2*(L+L.T)) display("Symmetric part of L", Dd) Cauchy = Matrix([[t*f0/(b*c*(1-t*eb)*(1-t*ec)),0,0],[0,0,0],[0,0,0]]) display("Cauchy =",Cauchy) P = simplify(det(F)*Cauchy*F.T.inv()) display("First Piola =",P) S = simplify(F.inv()*P) display("Second Piola =",S) e1 = sum([Cauchy[i]*Dd[i] for i in range(9)]) display("Cauchy",Cauchy,"Dd",Dd) display("D and Cauchy are energy conjugates: dU/dt", simplify(e1)) e2 = sum([P[i]*Fdot[i] for i in range(9)]) display("P",P,"Fdot",Fdot) display("P and Fdot are energy conjugates: dW/dt", simplify(e2)) e2 = sum([S[i]*Elagrangedot[i] for i in range(9)]) display("S",S,"E_Green",Elagrangedot) display("S and E_Green are energy conjugates: dW/dt", simplify(e2)) display("Rotation") xe = xe.subs({t:1}) Q = Matrix([[sp.cos(theta*(t-1)), sp.sin(theta*(t-1)),0], [-sp.sin(theta*(t-1)),sp.cos(theta*(t-1)), 0], [0,0,1]]) Q = Q.subs({theta:sp.pi/2}) display("Q =", Q) x = Q*xe F = Matrix([[diff(i,j) for j in X] for i in x]) display("F =",F) Elagrange = simplify(1/2*(F.T*F-eye(3))) display("Lagrange Strain =",Elagrange) Elagrangedot = diff(Elagrange,t) display("Lagrange Strain rate =",Elagrangedot) Fdot = simplify(diff(F,t)) display("Fdot =",Fdot) L = simplify(Fdot*F.inv()) display("Velocity gradient (L) =",L) Dd = simplify(1/2*(L+L.T)) display("Symmetric part of L", Dd) sigmalocal = Cauchy.subs({t:1}) Cauchy = simplify(Q*sigmalocal*Q.T) display("Cauchy =",Cauchy) P = simplify(det(F)*Cauchy*F.T.inv()) display("First Piola =",P) S = simplify(F.inv()*P) display("Second Piola =",S) e1 = sum([Cauchy[i]*Dd[i] for i in range(9)]) display("Cauchy",Cauchy,"Dd",Dd) display("D and Cauchy are energy conjugates: dU/dt", simplify(e1)) e2 = sum([P[i]*Fdot[i] for i in range(9)]) display("P",P,"Fdot",Fdot) display("P and Fdot are energy conjugates: dW/dt", simplify(e2)) e2 = sum([S[i]*Elagrangedot[i] for i in range(9)]) display("S",S,"E_Green",Elagrangedot) display("S and E_Green are energy conjugates: dW/dt", simplify(e2))
Video:
Quiz-Strain Energy
Problems
Let a deformation be described by , i.e., a rotation that is a function of time and an extension that is constant. If is the first Piola Kirchhoff stress tensor, show that .