Files
BrainWind/app/src/lib/nbr-tables/table-21.ts
T

71 lines
2.5 KiB
TypeScript

/**
* 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<string, Row> = {
'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;