55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
/**
|
||
* Avaliação de conforto humano (NBR 6123:2023, sec. 9.6).
|
||
*
|
||
* Aceleração-limite:
|
||
* a_lim = 0,01 · k_a · f^1.124 (m/s²)
|
||
*
|
||
* onde k_a = 6,12 (escritórios) ou 4,058 (residências).
|
||
*/
|
||
|
||
export interface ComfortInput {
|
||
/** Frequência de vibração f (Hz) */
|
||
freq: number;
|
||
/** Aceleração máxima a_max (m/s²) — calculada pelo usuário */
|
||
aMax: number;
|
||
/** Tipo de uso */
|
||
use: 'residential' | 'commercial';
|
||
}
|
||
|
||
export interface ComfortResult {
|
||
aLim: number;
|
||
use: 'residential' | 'commercial';
|
||
ok: boolean;
|
||
ratio: number;
|
||
description: string;
|
||
}
|
||
|
||
export function evaluateComfort(input: ComfortInput): ComfortResult {
|
||
const { freq, aMax, use } = input;
|
||
if (freq < 0.06 || freq > 1) {
|
||
return {
|
||
aLim: 0,
|
||
use,
|
||
ok: false,
|
||
ratio: 0,
|
||
description: 'Fora da faixa 0,06–1,00 Hz — aplicar critério da ISO 10137.',
|
||
};
|
||
}
|
||
const ka = use === 'commercial' ? 6.12 : 4.06;
|
||
const aLim = 0.01 * ka * Math.pow(freq, 1.124);
|
||
const ratio = aMax / aLim;
|
||
return {
|
||
aLim,
|
||
use,
|
||
ok: aMax <= aLim,
|
||
ratio,
|
||
description: aMax <= aLim
|
||
? `Aceleração dentro do limite (a/a_lim = ${ratio}).`
|
||
: `Aceleração acima do limite (a/a_lim = ${ratio}).`,
|
||
};
|
||
}
|
||
|
||
/** Aceleração máxima a_max = 4π²f²·u_max (sec. 9.6.1) */
|
||
export function maxAcceleration(freq: number, uMax: number): number {
|
||
return Number((4 * Math.PI * Math.PI * freq * freq * uMax).toFixed(3));
|
||
} |