calcs/wood-stud-column/wood-stud-column.typ
smillmorel d5ac3fca7e Add structural calculation worksheets
Collection of engineering calculation projects (Python + Typst), each with
input, calc script, tests, results, and generated PDF where available.
2026-09-21 12:19:20 -04:00

62 lines
3.3 KiB
Typst

#import "assets/sheet.typ": calcline, calcsheet, check
#let data = json("results.json")
#let n = data.values
#let checks = data.checks
#let round(value, digits: 2) = calc.round(value, digits: digits)
#show: calcsheet.with(
title: "Wood Stud Column — Axial Capacity",
project: data.project,
prepared-by: data.prepared_by,
)
= Wood Stud Column — Axial Capacity
Concentrically loaded 2x4 wood stud (SP / Southern Pine No. 2) analyzed for
axial compression parallel to grain per NDS 2018 ASD. Pint parses `input.yaml`;
`calc.py` computes the column stability factor $C_p$ (NDS 3.7.1.5, Eq. 3.7-1)
and the adjusted compression capacity. The governing limit state is compression
with buckling about the weak axis.
== Geometry And Axial Load
#let P = 400
#let L_ft = 6
#let b = 1.5
#let d = 3.5
#let A = b * d
#metadata((P_lbf: P, A_in2: A)) <wood-stud-column-loads>
#calcline([$P = #P " lbf"$], [Axial load, compression (ASD)])
#calcline([$L = #L_ft " ft" = #n.L_in " in"$], [Total stud length])
#calcline([$b = #b " in"$, $d = #d " in"$], [Actual dimensions of a nominal 2x4])
#calcline([$A = b d = #round(n.A_in2, digits: 2) " in"^2$], [Cross-sectional area])
#calcline([$K_e = #n.Ke$], [Effective-length factor, pinned-pinned (NDS 3.7.1.2)])
#calcline([$L_e = K_e L = #round(n.Le_in, digits: 1) " in"$], [Effective length])
#calcline([$d_"min" = min(b, d) = #n.d_least_in " in"$], [Least dimension; weak-axis buckling governs])
#calcline([$L_e / d_"min" = #round(n.Le_in / n.d_least_in, digits: 1) <= 50$], [Slenderness ratio, weak axis; cap $L_e/d <= 50$ (NDS 3.7.1.4)])
== Material And Adjustment Factors
#calcline([$"Species/grade" = #n.species_grade$], [NDS Supplement reference values])
#calcline([$F_c = #n.Fc_psi " psi"$], [Reference compression parallel to grain])
#calcline([$E = #n.E_psi " psi"$, $E'_"min" = #n.Emin_psi " psi"$], [Moduli of elasticity])
#calcline([$C_D = #n.CD$, $C_M = #n.CM$, $C_t = #n.Ct$, $C_F = #n.CF$, $C_i = #n.Ci$], [Load duration ($C_D=1.0$ normal/occupancy, NDS 2.3.2), wet service, temperature, size ($C_F=1.15$ for 2x4 compression, NDS 4.3.6), incising (NDS Table 4.3.1)])
== Column Stability Factor (NDS 3.7.1.4)
#calcline([$F^*_c = F_c C_D C_M C_t C_F C_i = #round(n.Fc_star_psi, digits: 1) " psi"$], [Adjusted reference compression, NDS 3.7.1.5])
#calcline([$E'_"min" = E_"min" C_M C_t C_i = #round(n.Emin_prime_psi, digits: 0) " psi"$], [Adjusted 5th-percentile modulus])
#calcline([$F_("cE") = 0.822 E'_"min" / (L_e / d_"min")^2 = #round(n.FcE_weak_psi, digits: 2) " psi"$], [Critical buckling stress, NDS Eq. 3.7-2 (coefficient 0.822)])
#calcline([$0.822$ (Euler coeff., NDS Eq. 3.7-2), $c = #n.c_sawn$], [Sawn-lumber column coefficient, NDS Eq. 3.7-1])
#calcline([$C_p = (1 + F_("cE")/F^*_c)/(2c) - sqrt(...) = #round(n.Cp, digits: 4)$], [Column stability factor, NDS Eq. 3.7-1 (3.7.1.5); weak axis governs])
== Adjusted Compression Capacity
#calcline([$F'_c = F^*_c C_p = #round(n.Fc_prime_psi, digits: 2) " psi"$], [Adjusted compression design value, NDS 3.7.1.5])
#calcline([$f_c = P / A = #round(n.fc_psi, digits: 2) " psi"$], [Acting compression stress])
#calcline([$P_a = F'_c A = #round(n.Pa_lbf, digits: 1) " lbf"$], [Allowable axial load])
#v(7pt)
#check("Axial Compression", checks.axial.demand, checks.axial.capacity, unit: "lbf", ok: checks.axial.ok, demand-label: [$P$], capacity-label: [$P_a$])