calcs/concentric-footing/concentric-footing.typ

110 lines
5.9 KiB
Typst
Raw Normal View History

#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$])