Moment Curvature
Pushes a fibre section's curvature in any moment direction under a held axial force, and returns the moment–curvature curve, the stress–strain history of every fibre, and the curve's first yield and ultimate state: the ductility of the section and what makes it fail.
🔧 Grasshopper component
MomentCurvature (Alpaca4d) — Alpaca4d ▸ MomentCurvature_βeta, nickname MC

AxialAxial force held constant while the curvature is applied, in kN.
DirectionThe moment direction, in degrees from the section's local y axis towards z, from -180 to 180: 0 bends it about y, 90 about z, and 180 and -90 the other way about each.
MaxPhi: the number of points on the curve, when it does not stop sooner.MaxPhiThe curvature along Direction to push the section to, in rad/m.
εcuUltimate compressive strain of the concrete, positive.
EpsilonCu.StopAtUltimateStop at the first increment where a fibre reaches its ultimate strain.
MaxPhi.kN.kN·m.kN·m.rad/m.rad/m.fiberStressStrainStress and strain history of every fibre.
kN·m: My cos a + Mz sin a.κCurvature along Direction, in rad/m: κy cos a + κz sin a.
κYieldYieldCurvatureCurvature along Direction at first yield.
kN·m.κUltimateUltimateCurvatureCurvature along Direction at the ultimate state.
kN·m.kN·m²: an effective cracked stiffness.🧮 Yield and the ultimate state
The curve is read against the strain limits of Interaction Domain:
| Point | Where |
|---|---|
| First yield | The first fibre of Steel01 or ReinforcingSteel at its yield strain, fy / E, in tension or compression: a bar, or the extreme fibre of a steel section. |
| Ultimate state | The first fibre at its ultimate strain: concrete at εcu, or at εc2 about point C when it is all in compression, and everything else at ±εud or its MinMax bounds. |
Each is read between the increments either side of it, so it does not fall on the increment the analysis happened to take; first yield along the curve's slope before it, which is exact for a section that is elastic until then. Failure names the material and the point of the section that reached its limit.
The analysis stops at the ultimate state, at the first increment past it, unless StopAtUltimate is off. The point of the domain at the same N and direction is the same ultimate state reached along a straight path; the two agree to within a few tenths of a percent.
On an HEA 300 in S355 at N = 0, εud = 5 %, the curve yields at exactly Wel,y fy, at fy / E over half the depth, with the secant stiffness E Iy, and ends at Mpl,y at εud over half the depth: a ductility of εud / εy = 29.6.
Any direction
Direction, between −180 and 180 degrees, holds the moment to its direction and leaves the curvature across it free, as bending about y always held Mz at zero. The two ways about an axis differ for a section that is not symmetric: a beam with 3 φ20 at the bottom and 2 φ16 at the top, at N = −1000 kN, reaches 249 kN·m at 0 and 264 kN·m at 180. A section bent off its axes, or an unsymmetric one, turns its neutral axis as it needs to, and its curve ends on the N-M Diagram cut at the same angle. Under the hood the element is turned so that the direction lies on a global axis; the forces and deformations come back in the section's own axes.
📈 When to use it
Use it when
- You need the path to failure, not just failure: cracking, yield and the ultimate state, all from the material laws.
- You are assessing ductility: the curvature ductility of a column or a plastic hinge.
- You need an effective cracked stiffness,
EI = M/κon the branch that matters. - You want the fibres' stresses under a given moment.
Use Interaction Domain instead for the N–M or N–My–Mz interaction at the ultimate limit state: it does not have to converge near the axial capacity, which a held Axial does.
Do not use it when
- You want member behaviour. This is a section-level analysis; the section cannot yet be assigned to a ForceBeamColumn.
💡 Getting a good curve
- Leave MaxPhi empty. It is taken from the section's ultimate state, and the analysis stops there: most of the increments go into the curve. Give it only to look past the ultimate state with
StopAtUltimateoff. - Raise
NumIncrfor a smooth curve. 100 points is enough to see the shape; 500 resolves the yield knee. - An increment that does not converge is tried again in ten steps of a tenth, then with a line search, then with the initial tangent, before the curve is given up on. A curve that still stops short comes with a warning, and what converged is on the outputs.
- Sign the axial force correctly. A column carries compression, so
Axialis negative. An axial force past what the section carries is refused before anything runs. - Moments are about the area centroid of every fibre, steel included, where OpenSees' fibre section takes them.
🔗 Relation to OpenSees
The component first has OpenSees trace each material's stress–strain curve, for the strain limits, as Interaction Domain does. It then writes and runs a complete section-analysis deck: a single zeroLengthSection element carrying the fibre section, turned by -orient to the moment direction, a Plain pattern applying the axial force, then a DisplacementControl push on the curvature DOF an increment at a time, with a fibre recorder capturing every fibre at every step, and a check of the strain limits after each increment.
Read the whole deck from the log output.
Note
Definitions made with the earlier Moment Curvature, which bent about y or z only and ran to MaxPhi, open with it; Grasshopper's Upgrade Components… swaps it for this one. The upgraded component keeps its wires and values: a Direction of y becomes 0 and z becomes 90, a Value List of the two wired to it is turned into one of 0 and 90, a Panel wired to it saying y or z says 0 or 90, a MaxPhi given stays given, and the curve now stops at the ultimate state.
