/** * Tabela 21 — Cúpulas sobre o terreno (NBR 6123:2023, sec. 6.2.4.1). * * Valores limites de Cpe (sobrepressão e sucção) e coeficiente de * sustentação Cs por f/d. * * Fonte: NBR 6123:2023, p. 40 (Tabela 21). * Última auditoria: 2026-07-07 — valores oficiais do PDF confirmados. * * Chaves: f/d (razão flecha/diâmetro). A norma fornece chaves literais * "1/15", "1/10", "1/8", "1/6", "1/4", "1/2". * * ⚠️ CORREÇÃO: Sobrepressão é POSITIVA (sopramento sobre a cúpula). * O código anterior usava valores negativos incorretamente. */ import { linearInterp1D } from '../log-interp'; const FD = [1 / 15, 1 / 10, 1 / 8, 1 / 6, 1 / 4, 1 / 2] as const; const FD_KEYS = ['1/15', '1/10', '1/8', '1/6', '1/4', '1/2'] as const; type Row = { sobrepressao: number; sucção: number; cs: number }; /** * Valores oficiais da Tabela 21 — NBR 6123:2023, p. 40. * Sobrepressão é POSITIVA (sinal + na norma). */ const T21: Record = { '1/15': { sobrepressao: +0.1, sucção: -0.3, cs: 0.15 }, '1/10': { sobrepressao: +0.2, sucção: -0.3, cs: 0.20 }, '1/8': { sobrepressao: +0.2, sucção: -0.4, cs: 0.20 }, '1/6': { sobrepressao: +0.3, sucção: -0.5, cs: 0.30 }, '1/4': { sobrepressao: +0.4, sucção: -0.6, cs: 0.30 }, '1/2': { sobrepressao: +0.6, sucção: -1.0, cs: 0.50 }, }; function lookup21(fd: number): Row { const fdClamped = Math.max(FD[0], Math.min(FD[FD.length - 1], fd)); const xs = [...FD]; const ys1 = FD_KEYS.map((k) => T21[k].sobrepressao); const ys2 = FD_KEYS.map((k) => T21[k].sucção); const ys3 = FD_KEYS.map((k) => T21[k].cs); return { sobrepressao: Number(linearInterp1D(xs, ys1, fdClamped).toFixed(2)), sucção: Number(linearInterp1D(xs, ys2, fdClamped).toFixed(2)), cs: Number(linearInterp1D(xs, ys3, fdClamped).toFixed(2)), }; } export interface DomeCpeResult { /** Cpe máximo (sobrepressão) — positivo para cúpulas sobre o terreno */ cpeMax: number; /** Cpe mínimo (sucção) */ cpeMin: number; /** Coeficiente de sustentação */ cs: number; } export function getDomeOnGroundCpeNBR6123(fOverD: number): DomeCpeResult { const v = lookup21(fOverD); return { cpeMax: v.sobrepressao, cpeMin: v.sucção, cs: v.cs }; } /** Força de sustentação F = Cs · q · (π·d²/4) */ export function getDomeLiftForce(cs: number, q: number, d: number): number { return Number((cs * q * (Math.PI * d * d) / 4).toFixed(3)); } // Mantém compatibilidade com o nome anterior (chaves literais) export const DOME_FD_KEYS = FD_KEYS;