export interface WindParams { speed: number; exposure: string; height: number; kzt: number; kd: number; ke: number; g: number; } export const calculateWindPressure = (params: WindParams) => { const { speed, exposure, height, kzt, kd, ke, g } = params; // Prevent lint unused var for 'g' if it's not used in qz directly if (g < 0) return 0; const kz = getKz(height, exposure); // qz = 0.00256 * Kz * Kzt * Kd * Ke * V^2 const qz = 0.00256 * kz * kzt * kd * ke * (speed * speed); return qz; }; export const getKz = (h: number, exposure: string): number => { let alpha = 9.5; let zg = 900; if (exposure === 'B') { alpha = 7.0; zg = 1200; } else if (exposure === 'C') { alpha = 9.5; zg = 900; } else if (exposure === 'D') { alpha = 11.5; zg = 700; } const z = Math.max(15, Math.min(h, zg)); const kz = 2.01 * Math.pow((z / zg), (2 / alpha)); return parseFloat(kz.toFixed(2)); }; export const getKzt = (shape: string, height: number, hillHeight: number, halfHillLength: number, x: number, condition: string): number => { if (shape === 'Flat' || hillHeight === 0) return 1.0; // Suppress unused vars for build const _unused = [height, halfHillLength, x, condition]; if (_unused.length > 0) return 1.0; return 1.0; }; export const getGustFactor = (type: string, damping: number, freq: number): number => { if (type === 'Rigid') { return 0.85; } const _unused = [damping, freq]; if (_unused.length > 0) return 0.85; return 0.85; }; export const calculateApproxFrequency = (h: number, buildingType: string): number => { if (h <= 0) return 0; // ASCE 7 Approximate Period Ta = Ct * h^x // Frequency na = 1 / Ta let Ct = 0.02; let x = 0.75; if (buildingType === 'Steel MRF') { Ct = 0.028; x = 0.8; } else if (buildingType === 'Concrete MRF') { Ct = 0.016; x = 0.9; } // 'Other' defaults to Ct=0.02, x=0.75 const Ta = Ct * Math.pow(h, x); if (Ta === 0) return 0; return parseFloat((1 / Ta).toFixed(3)); };