Biaxial column interaction surface: 16×20 tied column verification
Test case TC-15 verifies calcnote's three-dimensional P-Mx-My biaxial solver on an unsymmetric rectangular column (16×20 in with 10-#8 bars) subjected to simultaneous major-axis and minor-axis bending. Because published textbook biaxial examples rely on the approximate Bresler reciprocal load formula or visual chart interpolation rather than exact 2D clipped-compression-zone integration at inclined neutral-axis angles θ, this witness case is cross-validated against two independent first-principles strain-compatibility derivations implemented without access to calcnote's engine source.
Verdict
Across all anchor points on the demand plane λ = 30.96° and at the factored operating point (Pu = 200 kip, Mux = 50 kip-ft, Muy = 30 kip-ft), calcnote agrees with the independent first-principles baseline to within ≤ 0.5% (with anchor-level agreement ≤ 0.02% across the strain-compatibility points and ≤ 0.5% across the demand-plane ray-scaling check).
Section and load inputs (TC-15)
| Parameter | Value | Notes / ACI 318-19 reference |
|---|---|---|
| Gross dimensions b × h | 16 in × 20 in | Ag = 320.0 in2; Igx = 10,667 in4; Igy = 6,827 in4 |
| Longitudinal steel | 10-#8 (perimeter) | Ast = 7.90 in2 (ρg = 2.47%, within 1% to 8% per §10.6.1.1) |
| Transverse ties & cover | #3 ties @ 16 in, 1.5 in cover | Bar-center offset from outer face = 1.5 + 0.375 + 0.500 = 2.375 in |
| Material strengths | f′c = 4,000 psi, fy = 60 ksi | β1 = 0.85 (§22.2.2.4.3); ϵty = 0.00207 (§21.2.2) |
| Factored loads | Pu = 200 kip, Mux = 50 kip-ft, Muy = 30 kip-ft | Resultant demand moment Mλ = 58.31 kip-ft (699.7 kip-in) at λ = 30.96° |
| Slenderness parameters | kx = ky = 1.0, lux = luy = 120 in | (klu/r)x = 20.0 ≤ 28.0 (short); (klu/r)y = 25.0 ≤ 28.0 (short) |
2D bar coordinate layout
With a 16×20 in section, 1.5 in clear cover, #3 ties (dtie = 0.375 in), and #8 longitudinal bars (db = 1.000 in), the bar centers lie 2.375 in inside each perimeter face. Measured from the gross section centroid (x ∈ [−8, +8] in, y ∈ [−10, +10] in), the 10-#8 perimeter layout has 3 bars along the top and bottom 16-in faces (x = −5.625, 0.000, +5.625 in at y = ±7.625 in) and 4 bars along the left and right 20-in faces (y = −7.625, −2.542, +2.542, +7.625 in at x = ±5.625 in).
Demand-plane angle λ vs. neutral-axis angle θ
The factored end moments define the target moment angle λ in the (Mx, My) plane:
Because Igx ≠ Igy (20 in ≠ 16 in), setting the neutral-axis angle θ equal to 30.96° does not produce a moment vector aligned with 30.96°. Instead, at each target neutral-axis depth c, calcnote solves for the neutral-axis angle θ(c) such that the internal nominal moment vector (Mnx(c,θ), Mny(c,θ)) satisfies atan2(Mny, Mnx) = λ = 30.96°. Across the tension-controlled and transition zones on this section, the required neutral-axis inclination θ varies between 37.8° and 41.3° to hold the output moment plane fixed at λ = 30.96°.
Demand-plane anchor comparison (λ = 30.96°)
The table below lists the exact strain-compatibility anchors computed on the λ = 30.96° plane, showing the converged neutral-axis angle θ, neutral-axis depth c, extreme tensile strain ϵt, strength reduction factor φ, nominal axial and moment components, and factored capacities (φPn, φMn):
| Anchor | θ (deg) | c (in) | ϵt | φ | Pn (kip) | Mnx (kip-in) | Mny (kip-in) | φPn (kip) | φMn (kip-ft) |
|---|---|---|---|---|---|---|---|---|---|
| 1 · pure_compression_cap | n/a | ∞ | n/a | 0.650 | 1228.1 | 0.0 | 0.0 | 798.3 | 0.0 |
| 2 · cap_intersection | 39.47 | 22.98 | -0.00009 | 0.650 | 1228.0 | 1698.2 | 1018.9 | 798.2 | 107.3 |
| 3 · arc_strain_zero | 40.02 | 22.26 | 0.00000 | 0.650 | 1190.6 | 1875.4 | 1125.3 | 773.9 | 118.5 |
| 4 · arc_strain_pos_half_ety | 44.89 | 16.44 | 0.00103 | 0.650 | 773.4 | 3053.8 | 1832.2 | 502.7 | 192.9 |
| 5 · compression_controlled_limit | 44.58 | 13.09 | 0.00207 | 0.650 | 425.0 | 3349.9 | 2010.0 | 276.2 | 211.6 |
| 6 · transition_lower | 42.16 | 10.14 | 0.00357 | 0.775 | 119.1 | 3037.7 | 1822.6 | 92.3 | 228.8 |
| 7 · tension_controlled_limit | 41.63 | 8.94 | 0.00446 | 0.849 | 0.1 | 2731.8 | 1639.1 | 0.1 | 225.4 |
| 8 · tension_controlled_deep | 41.63 | 8.94 | 0.00446 | 0.849 | 0.1 | 2731.8 | 1639.1 | 0.1 | 225.4 |
| 9 · pure_bending | 41.63 | 8.94 | 0.00446 | 0.849 | 0.0 | 2731.8 | 1639.1 | 0.0 | 225.4 |
Operating-point capacity and ray scaling
In the 2D demand plane λ = 30.96°, the factored load point is (Pu, Mλ) = (200.0 kip, 58.31 kip-ft). Tracing the radial load ray from the origin (0, 0) through (200.0 kip, 58.31 kip-ft) to the factored boundary curve (φPn, φMn) gives the boundary intersection:
- Concentric axial capacity: Po = 1535.1 kip; Pn,max = 0.80·Po = 1228.1 kip; φPn,max = 798.3 kip.
- Boundary intersection on ray: (φPn,op, φMn,op) = (584.6 kip, 170.4 kip-ft) = (584.6 kip, 2045.1 kip-in).
- Governing demand/capacity ratio: D/C = Pu / φPn,op = Mλ / φMn,op = 0.342 ≤ 1.000 (PASS).
Automated regression lock
TC-15 runs automatically in the continuous verification test suite (tests/test_biaxial.py) on every commit. The test suite verifies 3D surface equilibrium, four-quadrant symmetry on the 16×20 section, convergence of the achieved moment angle λ across all anchors, and agreement with the independent first-principles demand-plane baseline within 0.5%.