Example Problem 1 page 399 from Mark. E. Tuttle's, "Structural Analysis of Polymeric Composite Materials", first edition.


In [2]:
import pyPLY

# see other examples for the parameters meaning

GraphiteEpoxy = pyPLY.CompositeMaterial()
GraphiteEpoxy.define("GraphiteEpoxy", "metric", E11=170e9, E22=10e9, G12=13e9, niu12=0.3, thk=0.125e-3,
             Sigma_ut0 = 1500e6, Sigma_uc0 = 1200e6, Sigma_ut90 = 50e6, Sigma_uc90 = 100e6, Tau_u = 75e6,
             alpha_11 = -0.9e-6, alpha_22 = 27.0e-6, beta_11 = 150e-6, beta_22 = 4800e-6)

layer1 = pyPLY.Lamina()
layer2 = pyPLY.Lamina()
layer3 = pyPLY.Lamina()
layer4 = pyPLY.Lamina()
layer5 = pyPLY.Lamina()
layer6 = pyPLY.Lamina()

layer1.define("Layer_1", 1, 0)
layer2.define("Layer_2", 1, 30)
layer3.define("Layer_3", 1, 60)
layer4.define("Layer_4", 1, 60)
layer5.define("Layer_5", 1, 30)
layer6.define("Layer_6", 1, 0)

layer1.update()
layer2.update()
layer3.update()
layer4.update()
layer5.update()
layer6.update()

laminate1 = pyPLY.Laminate()
laminate1.add_Lamina(layer1)
laminate1.add_Lamina(layer2)
laminate1.add_Lamina(layer3)
laminate1.add_Lamina(layer4)
laminate1.add_Lamina(layer5)
laminate1.add_Lamina(layer6)

laminate1.update()

load1 = pyPLY.Loading()
criterion1 = pyPLY.PlyFailure()

Results:

Apply a change in temperature of $\Delta T=-155.0^\circ C.$


In [3]:
load1.change_Load(0,0,0,0,0,0,-155.0,0)
load1.apply_To(laminate1)

and the results are...


In [4]:
print "     plyNo", "sigma11", "      sigma22", "    tau12"
for i in range (0, 6):
    stress = load1.list_ply_stresses_12[i*3 + 0]
    print "bottom  ", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])
    stress = load1.list_ply_stresses_12[i*3 + 1]
    print "centroid", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])
    stress = load1.list_ply_stresses_12[i*3 + 2]
    print "top     ", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])


     plyNo sigma11       sigma22     tau12
bottom   1 -5.554e+07 +2.8356e+07 +2.283e+07
centroid 1 -5.554e+07 +2.8356e+07 +2.283e+07
top      1 -5.554e+07 +2.8356e+07 +2.283e+07
bottom   2 +2.959e+07 +2.4788e+07 -1.863e-08
centroid 2 +2.959e+07 +2.4788e+07 -1.863e-08
top      2 +2.959e+07 +2.4788e+07 -1.863e-08
bottom   3 -5.554e+07 +2.8356e+07 -2.283e+07
centroid 3 -5.554e+07 +2.8356e+07 -2.283e+07
top      3 -5.554e+07 +2.8356e+07 -2.283e+07
bottom   4 -5.554e+07 +2.8356e+07 -2.283e+07
centroid 4 -5.554e+07 +2.8356e+07 -2.283e+07
top      4 -5.554e+07 +2.8356e+07 -2.283e+07
bottom   5 +2.959e+07 +2.4788e+07 -1.863e-08
centroid 5 +2.959e+07 +2.4788e+07 -1.863e-08
top      5 +2.959e+07 +2.4788e+07 -1.863e-08
bottom   6 -5.554e+07 +2.8356e+07 +2.283e+07
centroid 6 -5.554e+07 +2.8356e+07 +2.283e+07
top      6 -5.554e+07 +2.8356e+07 +2.283e+07

In [5]:
load1.change_Load(1,0,0,0,0,0,0,0)
load1.apply_To(laminate1)

In [6]:
print "     plyNo", "sigma11", "      sigma22", "    tau12"
for i in range (0, 6):
    stress = load1.list_ply_stresses_12[i*3 + 0]
    print "bottom  ", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])
    stress = load1.list_ply_stresses_12[i*3 + 1]
    print "centroid", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])
    stress = load1.list_ply_stresses_12[i*3 + 2]
    print "top     ", i+1, '{0:+.4}'.format(stress[0,0]), '{0:+.4e}'.format(stress[1,0]), '{0:+.4}'.format(stress[2,0])


     plyNo sigma11       sigma22     tau12
bottom   1 +2750.0 +5.1930e+01 -174.7
centroid 1 +2750.0 +5.1930e+01 -174.7
top      1 +2750.0 +5.1930e+01 -174.7
bottom   2 +1112.0 +1.2059e+02 -264.6
centroid 2 +1112.0 +1.2059e+02 -264.6
top      2 +1112.0 +1.2059e+02 -264.6
bottom   3 -209.8 +1.7598e+02 -89.85
centroid 3 -209.8 +1.7598e+02 -89.85
top      3 -209.8 +1.7598e+02 -89.85
bottom   4 -209.8 +1.7598e+02 -89.85
centroid 4 -209.8 +1.7598e+02 -89.85
top      4 -209.8 +1.7598e+02 -89.85
bottom   5 +1112.0 +1.2059e+02 -264.6
centroid 5 +1112.0 +1.2059e+02 -264.6
top      5 +1112.0 +1.2059e+02 -264.6
bottom   6 +2750.0 +5.1930e+01 -174.7
centroid 6 +2750.0 +5.1930e+01 -174.7
top      6 +2750.0 +5.1930e+01 -174.7

An additional force $Nx = 123 \times 10^3 N/m$ is applied:


In [7]:
load1.change_Load(123.0e3,0,0,0,0,0,-155.0,0)
load1.apply_To(laminate1)

Apply Maximum Stress Criterion for each ply.
(lamina failed if any of these results/vector components are bigger than 1.0 or smaller than -1.0)

Applying a criterion result in three vectors (lists in Python): ret_bottom, ret_centroid, ret_top each of them containing three values. I.e. ret_centroid is a list of 3 components:

  • $\sigma_{11} / \sigma_{uc/t0}$
  • $\sigma_{22} / \sigma_{uc/t90}$
  • $\tau_{12} / \tau_{u}$
where i.e. $\sigma_{uc/t0}$ is the ultimate stress in 0 direction measured in compression or tension.


In [8]:
criterion1.MaxStressCrit(load1, 0)
print "------------------------layer 1--------------------------"
print "criterion1.ret_centroid = ", '{0:.4}'.format(criterion1.ret_centroid[0]), \
'{0:.4}'.format(criterion1.ret_centroid[1]),'{0:.4}'.format(criterion1.ret_centroid[2])

criterion1.MaxStressCrit(load1, 1)
print "------------------------layer 2---------------------------"
print "criterion1.ret_centroid = ", '{0:.4}'.format(criterion1.ret_centroid[0]), \
'{0:.4}'.format(criterion1.ret_centroid[1]),'{0:.4}'.format(criterion1.ret_centroid[2])

criterion1.MaxStressCrit(load1, 2)
print "------------------------layer 3--------------------------"
print "criterion1.ret_centroid = ", '{0:.4}'.format(criterion1.ret_centroid[0]), \
'{0:.4}'.format(criterion1.ret_centroid[1]),'{0:.4}'.format(criterion1.ret_centroid[2])
criterion1.MaxStressCrit(load1, 3)
print "------------------------layer 4---------------------------"
print "criterion1.ret_centroid = ", '{0:.4}'.format(criterion1.ret_centroid[0]), \
'{0:.4}'.format(criterion1.ret_centroid[1]),'{0:.4}'.format(criterion1.ret_centroid[2])

criterion1.MaxStressCrit(load1, 4)
print "------------------------layer 5--------------------------"
print "criterion1.ret_centroid = ", '{0:.4}'.format(criterion1.ret_centroid[0]), \
'{0:.4}'.format(criterion1.ret_centroid[1]),'{0:.4}'.format(criterion1.ret_centroid[2])

criterion1.MaxStressCrit(load1, 5)
print "------------------------layer 6---------------------------"
print "criterion1.ret_centroid = ", criterion1.ret_centroid
print "---------------------------------------------------------"


------------------------layer 1--------------------------
criterion1.ret_centroid =  0.1884 0.6949 0.01787
------------------------layer 2---------------------------
criterion1.ret_centroid =  0.1109 0.7924 0.4339
------------------------layer 3--------------------------
criterion1.ret_centroid =  -0.06779 1.0 0.4518
------------------------layer 4---------------------------
criterion1.ret_centroid =  -0.06779 1.0 0.4518
------------------------layer 5--------------------------
criterion1.ret_centroid =  0.1109 0.7924 0.4339
------------------------layer 6---------------------------
criterion1.ret_centroid =  [0.18843847230687527, 0.69487034081253762, 0.017871359343325663]
---------------------------------------------------------

The same results put in a much nicer form:


In [9]:
from pyPLYTools import LXMatrix
from IPython.display import Latex

data = '$\\begin{array}{|c|c|c|c|} \\hline' + '\n'
data = data + 'PlyNo & \\sigma_{11} / \\sigma_{u0} & \\sigma_{22} / \\sigma_{u90} & \\tau_{12} / \\tau_{u} \\\\ \\hline \n'

for i in range(6):
    criterion1.MaxStressCrit(load1, i)
    data = data + ' ply~' + str(i) +  ' & ' + '{0:.4}'.format(criterion1.ret_centroid[0]) +  ' & ' +  \
    '{0:.4}'.format(criterion1.ret_centroid[1]) +  ' & ' +  '{0:.4}'.format(criterion1.ret_centroid[2]) + ' \\\\' + '\n'
data = data + '\\hline \\end{array}$'    

Latex(data)


Out[9]:
$\begin{array}{|c|c|c|c|} \hline PlyNo & \sigma_{11} / \sigma_{u0} & \sigma_{22} / \sigma_{u90} & \tau_{12} / \tau_{u} \\ \hline ply~0 & 0.1884 & 0.6949 & 0.01787 \\ ply~1 & 0.1109 & 0.7924 & 0.4339 \\ ply~2 & -0.06779 & 1.0 & 0.4518 \\ ply~3 & -0.06779 & 1.0 & 0.4518 \\ ply~4 & 0.1109 & 0.7924 & 0.4339 \\ ply~5 & 0.1884 & 0.6949 & 0.01787 \\ \hline \end{array}$
In these conditions layers 2 and 3 will fail.

In [9]: