feat: unified 0 and 90 degree PDF envelope and category descriptors
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* 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;
|
||||
Reference in New Issue
Block a user