TMM4175 Polymer Composites

Home About Python Links Next Previous Table of Contents

Features of the laminate stiffness matrix

See the Computational procedures for description of the functions imported from laminatelib

In [1]:
import numpy as np
from laminatelib import laminateStiffnessMatrix

General laminate:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & A_{xs} & B_{xx} & B_{xy} & B_{xs} \\ A_{xy} & A_{yy} & A_{ys} & B_{xy} & B_{yy} & B_{ys} \\ A_{xs} & A_{ys} & A_{ss} & B_{xs} & B_{ys} & B_{ss} \\ B_{xx} & B_{xy} & B_{xs} & D_{xx} & D_{xy} & D_{xs} \\ B_{xy} & B_{yy} & B_{ys} & D_{xy} & D_{yy} & D_{ys} \\ B_{xs} & B_{ys} & B_{ss} & D_{xs} & D_{ys} & D_{ss} \end{bmatrix} \end{equation}
In [2]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup1= [ {'mat':m1 , 'ori': 30  , 'thi':1} , 
          {'mat':m1 , 'ori': 10  , 'thi':1} ,
          {'mat':m1 , 'ori': 80  , 'thi':1}  ]

ABD1 = laminateStiffnessMatrix(layup1)
print(np.array2string(ABD1, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[228434.   39790.   64227.  -74414.  -19771.  -40703.]
 [ 39790.  163014.   37179.  -19771.  113957.    6422.]
 [ 64227.   37179.   45732.  -40703.    6422.  -19771.]
 [-74414.  -19771.  -40703.  114164.   36433.   48354.]
 [-19771.  113957.    6422.   36433.  166242.   39128.]
 [-40703.    6422.  -19771.   48354.   39128.   40889.]]

Symmetric laminate:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & A_{xs} & 0 & 0 & 0 \\ A_{xy} & A_{yy} & A_{ys} & 0 & 0 & 0 \\ A_{xs} & A_{ys} & A_{ss} & 0 & 0 & 0 \\ 0 & 0 & 0 & D_{xx} & D_{xy} & D_{xs} \\ 0 & 0 & 0 & D_{xy} & D_{yy} & D_{ys} \\ 0 & 0 & 0 & D_{xs} & D_{ys} & D_{ss} \end{bmatrix} \end{equation}
In [3]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup2= [ {'mat':m1 , 'ori': 30  , 'thi':1} , 
          {'mat':m1 , 'ori': 90  , 'thi':1} ,
          {'mat':m1 , 'ori': 30  , 'thi':1}  ]

ABD2 = laminateStiffnessMatrix(layup2)
print(np.array2string(ABD2, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[179606.   55908.   83704.       0.       0.       0.]
 [ 55908.  179606.   29607.       0.       0.       0.]
 [ 83704.   29607.   61849.       0.       0.       0.]
 [     0.       0.       0.  184509.   57547.   90680.]
 [     0.       0.       0.   57547.   53668.   32075.]
 [     0.       0.       0.   90680.   32075.   62004.]]

Balanced laminate:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & B_{xx} & B_{xy} & B_{xs} \\ A_{xy} & A_{yy} & 0 & B_{xy} & B_{yy} & B_{ys} \\ 0 & 0 & A_{ss} & B_{xs} & B_{ys} & B_{ss} \\ B_{xx} & B_{xy} & B_{xs} & D_{xx} & D_{xy} & D_{xs} \\ B_{xy} & B_{yy} & B_{ys} & D_{xy} & D_{yy} & D_{ys} \\ B_{xs} & B_{ys} & B_{ss} & D_{xs} & D_{ys} & D_{ss} \end{bmatrix} \end{equation}
In [4]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup3= [ {'mat':m1 , 'ori':  30  , 'thi':1} , 
          {'mat':m1 , 'ori':  80  , 'thi':1} ,
          {'mat':m1 , 'ori': -30  , 'thi':1},
          {'mat':m1 , 'ori': -80  , 'thi':1}]

ABD3 = laminateStiffnessMatrix(layup3)
print(np.array2string(ABD3, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[190255.   66234.       0.  -74414.  -19771.  -86003.]
 [ 66234.  305314.       0.  -19771.  113957.  -72059.]
 [     0.       0.   74157.  -86003.  -72059.  -19771.]
 [-74414.  -19771.  -86003.  253673.   88312.   81405.]
 [-19771.  113957.  -72059.   88312.  407086.  -12844.]
 [-86003.  -72059.  -19771.   81405.  -12844.   98875.]]

Symmetric and balanced laminate:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & 0 & 0 & 0 \\ A_{xy} & A_{yy} & 0 & 0 & 0 & 0 \\ 0 & 0 & A_{ss} & 0 & 0 & 0 \\ 0 & 0 & 0 & D_{xx} & D_{xy} & D_{xs} \\ 0 & 0 & 0 & D_{xy} & D_{yy} & D_{ys} \\ 0 & 0 & 0 & D_{xs} & D_{ys} & D_{ss} \end{bmatrix} \end{equation}
In [5]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup4= [ {'mat':m1 , 'ori':  30  , 'thi':1} , 
          {'mat':m1 , 'ori': -30  , 'thi':1} ,
          {'mat':m1 , 'ori': -30  , 'thi':1},
          {'mat':m1 , 'ori':  30  , 'thi':1}]

ABD4 = laminateStiffnessMatrix(layup4)
print(np.array2string(ABD4, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[339083.  105776.       0.       0.       0.       0.]
 [105776.   77401.       0.       0.       0.       0.]
 [     0.       0.  113699.       0.       0.       0.]
 [     0.       0.       0.  452111.  141035.  167409.]
 [     0.       0.       0.  141035.  103202.   59215.]
 [     0.       0.       0.  167409.   59215.  151598.]]

Anti-Symmetric laminate:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & 0 & 0 & B_{xs} \\ A_{xy} & A_{yy} & 0 & 0 & 0 & B_{ys} \\ 0 & 0 & A_{ss} & B_{xs} & B_{ys} & 0 \\ 0 & 0 & B_{xs} & D_{xx} & D_{xy} & 0 \\ 0 & 0 & B_{ys} & D_{xy} & D_{yy} & 0 \\ B_{xs} & B_{ys} & 0 & 0 & 0 & D_{ss} \end{bmatrix} \end{equation}
In [6]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup5= [ {'mat':m1 , 'ori': -30  , 'thi':1} , 
          {'mat':m1 , 'ori':  30  , 'thi':1} ,]

ABD5 = laminateStiffnessMatrix(layup5)
print(np.array2string(ABD5, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[169542.   52888.       0.       0.       0.   41852.]
 [ 52888.   38701.       0.       0.       0.   14804.]
 [     0.       0.   56849.   41852.   14804.       0.]
 [     0.       0.   41852.   56514.   17629.       0.]
 [     0.       0.   14804.   17629.   12900.       0.]
 [ 41852.   14804.       0.       0.       0.   18950.]]

The components $B_{xs}$ and $B_{ys}$ cause a coupling between normal forces and twist deformation ($\kappa_{xy}$):

In [7]:
loads=[1000, 0, 0, 0, 0, 0]

deformations = np.linalg.solve(ABD5, loads)

print(deformations)
[ 0.01610796 -0.01198669  0.          0.          0.         -0.0262117 ]

Now, if we double the number of layers while keeping the total thickness of the laminate constant:

In [8]:
layup5b= [ {'mat':m1 , 'ori': -30  , 'thi':0.5} , 
           {'mat':m1 , 'ori':  30  , 'thi':0.5} ,
           {'mat':m1 , 'ori': -30  , 'thi':0.5} ,
           {'mat':m1 , 'ori':  30  , 'thi':0.5} ]


ABD5b = laminateStiffnessMatrix(layup5b)
print(np.array2string(ABD5b, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[169542.   52888.       0.       0.       0.   20926.]
 [ 52888.   38701.       0.       0.       0.    7402.]
 [     0.       0.   56849.   20926.    7402.       0.]
 [     0.       0.   20926.   56514.   17629.       0.]
 [     0.       0.    7402.   17629.   12900.       0.]
 [ 20926.    7402.       0.       0.       0.   18950.]]

... the components $B_{xs}$ and $B_{ys}$ are reduced by a factor 1/2, while all other components remain the same.

With an increased number of layers in an anti-symmetric laminate, the coupling terms approace zero (relatively to the other terms):

In [9]:
n, Bxs, Bys = [],[],[]
for k in (1,2,3,4,6,10):
    layup5c=[]
    for i in range(0,k):
        tk=1/k
        layup5c.append( {'mat':m1 , 'ori': -30  , 'thi':tk} ) 
        layup5c.append( {'mat':m1 , 'ori':  30  , 'thi':tk} )
    ABD5c = laminateStiffnessMatrix(layup5c)
    Bxs.append(ABD5c[0,5])
    Bys.append(ABD5c[1,5])
    n.append(2*k)

import matplotlib.pyplot as plt
%matplotlib inline
fig,ax=plt.subplots(figsize=(6,3))
ax.plot(n,Bxs,label='Bxs')
ax.plot(n,Bys,label='Bys')
ax.set_xlabel('No. of layers',fontsize=12)
ax.set_ylabel('Bxs, Bys', fontsize=12)
ax.set_xlim(2,20)
ax.set_ylim(0,)
ax.grid(True)
ax.legend()
plt.show()

The coupling terms $B_{xs}$ and $B_{ys}$ as function of $\theta$ for a laminate [-$\theta$/+$\theta$]:

In [10]:
Bxs,Bys = [],[]
thetas=np.linspace(-90,90,180)
for theta in thetas:
    layup5d= [{'mat':m1 , 'ori': -theta  , 'thi':1},
              {'mat':m1 , 'ori':  theta  , 'thi':1} ]
    ABD5d = laminateStiffnessMatrix(layup5d)
    Bxs.append(ABD5d[0,5])
    Bys.append(ABD5d[1,5])

import matplotlib.pyplot as plt
%matplotlib inline
fig,ax=plt.subplots(figsize=(6,3))
ax.plot(thetas,Bxs,label='Bxs')
ax.plot(thetas,Bys,label='Bys')
ax.set_xlabel(r'$\theta$',fontsize=12)
ax.set_ylabel('Bxs', fontsize=12)
ax.set_xlim(-90,90)
ax.grid(True)
ax.legend()
plt.show()

(0/90)n laminates:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & B_{xx} & 0 & 0 \\ A_{xy} & A_{yy} & 0 & 0 & B_{yy} & 0 \\ 0 & 0 & A_{ss} & 0 & 0 & 0 \\ B_{xx} & 0 & 0 & D_{xx} & D_{xy} & 0 \\ 0 & B_{yy} & 0 & D_{xy} & D_{yy} & 0 \\ 0 & 0 & 0 & 0 & 0 & D_{ss} \end{bmatrix} \end{equation}
In [11]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup6a= [{'mat':m1 , 'ori':   0  , 'thi':1} , 
          {'mat':m1 , 'ori':  90  , 'thi':1} ]

layup6b= [{'mat':m1 , 'ori':   0  , 'thi':0.5} , 
          {'mat':m1 , 'ori':  90  , 'thi':0.5} ,
          {'mat':m1 , 'ori':   0  , 'thi':0.5},
          {'mat':m1 , 'ori':  90  , 'thi':0.5}]


ABD6a = laminateStiffnessMatrix(layup6a)
print('[0/90], total thickness = 2:\n')
print(np.array2string(ABD6a, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )

print()

ABD6b = laminateStiffnessMatrix(layup6b)
print('[0/90/0/90], total thickness = 2:\n')
print(np.array2string(ABD6b, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[0/90], total thickness = 2:

[[150971.    6039.       0.  -65421.      -0.       0.]
 [  6039.  150971.       0.       0.   65421.       0.]
 [     0.       0.   10000.       0.       0.       0.]
 [-65421.      -0.       0.   50324.    2013.       0.]
 [     0.   65421.       0.    2013.   50324.       0.]
 [     0.       0.       0.       0.       0.    3333.]]

[0/90/0/90], total thickness = 2:

[[150971.    6039.       0.  -32710.      -0.       0.]
 [  6039.  150971.       0.       0.   32710.       0.]
 [     0.       0.   10000.       0.       0.       0.]
 [-32710.      -0.       0.   50324.    2013.       0.]
 [     0.   32710.       0.    2013.   50324.       0.]
 [     0.       0.       0.       0.       0.    3333.]]

(0/90)ns laminates:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & 0 & 0 & 0 \\ A_{xy} & A_{yy} & 0 & 0 & 0 & 0 \\ 0 & 0 & A_{ss} & 0 & 0 & 0 \\ 0 & 0 & 0 & D_{xx} & D_{xy} & 0 \\ 0 & 0 & 0 & D_{xy} & D_{yy} & 0 \\ 0 & 0 & 0 & 0 & 0 & D_{ss} \end{bmatrix} \end{equation}
In [12]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup7= [ {'mat':m1 , 'ori':   0  , 'thi':1} , 
          {'mat':m1 , 'ori':  90  , 'thi':1} ,
          {'mat':m1 , 'ori':  90  , 'thi':1},
          {'mat':m1 , 'ori':   0  , 'thi':1}]

ABD7 = laminateStiffnessMatrix(layup7)
print(np.array2string(ABD7, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[301941.   12078.       0.       0.       0.       0.]
 [ 12078.  301941.       0.       0.       0.       0.]
 [     0.       0.   20000.       0.       0.       0.]
 [     0.       0.       0.  664270.   16104.       0.]
 [     0.       0.       0.   16104.  140906.       0.]
 [     0.       0.       0.       0.       0.   26667.]]

Quazi-isotropic laminates:

\begin{equation} \begin{bmatrix} \mathbf{A} & \mathbf{B} \\ \mathbf{B} & \mathbf{D} \end{bmatrix} = \begin{bmatrix} A_{xx} & A_{xy} & 0 & 0 & 0 & 0 \\ A_{xy} & A_{yy} & 0 & 0 & 0 & 0 \\ 0 & 0 & A_{ss} & 0 & 0 & 0 \\ 0 & 0 & 0 & D_{xx} & D_{xy} & D_{xs} \\ 0 & 0 & 0 & D_{xy} & D_{yy} & D_{ys} \\ 0 & 0 & 0 & D_{xs} & D_{ys} & D_{ss} \end{bmatrix} \end{equation}

where

\begin{equation} A_{yy}=A_{xx}, \quad A_{ss} = \frac{(A_{xx}-A_{xy})}{2} \end{equation}
In [13]:
# Material:
m1={'E1':140000, 'E2':10000, 'v12':0.3, 'G12':5000}

layup8  = [ {'mat':m1 , 'ori':   0  , 'thi':1} , 
            {'mat':m1 , 'ori': -45  , 'thi':1} ,
            {'mat':m1 , 'ori':  45  , 'thi':1} ,
            {'mat':m1 , 'ori':  90  , 'thi':1} ,
            {'mat':m1 , 'ori':  90  , 'thi':1} ,
            {'mat':m1 , 'ori':  45  , 'thi':1} ,
            {'mat':m1 , 'ori': -45  , 'thi':1} ,
            {'mat':m1 , 'ori':   0  , 'thi':1} ,]

ABD8 = laminateStiffnessMatrix(layup8)
print(np.array2string(ABD8, precision=0, suppress_small=True, separator='  ', floatmode='maxprec_equal') )
[[ 478950.   149087.        0.        0.        0.        0.]
 [ 149087.   478950.        0.       -0.       -0.        0.]
 [      0.        0.   164932.        0.        0.        0.]
 [      0.        0.        0.  4249427.   670199.  -261682.]
 [     -0.       -0.        0.   670199.  1109240.  -261682.]
 [      0.        0.        0.  -261682.  -261682.   754704.]]

Consider the A submatrix:

In [14]:
A=ABD8[0:3,0:3]
print(np.round(A))
[[478950. 149087.      0.]
 [149087. 478950.      0.]
 [     0.      0. 164932.]]

...and we do a random rotation about the z-axis, we find that

In [15]:
from laminatelib import Q2Dtransform
A_rotated=Q2Dtransform(A,13.543)
print(np.round(A_rotated))
[[478950. 149087.     -0.]
 [149087. 478950.      0.]
 [     0.     -0. 164932.]]

...it is the same as before, implying that we have isotropy in the x-y plane

Disclaimer:This site is about polymer composites, designed for educational purposes. Consumption and use of any sort & kind is solely at your own risk.
Fair use: I spent some time making all the pages, and even the figures and illustrations are my own creations. Obviously, you may steal whatever you find useful here, but please show decency and give some acknowledgment if or when copying. Thanks! Contact me: nils.p.vedvik@ntnu.no www.ntnu.edu/employees/nils.p.vedvik

Copyright 2021, All right reserved, I guess.