Stress Strain Calculation of a Laminate#
This example presents the stress strain calculation of a Laminate using the CLT.
[1]:
import matplotlib.pyplot as plt
import pandas as pd
from composipy import OrthotropicMaterial, LaminateProperty, LaminateStrength
[2]:
# Material
E1 = 137.9e3
E2 = 11.7e3
v12 = 0.31
G12 = 4.82e3
t = 0.1524
#Loads
Nxx = 100
Mxx = 20
# Quasi laminate
stacking = [45, -45, 90, 0]
stacking += stacking[::-1]
# Object definition
material = OrthotropicMaterial(E1, E2, v12, G12, t)
laminate = LaminateProperty(stacking, material)
strength_analysis = LaminateStrength(laminate, Nxx=Nxx, Mxx=Mxx)
Calculating strains at the midplane \(\varepsilon_{0x}\), \(\varepsilon_{0y}\) and \(\gamma_{0xy}\)
[3]:
strength_analysis.epsilon0()
[3]:
array([ 1.52630215e-03, -4.89003289e-04, -1.67758599e-20, 5.46178270e-03,
-2.99304212e-03, -6.90268796e-04])
Calculating strains ply by ply in analysis direction and material direction.
[4]:
df_strain = strength_analysis.calculate_strain()
df_strain.head(10) #display the first 6
[4]:
| ply | z | position | angle | epsilonx | epsilony | gammaxy | epsilon1 | epsilon2 | gamma12 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | -6.10e-01 | bot | 45 | -1.80e-03 | 1.34e-03 | 4.21e-04 | -2.34e-05 | -4.44e-04 | 3.14e-03 |
| 1 | 1 | -4.57e-01 | top | 45 | -9.71e-04 | 8.79e-04 | 3.16e-04 | 1.12e-04 | -2.04e-04 | 1.85e-03 |
| 2 | 2 | -4.57e-01 | bot | -45 | -9.71e-04 | 8.79e-04 | 3.16e-04 | -2.04e-04 | 1.12e-04 | -1.85e-03 |
| 3 | 2 | -3.05e-01 | top | -45 | -1.38e-04 | 4.23e-04 | 2.10e-04 | 3.72e-05 | 2.48e-04 | -5.62e-04 |
| 4 | 3 | -3.05e-01 | bot | 90 | -1.38e-04 | 4.23e-04 | 2.10e-04 | 4.23e-04 | -1.38e-04 | -2.10e-04 |
| 5 | 3 | -1.52e-01 | top | 90 | 6.94e-04 | -3.29e-05 | 1.05e-04 | -3.29e-05 | 6.94e-04 | -1.05e-04 |
| 6 | 4 | -1.52e-01 | bot | 0 | 6.94e-04 | -3.29e-05 | 1.05e-04 | 6.94e-04 | -3.29e-05 | 1.05e-04 |
| 7 | 4 | -5.55e-17 | top | 0 | 1.53e-03 | -4.89e-04 | 2.15e-20 | 1.53e-03 | -4.89e-04 | 2.15e-20 |
| 8 | 5 | -5.55e-17 | bot | 0 | 1.53e-03 | -4.89e-04 | 2.15e-20 | 1.53e-03 | -4.89e-04 | 2.15e-20 |
| 9 | 5 | 1.52e-01 | top | 0 | 2.36e-03 | -9.45e-04 | -1.05e-04 | 2.36e-03 | -9.45e-04 | -1.05e-04 |
Note#
The sequence of the DataFrame starts from the BOTTOM OF THE LAYUP to the TOP OF THE LAYUP. When defining the laminate, the first element of the list corresponds to the bottom-most layer. This is especially important for non-symmetric laminates.
[5]:
plt.grid()
plt.xlabel('strain')
plt.ylabel('ply number')
plt.plot(df_strain['epsilonx'], df_strain['z'], 'k')
[5]:
[<matplotlib.lines.Line2D at 0x1fdb8d998e0>]
Calculating stresses ply by ply in analysis direction and material direction.
[8]:
df_stress = strength_analysis.calculate_stress()
df_stress.head(30) #display the first 6
[8]:
| ply | z | position | angle | sigmax | sigmay | tauxy | sigma1 | sigma2 | tau12 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | -6.10e-01 | bot | 45 | -20.23 | 10.03 | 2.22e-01 | -4.88 | -5.33 | 1.51e+01 |
| 1 | 1 | -4.57e-01 | top | 45 | -2.49 | 15.34 | 8.42e+00 | 14.84 | -1.99 | 8.92e+00 |
| 2 | 2 | -4.57e-01 | bot | -45 | -22.57 | -4.73 | 1.42e+01 | -27.88 | 0.58 | -8.92e+00 |
| 3 | 2 | -3.05e-01 | top | -45 | 1.86 | 7.28 | -1.51e+00 | 6.08 | 3.06 | -2.71e+00 |
| 4 | 3 | -3.05e-01 | bot | 90 | -0.09 | 58.34 | 1.01e+00 | 58.34 | -0.09 | -1.01e+00 |
| 5 | 3 | -1.52e-01 | top | 90 | 8.07 | -2.03 | 5.07e-01 | -2.03 | 8.07 | -5.07e-01 |
| 6 | 4 | -1.52e-01 | bot | 0 | 96.36 | 2.15 | 5.07e-01 | 96.36 | 2.15 | 5.07e-01 |
| 7 | 4 | -5.55e-17 | top | 0 | 210.42 | -0.19 | 1.04e-16 | 210.42 | -0.19 | 1.04e-16 |
| 8 | 5 | -5.55e-17 | bot | 0 | 210.42 | -0.19 | 1.04e-16 | 210.42 | -0.19 | 1.04e-16 |
| 9 | 5 | 1.52e-01 | top | 0 | 324.48 | -2.52 | -5.07e-01 | 324.48 | -2.52 | -5.07e-01 |
| 10 | 6 | 1.52e-01 | bot | 90 | 24.37 | -122.78 | -5.07e-01 | -122.78 | 24.37 | 5.07e-01 |
| 11 | 6 | 3.05e-01 | top | 90 | 32.52 | -183.16 | -1.01e+00 | -183.16 | 32.52 | 1.01e+00 |
| 12 | 7 | 3.05e-01 | bot | -45 | 99.59 | 55.32 | -6.45e+01 | 141.93 | 12.97 | 2.21e+01 |
| 13 | 7 | 4.57e-01 | top | -45 | 124.02 | 67.33 | -8.02e+01 | 175.90 | 15.45 | 2.83e+01 |
| 14 | 8 | 4.57e-01 | bot | 45 | 103.94 | 47.25 | 5.76e+01 | 133.17 | 18.02 | -2.83e+01 |
| 15 | 8 | 6.10e-01 | top | 45 | 121.68 | 52.57 | 6.58e+01 | 152.89 | 21.36 | -3.46e+01 |
Note#
The sequence of the DataFrame starts from the BOTTOM OF THE LAYUP to the TOP OF THE LAYUP. When defining the laminate, the first element of the list corresponds to the bottom-most layer. This is especially important for non-symmetric laminates.
[7]:
plt.grid()
plt.xlabel('stress MPa')
plt.ylabel('ply number')
plt.plot(df_stress['sigmax'], df_stress['z'], 'k')
[7]:
[<matplotlib.lines.Line2D at 0x1fdb8c564e0>]
[ ]: