feat: unified 0 and 90 degree PDF envelope and category descriptors

This commit is contained in:
2026-07-08 19:52:34 +00:00
commit 9fece3f174
170 changed files with 27177 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
/**
* Tabela 33 — Número de Strouhal (St) para diversas seções
* (NBR 6123:2023, sec. 10.3).
*
* Fonte: NBR 6123:2023, p. 79 (Tabela 33).
* Última auditoria: 2026-07-08 — auditado e condizente com a norma.
*/
import { linearInterp1D } from '../log-interp';
export type SectionShape =
| 'circle'
| 'rectangle-b-a-1-3'
| 'rectangle-b-a-1-2'
| 'rectangle-b-a-1-1'
| 'rectangle-b-a-1-0-5'
| 'rectangle-b-a-2-0';
interface StEntry {
shape: SectionShape;
ratio: number;
st: number;
}
/** St por forma e relação b/a */
const ST_TABLE: readonly StEntry[] = [
{ shape: 'circle', ratio: 0, st: 0.20 },
{ shape: 'rectangle-b-a-1-3', ratio: 1 / 3, st: 0.16 },
{ shape: 'rectangle-b-a-1-3', ratio: 1 / 2, st: 0.12 },
{ shape: 'rectangle-b-a-1-3', ratio: 1, st: 0.11 },
{ shape: 'rectangle-b-a-1-3', ratio: 2, st: 0.10 },
{ shape: 'rectangle-b-a-1-2', ratio: 1, st: 0.12 },
{ shape: 'rectangle-b-a-1-2', ratio: 1.5, st: 0.10 },
{ shape: 'rectangle-b-a-1-2', ratio: 2, st: 0.08 },
{ shape: 'rectangle-b-a-1-1', ratio: 1, st: 0.12 },
{ shape: 'rectangle-b-a-1-1', ratio: 1.5, st: 0.08 },
{ shape: 'rectangle-b-a-1-1', ratio: 2, st: 0.08 },
{ shape: 'rectangle-b-a-1-1', ratio: 4, st: 0.08 },
{ shape: 'rectangle-b-a-1-0-5', ratio: 1, st: 0.12 },
{ shape: 'rectangle-b-a-1-0-5', ratio: 1.5, st: 0.06 },
{ shape: 'rectangle-b-a-1-0-5', ratio: 2, st: 0.05 },
{ shape: 'rectangle-b-a-2-0', ratio: 1, st: 0.10 },
{ shape: 'rectangle-b-a-2-0', ratio: 1.5, st: 0.08 },
{ shape: 'rectangle-b-a-2-0', ratio: 2, st: 0.08 },
{ shape: 'rectangle-b-a-2-0', ratio: 4, st: 0.08 },
];
export function getStrouhalNumber(shape: SectionShape, ratio: number): number {
const entries = ST_TABLE.filter((e) => e.shape === shape);
if (entries.length === 0) return 0.2;
const xs = entries.map((e) => e.ratio);
const ys = entries.map((e) => e.st);
return Number(linearInterp1D(xs, ys, ratio).toFixed(3));
}
/** Velocidade crítica do vento: Vcr = fn · L / St */
export function criticalVelocity(fn: number, L: number, st: number): number {
return Number((fn * L / Math.max(st, 0.001)).toFixed(2));
}
/** Verificação de dispensa: Vcr > 1,25 · V0 · S1 · S2(z, t=600s) · S3 (sec. 10.2) */
export function vortexDispenseCheck(vcr: number, v0: number, s1: number, s2: number, s3: number): boolean {
return vcr > 1.25 * v0 * s1 * s2 * s3;
}
/** Número de Scruton: Sc = ξ · m_eq / (ρ · d) */
export function scrutonNumber(xi: number, mEq: number, rho: number, d: number): number {
return Number((xi * mEq / (rho * d)).toFixed(2));
}
/** Susceptibilidade a vórtices: Sc < 20 indica susceptibilidade (sec. 10.5) */
export function isVortexSusceptible(scruton: number): boolean {
return scruton < 20;
}
/** Tabela 34 — C e K_a0 em função de Re (para sec. 10.4) */
export interface VortexCParams {
re: number;
C: number;
K_a0: number;
}
export const TABLE_34: readonly VortexCParams[] = [
{ re: 0, C: 0.0554, K_a0: 0.0281 },
{ re: 2.5e5, C: 0.0554, K_a0: 0.0281 },
{ re: 5e5, C: 0.1840, K_a0: 0.0807 },
{ re: 1e6, C: 0.0208, K_a0: 0.0008 },
{ re: 2e6, C: 0.0208, K_a0: 0.0008 },
{ re: 5e6, C: 0.0208, K_a0: 0.0008 },
];
/** Parâmetros C e K_a0 por interpolação em Re */
export function getVortexParams(re: number): { C: number; K_a0: number } {
const xs = TABLE_34.map((e) => e.re);
const cVals = TABLE_34.map((e) => e.C);
const kVals = TABLE_34.map((e) => e.K_a0);
const allKZero = kVals.every((v) => v === 0);
return {
C: Number(linearInterp1D(xs, cVals, re).toFixed(4)),
K_a0: Number(linearInterp1D(xs, allKZero ? [0] : kVals, re).toFixed(4)),
};
}