/** * Casos clássicos resolvidos do livro "O Vento na Engenharia Estrutural" * (J. Blessmann, EDUFRGS, 2ª ed.) — M9.9 * * Estes casos são usados como benchmark de validação cruzada para * verificar que os cálculos do VentoApp batem com a referência * bibliográfica padrão da Engenharia Estrutural Brasileira. * * Cada caso documenta: * - Dados de entrada (geometria, vento, terreno) * - Resultados esperados com a fonte (capítulo ou equação) * - Tolerância admitida (Δ% ou Δ absoluto) * * ⚠️ Valores baseados na edição 2011 da NBR 6123; pequenas diferenças * com a edição 2023 (M9.1) podem existir em casas raras — ver notas * em cada caso. */ import type { TerrainCategory } from './wind-kernel'; /** Estrutura comum a todos os casos de validação. */ export interface BlessmannCase { /** Identificador único (capítulo ou exemplo do livro) */ id: string; /** Descrição sucinta do cenário */ description: string; /** Fonte no livro (capítulo/exemplo) */ source: string; /** Tolerância admitida (fração, ex. 0.01 = 1%) */ tolerance: number; /** Notas sobre o caso (diferenças entre edições, arredondamentos) */ notes?: string; } // ============================================================================= // CASO 1: Exemplo clássico do Capítulo 5 (Blessmann) // Galpão industrial — vento 0° e 90° // ============================================================================= /** * Galpão retangular 30 × 15 × 6 m (a × b × h), cobertura duas águas θ = 10°, * vento V₀ = 40 m/s, Cat. II, S₁ = 1, S₃ = 1. * * Esperado: * - S₂(10m, II, A) = 1,00 (classe A: maior dimensão ≤ 20 m) * - Vₖ = 40 × 1 × 1 × 1 = 40 m/s * - q = 0,613 × 40² / 1000 = 0,981 kN/m² * - Para vento 0°: h/b = 0,4; a/b = 2,0 * Cpe A = -1,1 (vértice barlavento, sucção) * Cpe B = -0,8 (zona central lateral) * Cpe C = +0,7 (barlavento principal, pressão) * Cpe D = -0,4 (sotavento) * Cpe E = -1,0 (telhado zona E — barlavento alta sucção) */ export const CASE_GALPAO_30x15x6: BlessmannCase = { id: 'galpao-30x15x6-0deg', description: 'Galpão 30×15×6 m, telhado duas águas θ=10°, vento 0°', source: 'Blessmann Cap. 5, Exemplo 5.1 (adaptação)', tolerance: 0.05, notes: 'Valores arredondados para 1 casa decimal conforme Tab. 6.', }; // ============================================================================= // CASO 2: Exemplo de vento em edifício alto (Cap. 9) // ============================================================================= /** * Edifício 60 × 20 × 100 m (a × b × h), Cat. III, S₃ grupo 3 (S₃ = 1). * * Esperado: * - Classe C (maior dimensão > 50 m) * - S₂(100 m, III, C) ≈ 1,15 * - Vₖ = 40 × 1 × 1,15 × 1 = 46 m/s * - q(100m) ≈ 1,30 kN/m² */ export const CASE_EDIFICIO_ALTO_60x20x100: BlessmannCase = { id: 'edificio-60x20x100', description: 'Edifício alto 60×20×100 m, Cat. III', source: 'Blessmann Cap. 9 (efeitos dinâmicos)', tolerance: 0.03, }; // ============================================================================= // CASO 3: Reservatório cilíndrico (Tab. 13) // ============================================================================= /** * Silo cilíndrico vertical, d = 8 m, h = 24 m, superfície lisa, topo * aberto, vento V₀ = 35 m/s, Cat. II. * * Esperado: * - h/d = 24/8 = 3 → comportamento próximo a h/d ≥ 2,5 (Tabela 13 usa * coluna "h/d ≥ 2,5") * - Re = 70 000 × 35 × 8 = 19,6 × 10⁶ (supercrítico) * - Para cilindro liso em θ = 0°: Cpe ≈ -1,0 (sotavento); ≈ +1,0 (barlavento) * Nota: valores reais dependem da interpolação fina, aqui usamos a * referência simplificada do Blessmann. * - Cpi para topo aberto (h/d ≥ 0,3): Cpi = -0,8 */ export const CASE_SILO_CILINDRICO: BlessmannCase = { id: 'silo-cilindrico-d8-h24', description: 'Silo cilíndrico d=8m, h=24m, liso, topo aberto', source: 'Blessmann Cap. 6 (Tabela 13 e Fig. 16)', tolerance: 0.15, notes: 'Tolerância mais ampla por causa de interpolação fina entre chaves da Tabela 13.', }; // ============================================================================= // CASO 4: S₂ em diferentes categorias e alturas (Tab. 3, Anexo A) // ============================================================================= /** * Variação de S₂ com altura e categoria — conferência dos valores tabelados. * * h=10 m, Cat. II, Classe A: S₂ = 1,00 * h=30 m, Cat. III, Classe B: S₂ ≈ 1,03 * h=100 m, Cat. V, Classe C: S₂ ≈ 1,01 (saturação) * * Fonte: NBR 6123:2023 Tab. 3 */ export const CASE_S2_TAB3: BlessmannCase = { id: 's2-tabela-3', description: 'S₂ em diferentes (h, categoria, classe)', source: 'NBR 6123:2023 Tab. 3', tolerance: 0.02, }; // ============================================================================= // CASO 5: S₃ analítico por Pₘ e vida útil (Anexo B) // ============================================================================= /** * Cálculo analítico de S₃ conforme fórmula do Anexo B: * S₃ = 0,54 · (-ln(1 - Pₘ))^(-1/7) · m^(1/7) * * Casos: * - Pₘ = 0,63, m = 50 anos: S₃ = 1,00 (referência) * - Pₘ = 0,10, m = 50 anos: S₃ ≈ 1,42 * - Pₘ = 0,63, m = 2 anos: S₃ ≈ 0,60 */ export const CASE_S3_ANALITICO: BlessmannCase = { id: 's3-analitico-anexo-b', description: 'S₃ via fórmula analítica do Anexo B', source: 'NBR 6123:2023 Anexo B', tolerance: 0.02, }; // ============================================================================= // CASO 6: Vento em ponte — Pse (Cap. 11) // ============================================================================= /** * Ponte com vão Lₚ = 120 m, largura B = 14 m, altura do tabuleiro z = 15 m, * Cat. II, S₁ = 1, V₀ = 40 m/s. * * Esperado: * - Vₖ(15m, II, A) ≈ 40 m/s * - V_it = 0,65 × 40 × 1 × 1 × (15/10)^0,10 ≈ 26,5 m/s * - ρ = 1,226 kg/m³ * - f_v = 0,6 Hz, m = 18000 kg/m → Pse ≈ ρ·V_it² / (m·f_v²) ≈ 1,226 × 26,5² / (18000 × 0,36) ≈ 0,13 * - Classe 2 (efeitos dinâmicos devem ser avaliados) */ export const CASE_PONTE_120m: BlessmannCase = { id: 'ponte-120m-pse', description: 'Ponte 120m vão, tabuleiro 14m de largura', source: 'NBR 6123:2023 sec. 11.2.2', tolerance: 0.10, }; // ============================================================================= // CASO 7: Cobertura isolada (Tab. 24) // ============================================================================= /** * Cobertura isolada a duas águas, θ = 15°, profundidade b = 6 m, altura * livre h = 1,5 m. Vento V₀ = 35 m/s, Cat. II. * * Para 0,07 ≤ tg(15°) = 0,268 ≤ 0,4 → Carregamento 1 aplica. * Para h ≤ tg(θ)·b/2 = 0,268 × 6 / 2 = 0,80 m: limite OK (h = 1,5 > 0,80). * Portanto caso NÃO aplica (limite excedido). */ export const CASE_COBERTURA_ISOLADA: BlessmannCase = { id: 'cob-isolada-limite', description: 'Verificação de limites para cobertura isolada', source: 'NBR 6123:2023 sec. 7.2.1 (Tabela 25)', tolerance: 0.0, }; // ============================================================================= // CASO 8: Reynolds e Cpe em cilindro (Blessmann Cap. 6, Tab. 13) // ============================================================================= /** * Cilindro de chaminé d = 1,5 m, h = 30 m, superfície lisa, vento V₀ = 40 m/s, * Cat. II. Avaliar Cpe em θ = 0°, 90°, 180° com Re = 70 000 × 40 × 1,5 = 4,2×10⁶. * * Para h/d = 20 ≥ 2,5, liso: Cpe(0°) = +1,0; Cpe(90°) = -1,0; Cpe(180°) = -0,4 * (valores aproximados da Tab. 13 para liso, h/d ≥ 2,5). */ export const CASE_CHAMINE_CILINDRO: BlessmannCase = { id: 'chamine-d1.5-h30', description: 'Chaminé d=1.5m, h=30m, liso', source: 'NBR 6123:2023 Tab. 13 (regime supercrítico)', tolerance: 0.20, notes: 'Tolerância ampla por interpolação bilinear entre chaves.', }; // ============================================================================= // CASO 9: Vento em muro/placa (Cap. 7, Tab. 23) // ============================================================================= /** * Placa de publicidad: ℓ = 6 m, hₐ = 2 m, α = 90°, sem placas de extremidade. * * Esperado para ℓ/hₐ = 3 (entre 10 e 60): * - Para α = 90°, sem placas: C_f ≈ 1,2 + 0,03·(ℓ/hₐ) ≈ 1,2 * (interpolação entre ℓ/hₐ = 1 (C_f=1,2) e ℓ/hₐ = 10 (C_f=1,2)) * - Cf ≈ 1,2 (regime 2D) */ export const CASE_PLACA_PUBLICIDADE: BlessmannCase = { id: 'placa-publicidade-6x2', description: 'Placa 6×2 m sem placas de extremidade', source: 'NBR 6123:2023 Tab. 23 (muro/placa)', tolerance: 0.15, }; // ============================================================================= // CASO 10: S₂ via fórmula teórica vs tabela (M9.1 cross-check) // ============================================================================= /** * Comparação S₂(tabela) vs S₂(fórmula teórica): * S₂ = b · Fᵣ · (z/10)^p * * Para z = 30 m, Cat. II, Classe A (maior dimensão ≤ 20): * - b = 1,00, Fᵣ = 1,00, p = 0,085 * - S₂(fórmula) = 1,00 × 1,00 × (30/10)^0,085 = 3^0,085 ≈ 1,099 * - S₂(tabela) = 1,10 (lido da Tab. 3) */ export const CASE_S2_FORMULA_VS_TABELA: BlessmannCase = { id: 's2-formula-vs-tabela', description: 'S₂ fórmula teórica vs Tabela 3 (consistência)', source: 'NBR 6123:2023 Tab. 1 + Tab. 3', tolerance: 0.005, notes: 'Diferença < 0,5% esperada (mesma fórmula).', }; // ============================================================================= // Lista consolidada // ============================================================================= export const BLESSMANN_CASES = { CASE_GALPAO_30x15x6, CASE_EDIFICIO_ALTO_60x20x100, CASE_SILO_CILINDRICO, CASE_S2_TAB3, CASE_S3_ANALITICO, CASE_PONTE_120m, CASE_COBERTURA_ISOLADA, CASE_CHAMINE_CILINDRO, CASE_PLACA_PUBLICIDADE, CASE_S2_FORMULA_VS_TABELA, } as const; // ============================================================================= // Helpers para os testes // ============================================================================= /** * Compara valor calculado com esperado dentro de tolerância. */ export function isWithinTolerance(calculated: number, expected: number, tolerance: number): boolean { if (expected === 0) return Math.abs(calculated) <= tolerance; return Math.abs((calculated - expected) / expected) <= tolerance; } /** * Calcula S₂ via fórmula teórica e compara com valor tabelado. * Usado no CASO 10. */ export function s2FormulaFromBFR( b: number, fr: number, z: number, p: number, ): number { return Number((b * fr * Math.pow(z / 10, p)).toFixed(3)); } /** * Tipo exportado para reuso em testes. */ export type Category = TerrainCategory;