Laminate¶
A Laminate stacks plane-stress layers into a section for a Shell. It takes the place of the material there, and the shell integrates the layers through the thickness during the analysis rather than reducing them to ABD matrices, so a layer may be nonlinear or carry internal state:
import torch
from torchfem import Laminate, Shell
from torchfem.materials import OrthotropicElasticityPlaneStress
gfrp = OrthotropicElasticityPlaneStress(
E_1=54000.0, E_2=9400.0, nu_12=0.33, G_12=5500.0, G_13=5500.0, G_23=3000.0
)
layup = Laminate(
materials=[gfrp] * 4,
thicknesses=[0.25] * 4,
angles=[0.0, torch.pi / 2, torch.pi / 2, 0.0],
)
model = Shell(nodes, elements, layup)
Layers are given from the bottom surface upwards. symmetric mirrors the half-stack about the mid-plane, and the offset of a Shell moves the reference surface its nodes sit on:

A stacking sequence of plane-stress layers for shell elements.
Parameters:
-
materials(Sequence[MechanicsMaterial]) –Plane-stress mechanics materials, one per layer.
-
thicknesses(Sequence[float] | Sequence[Tensor] | Tensor) –Per-layer thicknesses. Each entry may be a scalar (constant over the mesh) or a tensor of shape
(n_elem,). -
angles(Sequence[float] | Sequence[Tensor] | Tensor) –Per-layer orientation angles in radians, measured from the element's first local axis. Each entry may be a scalar or a tensor of shape
(n_elem,). -
n_simpson(int, default:3) –Number of Simpson integration points used per layer through the thickness. Must be an odd integer (default
3). -
symmetric(bool, default:False) –If
True, the given layers are the half-stack (outer surface to mid-plane) and are mirrored to form the full laminate.
Notes
- Layers may carry internal state (e.g. an elastoplastic metal ply); the state width is the per-layer maximum. Stations are integrated during the analysis, so nonlinear, state-bearing layers need no ABD matrices.
Shellbinds the laminate to its mesh withvectorize(...), and the bound section atshell.sectionrotates itsmaterialsby theiranglesand reads its stations, transverse shear stiffness and mass from itsthicknesseswhenever they are needed. A layer's material, angle or thickness may be reassigned there and may carry a gradient, as a design variable of an orientation or free-size optimization.- The stack is centered on its mid-plane.
Shell(offset=...)moves the reference surface, adding the membrane-bending coupling it implies.
__init__(materials, thicknesses, angles, n_simpson=3, symmetric=False)
¶
vectorize(n_elem, offset)
¶
Return a copy bound to n_elem elements and the reference surface offset.
Each layer material is vectorized and each layer thickness is expanded to one value per element.
plot(ax=None)
¶
Illustrate the stacking sequence.
Each ply is drawn as a band through the thickness (height proportional to the ply thickness) with the ply angle annotated.
Parameters:
-
ax–Existing matplotlib axes to plot into.