Collection of engineering calculation projects (Python + Typst), each with input, calc script, tests, results, and generated PDF where available.
108 lines
5.7 KiB
Typst
108 lines
5.7 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 Joist Analysis",
|
|
project: data.project,
|
|
prepared-by: data.prepared_by,
|
|
)
|
|
|
|
= Wood Joist Analysis
|
|
|
|
Simple-span wood joist under uniform gravity load, analyzed per NDS 2018 ASD.
|
|
Pint parses `input.yaml`, `calc.py` computes the member capacities and checks.
|
|
Typst determines the gravity-load demands below; the checked Python inputs
|
|
are reconciled to those values by the test suite.
|
|
|
|
== Loads Determination
|
|
|
|
#let DL = 25
|
|
#let LL = 50
|
|
#let L = 9
|
|
#let B = 13
|
|
#let w = (DL + LL) * B
|
|
#let wL = LL * B
|
|
#let M = w * L * L / 8
|
|
#let V = w * L / 2
|
|
#let R = V
|
|
#metadata((w_plf: w, wL_plf: wL, M_ftlbf: M, V_lbf: V, R_lbf: R)) <wood-joist-loads>
|
|
|
|
#calcline([$L = #L " ft"$], [Simple span])
|
|
#calcline([$B = #B " ft"$], [Tributary spacing, on-center])
|
|
#calcline([$D = #DL " psf"$], [Dead load])
|
|
#calcline([$L_L = #LL " psf"$], [Live load])
|
|
#calcline([$w = (D + L_L) B = #w " plf"$], [Total uniform line load, Typst-derived])
|
|
#calcline([$w_("checked") = #round(n.w_plf, digits: 1) " plf"$], [Total uniform line load, checked input])
|
|
#calcline([$w_L = L_L B = #wL " plf"$], [Live uniform line load, Typst-derived])
|
|
#calcline([$w_("L,checked") = #round(n.wL_plf, digits: 1) " plf"$], [Live uniform line load, checked input])
|
|
#calcline([$M = w L^2 / 8 = #round(M, digits: 2) " ft·lbf"$], [Maximum moment, Typst-derived])
|
|
#calcline([$M_("checked") = #round(n.M_ftlbf, digits: 2) " ft·lbf"$], [Maximum moment, checked input])
|
|
#calcline([$V = w L / 2 = #V " lbf"$], [Support shear, Typst-derived])
|
|
#calcline([$V_("checked") = #round(n.V_lbf, digits: 1) " lbf"$], [Support shear, checked input])
|
|
#calcline([$R = V = #R " lbf"$], [Support reaction, Typst-derived])
|
|
#calcline([$R_("checked") = #round(n.R_lbf, digits: 1) " lbf"$], [Support reaction, checked input])
|
|
|
|
== Section Properties
|
|
|
|
#calcline([$b = #n.b_in " in"$, $d = #n.d_in " in"$], [Joist width and depth])
|
|
#calcline([$A = b d = #round(n.A_in2, digits: 2) " in"^2$], [Section area])
|
|
#calcline([$I_x = b d^3 / 12 = #round(n.Ix_in4, digits: 1) " in"^4$], [Moment of inertia])
|
|
#calcline([$S_x = b d^2 / 6 = #round(n.Sx_in3, digits: 1) " in"^3$], [Elastic section modulus])
|
|
|
|
== Material And Adjustment Factors
|
|
|
|
#calcline([$"Species/grade" = #n.species_grade$], [NDS Supplement reference values])
|
|
#calcline([$F_b = #n.Fb_psi " psi"$, $F_v = #n.Fv_psi " psi"$], [Reference bending and shear])
|
|
#calcline([$F_(c"⊥") = #n.Fcp_psi " psi"$], [Reference compression perpendicular 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$], [Load duration, wet service, temperature, size])
|
|
#calcline([$C_r = #n.Cr$, $C_"fu" = #n.Cfu$, $C_i = #n.Ci$], [Repetitive member, flat use, incising])
|
|
|
|
== Flexure
|
|
|
|
#calcline([$l_e = #n.le_in " in"$], [Unbraced length of compression edge])
|
|
#calcline([$R_B = sqrt(l_e d / b^2) = #round(n.RB, digits: 3)$], [Slenderness ratio, NDS 3.3.3])
|
|
#calcline([$F^*_b = F_b C_D C_M C_t C_F C_i C_r = #round(n.Fb_star_psi, digits: 1) " psi"$], [Adjusted reference bending])
|
|
#calcline([$F_("bE") = 1.20 E'_"min" / R_B^2 = #round(n.FbE_psi, digits: 1) " psi"$], [Critical buckling stress])
|
|
#calcline([$C_L = (1 + F_("bE")/F^*_b)/1.9 - sqrt(...) = #round(n.CL, digits: 4)$], [Beam stability factor, NDS 3.3.3])
|
|
#calcline([$F'_b = F^*_b C_L C_"fu" = #round(n.Fb_prime_psi, digits: 1) " psi"$], [Adjusted bending])
|
|
#calcline([$f_b = M / S_x = #round(n.fb_psi, digits: 1) " psi"$], [Acting bending stress])
|
|
#calcline([$M_a = S_x F'_b = #round(n.Ma_ftlbf, digits: 1) " ft·lbf"$], [Allowable moment])
|
|
|
|
#v(7pt)
|
|
#check("Flexure", checks.flexure.demand, checks.flexure.capacity, unit: "psi", ok: checks.flexure.ok, demand-label: [$f_b$], capacity-label: [$F'_b$])
|
|
|
|
== Shear
|
|
|
|
#calcline([$F'_v = F_v C_D C_M C_t C_"vr" = #round(n.Fv_prime_psi, digits: 1) " psi"$], [Adjusted shear])
|
|
#calcline([$f_v = 3 V / (2 A) = #round(n.fv_psi, digits: 3) " psi"$], [Acting shear stress])
|
|
|
|
#v(7pt)
|
|
#check("Shear", checks.shear.demand, checks.shear.capacity, unit: "psi", ok: checks.shear.ok, demand-label: [$f_v$], capacity-label: [$F'_v$])
|
|
|
|
== Bearing
|
|
|
|
#calcline([$l_b = #n.lb_in " in"$], [Bearing length])
|
|
#calcline([$l_("end") = #n.bed_in " in"$], [Distance from member end to near edge of bearing, >= 3 in])
|
|
#calcline([$C_b = (l_b + 0.375) / l_b = #round(n.Cb, digits: 3)$], [Bearing area factor, NDS 3.10.4])
|
|
#calcline([$F'_("c⊥") = F_("c⊥") C_M C_t C_i C_b = #round(n.Fcp_prime_psi, digits: 2) " psi"$], [Adjusted bearing])
|
|
#calcline([$A_b = l_b b = #round(n.Ab_in2, digits: 2) " in"^2$], [Bearing area])
|
|
#calcline([$f_("c⊥") = R / A_b = #round(n.fcp_psi, digits: 2) " psi"$], [Acting bearing stress])
|
|
|
|
#v(7pt)
|
|
#check("Bearing", checks.bearing.demand, checks.bearing.capacity, unit: "psi", ok: checks.bearing.ok, demand-label: [$f_("c⊥")$], capacity-label: [$F'_("c⊥")$])
|
|
|
|
== Deflection
|
|
|
|
#calcline([$Delta_"total" = 5 w L^4 / (384 E I_x) = #round(n.delta_total_in, digits: 3) " in"$], [Total-load deflection])
|
|
#calcline([$Delta_"live" = 5 w_L L^4 / (384 E I_x) = #round(n.delta_live_in, digits: 3) " in"$], [Live-load deflection])
|
|
#calcline([$L/240 = #n.delta_allow_total_in " in"$], [Total-load limit])
|
|
#calcline([$L/360 = #n.delta_allow_live_in " in"$], [Live-load limit])
|
|
|
|
#v(7pt)
|
|
#check("Deflection (total)", checks.deflection_total.demand, checks.deflection_total.capacity, unit: "in", ok: checks.deflection_total.ok, demand-label: [$Delta_"total"$], capacity-label: [$L/240$])
|
|
#check("Deflection (live)", checks.deflection_live.demand, checks.deflection_live.capacity, unit: "in", ok: checks.deflection_live.ok, demand-label: [$Delta_"live"$], capacity-label: [$L/360$])
|