Composipy for strength analysis of a laminate

In this exemple we will use the exercise 6-7 from Analysis and Performance of Fiber Composites by B. Agarwal pg. 244.

[ ]:
from composipy import Ply, Laminate, Load, Strength

Fist, lets consider the following laminate

\([45_{ply1}/0_{ply2}/45_{ply1}]\)

Where \(ply_1\) is \(3 mm\) thick and \(ply_2\) is \(6mm\) thick with the following Elastic and strength characteristics

  • E1 = 19745 MPa

  • E2 = 1980 MPa

  • \(\nu_{12}\) = 0.35

  • G = 700 MPa

  • \(\sigma_1^T\) = 400 Mpa

  • \(\sigma_1^C\) = -250 Mpa

  • \(\sigma_2^T\) = 150 Mpa

  • \(\sigma_2^C\) = -200 Mpa

  • \(\tau_{12}\) = 25 Mpa

Setting the laminate

[ ]:
ply_1 = Ply(19745 , 1980, 0.35, 700, 3, 400, -250, 150, -200, 25,  name='3mm Unidirection Fiber Composite')
ply_2 = Ply(19745 , 1980, 0.35, 700, 6, 400, -250, 150, -200, 25, name='6mm Unidirection Fiber Composite')

Now, defining the laminate

[25]:
layup_1 = [
    (45, ply_1),
    (0, ply_2),
    (45, ply_1)
    ]

laminate_1 = Laminate(layup_1)


print(ply_1,'\n',ply_2)

print('==============================================')

print(laminate_1)
Ply(6mm Unidirection Carbon Fiber, E1 = 19745, E2 = 1980,
            v12 = 0.35, G12 = 700, thickness = 3,
            T1 = 400, C1 = -250, T2 = 150, C2 = -200, S = 25)
 Ply(6mm Unidirection Carbon Fiber, E1 = 19745, E2 = 1980,
            v12 = 0.35, G12 = 700, thickness = 6,
            T1 = 400, C1 = -250, T2 = 150, C2 = -200, S = 25)
==============================================
6mm Unidirection Carbon Fiber 45                  /////
6mm Unidirection Carbon Fiber 0                   =====
6mm Unidirection Carbon Fiber 45                  /////

The \(ABD'\) matrix can be called by the ABD_p atribute

[27]:
laminate_1.ABD_p
[27]:
matrix([[ 7.59007904e-06, -3.56488909e-06, -3.09494584e-06,
         -0.00000000e+00, -0.00000000e+00, -0.00000000e+00],
        [-3.56488909e-06,  3.43738980e-05, -2.36888731e-05,
         -0.00000000e+00, -0.00000000e+00, -0.00000000e+00],
        [-3.09494584e-06, -2.36888731e-05,  4.90937552e-05,
         -0.00000000e+00, -0.00000000e+00, -0.00000000e+00],
        [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00,
          1.62021784e-06, -7.58814609e-07, -7.38051735e-07],
        [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00,
         -7.58814609e-07,  3.01561903e-06, -1.93363381e-06],
        [-0.00000000e+00, -0.00000000e+00, -0.00000000e+00,
         -7.38051735e-07, -1.93363381e-06,  3.80139988e-06]])

Setting the loads

In the exemple, the element is subjected to the following loads

  • Nx = 1000 N/mm

  • Ny = 200 N/m

  • Nxy = 0

  • Mx = 0

  • My = 0

  • Mxy = 0

We will input the loads by using the Load class.

[26]:
loads_1 = Load(1000,200,0,0,0,0)

loads_1
[26]:
Load(Nx = 1000, Ny = 200,  Nxy = 0
                     Mx = 0, My = 0, Mxy = 0)

Checking the strength and elastic parameters of the laminate under load

Now we can analyse the strain and strees in the laminate using the Strength class.

[28]:
analysis = Strength(laminate_1,loads_1)

Let’s see the the mid-plane strain in the load direction (xy) by calling the mid_strain_xy atribute

[29]:
analysis.mid_strain_xy
[29]:
matrix([[ 0.0068771 ],
        [ 0.00330989],
        [-0.00783272],
        [ 0.        ],
        [ 0.        ],
        [ 0.        ]])

Or, in the laminate coordinates (12), by calling mid_strain_12.

[30]:
analysis.mid_strain_12
[30]:
[matrix([[ 0.00117714],
         [ 0.00900986],
         [-0.00356721]]),
 matrix([[ 0.0068771 ],
         [ 0.00330989],
         [-0.00783272]]),
 matrix([[ 0.00117714],
         [ 0.00900986],
         [-0.00356721]])]

Just like that, we can get the stress in all plies for both xy and 12 directions by calling stress_xy or stress_12.

[31]:
analysis.stress_xy
[31]:
[matrix([[26.86723559],
         [21.87314058],
         [ 5.48290432]]),
 matrix([[139.79943108],
         [ 11.46019275],
         [ -5.48290432]]),
 matrix([[26.86723559],
         [21.87314058],
         [ 5.48290432]])]
[32]:
analysis.stress_12
[32]:
[matrix([[29.8530924 ],
         [18.88728376],
         [-2.4970475 ]]),
 matrix([[139.79943108],
         [ 11.46019275],
         [ -5.48290432]]),
 matrix([[29.8530924 ],
         [18.88728376],
         [-2.4970475 ]])]

From the stresses in the laminate coordinates, we can calculate the Tsai-Wu failure index for all plies by calling TW_i.

[33]:
analysis.TW_i
[33]:
[0.011840177555671384, 0.04129615058665213, 0.011840177555671384]

Because the Tsai-Wu index is below 1 for all plies, the laminate is still undamaged.

We can discover in what load the first ply will fail based on the Tsai-Wu failure criterion by using the FPF parameter.

[34]:
analysis.FPF
FPF Load:
 [[2548.05698026]
 [ 509.61139605]
 [   0.        ]
 [   0.        ]
 [   0.        ]
 [   0.        ]]
Failed Ply(ies):
 [2]
Laminate Tsai-Wu Index in FPF:
 [0.12933910070551077, 1.0199433489695386, 0.12933910070551077]
Strength Ratio for FPF:
 2.573537550058799

By this, we now know that the second ply will fail under \(Nx = 2548.06 N/mm; Ny=509.61N/mm\) and that the Strenth Ratio for the FPF is \(2.57\).