Reading Time: 12 minutes

Cuando los investigadores hacen la transición de simulaciones de flujo incompresibles a compresibles en Python, se encuentran con una física fundamentalmente diferente: la densidad se convierte en una variable, la ecuación de energía debe resolverse y las ondas de choque introducen discontinuidades que los métodos numéricos estándar simplemente no pueden manejar. Este artículo cubre lo que hace que Supersonic Flow sea diferente, los métodos de captura de choque diseñados para manejarlo y los solucionadores de Python que implementan estos métodos para aplicaciones aeroespaciales.

Comida clave

  • El flujo compresible requiere resolver las ecuaciones de Navier-Stokes comprimibles con la densidad como variable y la ecuación de energía acoplada, a diferencia del flujo incompresible donde la densidad es constante.
  • Métodos de captura de choque (ROE, AUSM, TVD, WENO, TENO) son esenciales porque los choques introducen discontinuidades. El esquema ROE necesita una solución de entropía y protección de carbunco en choques fuertes.
  • Los solucionadores de Python para el flujo compresible ahora son de producción: Pybaram (no estructuradas, 2022), OpenSBLI v3.0 (generación de código automatizada, CPC 2025), JANC (Diferencial de GPU Solver, abril de 2025) y PyGasFlow (Quasi-1D Analytical).
  • Casos de referencia como el tubo de choque SOD y el problema de SHU-OSHER proporcionan una validación estándar para la precisión de captura de golpes.
  • MusCl-TVD es más barato pero oscila cerca de las discontinuidades; WENO de 5.º orden da una resolución superior pero cuesta más. Para DNS/ILES de interacciones shock-boundary-capa, Weno/Teno es el estándar actual.
  • PygasFlow y el repositorio de código abierto python-shock-tube proporcionan puntos de entrada accesibles para comprender la física de choque antes de comprometerse con los solucionadores de producción.

¿Qué hace que el flujo supersónico sea diferente del flujo incompresible?

En el flujo incompresible, la densidad se trata como una constante. Las ecuaciones de momento se resuelven independientemente de la ecuación de energía, y la presión está determinada únicamente por el campo de velocidad a través de un algoritmo de acoplamiento presión-velocidad (como simple o piso). Esto significa que para los flujos de baja velocidad, puede resolver las ecuaciones de impulso y continuidad sin saber nunca los cambios de densidad del fluido, es un hecho.

En el flujo compresible, todo cambia. La densidad se convierte en una variable que evoluciona de acuerdo con la ecuación de continuidad, las ecuaciones de momento y la ecuación de energía. El estado termodinámico del fluido (presión, temperatura y densidad) se acoplan a través de la ecuación de estado (típicamente la ley de gas ideal para aplicaciones aeroespaciales). Esto significa que no puedes desacoplar el impulso de la ecuación de energía. El solucionador debe rastrear cómo las ondas de presión se propagan a través del fluido, y estas ondas viajan a la velocidad del sonido.

El parámetro adimensional que gobierna esta transición es el número MACH, la relación entre la velocidad del flujo y la velocidad local del sonido. Cuando m < 0.3, los cambios de densidad suelen ser lo suficientemente pequeños como para que se mantenga la suposición incompresible. Cuando m > 1 (supersonic), el flujo contiene ondas de choque: discontinuidades donde la densidad, la presión y la temperatura saltan casi instantáneamente a través de una región estrecha.

Para los investigadores aeroespaciales que usan Python, esto significa que el cebador CFD de Python (post 390), que cubre los fluidos fipy, su2 y jax, principalmente para flujos incompresibles, deja una brecha significativa. Necesitas entender:

  1. Las ecuaciones compresibles de Navier-Stokes en su forma completa, incluida la ecuación de energía
  2. Resolvedores de Riemann que calculan los flujos a través de las caras de las celdas donde pueden existir discontinuidades
  3. Métodos de reconstrucción que determinan cómo las variables se interpolan desde los centros celulares a las caras
  4. Esquemas de integración de tiempo que respetan las restricciones de CFL más estrictas en números altos de Mach
  5. Tratamientos numéricos especiales como la solución de entropía y la protección del carbunco

Esta no es una simple extensión del flujo incompresible, es una metodología numérica diferente aplicada a un régimen físico diferente.

Métodos de captura de choque: de ROE a WENO

Cuando se forma una onda de choque, las variables de flujo cambian discontinuamente en una distancia más pequeña de lo que puede resolver cualquier cuadrícula física. En lugar de tratar de resolver los choques directamente (lo que requeriría cuadrículas imposiblemente finas), los métodos de captura de golpes permiten que el esquema numérico absorba la discontinuidad dentro de unas pocas celdas, utilizando la disipación numérica para estabilizar la solución.

El esquema ROE y por qué necesita arreglos

El esquema ROE, introducido por Peter Roe en 1978, es un solucionador de Riemann aproximado que linealiza las ecuaciones de Euler alrededor del estado de la cara de la celda. Es computacionalmente eficiente y fue el método dominante de captura de choque durante décadas. La idea es simple: en cada cara de celda, se resuelve una versión linealizada del problema de Riemann (el problema del valor inicial para los datos discontinuos), calcula el flujo y agrega la disipación numérica proporcional a las velocidades de onda.

En Python, la implementación del esquema ROE de ARXIV 2103.02794 sigue este patrón:

# Roe scheme flux computation (simplified from arXiv 2103.02794)
def roe_flux(uL, uR, n):
    """Compute Roe flux for Euler equations.
    uL, uR: left and right primitive states [rho, u, P]
    n: normal direction (1 or -1 for 1D)
    """
    rhoL, uL, P_L = uL
    rhoR, uR, P_R = uR
    
    # Compute interface states
    rho_hat = (rhoL**2 * rhoR**2 / 
               (rhoL + rhoR))**0.5
    u_hat = (rhoL * uL + rhoR * uR) / (rhoL + rhoR)
    
    # Speed of sound
    S_hat = ((P_L + P_R) / 
             (2 * (rhoL + rhoR)))**0.5
    
    # Compute Roe matrix eigenvalues
    # |u_hat| +/- S_hat for acoustic waves
    # |u_hat| for shear/convection
    # ... eigenvalue computation omitted for brevity

El problema con el esquema ROE básico es doble. En primer lugar, con fuertes choques, el esquema puede desarrollar presión negativa, un estado no físico que hace que el solucionador se bloquee. Esto es abordado por el arreglo de entropía, que modifica las velocidades de onda cerca de los choques para restaurar la convexidad de la función de flujo y evitar estados no físicos.

En segundo lugar, en las cuadrículas no estructuradas, el esquema ROE puede exhibir el fenómeno del carbuncle, una inestabilidad numérica en la que un fuerte choque (como el que se forma detrás de un cuerpo contundente) desarrolla un segundo choque no físico que se deriva del choque principal. Esto ocurre porque el esquema ROE es demasiado sensible a la orientación de la cuadrícula con fuertes choques. El «esquema de ROE estable en choque» combina la solución de entropía con un solucionador de Riemann girado para curar esto. Para los investigadores que trabajan en geometrías aeroespaciales con fuertes choques (como cilindros supersónicos o cuerpos romos), omitir la protección del buncle puede causar fallas en el solucionador.

AUSM: dividir el flujo

El método de división ascendente de advección (AUSM) adopta un enfoque diferente. En lugar de calcular la matriz de ROE, AUSM divide el flujo en componentes advectivos y de presión. Esto lo hace robusto tanto con números de Mach altos como con fuertes amortiguadores sin requerir una corrección de entropía: la división maneja inherentemente la condición de entropía física. Las variantes AUSM (AUSM+, AUSM+, AUSM+) y sus sucesores (AusMPWR+) se encuentran entre los esquemas de captura de choque más utilizados en los códigos CFD aeroespaciales porque manejan el rango completo de Mach (desde subsónica hasta hipersónico) sin estrategias de cambio.

El repositorio Python-Shock-Tube implementa AUSM con una interfaz limpia que funciona junto con los solucionadores de GoDunov, ROE, HLL y HLLC:

# AUSM implementation pattern from Python-shock-tube
def ausm_flux(uL, uR, n):
    """AUSM flux with pressure splitting."""
    rhoL, uL, P_L = uL
    rhoR, uR, P_R = uR
    
    # Split flux into advective and pressure parts
    # Advective part uses Mach number-based splitting
    # Pressure part uses sign function of Mach number
    # See Toro's "Riemann Solvers and Numerical Methods 
    # for Fluid Dynamics" for full derivation

Limitadores de flujo de TVD y reconstrucción MUSCL

Los limitadores de flujo de TVD (disminución total de la variación) evitan las oscilaciones espurias cerca de las discontinuidades al controlar la variación total de la solución. Cuando se combinan con la reconstrucción de MUSCL (Esquema Monotónico Centrado Upstream para las Leyes de Conservación), forman el esquema muscl-TVD, un método de segundo orden que es el caballo de batalla para la captura de choque a nivel de ingeniería.

La compensación aquí es clara: MUSCL-TVD es computacionalmente barato y robusto, pero con fuertes choques o interacciones de onda complejas, puede producir pequeñas oscilaciones detrás del frente de choque. Para aplicaciones de ingeniería donde la resolución absoluta de choques no es crítica, MUSCL-TVD suele ser suficiente.

Weno y Teno: captura de choque de alto orden

La reconstrucción esencialmente no oscilatoria ponderada de quinto orden (WENO) aborda las limitaciones de MUSCL-TVD mediante el uso de una combinación ponderada de plantillas que se adaptan automáticamente a regiones lisas versus discontinuas. Casi flujo suave, todas las plantillas contribuyen; Cerca de los choques, los pesos se concentran en la plantilla no oscilatoria. El resultado es una resolución dramáticamente mejor de las oscilaciones de alta frecuencia cerca de las discontinuidades, cruciales para la simulación numérica directa (DNS) de alta fidelidad y la simulación de remolinos grandes implícitas (ILES).

El repositorio Python-Shock-Tube lo demuestra claramente con el problema shu–osher, un punto de referencia clásico donde un choque interactúa con una onda de densidad. Vea la imagen de comparación shu–osher del repositorio, que muestra que WENO de 5.° orden resuelve las oscilaciones de alta frecuencia detrás del choque mucho mejor que MUSCL-TVD.

Para DNS e ILEs de interacciones de choque-capa límite, como los casos de buffet transónico validados en OpenSBLI V3.0, Weno y su variante TENO de preservación de borde (Eno objetivo) son el estándar actual. La generación de código automatizado de OpenSBLI produce código C de producción a partir de formulaciones simbólicas de Python utilizando Weno/Teno para la discretización compresible de Navier-Stokes.

Soludores de Python para flujo aeroespacial compresible

El panorama de los solucionadores de flujo compresible basados en Python ha madurado significativamente entre 2021 y 2025. Ahora hay cinco marcos disponibles para investigadores aeroespaciales, cada uno con arquitecturas distintas:

Pybaram: cuadrículas no estructuradas para golpes fuertes

Pybaram (publicado en SoftwareX, 2022) implementa métodos de volumen finito en cuadrículas no estructuradas para geometrías aeroespaciales 2D y 3D. Maneja explícitamente fuertes ondas de choque y expansión, diseñadas tanto para la enseñanza como para la investigación con datos abiertos sobre Mendeley. Con más de 10 citas, Pybaram representa un punto de entrada accesible para los investigadores que necesitan soporte de red no estructurado sin la sobrecarga de paquetes más grandes.

OpenSBL V3.0 — Generación de código automatizada para DNS/ILES

OpenSBLI representa un enfoque fundamentalmente diferente: en lugar de escribir el código CFD compilado directamente, los usuarios escriben ecuaciones en notación Einstein usando Python Symbolic Algebra (simpy), y el generador de código de OpenSBLI produce un código C optimizado a través del OPS DSL. El framework apunta a cuadrículas estructuradas de varios bloques y admite backends de CPU (MPI/OpenMP) y GPU (CUDA/OpenCL).

opensbli v3.0, publicado en Computadoras & Física (enero de 2025), apoya explícitamente weno y teno shock-capture y ha sido validado en:

  • Interacciones de capas límite de choque en números de Mach hipersónicos
  • Buffet Transonic en los perfiles aerodinámicos de la NASA-CRM
  • DNS de flujo hipersónico sobre protuberancias gaussianas

El pedigrí académico del marco es fuerte: el equipo de Southampton/Oxford (Lusher, Sandham) ha publicado más de 20 artículos sobre aplicaciones de OpenSBL. Si su investigación involucra DNS/ILE de alta fidelidad de flujos compresibles con interacciones de choque, la generación de código automatizada de OpenSBLI es la opción más madura.

diagrama de flujo de trabajo ilustra cómo son las ecuaciones simbólicas de Python Traducido al código C optimizado a través del OPS DSL.

JANC — Flujo compresible diferenciable en GPU

Janc (publicado en abril de 2025 por investigadores de la Universidad y colaboradores de Tsinghua) es posiblemente el solucionador de Python compresible más novedoso en los últimos años. Construido completamente sobre JAX-AMR (refinamiento de malla adaptativa estructurada en bloques basada en JAX), JANC es un solucionador totalmente diferenciable para flujos de reacción compresibles. Su pretensión de distinción:

En una sola GPU A100, JANC logra 1% del costo computacional de OpenFOAM (usando 384 núcleos de CPU). Con AMR habilitado, el costo cae al 1-2% de OpenFoam.

Esta no es una afirmación de marketing, se verifica contra los casos de prueba informados. Apalancamiento de Janc:

  • Diferenciación automática (no hay necesidad de derivar ecuaciones adjuntas manualmente)
  • Compilación XLA JIT (optimización de cálculo de tensor de XLA)
  • Refinamiento de malla adaptativa (resolución automática donde los gradientes son pronunciados)
  • Paralelismo nativo de GPU/TPU
  • Licencias del MIT

Para los investigadores que exploran diferenciable CFD, una tendencia creciente de optimización del diseño, análisis de sensibilidad e integración de ML, JANC es el primer solucionador de Python completamente diferenciable para reaccionar los flujos compresibles. El código está disponible bajo una licencia MIT.

PygasFlow y SU2: cálculos rápidos y suites aeroespaciales completas

Pygasflow (v1.4.1) es un paquete de Python ligero para la dinámica de gas ideal cuasi-1D. Implementa relaciones de choque normales y oblicuas, flujo isoentrópico, flujo de Fanno y Rayleigh, y correlaciones de placa plana/estancamiento aerotermodinámica. Si bien no es un solucionador de CFD completo, es invaluable para cálculos analíticos rápidos: diagramas interactivos de deflexión de presión, controles de relación de choque y barridos paramétricos rápidos antes de comprometerse con una simulación completa.

Su2 sigue siendo el conjunto de CFD de código abierto más citado para aplicaciones aeroespaciales. Sus capacidades supersónicas/comprimibles incluyen la cuña supersónica inviscida, el perfil aerodinámico Transonic ONERAM6 y el flujo compresible no ideal en los tutoriales de boquillas supersónicas. Con más de 4400 estrellas de GitHub, SU2 es la opción establecida para la producción de CFD aeroespacial, donde Python sirve principalmente como capa de script y automatización.

Casos de referencia y validación

Cualquier implementación de captura de choque necesita validación contra casos de referencia estándar. Son fundamentales dos casos:

Tubo de choque de césped

El tubo de choque SOD es la prueba canónica para los solucionadores de Riemann. Inicializa un tubo con un estado izquierdo de alta presión y un estado derecho de baja presión. En t = 0, el diafragma se rompe y se forma un choque, discontinuidad de contacto y forma de ventilador de expansión. El repositorio python-shock-tube proporciona este punto de referencia. Consulte la Comparación de tubos de choque SOD que muestra la resolución de flujo en cuatro solucionadores (Godunov, ROE, HLL, HLLC) en 300 celdas con reconstrucción de orden 0.

La imagen muestra la resolución de flujo en cuatro solucionadores (Godunov, ROE, HLL, HLLC) en 300 celdas con reconstrucción de orden 0. HLLC (lax-Friedrichs linealizado híbrido con contacto) generalmente proporciona el mejor equilibrio: resuelve la discontinuidad de contacto mejor que HLL y es computacionalmente comparable a HLL. Esta es la razón por la que HLLC es la opción predeterminada en la implementación WENO del repositorio Python-Shock-Tube.

Problema Shu-Osher

El problema Shu-Osher prueba qué tan bien un esquema maneja la interacción entre una onda de choque y una onda de densidad. La condición inicial es una función de paso para la presión con una perturbación de densidad sinusoidal detrás del choque. Este caso revela cómo los métodos de reconstrucción resuelven las oscilaciones de alta frecuencia:

  • Reconstrucción de orden 0° (Godunov) sufre una disipación numérica excesiva en choques fuertes
  • MUSCL-TVD reduce la disipación pero oscila detrás del shock
  • weno de 5to orden Resuelve las oscilaciones de alta frecuencia con precisión

Para simulaciones aeroespaciales de alta fidelidad, WENO es ahora la opción estándar.

Desafíos numéricos exclusivos del flujo de alto mach

Varios desafíos numéricos surgen específicamente en un flujo compresible/supersonic que no aparecen (o aparecen de manera diferente) en CFD incompresible:

Restricciones de CFL en números mach altos

La condición CFL (Courant-Friedrichs-Lewy) gobierna la estabilidad para la integración del tiempo explícita. Para el flujo compresible, el número CFL depende de la suma de la velocidad del flujo y la velocidad del sonido:

$$CFL = frac{u + A}{Delta X} Delta T$$

En números de mach altos, $u approx m cdot a$, por lo que la condición de CFL se vuelve extremadamente restrictiva. Esto significa que se requieren pequeños pasos de tiempo, a menudo órdenes de magnitud más pequeños que para flujos incompresibles. Los métodos implícitos de paso de tiempo o multigrid pueden mitigar esto, pero los esquemas explícitos necesitan un control de paso de tiempo cuidadoso.

arreglo de entropía

El esquema básico de ROE falla la condición de entropía en choques fuertes: en lugar del aumento de entropía físicamente correcto a través del choque, la solución numérica puede violar la termodinámica. El arreglo de entropía modifica los valores propios cerca de los choques para garantizar que el esquema numérico respete la segunda ley de la termodinámica. Sin él, la solución puede converger a un estado de entropía equivocado: un choque que es demasiado fuerte o demasiado débil.

Fenómeno de carbunco

Como se mencionó anteriormente, el fenómeno de Carbuncle es una inestabilidad numérica específica del esquema ROE en redes no estructuradas. Cuando un choque fuerte se alinea mal con la red, el solucionador puede desarrollar un choque secundario que se ramifica del choque principal, físicamente imposible y numéricamente catastrófico. El esquema de ROE estable a los golpes (combinación de corrección de entropía con solucionador de Riemann rotado) lo cura.

Interacción de la capa límite-Shock

En las aplicaciones aeroespaciales, las ondas de choque que interactúan con las capas límite producen estructuras de flujo complejas: separación de flujo, reincorporación y buffet inestable. Resolver estos requiere:

  • Resolución fina de la capa límite (a menudo DNS resuelto en la pared)
  • Captura de golpes de alto orden (WENO/Teno) para resolver el choque
  • Resolución temporal adecuada para fenómenos inestables

Esta es la razón por la que la validación de OpenSBLI V3.0 se centra en SBLI: es la física lo que más importa para el diseño de vehículos transónicos e hipersónicos.

¿Qué solucionador deberías elegir?

La elección del solucionador de flujo compresible depende de los requisitos de la red, las necesidades de fidelidad y los recursos computacionales. Aquí hay una comparación:

solidista Tipo de cuadrícula captura de choque mejor para hardware
píbara desestructurado Volumen finito Enseñanza, Aeroespacial 2D/3D, Golpes fuertes CPU paralelo
AbiertosBLI Estructurado (multibloqueo) Weno/Teno DNS/ILES, SBLI, Trasónico Buffet, Hipersónico CPU/GPU (CUDA/OpenCL)
enderezado Estructurado (Bloque AMR) Diferencia automática de Jax CFD diferenciable, optimización adjunta, GPU GPU/TPU (A100+)
flujo de pigas N/A (analítica) N/A Relaciones rápidas de choque, Fanno/Rayleigh, barridos paramétricos Cualquier
su2 Estructurado/no estructurado ROE, AUSM, etc. Suite aeroespacial completa, CFD de producción, flujos N+1 CPU/MPI

Recomendación práctica: Comience con PyGasFlow para comprender analíticamente las relaciones de choque y el flujo de Fanno/Rayleigh. Luego use el repositorio Python-Shock-Tube para la práctica de captura de golpes 1D (ROE, AUSM, Weno). Elija Pybaram si necesita cuadrículas no estructuradas para geometrías complejas 2D/3D. Elija opensbli si su investigación involucra DNS/ILES con WENO/TENO en cuadrículas estructuradas. Elija Janc si está explorando CFD diferenciable con GPU Acceleration y AMR.

Resumen y próximos pasos

Este artículo cubrió lo que hace que el flujo compresible/supersonic sea diferente del flujo incompresible, los métodos de captura de choque (ROE con Entropy Fix, AUSM, TVD, Weno/Teno) que manejan discontinuidades, los solucionadores de Python disponibles para aplicaciones aeroespaciales (Pybaram, OpenSBL, JANC, PygasFlow, SU2) y casos de referencia para la validación.

Para los investigadores que comienzan con el flujo compresible en Python: comience con PyGasFlow para realizar cálculos analíticos rápidos, practique métodos de captura de choque con Python-Shock-Tube, luego elija Pybaram (no estructurado) o OpensBLI (estructurado) según los requisitos de su red. Para CFD diferenciable con aceleración de GPU, JANC representa el estado actual del arte.

Si es nuevo en Python CFD, comience con nuestro Comprensivo CFD Primer cubriendo fipy, malla y el 12 Pasos a Navier-Stokes. Para los flujos dominados por la advección donde es importante la resolución de la malla, Adaptación de malla anisotrópica puede complementar su esquema de captura de choque. Cuando necesite una mejor resolución que el volumen finito de segundo orden, Métodos espectrales y DG de orden alto ofrecen alternativas.


lectura recomendada