Laminate stiffness matrix: features

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 a random rotation about the z-axis...

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

...showing no diffence, implying isotropy in the x-y plane

TOC Next Prev

Disclaimer:This site is designed for educational purposes only. There are most likely errors, mistakes, typos, and poorly crafted statements that are not detected yet... www.ntnu.edu/employees/nils.p.vedvik

Copyright 2024, All rights reserved