// scenes-v2-c.jsx — Escena WRF (modelo meteorológico regional) // Se ubica entre Resolución 40 km (CAMS) y Downscaling. function S6WRF() { const { localTime, duration } = useSprite(); const time = useTime(); const tKick = Easing.easeOutCubic(clamp((localTime - 0.2) / 0.5, 0, 1)); const tHead = Easing.easeOutCubic(clamp((localTime - 0.6) / 0.6, 0, 1)); const tBody = Easing.easeOutCubic(clamp((localTime - 1.1) / 0.7, 0, 1)); const tD1 = Easing.easeOutCubic(clamp((localTime - 1.6) / 0.5, 0, 1)); const tD2 = Easing.easeOutCubic(clamp((localTime - 2.1) / 0.5, 0, 1)); const tD3 = Easing.easeOutCubic(clamp((localTime - 2.6) / 0.5, 0, 1)); const tWinds = Easing.easeOutCubic(clamp((localTime - 3.4) / 0.6, 0, 1)); const tStats = Easing.easeOutCubic(clamp((localTime - 4.4) / 0.6, 0, 1)); const fadeOut = clamp((duration - localTime) / 0.45, 0, 1); // Diagram geometry — nested domains on the right side const cx = 920, cy = 380; // D01 (outer, 18 km, NW South America) const d1 = { w: 340, h: 380, color: C.purple, label: 'D01 · 18 km', sub: 'NW de Sudamérica' }; // D02 (6 km, Colombia) const d2 = { w: 200, h: 240, color: C.cyan, label: 'D02 · 6 km', sub: 'Antioquia' }; // D03 (2 km, Valle de Aburrá) const d3 = { w: 100, h: 130, color: C.amber, label: 'D03 · 2 km', sub: 'Valle de Aburrá' }; return ( {/* Left text column */}
Capítulo V · ¿Qué es WRF?
La meteorología
del Valle,
hora a hora.
WRF (Weather Research and Forecasting, NCAR / NOAA) es un modelo atmosférico regional. SIATA lo opera con tres dominios anidados que bajan de 18 km a 2 km hasta cubrir el Valle con el detalle topográfico que CAMS no puede ver.
Lo que aporta al pronóstico de PM2.5: vientos, temperatura, humedad, altura de capa de mezcla y radiación — 16 variables que explican cómo se acumula o se ventila el aire dentro del cañón.
{/* Stats pills */}
{[ { v: '2 km', l: 'dominio interno' }, { v: '16', l: 'variables' }, { v: 'horaria', l: 'salida' }, ].map((s, i) => (
{s.v}
{s.l}
))}
{/* Right diagram: nested WRF domains */}
{/* D01 outer rectangle */}
{/* Grid hatching inside D01 */} {Array.from({ length: 8 }, (_, i) => ( ))} {Array.from({ length: 7 }, (_, i) => ( ))} {/* Tag */}
{d1.label}
{d1.sub}
{/* D02 middle rectangle */}
{Array.from({ length: 12 }, (_, i) => ( ))} {Array.from({ length: 10 }, (_, i) => ( ))}
{d2.label}
{d2.sub}
{/* D03 inner rectangle — Valle de Aburrá */}
{/* Dense grid (2 km cells) */} {Array.from({ length: 18 }, (_, i) => ( ))} {Array.from({ length: 14 }, (_, i) => ( ))} {/* Valley silhouette inside D03 */} {/* Wind vectors */} {tWinds > 0 && (() => { const arrows = []; for (let i = 0; i < 5; i++) { for (let j = 0; j < 7; j++) { const ax = 10 + (d3.w - 20) * (i + 0.5) / 5; const ay = 12 + (d3.h - 24) * (j + 0.5) / 7; // Wind blows northward up the valley with diurnal switch const phase = time * 0.6 + j * 0.3; const ang = -Math.PI / 2 + Math.sin(phase) * 0.5 + (Math.random ? 0 : 0); const len = 6 + 3 * Math.sin(phase + i); const ex = ax + Math.cos(ang) * len; const ey = ay + Math.sin(ang) * len; const opa = tWinds * (0.45 + Math.sin(phase + i * 0.7) * 0.25); arrows.push( ); } } return arrows; })()}
{d3.label}
{/* Topography hint behind everything (mountain ridges) */} {Array.from({ length: 7 }, (_, i) => { const y = (d1.h + 80) * (i + 1) / 8; let path = 'M 0 ' + y; for (let x = 0; x <= d1.w + 80; x += 12) { const yy = y + Math.sin(x * 0.04 + i * 1.3) * 8 + Math.sin(x * 0.012) * 14; path += ' L ' + x + ' ' + yy; } return ; })}
); } Object.assign(window, { S6WRF });