calcs/concentric-footing/concentric-footing.typ
smillmorel aa790c1be5 Normalize spacing before units across all calc sheets
Plain units already get a gap from the source whitespace, so drop the
leading space inside the string; keep it only on superscripted units
(in^2, in^3, in^4, ft^2). Also fix the generated concrete-beam figure
labels. Regenerate all affected PDFs.
2026-09-21 20:38:04 -04:00

110 lines
5.9 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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: "Concentric Footing Analysis",
project: data.project,
prepared-by: data.prepared_by,
)
= Concentric Footing Analysis
Square spread footing under concentric axial load, ACI 318-19. Numbers come from
`calc.py`; this sheet only presents them. Typst derives gravity loads below;
checked Python demands are reconciled by the test suite.
#figure(
align(center)[
#box(width: 160pt, height: 130pt)[
#place(rect(width: 120pt, height: 120pt, stroke: 1pt))
#place(dx: 45pt, dy: 45pt, rect(width: 30pt, height: 30pt, fill: rgb("#cccccc"), stroke: 0.8pt))
#place(dx: 55pt, dy: 2pt, text(size: 8pt)[$B_f$])
#place(dx: 124pt, dy: 55pt, text(size: 8pt)[$B_f$])
#place(dx: 56pt, dy: 56pt, text(size: 7pt)[$c$])
]
],
caption: [Footing plan and section: #n.Bf_ft ft × #n.Bf_ft ft × #n.Df_in in, d=#n.d_in in.],
)
== Loads Determination
#let DLr = 10 // psf
#let LLr = 20 // psf
#let Br = 18.9 // ft
#let Lr = 27.5 // ft
#let Ar = Br * Lr // ft2
#let bc = 14 // in
#let Lc = 14 // ft
#let gamma_c = 145 // pcf
#let Wc_kip = bc * bc / 144 * Lc * gamma_c / 1000 // kip column weight
#let Ps_typst = (DLr + LLr) * Ar / 1000 + Wc_kip // kip
#let Pu_typst = 1.2*(DLr*Ar/1000 + Wc_kip) + 1.6*LLr*Ar/1000
#metadata((Ps_kip: Ps_typst, Pu_kip: Pu_typst, Ar_ft2: Ar, Wc_kip: Wc_kip)) <concentric-footing-loads>
#calcline([$A_r = B_r L_r = #round(Ar, digits: 2) " ft"^2$], [Tributary area])
#calcline([$W_c = b_c b_c L_c gamma_c = #round(Wc_kip, digits: 2) "kip"$], [Column self weight])
#calcline([$P_s = (D_L_r + L_L_r) A_r + W_c = #round(Ps_typst, digits: 2) "kip"$], [Typst-derived service load])
#calcline([$P_(s,"checked") = #round(n.Ps_kip, digits: 2) "kip"$], [Python-checked service load])
#calcline([$P_u = 1.2(D_L_r A_r + W_c) + 1.6 L_L_r A_r = #round(Pu_typst, digits: 2) "kip"$], [Typst-derived factored load])
#calcline([$P_(u,"checked") = #round(n.Pu_kip, digits: 2) "kip"$], [Factored axial load])
#calcline([$q_u = P_u / A_f = #round(n.qu_psf, digits: 1) "psf"$], [Factored gross pressure])
== Geometry and Materials
#calcline([$B_f = #n.Bf_ft "ft"$, $A_f = #n.Af_ft2 " ft"^2$], [Footing plan dimensions])
#calcline([$D_f = #n.Df_in "in"$, $"cover" = #n.cover_in "in"$, $d = D_f - "cover" = #n.d_in "in"$], [Effective depth])
#calcline([$c = #n.c_in "in"$, $b_p = #n.bp_in "in"$], [Column and base-plate widths])
#calcline([$f'_c = #n.fc_psi "psi"$, $f_y = #n.fy_ksi "ksi"$, $lambda = #n.lambda$], [Concrete and steel])
#calcline([$N = #n.N$, #("#" + str(n.rebar_size) + " bars"), $A_(s,1) = #round(n.As1_in2, digits: 4) " in"^2$, $A_s = #round(n.As_in2, digits: 4) " in"^2$], [Reinforcement per direction])
#calcline([$rho = A_s/(B_f d) = #round(n.rho, digits: 4)$, $rho_min = #n.rho_min$], [Reinforcement ratio])
== Soil Bearing
#calcline([$q = P_s/A_f = #round(n.q_psf, digits: 1) "psf"$], [Acting service pressure])
#calcline([$q_a = #n.qa_psf "psf"$], [Allowable gross pressure])
#check("Soil bearing", checks.soil_bearing.demand, checks.soil_bearing.capacity, unit: "psf", ok: checks.soil_bearing.ok, demand-label: [$q$], capacity-label: [$q_a$])
== One-Way Shear
#calcline([$L_1 = (B_f - c)/2 - d = #round(n.L1_in, digits: 2) "in"$], [Cantilever beyond d])
#calcline([$V_u = q_u B_f L_1 = #round(n.Vu_one_way_kip, digits: 2) "kip"$], [Demand at d])
#calcline([$V_c = 2 lambda sqrt(f'_c) B_f d = #round(n.Vc_one_way_kip, digits: 1) "kip"$], [ACI 22.5])
#calcline([$phi V_c = #round(n.phiVc_one_way_kip, digits: 1) "kip"$], [phi=0.75])
#check("One-way shear", checks.one_way_shear.demand, checks.one_way_shear.capacity, unit: "kip", ok: checks.one_way_shear.ok, demand-label: [$V_u$], capacity-label: [$phi V_c$])
== Two-Way Shear (Punching)
#calcline([$b_o = 4(c+d) = #n.bo_in "in"$], [Critical perimeter at d/2])
#calcline([$v_c = min(4, 2+4/beta, 2+alpha_s d/b_o) lambda sqrt(f'_c) = #round(n.vc_psi, digits: 1) "psi"$], [ACI 22.6])
#calcline([$V_c = v_c b_o d = #round(n.Vc_two_way_kip, digits: 1) "kip"$], [Concrete shear strength])
#calcline([$V_u = q_u (A_f - (c+d)^2) = #round(n.Vu_two_way_kip, digits: 1) "kip"$], [Punch demand])
#check("Two-way shear", checks.two_way_shear.demand, checks.two_way_shear.capacity, unit: "kip", ok: checks.two_way_shear.ok, demand-label: [$V_u$], capacity-label: [$phi V_c$])
== Flexure
#calcline([$L_c = (B_f - c)/2 = #round(n.Lc_in, digits: 1) "in"$], [Cantilever])
#calcline([$M_u = q_u B_f L_c^2/2 = #round(n.Mu_kipft, digits: 2) "kip·ft"$], [Demand])
#calcline([$a = A_s f_y/(0.85 f'_c B_f) = #round(n.a_in, digits: 3) "in"$], [Whitney stress block])
#calcline([$M_n = A_s f_y (d - a/2) = #round(n.Mn_kipft, digits: 1) "kip·ft"$], [Nominal moment strength])
#calcline([$phi M_n = #round(n.phiMn_kipft, digits: 1) "kip·ft"$], [phi=0.90])
#calcline([$rho = A_s/(B_f d) = #round(n.rho, digits: 4)$], [vs rho_min 0.0018])
#check("Flexure", checks.flexure.demand, checks.flexure.capacity, unit: "kip·ft", ok: checks.flexure.ok, demand-label: [$M_u$], capacity-label: [$phi M_n$])
#check("Minimum steel", checks.minimum_steel.demand, checks.minimum_steel.capacity, unit: "", ok: checks.minimum_steel.ok, demand-label: [$rho$], capacity-label: [$rho_min$])
== Concrete Bearing
#calcline([$A_1 = b_p^2 = #round(n.A1_in2, digits: 1) " in"^2$, $A_2 = B_f^2 = #round(n.A2_in2, digits: 1) " in"^2$], [Plate and footing])
#calcline([$sqrt(A_2/A_1) = #round(n.sqrt_ratio, digits: 2)$], [Uncapped ratio, capped at 2.0 for strength])
#calcline([$B_n = 0.85 f'_c A_1 sqrt(...) = #round(n.Bn_kip, digits: 1) "kip"$], [ACI 22.8])
#calcline([$phi B_n = #round(n.phiBn_kip, digits: 1) "kip"$], [phi=0.65])
#check("Concrete bearing", checks.bearing.demand, checks.bearing.capacity, unit: "kip", ok: checks.bearing.ok, demand-label: [$P_u$], capacity-label: [$phi B_n$])