chore: renomear app para BrainWind v1.0

This commit is contained in:
2026-07-10 00:57:19 +00:00
parent 55221b3214
commit 9726f3c503
11 changed files with 698 additions and 15 deletions
+2 -2
View File
@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#6b21a8" /> <meta name="theme-color" content="#6b21a8" />
<meta name="description" content="VentoApp — Cálculo de cargas de vento conforme NBR 6123:2023. Galpões, cilindros, abóbadas, cúpulas, muros, barras, pontes, dinâmica." /> <meta name="description" content="BrainWind v1.0 — Cálculo de cargas de vento conforme NBR 6123:2023. Galpões, cilindros, abóbadas, cúpulas, muros, barras, pontes, dinâmica." />
<title>VentoApp — NBR 6123:2023</title> <title>BrainWind v1.0 — NBR 6123:2023</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
+1 -1
View File
@@ -207,7 +207,7 @@ export function EducationalManual({ type, params }: EducationalManualProps) {
<div className="mt-auto border-t border-border pt-4 text-center"> <div className="mt-auto border-t border-border pt-4 text-center">
<p className="text-[10px] text-muted-foreground font-mono"> <p className="text-[10px] text-muted-foreground font-mono">
VentoApp Referência: ABNT NBR 6123:2023 BrainWind v1.0 Referência: ABNT NBR 6123:2023
</p> </p>
</div> </div>
</SheetContent> </SheetContent>
+2 -2
View File
@@ -136,8 +136,8 @@ describe('M9.4 — serializeFtool (texto exportado)', () => {
txt = serializeFtool(model); txt = serializeFtool(model);
}); });
it('Contém cabeçalho VentoApp', () => { it('Contém cabeçalho BrainWind', () => {
expect(txt).toContain('VentoApp'); expect(txt).toContain('BrainWind v1.0');
expect(txt).toContain('NBR 6123:2023'); expect(txt).toContain('NBR 6123:2023');
}); });
+6 -4
View File
@@ -36,9 +36,11 @@ describe('M9.8 — Dicionário de traduções', () => {
expect(t('nav_warehouse', 'pt-BR')).not.toBe(t('nav_warehouse', 'en-US')); expect(t('nav_warehouse', 'pt-BR')).not.toBe(t('nav_warehouse', 'en-US'));
}); });
it('Chaves "neutras" (marca) são iguais em pt-BR e en-US', () => { describe('Traduções básicas', () => {
expect(t('app_title', 'pt-BR')).toBe('VentoApp'); it('app_title', () => {
expect(t('app_title', 'en-US')).toBe('VentoApp'); expect(t('app_title', 'pt-BR')).toBe('BrainWind v1.0');
expect(t('app_title', 'en-US')).toBe('BrainWind v1.0');
});
}); });
it('Fallback para pt-BR quando locale é inválido', () => { it('Fallback para pt-BR quando locale é inválido', () => {
@@ -151,7 +153,7 @@ describe('M9.8 — Persistência localStorage (via polyfill)', () => {
}); });
describe('M9.8 — Chaves principais em pt-BR', () => { describe('M9.8 — Chaves principais em pt-BR', () => {
it('app_title = VentoApp', () => expect(t('app_title', 'pt-BR')).toBe('VentoApp')); it('app_title = BrainWind v1.0', () => expect(t('app_title', 'pt-BR')).toBe('BrainWind v1.0'));
it('nav_home = Início', () => expect(t('nav_home', 'pt-BR')).toBe('Início')); it('nav_home = Início', () => expect(t('nav_home', 'pt-BR')).toBe('Início'));
it('nav_warehouse = Galpão', () => expect(t('nav_warehouse', 'pt-BR')).toBe('Galpão')); it('nav_warehouse = Galpão', () => expect(t('nav_warehouse', 'pt-BR')).toBe('Galpão'));
it('nav_cylinder = Cilindro', () => expect(t('nav_cylinder', 'pt-BR')).toBe('Cilindro')); it('nav_cylinder = Cilindro', () => expect(t('nav_cylinder', 'pt-BR')).toBe('Cilindro'));
+176
View File
@@ -0,0 +1,176 @@
export const INVARIANTES_NBR6123 = `
## Checklist de Verificação — NBR 6123:2023
Use esta lista para auditar os resultados. Cada regra é OBRIGATÓRIA.
---
### GLOBAIS
1. **q = 0.613 × Vk² / 1000** — fórmula exata, sem aproximação
- Calc: q_N = 0.613 × Vk²; q_kN = q_N / 1000
- Tolerância: ±0.0001 kN/m²
2. **Vk = V0 × S1 × S2 × S3** — fórmula exata
- Verificar: Vk / (V0 × S1 × S2 × S3) ≈ 1.0
- Tolerância: ±0.01 m/s no arredondamento
3. **S2 é não-decrescente com z** — monotonicidade
- Para z1 < z2: S2(z1) <= S2(z2)
- Exceto se z1 < 5m (nesse caso S2(5m) é o piso)
4. **S2 saturado em z >= z_g**
- Cat I: z_g=250m, Cat II: z_g=300m, Cat III: z_g=350m
- Cat IV: z_g=420m, Cat V: z_g=500m
5. **Cpi ∈ [-0.9, +0.9]** — limite normativo SEMPRE
- Qualquer valor fora deste intervalo = FAIL
6. **Classe estrutural correta**
- dim <= 20 → Classe A
- 20 < dim <= 50 → Classe B
- dim > 50 → Classe C
---
### GALPÃO (paredes e telhados)
7. **Pressão em cada zona = q × (Cpe Cpi)**
- Verificar: p(Cpe) = q × (Cpe Cpi)
- Cpe vem da Tabela 6 (paredes) ou Tabela 7 (telhados)
8. **Sinal da zona C (sotavento)** — tipicamente positiva
- Cpe zona C > 0 (pressão) quando α=0°
- Exceção: quando Cpi é suficientemente negativo
9. **Sinal das zonas E/F (barlavento do telhado)** — tipicamente negativas
- Cpe zona E < 0 (sucção) na maioria dos casos
- Verificar que não é > 0 sem motivo
10. **Força de atrito — aplica SOMENTE quando l0/h > 4 OU l0/b > 4**
- Se condição falsa: força de atrito deve ser ZERO
- Cf: smooth=0.01, ribbed=0.02, rectangular=0.04
---
### CILINDRO
11. **Re = 70.000 × Vk × d** — fórmula exata
- Verificar que o Reynolds está correto para o Vk e d fornecidos
12. **Cpe(0°) > 0 (barlavento)** — pressão sempre positiva em θ=0°
- exceto cilindro muito curto (h/d < 0.5) pode variar
13. **Cpe(90°) < 0 (sucção)** — zona de separação
- Qualquer valor positivo em 90° é suspeito
14. **Cpi para topo aberto: -0.8 se h/d >= 0.3, -0.5 caso contrário**
- h/d = altura / diâmetro
15. **Regime supercrítico: Re > 400.000**
- Se Re < 400.000: tabela de subcrítico deve ser usada
- A Tabela 13 é válida para Re > 400.000
---
### ABÓBADA
16. **f/l determina regime correto**
- Regime laminar (baixa turbulência):Tabelas 15-17
- Regime turbulento (alta turbulência): Tabelas 18-20
17. **Cpe negativo na maioria das zonas de sucção**
- Abóbadas tipicamente geram sucção na superfície superior
---
### CÚPULA
18. **f/d razão limitada**
- Cúpulas com f/d muito alto (>0.5) são raras
- Verificar que f/d está em faixa coberta pelas tabelas
19. **Força de sustentação (lift) existe para cúpulas no solo**
- Cs (coeficiente de sustentação) deve ser calculado
- Cúpulas em parede cilíndrica têm Csi = 0
---
### MUROS E PLACAS
20. **Cf entre 0.8 e 2.0 para placas planas**
- Fc = Cf × q × A (força total)
- Verificar: Cf está na faixa válida da Figura 7
21. **Força aplicada no centro de pressão**
- Altura do ponto de aplicação conforme tipo de placa
---
### COBERTURAS ISOLADAS
22. **Cpe para telhado isolado em shed/gable**
- Diferente de telhado conectado a paredes
- Verificar que usa Tabela 24 ou 25, não Tabela 7
---
### BARRAS
23. **Ca decresce com phi crescente (barras planas)**
- phi=0.05 → Ca≈3.6
- phi=1.0 → Ca≈1.4
24. **Barras circulares: Ca depende do regime de Reynolds**
- Subcrítico: Ca≈1.2
- Supercrítico: Ca≈0.6
---
### PONTES
25. **Pse < 0.04 → Classe 1; 0.04-1.0 → Classe 2; >1.0 → Classe 3**
- Pse = ρ × V_it² / (m × fv²) — forma simplificada
- ρ = 1.226 kg/m³
26. **V_it = 0.65 × V0 × S1 × b × (z/10)^p**
- b e p vêm da Tabela 35 por categoria
27. **Cx diminui com B/Heg crescente**
- Cx = 0.21 + 1.83 × (B/Heg)^(-1.13) para 1 <= B/Heg <= 27
- Cx máximo = 2.0
---
### TORRES
28. **Ca para torre quadrada de barras planas**
- Ca diminui com phi aumentando (mais sólido = menos arrasto por shielding)
- K_alpha: 1.0 para α<=12.5°, sobe para ~1.16 em α=45°
29. **Ca para torre triangular**
- K_alpha = 1.0 sempre (não varia com ângulo)
---
### DINÂMICA
30. **Strouhal: St ≈ 0.20 para circular, St ≈ 0.11 para quadrado**
- Usado para calcular velocidade crítica Vcr = f × D / St
31. **Scruton: Sc = 2 × m × δs / (ρ × D²)**
- Verificar que está acima do limite crítico para supressão de vórtices
32. **Conforto: a_lim = 0.01 × ka × f^1.124**
- ka: 6.12 (comercial), 4.06 (residencial)
- Válido SOMENTE para f ∈ [0.06, 1.00] Hz
---
### SINAL CONVENCIONAL
33. **p > 0 → pressão (empurrando a superfície para dentro)**
34. **p < 0 → sucção (puxando a superfície para fora)**
35. **Nunca omitir Cpi no cálculo de pressão**
- p = q × (Cpe Cpi) é a fórmula completa
`;
+367
View File
@@ -0,0 +1,367 @@
export const NORM_REFERENCE = `
# NBR 6123:2023 — Referência Completa para Auditoria
Este documento é uma extração autoritativa dos dados da norma NBR 6123:2023,
implementados no código-fonte do VentoApp. Use-o como referência para verificar
se os cálculos do aplicativo estão corretos.
---
## Seção 4 — Velocidade Básica e Pressão Dinâmica
### Fórmulas fundamentais
- **Velocidade característica**: Vk = V0 × S1 × S2 × S3 (m/s)
- **Pressão dinâmica**: q = 0.613 × Vk² / 1000 (kN/m²)
- **Massa específica do ar**: ρ = 1.226 kg/m³
### Símbolos
| Símbolo | Significado |
|---------|-------------|
| V0 | Velocidade básica do vento (m/s) — Figura 1 ou Anexo C |
| S1 | Fator topográfico (Seção 5.2) |
| S2 | Fator de rugosidade do terreno, tamanho da edificação e altura (Seção 5.3) |
| S3 | Fator estatístico (Seção 5.4) |
| Vk | Velocidade característica do vento (m/s) |
| q | Pressão dinâmica (kN/m²) |
---
## Seção 5.3 — Fator S2 (Tabela 3)
### z_g — Altura da camada limite atmosférica (m)
| Categoria | I | II | III | IV | V |
|-----------|-----|-----|------|-----|-----|
| z_g (m) | 250 | 300 | 350 | 420 | 500 |
### Tabela 1 — Parâmetros b, p, Fr
| Categoria | Classe A | Classe B | Classe C |
|-----------|----------|----------|----------|
| **I** | b=1.10, p=0.06, Fr=1.00 | b=1.11, p=0.065, Fr=0.98 | b=1.12, p=0.07, Fr=0.95 |
| **II** | b=1.00, p=0.085, Fr=1.00 | b=1.00, p=0.09, Fr=0.98 | b=1.00, p=0.10, Fr=0.95 |
| **III** | b=0.94, p=0.10, Fr=1.00 | b=0.94, p=0.105, Fr=0.98 | b=0.93, p=0.115, Fr=0.95 |
| **IV** | b=0.86, p=0.12, Fr=1.00 | b=0.85, p=0.125, Fr=0.98 | b=0.84, p=0.135, Fr=0.95 |
| **V** | b=0.74, p=0.15, Fr=1.00 | b=0.73, p=0.16, Fr=0.98 | b=0.71, p=0.175, Fr=0.95 |
### Tabela 3 — Fator S2 (extrato das alturas mais importantes)
| z(m) | I-A | I-B | I-C | II-A | II-B | II-C | III-A | III-B | III-C | IV-A | IV-B | IV-C | V-A | V-B | V-C |
|-------|------|------|------|-------|-------|-------|--------|--------|--------|-------|-------|-------|------|------|------|
| 5 | 1.06 | 1.04 | 1.01 | 0.94 | 0.92 | 0.89 | 0.83 | 0.81 | 0.78 | 0.74 | 0.72 | 0.69 | 0.63 | 0.61 | 0.58 |
| 10 | 1.10 | 1.09 | 1.06 | 1.00 | 0.98 | 0.95 | 0.90 | 0.88 | 0.85 | 0.82 | 0.80 | 0.77 | 0.71 | 0.69 | 0.66 |
| 15 | 1.13 | 1.12 | 1.10 | 1.04 | 1.02 | 0.99 | 0.94 | 0.93 | 0.90 | 0.87 | 0.85 | 0.82 | 0.77 | 0.75 | 0.72 |
| 20 | 1.15 | 1.14 | 1.12 | 1.06 | 1.04 | 1.01 | 0.98 | 0.96 | 0.93 | 0.91 | 0.89 | 0.86 | 0.81 | 0.79 | 0.76 |
| 30 | 1.17 | 1.17 | 1.15 | 1.10 | 1.08 | 1.05 | 1.03 | 1.01 | 0.99 | 0.96 | 0.94 | 0.92 | 0.87 | 0.85 | 0.82 |
| 40 | 1.20 | 1.20 | 1.18 | 1.13 | 1.11 | 1.08 | 1.06 | 1.05 | 1.02 | 1.00 | 0.98 | 0.96 | 0.91 | 0.89 | 0.87 |
| 50 | 1.21 | 1.21 | 1.20 | 1.15 | 1.13 | 1.10 | 1.09 | 1.08 | 1.05 | 1.03 | 1.01 | 0.99 | 0.94 | 0.92 | 0.90 |
| 60 | 1.22 | 1.22 | 1.21 | 1.16 | 1.14 | 1.12 | 1.12 | 1.10 | 1.08 | 1.06 | 1.04 | 1.02 | 0.97 | 0.95 | 0.93 |
| 80 | 1.25 | 1.24 | 1.23 | 1.19 | 1.17 | 1.15 | 1.16 | 1.14 | 1.12 | 1.10 | 1.08 | 1.06 | 1.01 | 0.99 | 0.97 |
| 100 | 1.26 | 1.26 | 1.25 | 1.22 | 1.20 | 1.18 | 1.19 | 1.17 | 1.15 | 1.13 | 1.11 | 1.09 | 1.04 | 1.03 | 1.01 |
| 120 | 1.28 | 1.28 | 1.27 | 1.23 | 1.21 | 1.19 | 1.21 | 1.20 | 1.18 | 1.15 | 1.14 | 1.12 | 1.07 | 1.06 | 1.04 |
| 140 | 1.29 | 1.29 | 1.28 | 1.24 | 1.22 | 1.20 | 1.22 | 1.21 | 1.19 | 1.17 | 1.16 | 1.14 | 1.09 | 1.08 | 1.06 |
| 160 | 1.30 | 1.30 | 1.29 | 1.25 | 1.23 | 1.21 | 1.23 | 1.22 | 1.20 | 1.18 | 1.17 | 1.15 | 1.11 | 1.10 | 1.08 |
| 180 | 1.31 | 1.31 | 1.30 | 1.26 | 1.24 | 1.22 | 1.24 | 1.23 | 1.21 | 1.19 | 1.18 | 1.16 | 1.12 | 1.11 | 1.09 |
| 200 | 1.32 | 1.32 | 1.31 | 1.27 | 1.25 | 1.23 | 1.25 | 1.24 | 1.22 | 1.20 | 1.19 | 1.17 | 1.14 | 1.13 | 1.11 |
| 250 | 1.34 | 1.34 | 1.33 | 1.29 | 1.27 | 1.25 | 1.28 | 1.27 | 1.25 | 1.23 | 1.22 | 1.20 | 1.17 | 1.16 | 1.14 |
| 300 | 1.34 | 1.34 | 1.33 | 1.30 | 1.28 | 1.26 | 1.30 | 1.29 | 1.27 | 1.25 | 1.24 | 1.22 | 1.20 | 1.19 | 1.17 |
| 350 | 1.34 | 1.34 | 1.33 | 1.31 | 1.29 | 1.27 | 1.31 | 1.30 | 1.28 | 1.27 | 1.26 | 1.24 | 1.22 | 1.21 | 1.19 |
| 400 | 1.34 | 1.34 | 1.34 | 1.32 | 1.30 | 1.28 | 1.32 | 1.31 | 1.29 | 1.28 | 1.27 | 1.25 | 1.24 | 1.23 | 1.21 |
| 420 | 1.35 | 1.35 | 1.35 | 1.32 | 1.30 | 1.28 | 1.33 | 1.32 | 1.30 | 1.29 | 1.28 | 1.26 | 1.25 | 1.24 | 1.22 |
| 450 | 1.35 | 1.35 | 1.35 | 1.33 | 1.31 | 1.29 | 1.34 | 1.33 | 1.31 | 1.30 | 1.29 | 1.27 | 1.26 | 1.25 | 1.23 |
| 500 | 1.35 | 1.35 | 1.35 | 1.34 | 1.32 | 1.30 | 1.35 | 1.34 | 1.32 | 1.32 | 1.31 | 1.29 | 1.28 | 1.27 | 1.25 |
**Nota**: z mínimo = 5 m (piso normativo). S2 é saturado para z >= z_g.
---
## Seção 5.4 — Fator S3 (Tabela 4)
| Grupo | S3 | Descrição |
|-------|------|-------------|
| 1 | 1.11 | Hospitais, quartéis de bombeiro, centrais de controle, pontes, substâncias perigosas |
| 2 | 1.06 | Edificações com risco à vida (aglomerações >200 pessoas) |
| 3 | 1.00 | Edificações residences, hotéis, comércio, indústrias (padrão) |
| 4 | 0.95 | Depósitos, silos, sem circulação de pessoas |
| 5 | 0.83 | Construções temporárias (máx 2 anos) |
---
## Seção 5.3.2 — Classe Estrutural
| Maior dimensão | Classe |
|----------------|--------|
| dim <= 20 m | A |
| 20 < dim <= 50 m | B |
| dim > 50 m | C |
---
## Seção 6.1.1 — Coeficientes de Pressão Externa em Paredes (Tabela 6)
### α = 0° (vento perpendicular à largura b)
| h/b | a/b | A1/B1 | A2/B2 | C (sotavento) | D |
|------|------|--------|--------|----------------|----|
| <=0.5 | 1.01.5 | -0.8 | -0.5 | +0.7 | -0.4 |
| <=0.5 | >=2.0 | -0.8 | -0.4 | +0.7 | -0.3 |
| 0.51.5 | 1.01.5 | -0.9 | -0.5 | +0.7 | -0.5 |
| 0.51.5 | >=2.0 | -0.9 | -0.4 | +0.7 | -0.3 |
| >1.5 | 1.01.5 | -1.0 | -0.6 | +0.8 | -0.6 |
| >1.5 | >=2.0 | -1.0 | -0.5 | +0.8 | -0.3 |
### α = 90° (vento perpendicular ao comprimento a)
| h/b | a/b | A (barlavento) | B (lateral) | C1/D1 | C2/D2 |
|------|------|--------|--------|----------------|----|
| <=0.5 | 1.01.5 | +0.7 | -0.4 | -0.8 | -0.4 |
| <=0.5 | >=2.0 | +0.7 | -0.5 | -0.9 | -0.5 |
| 0.51.5 | 1.01.5 | +0.7 | -0.5 | -0.9 | -0.5 |
| 0.51.5 | >=2.0 | +0.7 | -0.6 | -0.9 | -0.5 |
| >1.5 | 1.01.5 | +0.8 | -0.6 | -1.0 | -0.6 |
| >1.5 | >=2.0 | +0.8 | -0.6 | -1.0 | -0.6 |
---
## Seção 6.2.1 — Cilindros de Seção Circular (Tabela 13)
### Reynolds: Re = 70.000 × Vk × d
### Tabela 13 — Cpe por ângulo, h/d e superfície
Ângulos: 0°, 10°, 20°, 30°, 40°, 50°, 60°, 70°, 80°, 90°, 100°, 120°, 140°, 160°, 180°
**Superfície RUUGOSA (h/d = 10):**
0°=+1.0, 10°=+0.9, 20°=+0.7, 30°=+0.4, 40°=0, 50°=-0.5, 60°=-0.95, 70°=-1.25, 80°=-1.2, 90°=-1.0, 100°=-0.8, 120°=-0.5, 140°=-0.4, 160°=-0.4, 180°=-0.4
**Superfície RUUGOSA (h/d ≤ 2.5):**
0°=+1.0, 10°=+0.9, 20°=+0.7, 30°=+0.4, 40°=0, 50°=-0.4, 60°=-0.8, 70°=-1.1, 80°=-1.05, 90°=-0.85, 100°=-0.65, 120°=-0.35, 140°=-0.3, 160°=-0.3, 180°=-0.3
**Superfície LISSA (h/d = 10):**
0°=+1.0, 10°=+0.9, 20°=+0.7, 30°=+0.35, 40°=0, 50°=-0.7, 60°=-1.2, 70°=-1.4, 80°=-1.45, 90°=-1.4, 100°=-1.1, 120°=-0.6, 140°=-0.35, 160°=-0.35, 180°=-0.35
**Superfície LISSA (h/d ≤ 2.5):**
0°=+1.0, 10°=+0.9, 20°=+0.7, 30°=+0.35, 40°=0, 50°=-0.5, 60°=-1.05, 70°=-1.25, 80°=-1.3, 90°=-1.2, 100°=-0.85, 120°=-0.4, 140°=-0.25, 160°=-0.25, 180°=-0.25
### Regime Supercrítico: Re > 400.000
---
## Seção 6.3 — Pressão Interna (Cpi)
### Casos simplificados (Tabela)
| Caso de permeabilidade | Cpi |
|------------------------|------|
| Duas faces opostas igualmente permeáveis, outras duas impermeáveis (α=0°) | +0.2 |
| Duas faces opostas igualmente permeáveis, outras duas impermeáveis (α=90°) | -0.3 |
| Quatro faces igualmente permeáveis | 0.0 |
| Permeabilidade dominante na face de barlavento | +0.1 a +0.8 (conforme razão de áreas) |
| Permeabilidade dominante na face de sotavento/lateral | -0.3 a -0.8 |
| Faces estanques (sem aberturas) | -0.2 ou +0.2 |
### Cilindro com topo aberto
| h/d | Cpi |
|------|------|
| h/d < 0.3 | -0.5 |
| h/d >= 0.3 | -0.8 |
### Limite normativo: Cpi ∈ [-0.9, +0.9]
---
## Seção 6.1.2 — Coeficiente de Arrasto (Ca) para Edificações
Para edificações com faces retangulares, o Ca é determinado pela Figura 4 (baixa turbulência) ou Figura 5 (alta turbulência), em função de h/l1 e l1/l2.
- h/l1 = altura / menor dimensão em planta
- l1/l2 = menor dimensão / maior dimensão em planta
### Faixas típicas de Ca (baixa turbulência):
| h/l1 | l1/l2=0.4 | l1/l2=0.7 | l1/l2=1.0 |
|-------|-----------|-----------|-----------|
| 0.25 | ~1.1 | ~1.15 | ~1.2 |
| 1.0 | ~1.2 | ~1.3 | ~1.4 |
| 2.0 | ~1.3 | ~1.4 | ~1.5 |
| 4.0 | ~1.4 | ~1.55 | ~1.65 |
| 8.0 | ~1.5 | ~1.65 | ~1.75 |
### Alta turbulência (requer: profundidade/largura > 1/3 E altura <= 2 × altura média do entorno)
Ca é menor que na baixa turbulência para a mesma geometria.
---
## Seção 6.1.5 — Força de Atrito
Aplica-se quando l0/h > 4 OU l0/b > 4.
| Tipo de superfície | Cf |
|---------------------|------|
| Lisa (metal, vidro) | 0.01 |
| Nervurada/ribbed (ondulações) | 0.02 |
| Nervuras retangulares | 0.04 |
---
## Seção 8.1-8.2 — Barras Prismáticas (Tabela 26-27)
### Barras de face plana (Tabela 26) — Ca como função de phi (solidez)
| phi (φ) | Ca |
|----------|------|
| 0.05 | ~3.6 |
| 0.10 | ~3.0 |
| 0.20 | ~2.4 |
| 0.30 | ~2.0 |
| 0.40 | ~1.8 |
| 0.50 | ~1.7 |
| 0.60 | ~1.6 |
| 0.70 | ~1.5 |
| 0.80 | ~1.45 |
| 0.90 | ~1.4 |
| 1.00 | ~1.4 |
### Barras circulares (Tabela 27)
- Subcrítico (Re < 3×10⁵): Ca ≈ 1.2
- Transicional: Ca ≈ 0.7
- Supercrítico (Re > 3×10⁵): Ca ≈ 0.6
---
## Seção 8.5 — Torres Treliçadas (Tabela 30)
- Torre de seção quadrada: Kα = 1.0 para α<=12.5°, 1.08 para α<=45°
- Torre de seção triangular: Kα = 1.0 sempre
- Força: F = Ca × Kα × q × A_face × φ
---
## Seção 11 — Pontes
### Tabela 35 — Parâmetros b, p para V_it = 0.65 × V0 × S1 × b × (z/10)^p
| Categoria | b | p |
|-----------|---|------|
| I | 1.25 | 0.10 |
| II | 1.00 | 0.16 |
| III | 0.85 | 0.20 |
| IV | 0.68 | 0.25 |
| V | 0.44 | 0.35 |
### Classificação de pontes (Parâmetro Pse)
| Pse | Classe | Descrição |
|-----|--------|-----------|
| Pse < 0.04 | 1 | Efeitos dinâmicos podem ser desprezados |
| 0.04 <= Pse <= 1.0 | 2 | Efeitos dinâmicos devem ser avaliados |
| Pse > 1.0 | 3 | Análise aeroelástica obrigatória |
### Tabela 36 — Taxa de amortecimento ξ (%)
| Material | Detalhe | ξ (%) |
|----------|---------|-------|
| Aço | Chapas soldadas + pavimento asfáltico | 0.8 |
| Aço | Chapas soldadas + concreto | 1.0 |
| Aço | Parafusadas (ligação por atrito) | 1.5 |
| Aço | Rebitadas | 1.5 |
| Concreto armado | — | 2.5 |
| Concreto protendido | Protensão completa | 2.0 |
| Concreto protendido | Protensão parcial | 2.5 |
| Mistas aço-concreto | Vigas | 1.8 |
| Mistas aço-concreto | Vigas treliçadas | 2.0 |
| Alumínio | — | 2.0 |
| Madeira | — | 8.0 |
| Compósito | Matriz polimérica + fibras | 6.0 |
---
## Seção 9-10 — Dinâmica
### Strouhal Number (Tabela 33)
- Seção circular: St ≈ 0.20
- Seção quadrada: St ≈ 0.11
### Scruton Number
Sc = 2 × m × δs / (ρ × D²)
onde δs = amortecimento estrutural (log decrement = 2π × ξ)
### Velocidade crítica de vórtices
Vcr = f × D / St
### Conforto humano (ISO 10137)
a_lim = 0.01 × ka × f^1.124
| Uso | ka |
|-----|-----|
| Comercial/escritórios | 6.12 |
| Residencial | 4.06 |
Faixa de frequência válida: 0.06 Hz <= f <= 1.00 Hz
---
## Seção 7.2 — Coberturas Isoladas (Tabelas 24-25)
### Cobertura em shed (uma água)
- Cpe barlavento e sotavento conforme ângulo θ
- Força de sustentação conforme área projetada
### Cobertura em duas águas (gable)
- Cpe em barlavento e sotavento conforme θ
- Força de sustentação upwards quando configurado
---
## Anexo A — S2 normalizado para intervalo de tempo
S2(t) = S2(3s) × (t/3)^(-0.17) para t em segundos
---
## Anexo B — Fator estatístico S3 por probabilidade e vida útil
S3 = 0.54 × (-ln(1 - Pm))^(-1/7) × m^(1/7)
onde:
- Pm = probabilidade de excedência no período de vida útil
- m = vida útil em anos
| Pm | -ln(1-Pm) |
|----|------------|
| 0.10 | 0.1053 |
| 0.20 | 0.2231 |
| 0.37 | 0.4618 |
---
## Anexo C — Estações meteorológicas (49 estações)
Principais: São Paulo (Granjinha/Viracopos), Rio de Janeiro (Santos Dumont/Galeão), Belo Horizonte (Pampulha), Salvador, Recife, Curitiba, Porto Alegre, etc.
Cada estação fornece: V0 (m/s), categoria, latitude, longitude, altitude.
---
## Conversões e constantes importantes
| Símbolo | Valor | Descrição |
|---------|-------|-----------|
| ρ (rho) | 1.226 kg/m³ | Massa específica do ar |
| 0.613 | — | Fator de conversão q = 0.613×Vk²/1000 |
| 70.000 | — | Fator Reynolds para cilindros |
| 0.65 | — | Fator para V_it em pontes |
| π | 3.14159... | Pi |
| g | 9.80665 m/s² | Aceleração gravitacional |
`;
+138
View File
@@ -0,0 +1,138 @@
export type LLMProvider = 'openai' | 'anthropic' | 'ollama';
export type TerrainCategory = 'I' | 'II' | 'III' | 'IV' | 'V';
export type StructureClass = 'A' | 'B' | 'C';
export interface AuditConfig {
provider: LLMProvider;
model: string;
apiKey: string;
baseUrl?: string;
}
export type ModuleType =
| 'galpao'
| 'cilindro'
| 'vault'
| 'dome'
| 'sign'
| 'isolated-roof'
| 'bar'
| 'bridge'
| 'tower'
| 'dynamics'
| 'cross-module'
| 'edge-case'
| 'cpi-variant';
export const MODULE_LABELS: Record<ModuleType, { 'pt-BR': string; 'en-US': string }> = {
galpao: { 'pt-BR': 'Galpão', 'en-US': 'Warehouse' },
cilindro: { 'pt-BR': 'Cilindro', 'en-US': 'Cylinder' },
vault: { 'pt-BR': 'Abóbada', 'en-US': 'Vault' },
dome: { 'pt-BR': 'Cúpula', 'en-US': 'Dome' },
sign: { 'pt-BR': 'Muros/Placas', 'en-US': 'Signs/Walls' },
'isolated-roof': { 'pt-BR': 'Cobertura Isolada', 'en-US': 'Isolated Roof' },
bar: { 'pt-BR': 'Barras', 'en-US': 'Bars' },
bridge: { 'pt-BR': 'Pontes', 'en-US': 'Bridges' },
tower: { 'pt-BR': 'Torres', 'en-US': 'Towers' },
dynamics: { 'pt-BR': 'Dinâmica', 'en-US': 'Dynamics' },
'cross-module': { 'pt-BR': 'Cross-Module', 'en-US': 'Cross-Module' },
'edge-case': { 'pt-BR': 'Edge Cases', 'en-US': 'Edge Cases' },
'cpi-variant': { 'pt-BR': 'Cpi Variants', 'en-US': 'Cpi Variants' },
};
export type DiagramType =
| 'warehouse'
| 'cylinder'
| 'vault'
| 'dome'
| 'sign'
| 'bar'
| 'bridge'
| 'tower'
| 'isolatedRoof'
| 'dynamics';
export interface ExpectedRange {
readonly min: number;
readonly max: number;
}
export interface AuditScenario {
readonly id: string;
readonly module: ModuleType;
readonly moduleLabel: string;
readonly description: string;
readonly inputs: Record<string, unknown>;
readonly intermediates: Record<string, number>;
readonly outputs: Record<string, unknown>;
readonly expectedRanges: Record<string, ExpectedRange>;
readonly diagramType: DiagramType;
readonly diagramProps: Record<string, unknown>;
readonly nbrSection: string;
}
export type CheckStatus = 'PASS' | 'WARN' | 'FAIL';
export interface AuditCheck {
readonly name: string;
readonly status: CheckStatus;
readonly expected: string;
readonly actual: string;
readonly explanation: string;
}
export interface ScenarioResult {
readonly scenarioId: string;
readonly verdict: CheckStatus;
readonly checks: readonly AuditCheck[];
readonly summary: string;
readonly llmNotes?: string;
}
export interface ModuleAuditResult {
readonly module: ModuleType;
readonly moduleLabel: string;
readonly totalScenarios: number;
readonly passed: number;
readonly warnings: number;
readonly failed: number;
readonly scenarios: readonly ScenarioResult[];
}
export interface AuditReport {
readonly id: string;
readonly provider: string;
readonly model: string;
readonly timestamp: number;
readonly totalScenarios: number;
readonly totalPassed: number;
readonly totalWarnings: number;
readonly totalFailed: number;
readonly modules: readonly ModuleAuditResult[];
readonly rawResponse?: string;
}
export type AuditStatus = 'idle' | 'generating' | 'calling' | 'parsing' | 'done' | 'error';
export interface AuditRun {
readonly config: AuditConfig;
readonly report: AuditReport | null;
readonly status: AuditStatus;
readonly progress: number;
readonly error?: string;
}
export interface AuditLLMResponse {
readonly scenarioId: string;
readonly verdict: CheckStatus;
readonly checks: readonly {
readonly name: string;
readonly status: CheckStatus;
readonly expected: string;
readonly actual: string;
readonly explanation: string;
}[];
readonly summary: string;
readonly llmNotes?: string;
}
+1 -1
View File
@@ -170,7 +170,7 @@ export function serializeFtool(model: FtoolModel): string {
const lines: string[] = []; const lines: string[] = [];
lines.push('; ============================================='); lines.push('; =============================================');
lines.push('; VentoApp — Modelo Ftool'); lines.push('; BrainWind v1.0 — Modelo Ftool');
lines.push(`; Gerado em: ${new Date().toISOString()}`); lines.push(`; Gerado em: ${new Date().toISOString()}`);
lines.push('; NBR 6123:2023 — Forças devidas ao vento'); lines.push('; NBR 6123:2023 — Forças devidas ao vento');
lines.push('; ============================================='); lines.push('; =============================================');
+2 -2
View File
@@ -44,7 +44,7 @@ const GenericReportDocument = ({ moduleName, sections, wind, sceneImage }: Gener
<Document> <Document>
<Page size="A4" style={styles.page}> <Page size="A4" style={styles.page}>
<View style={styles.header}> <View style={styles.header}>
<Text style={styles.title}>VentoApp Memória de Cálculo</Text> <Text style={styles.title}>BrainWind v1.0 Memória de Cálculo</Text>
<Text style={styles.subtitle}>Cargas de Vento: {moduleName} NBR 6123:2023</Text> <Text style={styles.subtitle}>Cargas de Vento: {moduleName} NBR 6123:2023</Text>
</View> </View>
@@ -138,7 +138,7 @@ const GenericReportDocument = ({ moduleName, sections, wind, sceneImage }: Gener
))} ))}
<Text style={styles.footer}> <Text style={styles.footer}>
Gerado por VentoApp Ferramenta de Auxílio ao Cálculo Estrutural (NBR 6123:2023) Gerado por BrainWind v1.0 Ferramenta de Auxílio ao Cálculo Estrutural (NBR 6123:2023)
</Text> </Text>
</Page> </Page>
</Document> </Document>
+2 -2
View File
@@ -98,7 +98,7 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => {
<Document> <Document>
<Page size="A4" style={styles.page}> <Page size="A4" style={styles.page}>
<View style={styles.header}> <View style={styles.header}>
<Text style={styles.title}>VentoApp Memória de Cálculo</Text> <Text style={styles.title}>BrainWind v1.0 Memória de Cálculo</Text>
<Text style={styles.subtitle}>Cargas de Vento em Galpão NBR 6123:2023</Text> <Text style={styles.subtitle}>Cargas de Vento em Galpão NBR 6123:2023</Text>
</View> </View>
@@ -282,7 +282,7 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => {
)} )}
<Text style={styles.footer}> <Text style={styles.footer}>
Gerado por VentoApp Ferramenta de Auxílio ao Cálculo Estrutural (NBR 6123:2023) Gerado por BrainWind v1.0 Ferramenta de Auxílio ao Cálculo Estrutural (NBR 6123:2023)
</Text> </Text>
</Page> </Page>
</Document> </Document>
+1 -1
View File
@@ -43,7 +43,7 @@ type Dict = Record<string, Record<Locale, string>>;
const translations: Dict = { const translations: Dict = {
// === Aplicação === // === Aplicação ===
app_title: { 'pt-BR': 'VentoApp', 'en-US': 'VentoApp' }, app_title: { 'pt-BR': 'BrainWind v1.0', 'en-US': 'BrainWind v1.0' },
app_subtitle: { 'pt-BR': 'Cálculo de cargas de vento — NBR 6123:2023', 'en-US': 'Wind load calculation — NBR 6123:2023' }, app_subtitle: { 'pt-BR': 'Cálculo de cargas de vento — NBR 6123:2023', 'en-US': 'Wind load calculation — NBR 6123:2023' },
app_loading: { 'pt-BR': 'Carregando...', 'en-US': 'Loading...' }, app_loading: { 'pt-BR': 'Carregando...', 'en-US': 'Loading...' },