Laminate Theory Calculator

Introduction

This set of scrips contains functions that can be used for the design of simple fibre composite laminates. The goal of this project is to create a open-source laminate theory calculator something that can compete with “The Laminator”. There are two benefits of the project in python is that it can easily be integrated in, for example, a stiffend plate buckling/cripling calculator. Or that it can be used to find the optimal layout by iterating over various designs.

Before using the code I recommend to read upon literature introducing the Classical Laminate Theory. Many such books exist, from my experience the following where reccomended:

  • Design and Analysis of Composite Structures: With Applications to Aerospace Structures by Christos Kassapoglou (ISBN: 9781118536933, DOI: 10.1002/9781118536933)
  • Composite Materials: Design and Applications by Daniel Gay (ISBN: 9780429101038 DOI: 10.1201/b17106)

Todo

  • Adding functions to the homonigization module.
  • Adding a inverse ply failure calculator for Tsai-Hill.
  • Adding buckling / cripling calculators.

Example

The example disscussed below is formed by snipplets of example.py.

At the start of the file the required packages are needed. A minimum requirement is numpy and the different scripts related to this project

13
14
15
16
17
18
19
# Import external packages.
import numpy as np

# Import local packages.
import homogenization
import abdcal
import deformation

Currently one is required to define the ply parameters in the ply axis system. In the future this will be replaced by a script where a basic homonigization is performed on the constituants of each ply.

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# List the elastic properties of the ply.
El = 142 * 1e3  # MPa
Et = 13 * 1e3  # MPa
G = 5 * 1e3  # MPa
nult = 0.3  # -

# List the failure properties of the ply.
Xt = 2200  # MPa
Xc = 1850  # MPa
Yt = 55  # MPa
Yc = 200  # MPa
Smax = 120  # MPa

# List the other properties of the ply.
t = 0.16  # mm

# Calculate the ply stiffness matricess matrix.
Q = abdcal.QPlaneStress(El, Et, nult, G)

Then the laminate properties musth be defined. Starting with the stacking sequence which consists of a list of the rotation angles of each ply (global to ply axis system) and a list with the thickness of each ply and the ply stiffness matrix \(Q\). All list must be orderd from the top to the bottom of the laminate. Notice that the positive \(z\) direction is downward by convention.

Afterwards the ply properties can be used to calculate the ABD matrix and its inverse.

49
50
51
52
53
54
55
56
# Define the stacking sequence.
angles_deg = [0, 0, 45, 90, -45, -45, 90, 45, 0, 0]
thickness = [t] * len(angles_deg)
Q = [Q] * len(angles_deg)

# Calculate the ABD matrix and its inverse.
abd = abdcal.abd(Q, angles_deg, thickness)
abd_inv = abdcal.matrix_inverse(abd)

Now a load or deformation vector can be applied. Here the load vector was used. The load vector is a 1 by 3 numpy matrix consists of the running loads and moments in the form of \((N_x, N_y, N_{xy}, M_x, M_y, M_{xy})^T\). Similarly a deformation vector is defined as \((\varepsilon_x, \varepsilon_y, \varepsilon_{xy},\kappa_x, \kappa_y, \kappa_{xy})^T\). Afterwards the resulting ply stresses and loads (in their local axis system) can be calculated. The strain and stress calculations are performed at the top and bottom of each ply. Detials can be found in the documentation of the deformation module.

62
63
64
65
66
67
68
# Calculate the deformation caused by a given running load.
NM = np.matrix([0, 1, 0, 1, 0, 0]).T  # MPa/mm and MPa*mm/mm
deformed = deformation.load_applied(abd_inv, NM)

# Calculate the stress in each layer caused by the running loads.
strain = deformation.ply_strain(deformed, Q, angles_deg, thickness)
stress = deformation.ply_stress(deformed, Q, angles_deg, thickness, plotting=True)

Lastly the stresses are used to calculate if the failure criterias are violated. Here the the max stress, Tsai-Wu and Tsai-Hill criterias are used. It is reccomended that the user reads up on the differences between the possible criteria, all of them have their specific strength and weaknesses and are meant for their specif purpose. If one does not keep this in mind properly one will end up with flawed designs.

74
75
76
77
# Testing whether the failure criterias are violated.
failure.max_stress(stress, Xt, Xc, Yt, Yc, Smax)
failure.tsai_wu(stress, Xt, Xc, Yt, Yc, Smax)
failure.tsai_hill(stress, Xt, Xc, Yt, Yc, Smax)

Indices and Tables