See the Computational procedures for description of the functions imported from laminatelib
import numpy as np
from laminatelib import laminateStiffnessMatrix
# 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') )
# 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') )
# 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') )
# 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') )
# 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') )
The components $B_{xs}$ and $B_{ys}$ cause a coupling between normal forces and twist deformation ($\kappa_{xy}$):
loads=[1000, 0, 0, 0, 0, 0]
deformations = np.linalg.solve(ABD5, loads)
print(deformations)
Now, if we double the number of layers while keeping the total thickness of the laminate constant:
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') )
... 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):
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$]:
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()
# 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') )
# 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') )
where
\begin{equation} A_{yy}=A_{xx}, \quad A_{ss} = \frac{(A_{xx}-A_{xy})}{2} \end{equation}# 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') )
Consider the A submatrix:
A=ABD8[0:3,0:3]
print(np.round(A))
...and a random rotation about the z-axis...
from laminatelib import Q2Drotate
A_rotated=Q2Drotate(A,13.543)
print(np.round(A_rotated))
...showing no diffence, implying isotropy in the x-y plane