Module: vernastruct.modules.columns.service.ColumnDesignService
Code basis: NDS 2018 §3.7.1.5 (column stability factor C_P, sawn c = 0.8)
and §3.7.2 (tapered round columns — representative diameter rule valid for all
support conditions, plus the pure-compression check on the minimum section).
Status: ✅ PASS — software matches hand calculation exactly after fixing a
defect this case uncovered (see §5).
A tapered date-palm trunk column — the signature vernacular column of Najdi and Hejazi heritage construction. Palm trunks taper from base to top; NDS §3.7.2 handles this with an effective (representative) diameter for the stability check and a separate pure-compression check on the small end.
| Input | Symbol | Value |
|---|---|---|
| Height | H | 3.50 m |
| Diameter, top (small end) | d_top | 200 mm |
| Diameter, base (large end) | d_base | 300 mm |
| Material | — | Date Palm Trunk (E = 6.5 GPa, f_b = 6.0 MPa) |
| Reference compression | Fc* | 0.7 × f_b = 4.20 MPa (service convention) |
| End condition | — | pinned–pinned (Ke = 1.0) |
| Axial service load | P | 6.0 t |
| Design state / damage | — | New / None (k_d = 1.00) |
Conventions: kN → tonne with 9.81 (columns module); sawn-timber c = 0.8.
Effective diameter (NDS §3.7.2, general rule — all support conditions):
d_eff = d_min + (d_max − d_min)/3 = 200 + 100/3 = 233.3333 mm
A_eff = π d_eff²/4 = 0.0427606 m²
Slenderness and stability factor:
Le = Ke·H = 3.50 m ; λ = Le/d_eff = 3.50/0.2333333 = 15.0000
FcE = 0.822 E / λ² = 0.822 × 6500 / 225 = 23.74667 MPa
r = FcE/Fc* = 23.74667/4.20 = 5.653968
CP = (1+r)/(2c) − √[ ((1+r)/(2c))² − r/c ]
= 4.158730 − √(17.295037 − 7.067460) = 4.158730 − 3.198058 = 0.960672
Fc′ = Fc* × CP = 4.20 × 0.960672 = 4.034822 MPa
Note CP = 0.96, not 1.0, even though FcE ≫ Fc* — the NDS formula applies at all slenderness values (see §5).
Axial capacity (effective section):
P_cap = Fc′ × A_eff = 4.034822 MPa × 0.0427606 m² = 172.531 kN = 17.5873 t
util = 6.0 / 17.5873 = 0.34116
Small-end pure-compression check (NDS §3.7.2):
A_min = π (0.200)²/4 = 0.0314159 m²
f_c = 6.0 × 9.81 / 0.0314159 kN/m² = 1.87357 MPa
util = 1.87357 / 4.20 = 0.44609 ← governs
| Check | Hand calc | Software (ColumnDesignService) |
Match | Pass? |
|---|---|---|---|---|
| Effective diameter | 233.3333 mm | 233.3333 mm | ✅ exact | — |
| Slenderness λ | 15.0000 | 15.0000 | ✅ exact | — |
| Fc′ (with CP) | 4.03482 MPa | 4.03482 MPa | ✅ exact (after fix, §5) | — |
| Axial capacity | 17.5873 t | 17.5873 t | ✅ exact | util 0.341 → PASS |
| Small-end stress | 1.87357 MPa | 1.87357 MPa | ✅ exact | util 0.446 → PASS |
| Governing utilization | 0.44609 (small end) | 0.44609 | ✅ exact | — |
The small end governs — exactly the failure mode field engineers know for palm-trunk columns (crushing at the slender top under the beam seat), and the reason a straight-column idealization at the base diameter would be unsafe.
from vernastruct.modules.columns.models import ColumnInput
from vernastruct.modules.columns.service import ColumnDesignService
result = ColumnDesignService().design(ColumnInput(
height_m=3.50, is_tapered=True,
diameter_top_mm=200, diameter_base_mm=300,
material_id="date_palm_traditional", end_condition="pinned-pinned",
axial_load_ton=6.0,
))
assert result.ok
Pinned as
tests/test_verification_cases.py::test_vc06_tapered_palm_column.
The stability-factor implementation contained a shortcut: CP was set to 1.0 whenever FcE ≥ Fc*. The NDS §3.7.1.5 formula applies at all slenderness values and approaches 1.0 only asymptotically — for this stocky column the correct CP is 0.9607, so the shortcut overstated axial capacity by ~4% (unconservative). All pre-existing column tests were qualitative and could not catch it. Fixed 2026-07-09: the formula now always applies.
Verification-library score: 6 cases → 4 computational/reporting defects found and fixed (VC-03, VC-04, VC-05, VC-06).
Every case in this manual is pinned as an automated regression test that runs on every build — no future change can silently break a verified result. © 2026 Hesham Salama.