// ASCE 7-16 Table 11.4-1 (Short Period Site Coefficient Fa) export const getFa = (siteClass: string, ss: number): number => { // Simplified interpolation could be done, but step values for key points: // Ss <= 0.25, 0.5, 0.75, 1.0, >= 1.25 // Site Class A, B, C, D, E (F requires site response) // For brevity, implementing a simplified lookup or specific common logic. // Implementing strict table lookups is verbose. // Using a helper function to interpolate. // Table data structure: [Ss values], [Site Class Row values] // ... For this task, I will implement a robust linear interpolation. const ssVals = [0.25, 0.50, 0.75, 1.00, 1.25]; let row: number[] = []; switch (siteClass) { case 'A': row = [0.8, 0.8, 0.8, 0.8, 0.8]; break; case 'B': row = [0.9, 0.9, 0.9, 0.9, 0.9]; break; case 'C': row = [1.3, 1.3, 1.2, 1.2, 1.2]; break; case 'D': row = [1.6, 1.4, 1.2, 1.1, 1.0]; break; case 'E': row = [2.4, 1.7, 1.3, 1.2, 1.2]; break; // Note: See Sect 11.4.8 for Ss>=1 default: return 1.0; } return interpolate(ss, ssVals, row); }; // ASCE 7-16 Table 11.4-2 (Long Period Site Coefficient Fv) export const getFv = (siteClass: string, s1: number): number => { // S1 <= 0.1, 0.2, 0.3, 0.4, >= 0.5 const s1Vals = [0.10, 0.20, 0.30, 0.40, 0.50]; let row: number[] = []; switch (siteClass) { case 'A': row = [0.8, 0.8, 0.8, 0.8, 0.8]; break; case 'B': row = [0.8, 0.8, 0.8, 0.8, 0.8]; break; case 'C': row = [1.5, 1.5, 1.5, 1.5, 1.5]; break; case 'D': row = [2.4, 2.2, 2.0, 1.9, 1.8]; break; case 'E': row = [4.2, 3.3, 2.8, 2.4, 2.4]; break; // Note: See Sect 11.4.8 default: return 1.5; } return interpolate(s1, s1Vals, row); }; const interpolate = (val: number, xPoints: number[], yPoints: number[]): number => { if (val <= xPoints[0]) return yPoints[0]; if (val >= xPoints[xPoints.length - 1]) return yPoints[yPoints.length - 1]; for (let i = 0; i < xPoints.length - 1; i++) { if (val >= xPoints[i] && val <= xPoints[i + 1]) { const ratio = (val - xPoints[i]) / (xPoints[i + 1] - xPoints[i]); return yPoints[i] + ratio * (yPoints[i + 1] - yPoints[i]); } } return yPoints[0]; }; export const calculateSeismicDesign = (ss: number, s1: number, siteClass: string) => { const fa = getFa(siteClass, ss); const fv = getFv(siteClass, s1); const sms = fa * ss; const sm1 = fv * s1; const sds = (2 / 3) * sms; const sd1 = (2 / 3) * sm1; return { sds, sd1 }; };