Deformation gradient
The deformation gradient is the derivative of the deformed coordinates with respect to the undeformed coordinates.
Note
In the 2D case, a plane strain state is assumed. This implies \(F_{zz}=1\).
>>> import numpy as np
>>> import sympy as sy
>>> import conforce_gen.expressions as expr
Undeformed
The deformation gradient of the undeformed state in 2D is the identity matrix.
>>> F_undeformed = expr.eval_F(2, sy.ZeroMatrix(2, 2))
>>> F_undeformed
Matrix([
[1, 0],
[0, 1]])
In order to integrate over a volume, the volume change is required. The change in volume is computed using the determinant of the deformation gradient, which is
>>> sy.det(F_undeformed)
1
for the undeformed state. So the volume does not change.
Deformed
However, for a deformation of \(\varepsilon_{xx}=0.2; \gamma_{xy}=0.1\), the deformation gradient is
>>> F_deformed = expr.eval_F(2, sy.Matrix([[0.2, 0.1], [0, 0]]))
>>> F_deformed
Matrix([
[1.2, 0.1],
[ 0, 1]])
and its determinat
>>> float(sy.det(F_deformed))
1.2
states that the volume increases by a factor of 1.2. Note, that the tensile strain \(\varepsilon_{xx}=0.2\) results in a volume change. The simple shear \(\gamma_{xy}=0.1\) does not contribute to the volume change.
Pure shear
However, a pure shear deformation of \(\gamma_{xy}=0.1\) without a tensile strain would decrease the volume by a factor of
>>> float(sy.det(expr.eval_F(2, sy.Matrix([[0.0, 0.1], [0.1, 0]]))))
0.99
Transformation
The deformation gradient is a linear transformation from the undeformed to the deformation state. Considering a simple shear deformation,
>>> F = expr.eval_F(2, sy.Matrix([[0.0, 0.1], [0.0, 0]]))
>>> F
Matrix([
[1, 0.1],
[0, 1]])
the points of the undeformed unit square can be transformed to the deformed state by a vector matrix multiplication. The “@”-symbol stands for a matrix multiplication.
>>> X_unit_square = np.array([
... [0, 0],
... [0, 1],
... [1, 1],
... [1, 0],
... ])
>>> X_deformed_unit_square = X_unit_square @ F.T
>>> X_deformed_unit_square
Matrix([
[ 0, 0],
[0.1, 1],
[1.1, 1],
[ 1, 0]])
For the back transformation from the deformed to the undeformed state, the inverse of the deformation gradient is used.
>>> np.array(X_deformed_unit_square @ F.inv().T, dtype=float)
array([[0., 0.],
[0., 1.],
[1., 1.],
[1., 0.]])