A Python implementation of Classical Laminate Theory (CLT) for parametric analysis and optimization of composite laminates. Computes full ABD stiffness matrices, ply-level stress/strain recovery, Tsai-Wu failure indices, and Navier-series center deflections, then uses a Simulated Annealing optimizer to search for minimum-weight, maximum-stiffness stacking sequences under engineering constraints.
Built to support the design and analysis workflow for the 2024-25 SAMPE Fuselage Competition and general composites coursework at USC.
Analysis (src/clt.py, src/main.py):
- Assembles [A], [B], [D] stiffness matrices for arbitrary symmetric and unsymmetric laminates
- Solves the coupled mid-plane strain-curvature problem via Schur complement
- Recovers ply-level strains and stresses in both global (x-y) and local (1-2) axes
- Computes Tsai-Wu failure index at every ply interface
- Estimates SSSS plate center deflection via Navier double-sine series
- Parametric angle sweep: sweeps ply orientation 0°→90° and exports Ex_eff vs angle
Optimization (src/layup_optimizer_sa.py):
- Simulated Annealing over stacking sequence space (orientations + ply count)
- Design variables: symmetric half-laminate with variable length
- Moves: orientation change, ply insertion, ply deletion
- Constraints: symmetry, balance (equal ±45° count), minimum 10% of each orientation (0°, 90°, ±45°)
- Objective: minimize 1/D₁₁ + weight (penalty for constraint violations)
Angle sweep on an 8-ply [θ]₈ IM7/8552-equivalent laminate:
| θ (deg) | Ex_eff (GPa) |
|---|---|
| 0 | ~145 |
| 45 | ~17 |
| 90 | ~10 |
The [0/±45/90]s quasi-isotropic baseline shows ~34 GPa effective modulus and satisfies all balance/symmetry constraints automatically.
SA optimizer on 4–40 ply symmetric laminates consistently identifies [−45/0/45/90]s variants as the Pareto-optimal configuration for stiffness-to-weight under competition geometry constraints.
composite-laminate-clt/
├── src/
│ ├── clt.py # Core CLT: Q, Qbar, ABD, ply recovery, Tsai-Wu, Navier
│ ├── main.py # Driver: baseline + angle sweep + CSV/plot output
│ ├── utils.py # Material loader and helper functions
│ ├── layup_optimizer_sa.py # Simulated Annealing layup optimizer
│ └── compare_clt_fea.py # CLT vs FEA comparison utilities
├── data/
│ ├── materials.csv # Material property database (E1, E2, G12, v12, t_ply)
│ └── sweeps/ # Output CSVs from parametric studies
├── notebooks/
│ └── validation.ipynb # Validation notebook: CLT vs reference solutions
├── docs/
│ ├── Clt_theory.pdf # Derivation of CLT equations
│ ├── Clt_theory.tex # LaTeX source
│ └── Methodology_Notes.md # Assumptions and validation plan
├── figures/ # Plots (gitignored, generated by main.py)
├── fea/
│ ├── abaqus_inputs/ # Abaqus .inp files (gitignored)
│ └── results/ # FEA output exports
├── requirements.txt
└── .gitignore
pip install -r requirements.txt
# Baseline laminate + angle sweep (generates data/sweeps/ CSVs and figures/)
python src/main.py
# Simulated annealing layup optimizer
python src/layup_optimizer_sa.pyExpected output from main.py:
=== Baseline Laminate =========================================
Stack: [0, 45, -45, 90, 90, -45, 45, 0]
Total thickness t = 1.000 mm
||A|| = 2.034e+08
||B|| = 4.012e-08 (near-zero for symmetric laminate ✓)
SSSS Navier center deflection at q=1 kPa: 0.041823 mm
Saved: data/sweeps/baseline_ply_summary.csv
Saved: data/sweeps/angle_sweep_ex.csv
Saved: figures/angle_sweep_ex.png
| Parameter | Value |
|---|---|
| Plate dimensions | 300 mm × 300 mm |
| Total laminate thickness | 1.0 mm |
| Ply thickness | 0.125 mm |
| Baseline layup | [0/+45/−45/90]s (8 plies) |
| Boundary conditions | SSSS (Simply Supported all sides) |
| Applied load | 1 kPa uniform transverse pressure |
| Property | Symbol | Value | Unit |
|---|---|---|---|
| Longitudinal modulus | E₁ | 161 | GPa |
| Transverse modulus | E₂ | 11.4 | GPa |
| Shear modulus | G₁₂ | 5.17 | GPa |
| Poisson's ratio | ν₁₂ | 0.32 | — |
| Density | ρ | 1600 | kg/m³ |
- Q matrix: Plane-stress reduced stiffness in principal material axes
- Q̄ matrix: Closed-form transformation using m = cos(θ), s = sin(θ) trig invariants
- ABD assembly: Integration over ply z-interfaces; B → 0 confirmed for symmetric laminates
- Mid-plane solve: Schur complement (faster and better-conditioned than 6×6 direct solve)
- Navier series: Convergence verified with odd m,n up to 9; ±0.1% change from n=5 to n=9
- Tsai-Wu: Uses F₁₂ = −0.5√(F₁₁·F₂₂) (biaxial strength interaction term)
numpy >= 1.24scipy >= 1.10matplotlib >= 3.7pandas >= 2.0
- Implement Hashin failure criteria alongside Tsai-Wu for fiber/matrix mode separation
- Add progressive failure analysis (ply-by-ply stiffness knockdown after first-ply failure)
- Extend SA optimizer to multi-objective (stiffness + toughness + cost)
- Wrap in a Streamlit GUI for interactive layup exploration
- Validate against published benchmark problems (Reddy, Daniel & Ishai)
- Jones, R.M. (1999). Mechanics of Composite Materials, 2nd ed.
- Daniel, I.M. & Ishai, O. (2006). Engineering Mechanics of Composite Materials.
- Tsai, S.W. & Wu, E.M. (1971). "A General Theory of Strength for Anisotropic Materials." Journal of Composite Materials.
- MIL-HDBK-17; ASTM D3039, D7264, D6641.