Thrust Network Analysis
Graphic Statics & Reciprocal Force Diagrams: Modern digital form-finding (Thrust Network Analysis - TNA) stems from James Clerk Maxwell's 1864 reciprocal figure theorem. A spatial form diagram representing structural bar geometry $\Gamma$ has an exact dual reciprocal diagram $\Gamma^*$. Every closed polygon of forces in $\Gamma^*$ corresponds to a node in equilibrium in $\Gamma$, allowing architects to sculpt compression-only vaults purely geometrically without finite element matrix inversion.
Maxwell-Cremona Duality:
1def solve_thrust_network_equilibrium(form_edges, force_densities, loads):2 """3 Thrust Network Analysis (TNA) by Block & Ochsendorf (2007).4 Relates horizontal equilibrium to reciprocal graphic statics (Maxwell-Cremona):5 Edge e in Form Diagram Gamma is perpendicular/parallel to edge e* in Force Diagram Gamma*.6 Length ||e*|| in force diagram equals horizontal thrust force H_e.7 """8 # Vertical equilibrium: z_i coordinates solved via laplacian linear solve:9 # C^T * diag(q) * C * z = P_z (where q are force densities)10 return "Equilibrium Thrust Network & Reciprocal Force Polygons"
Funicular Thrust Lines & Masonry Equilibrium: Stone and unreinforced concrete masonry cannot bear tension. Jacques Heyman proved the Lower-Bound Safe Theorem of limit analysis: a historical vault or arch cannot collapse under its dead weight if a funicular thrust line exists that lies wholly within the masonry envelope. If asymmetric point loads push the thrust line outside the boundary, cracks open and three-hinge collapse mechanisms trigger.
Heyman's Limit Theorem:
1def is_thrust_line_safe(thrust_points, arch_intrados, arch_extrados):2 """3 Heyman's Safe Limit Analysis Theorem for unreinforced masonry arches (1966).4 Assumptions: masonry has zero tensile capacity, infinite compressive strength, and no sliding.5 An arch is 100% stable if and only if at least ONE equilibrium thrust line6 can be contained entirely between the intrados (bottom) and extrados (top) boundaries.7 """8 for pt, bottom, top in zip(thrust_points, arch_intrados, arch_extrados):9 if pt[1] < bottom[1] or pt[1] > top[1]:10 return False # Thrust line escapes boundary -> hinge collapse11 return True