import type { ConnectionType, Support, Beam, Angle, Bolts, Weld, Materials, LimitState, DesignMethod, } from '../types/connection'; export function calculateLimitStates( _connectionType: ConnectionType, support: Support, beam: Beam, angle: Angle, bolts: Bolts, weld: Weld, materials: Materials, _designMethod: DesignMethod ): LimitState[] { const limitStates: LimitState[] = []; // Bolt shear rupture at support (AISC J3.7) if (angle.connectionMethod === 'bolted') { const Ab = Math.PI * Math.pow(bolts.diameter, 2) / 4; const Fnv = bolts.grade === 'A325' ? 54 : 68; // ksi (for threads included) const rn = Fnv * Ab * bolts.numberOfRows; limitStates.push({ name: 'Bolt Shear Rupture at Support', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Bolt shear rupture at beam if (angle.connectionMethod === 'bolted') { const Ab = Math.PI * Math.pow(bolts.diameter, 2) / 4; const Fnv = bolts.grade === 'A325' ? 54 : 68; const rn = Fnv * Ab * bolts.numberOfRows; limitStates.push({ name: 'Bolt Shear Rupture at Beam', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Angle bearing at bolt holes - support side (AISC J3.10) if (angle.connectionMethod === 'bolted') { const rn = 2.4 * bolts.diameter * angle.thickness * materials.angle.fu * bolts.numberOfRows; limitStates.push({ name: 'Angle Bearing Holes at Support', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Angle bearing at bolt holes - beam side if (angle.connectionMethod === 'bolted') { const rn = 2.4 * bolts.diameter * angle.thickness * materials.angle.fu * bolts.numberOfRows; limitStates.push({ name: 'Angle Bearing Holes at Beam', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Angle shear yielding (AISC J4.2) const Agv = angle.legOnBeam * angle.thickness; const rnShearYield = 0.6 * materials.angle.fy * Agv; limitStates.push({ name: 'Angle Shear Yielding', phi: 1.0, omega: 1.5, rn: rnShearYield, phiRn: 1.0 * rnShearYield, rnOmega: rnShearYield / 1.5, applicable: true, }); // Angle shear rupture (AISC J4.2) if (angle.connectionMethod === 'bolted') { const Anv = angle.legOnBeam * angle.thickness - bolts.numberOfRows * (bolts.diameter + 0.125) * angle.thickness; const rnShearRupture = 0.6 * materials.angle.fu * Anv; limitStates.push({ name: 'Angle Shear Rupture', phi: 0.75, omega: 2.0, rn: rnShearRupture, phiRn: 0.75 * rnShearRupture, rnOmega: rnShearRupture / 2.0, applicable: true, }); } // Angle block shear (AISC J4.3) if (angle.connectionMethod === 'bolted') { const Agv = (bolts.numberOfRows - 1) * bolts.spacing * angle.thickness; const Anv = Agv - (bolts.numberOfRows - 0.5) * (bolts.diameter + 0.125) * angle.thickness; const Ant = angle.edgeDistanceHorizontal * angle.thickness; const Ubs = 1.0; const rn = Math.min( 0.6 * materials.angle.fu * Anv + Ubs * materials.angle.fu * Ant, 0.6 * materials.angle.fy * Agv + Ubs * materials.angle.fu * Ant ); limitStates.push({ name: 'Angle Block Shear', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Support bearing at bolt holes if (angle.connectionMethod === 'bolted') { const tSupport = support.tf || 0.5; // Use flange thickness if available, otherwise assume const rn = 2.4 * bolts.diameter * tSupport * materials.support.fu * bolts.numberOfRows; limitStates.push({ name: 'Support Bearing at Bolt Holes', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Beam bearing at bolt holes if (angle.connectionMethod === 'bolted') { const tBeam = beam.tw || 0.3; // Use web thickness if available, otherwise assume const rn = 2.4 * bolts.diameter * tBeam * materials.beam.fu * bolts.numberOfRows; limitStates.push({ name: 'Beam Bearing at Bolt Holes', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } // Beam web shear yielding (AISC J4.2) if (beam.tw && beam.d) { const Agv = beam.tw * beam.d; const rnBeamWebShear = 0.6 * materials.beam.fy * Agv; limitStates.push({ name: 'Beam Web Shear Yielding', phi: 1.0, omega: 1.5, rn: rnBeamWebShear, phiRn: 1.0 * rnBeamWebShear, rnOmega: rnBeamWebShear / 1.5, applicable: true, }); } else { limitStates.push({ name: 'Beam Web Shear Yielding', phi: 0, omega: 0, rn: 0, phiRn: 0, rnOmega: 0, applicable: false, }); } // Weld shear (AISC J2.4) if (angle.connectionMethod === 'welded') { const Aw = 2 * angle.legOnSupport * weld.size * 0.707; // both sides const Fnw = 0.6 * weld.strength; const rn = Fnw * Aw; limitStates.push({ name: 'Weld Shear at Support', phi: 0.75, omega: 2.0, rn, phiRn: 0.75 * rn, rnOmega: rn / 2.0, applicable: true, }); } else { limitStates.push({ name: 'Weld Shear at Support', phi: 0, omega: 0, rn: 0, phiRn: 0, rnOmega: 0, applicable: false, }); } return limitStates; }