35.1 Objetivo del proyecto
Construiremos un laboratorio que conecte dos niveles del curso. Primero resolverá un circuito horizontal donde una bomba compensa pérdidas. Después usará el caudal calculado para transportar partículas por un canal.
El objetivo no es imitar una instalación específica, sino integrar conservación, propiedades, regímenes, pérdidas, fuerzas, estructuras de datos, métodos numéricos y visualización verificable.
35.2 Conceptos integrados
| Bloque | Conceptos | Salida principal |
|---|---|---|
| Fluido | ρ, μ, ν | Propiedades consistentes |
| Circuito | Continuidad, Reynolds, Darcy–Weisbach, Colebrook | Q, f, pérdidas |
| Partícula | Arrastre de Stokes, empuje, τp, Rep | Velocidad y deposición |
| Método numérico | Paso fijo, relajación exponencial, fronteras | Trayectorias reproducibles |
| Interfaz | Canvas, controles, accesibilidad | Laboratorio explorable |
35.3 Preguntas que debe responder
- ¿Qué caudal produce una carga de bomba dada?
- ¿Cuánto se pierde por tubería y cuánto por accesorios?
- ¿El flujo del conducto es laminar, transitorio o turbulento?
- ¿Qué velocidad media llega al canal?
- ¿Las partículas siguen al flujo o muestran inercia?
- ¿Es válido el arrastre de Stokes?
- ¿Cuántas partículas se depositan durante el tiempo simulado?
35.4 Alcance y supuestos
El fluido es newtoniano e incompresible; el circuito es horizontal y de diámetro uniforme; la bomba entrega carga constante; las pérdidas localizadas se agrupan en ΣK.
Las partículas son esferas diluidas con acoplamiento de una vía. El arrastre es lineal de Stokes, el eje horizontal es periódico y el fondo del canal captura partículas inerciales. No se modelan colisiones ni realimentación sobre el flujo.
35.5 Arquitectura por módulos
Cada flecha representa datos explícitos. El canvas no calcula la física y los controles no modifican partículas directamente: actualizan una configuración que los módulos consumen.
35.6 Configuración en SI
const configuracion = {
fluido: { densidad: 1000, viscosidadDinamica: 0.001 },
circuito: {
cargaBomba: 2,
diametro: 0.05,
longitud: 20,
rugosidad: 0.00005,
sumaK: 5,
areaCanal: 0.02
},
particulas: { cantidad: 120, diametro: 20e-6, densidad: 2500 },
simulacion: { dt: 0.002, semilla: 35 }
};
console.log(configuracion);La interfaz convierte mm, μm y L/s; el núcleo conserva metros, segundos, kilogramos y pascales.
35.7 Invariantes de la configuración
Densidades, viscosidad, diámetro, longitud, área y paso deben ser positivos. Carga, rugosidad y ΣK pueden ser cero, pero no negativos. La cantidad debe ser un entero no negativo.
Validar antes de resolver evita iteraciones sin significado y resultados no finitos.
35.8 Balance de energía del circuito
Al ser un lazo horizontal cerrado, la bomba compensa las pérdidas:
El factor depende de v mediante Re = ρvD/μ. Por eso el caudal no se obtiene con una única sustitución.
35.9 Factor de fricción
En laminar usamos f = 64/Re. En turbulento resolvemos Colebrook. En transición no hay relación universal; el laboratorio interpola únicamente para mantener una visualización continua y muestra una advertencia.
Una aplicación de diseño debería reemplazar esa interpolación por un criterio conservador o datos específicos.
35.10 Solver hidráulico iterativo
function factorTurbulento(reynolds, rugosidadRelativa) {
let f = 0.03;
for (let i = 0; i < 40; i++) {
f = 1 / (-2 * Math.log10(
rugosidadRelativa / 3.7 + 2.51 / (reynolds * Math.sqrt(f))
)) ** 2;
}
return f;
}
function factorDarcy(reynolds, rugosidadRelativa) {
if (reynolds <= 0) throw new Error("Re debe ser positivo");
if (reynolds < 2300) return 64 / reynolds;
if (reynolds > 4000) return factorTurbulento(reynolds, rugosidadRelativa);
// Interpolación orientativa: la transición no posee una correlación universal.
const fraccion = (reynolds - 2300) / (4000 - 2300);
const fLaminar = 64 / 2300;
const fTurbulento = factorTurbulento(4000, rugosidadRelativa);
return (1 - fraccion) * fLaminar + fraccion * fTurbulento;
}
function resolverCircuito({ rho, mu, carga, D, L, epsilon, sumaK, g = 9.81 }) {
let velocidad = 1;
let f = 0.03;
for (let i = 0; i < 60; i++) {
const reynolds = rho * velocidad * D / mu;
f = factorDarcy(reynolds, epsilon / D);
const nuevaVelocidad = Math.sqrt(2 * g * carga / (f * L / D + sumaK));
if (Math.abs(nuevaVelocidad - velocidad) <= 1e-10 * Math.max(1, velocidad)) {
velocidad = nuevaVelocidad;
break;
}
velocidad = nuevaVelocidad;
}
const area = Math.PI * D ** 2 / 4;
const reynolds = rho * velocidad * D / mu;
f = factorDarcy(reynolds, epsilon / D);
const perdida = (f * L / D + sumaK) * velocidad ** 2 / (2 * g);
return { velocidad, caudal: area * velocidad, reynolds, f, residuo: carga - perdida };
}
console.log(resolverCircuito({ rho: 1000, mu: 0.001, carga: 2, D: 0.05, L: 20, epsilon: 0.00005, sumaK: 5 }));35.11 Criterio de convergencia
Un número fijo de iteraciones es simple, pero un solver general debería detenerse cuando el cambio relativo de v o f sea menor que una tolerancia, con un máximo de seguridad.
También debe calcular el residuo energético:
Convergencia de variables sin residuo pequeño puede ocultar un error de ecuación.
35.12 Del caudal al canal
Si el área transversal efectiva del canal es Ac:
Esta relación acopla ambos módulos. Cambiar bomba, diámetro o pérdidas modifica Q y, por continuidad, la velocidad base que transporta partículas.
35.13 Campo del canal
Sobre la velocidad base agregamos un vórtice localizado para producir trayectorias curvas:
E es una envolvente gaussiana. Este campo educativo no se obtiene de Navier–Stokes, pero es continuo, controlable y útil para probar el integrador.
35.14 Modelo de partícula
Las trazadoras usan vp = u. Las inerciales usan:
El laboratorio aplica la actualización exponencial del tema 34 y deposita la partícula cuando alcanza el fondo.
35.15 Escalas y validez
El panel calcula:
Si Rep,t ≥ 1, el laboratorio advierte que el modelo lineal de arrastre puede ser inadecuado.
35.16 Acoplamiento de una vía
Q determina el campo y el campo determina el movimiento de las partículas. Las partículas no cambian Q ni el campo.
Este acoplamiento es adecuado para una fase dispersa diluida. A concentraciones mayores harían falta reacción sobre el fluido, sedimentación impedida y quizá colisiones.
35.17 Depósito en el fondo
Una partícula inercial que llega a y = H se marca como depositada y deja de integrarse. Esto es una condición absorbente ideal.
No representa rebote, erosión ni resuspensión. Al informar porcentaje depositado, el proyecto debe declarar esta regla.
35.18 Bucle de simulación
La hidráulica solo se recalcula cuando cambia una entrada. Las partículas se actualizan muchas veces por segundo. Separar ambas frecuencias evita trabajo innecesario.
35.19 Estado reproducible
Las posiciones iniciales provienen de una semilla fija. Reiniciar con la misma configuración produce el mismo conjunto.
El estado exportado incluye parámetros y partículas. El tiempo de pantalla no forma parte de la física; el tiempo simulado sí.
35.20 Diseño de la interfaz
Los controles se dividen en circuito y partículas. Esta agrupación revela qué módulo consume cada dato.
Los resultados también se separan conceptualmente: Q, Re y f diagnostican la hidráulica; τ, St, Rep y depósito diagnostican la fase dispersa.
35.21 Visualización
El canvas muestra el canal, vectores del campo, partículas activas y un lecho de partículas depositadas. En la parte superior resume bomba, caudal y pérdidas.
El radio se amplifica para visibilidad y no está a escala con el dominio. Esta decisión se indica para evitar interpretar el dibujo como geometría real.
35.22 Escenarios predefinidos
Los presets no son resultados guardados: modifican entradas y ejecutan el mismo solver. Sirven para comparar agua con microesferas, un aceite viscoso y partículas grandes fuera de Stokes.
Un preset debe poder reconstruirse mediante sus parámetros, no mediante condiciones ocultas.
35.23 Verificación hidráulica
- hf + hm debe coincidir con hP;
- Q debe coincidir con Av;
- Re debe usar la misma v y D;
- f debe corresponder al régimen y a ε/D;
- potencia hidráulica debe ser ρgQhP;
- al aumentar ΣK con lo demás fijo, Q debe disminuir.
35.24 Verificación de partículas
- con ρp = ρf, la sedimentación debe anularse;
- con St → 0, la trayectoria inercial debe acercarse a la trazadora;
- en flujo uniforme, el deslizamiento debe tender a vt;
- el porcentaje depositado debe permanecer entre 0 y 100 %;
- reducir Δt debe llevar a un resultado convergente.
35.25 Pruebas automáticas
function afirmarCerca(actual, esperado, tolerancia, mensaje) {
if (Math.abs(actual - esperado) > tolerancia) {
throw new Error(`${mensaje}: ${actual} no está cerca de ${esperado}`);
}
}
const rho = 1000;
const g = 9.81;
const Q = 0.003;
const h = 2;
afirmarCerca(rho * g * Q * h, 58.86, 1e-10, "potencia hidráulica");
console.log("Prueba superada");35.26 Estudio de convergencia
Ejecutar hasta el mismo tiempo con Δt, Δt/2 y Δt/4 permite comparar posiciones, rapidez media y depósito.
El porcentaje depositado puede cambiar bruscamente si muchas partículas están cerca del fondo; además de la métrica global conviene comparar trayectorias o tiempos individuales.
35.27 Sensibilidad física
El proyecto permite explorar relaciones no lineales:
- aumentar carga de bomba eleva Q, pero también las pérdidas cuadráticas;
- aumentar D reduce L/D y aumenta área;
- aumentar μ reduce Re del circuito y alarga o acorta escalas según el régimen;
- aumentar d eleva τp y vt como d² dentro de Stokes;
- aumentar el vórtice puede retener partículas y modificar deposición.
35.28 Rendimiento
El solver hidráulico es pequeño; el costo repetido está en partículas y dibujo. El proyecto limita la cantidad y reutiliza objetos.
Para escalar, podrían usarse arreglos tipados, renderizado por lotes, Web Workers o GPU. Cada optimización debe conservar pruebas numéricas equivalentes.
35.29 Accesibilidad
La simulación incluye pausa y avance manual. Inicia pausada si el sistema solicita movimiento reducido. Los resultados numéricos y el estado aparecen fuera del canvas.
Los botones tienen texto, los controles poseen etiquetas y el canvas actualiza una descripción accesible resumida.
35.30 Exportar un experimento
function crearDocumento(configuracion, estado, diagnosticos) {
return {
versionFormato: 1,
unidades: "SI",
exportadoEn: new Date().toISOString(),
configuracion,
estado,
diagnosticos
};
}
const documento = crearDocumento(
{ fluido: { densidad: 1000, viscosidadDinamica: 0.001 } },
{ tiempo: 2.5, particulas: [] },
{ caudal: 0.003 }
);
console.log(JSON.stringify(documento, null, 2));Importar debería validar versión, unidades y rangos antes de reemplazar el estado actual.
35.31 Manejo de errores
Una entrada inválida debe producir un mensaje cercano al control. Un fallo del solver debe pausar la simulación y conservar los datos para diagnóstico.
No se deben reemplazar silenciosamente NaN o infinitos por cero: eso oculta la causa y puede crear una animación engañosa.
35.32 Laboratorio integrador
Ajustá el circuito y observá cómo el caudal resultante cambia el transporte. En modo inercial, las partículas que alcanzan el fondo quedan depositadas.
Circuito y fluido
Partículas y simulación
hP = hf + hm = 1,287 + 0,713 = 2,000 m; Ucanal = Q/A = 0,164 m/s
Circuito turbulento y partículas dentro del régimen de Stokes. Simulación en ejecución.
35.33 Interpretar el experimento
No alcanza con observar trayectorias. Compará valores:
- modificá carga de bomba y observá Q y potencia;
- aumentá ΣK y verificá que Q disminuya;
- pasá de trazadoras a inerciales sin cambiar el circuito;
- aumentá d y observá τ, St, Rep y depósito;
- reducí Δt y compará el porcentaje depositado al mismo tiempo;
- exportá el estado para documentar el ensayo.
35.34 Desafío final
Extendé el laboratorio para comparar simultáneamente dos clases de partículas de 20 μm y 60 μm, ambas con ρp = 2500 kg/m³ en agua.
- Agregá una propiedad
clasey un color por clase. - Calculá τ y vt para cada diámetro.
- Informá depósito por clase.
- Usá la misma secuencia inicial normalizada para comparar.
- Comprobá Rep y explicá la diferencia observada.
Ver una implementación mínima del cálculo por clase
const fluido = { densidad: 1000, viscosidad: 0.001 };
const rhoP = 2500;
const g = 9.81;
const clases = [20e-6, 60e-6].map(diametro => {
const tau = rhoP * diametro ** 2 / (18 * fluido.viscosidad);
const velocidadTerminal = tau * g * (1 - fluido.densidad / rhoP);
const reynolds = fluido.densidad * velocidadTerminal * diametro /
fluido.viscosidad;
return { diametro, tau, velocidadTerminal, reynolds, depositadas: 0 };
});
for (const clase of clases) {
console.log(
`${clase.diametro * 1e6} µm: ` +
`tau=${(clase.tau * 1000).toFixed(4)} ms, ` +
`vt=${(clase.velocidadTerminal * 1000).toFixed(4)} mm/s, ` +
`Re=${clase.reynolds.toFixed(4)}`
);
}Dentro de Stokes, la partícula de 60 μm posee nueve veces τ y nueve veces velocidad terminal que la de 20 μm. Su Reynolds también aumenta y debe comprobarse antes de aceptar el modelo.
35.35 Posibles ampliaciones
- curva real de bomba y punto de operación;
- red de varias ramas;
- campo importado desde una simulación CFD;
- arrastre no lineal mediante CD(Re);
- distribución de tamaños y densidades;
- resuspensión y colisiones;
- acoplamiento de dos vías;
- gráficos temporales y exportación CSV;
- pruebas automatizadas en un módulo separado.
35.36 Lista de comprobación del proyecto
- ¿Todas las variables internas están en SI?
- ¿El balance de energía cierra?
- ¿El régimen usa la correlación correcta?
- ¿Rep respalda el modelo de arrastre?
- ¿El resultado converge al reducir Δt?
- ¿Reiniciar reproduce el estado?
- ¿La simulación puede pausarse y avanzar manualmente?
- ¿Los datos importantes aparecen como texto?
- ¿El archivo exportado incluye versión y unidades?
- ¿Los límites del modelo están explicados?
35.37 Cierre del curso
El recorrido comenzó con sistemas de partículas y magnitudes colectivas, continuó con el modelo continuo de los fluidos y terminó reuniendo hidrostática, flujo, viscosidad, pérdidas y transporte de partículas en un programa interactivo.
La lección central es metodológica: elegir el sistema, declarar supuestos, conservar magnitudes, comprobar escalas, diseñar datos coherentes, resolver con un método adecuado y verificar antes de interpretar una visualización.