Skip to content
cfd-lab:~/es/posts/2026-09-27-all-mach-twop…● online

Traducción del original en coreano escrito por el autor. Leer el original (한국어)

NOTE #167DAY SUN 논문리뷰DATE 2026.09.27UPDATED 2026.10.19READ 9 min read#All-Mach#Asymptotic-Preserving#Operator-Splitting#Compressible-Multiphase#Paper-Review

[Reseña de artículo] La presión pasó a implícita y Δt se redujo 100 veces — el segundo 1/M² oculto en la velocidad relativa

Tratar solo la presión de forma implícita no alcanza: la diferencia de entalpía en la ecuación de velocidad relativa carga su propio 1/M², y el paso temporal sigue atado al número de Mach hasta que ese término también pasa a implícito.

La presión pasó a implícita y el paso temporal solo se hizo más pequeño#

Hay un fracaso por el que pasa cualquiera que escriba un resolvedor bifásico de bajo Mach. Se detecta que los términos de presión son rígidos (stiff) y se tratan de forma implícita. Creyendo que ya no hay dependencia de la velocidad del sonido, se sube Δt\Delta t a la escala de la velocidad material. Y estalla. En M=0.01M=0.01 el paso temporal utilizable es cien veces menor que el que funcionaba en M=1M=1.

El artículo de 2022 de Lukáčová-Medviďová y colaboradores señala con precisión dónde vive ese fracaso. El modelo bifásico isentrópico lleva 1/M21/M^2 en dos lugares. Uno es la presión, ya conocida. El otro va montado sobre la diferencia de entalpía en la ecuación de velocidad relativa. Este texto desentierra el segundo y mide, sobre una malla de 64 celdas, si tratarlo de forma implícita libera de verdad la cota del paso temporal del número de Mach.

Al empujar log10 M a la izquierda, los abanicos rápidos se abren juntos. La barra de Δt\Delta t admisible suelta el número de Mach solo con f^c implicit marcado.

t = 0.00 Δt

El abanico azul es la presión; el rosa, la diferencia de entalpía. Con solo f^a implicit, la barra inferior sigue encogiéndose con MM.

Dos copias de 1/M² en un mismo modelo#

El vector de estado del artículo es W=(ρ, αρ, α1ρ1, ρu, u1−u2)TW = (\rho,\ \alpha\rho,\ \alpha_1\rho_1,\ \rho u,\ u_1-u_2)^T: densidad de mezcla, fracción volumétrica (la parte del volumen de celda que ocupa la fase 1), densidad parcial, cantidad de movimiento de mezcla y la diferencia de las dos velocidades de fase. Esa última componente distingue al modelo. En lugar de llevar una velocidad por fase, lleva una velocidad de mezcla y una diferencia de velocidad.

Al adimensionalizar, MkM_k entra en el flujo. En la ecuación de cantidad de movimiento la presión aparece como

αϱ1p^1M12+α2p^2M22\frac{\alpha\varrho_1\hat{p}_1}{M_1^2} + \frac{\alpha_2\hat{p}_2}{M_2^2}

donde p^k\hat{p}_k es la presión truncada alrededor de un estado de referencia, MkM_k el número de Mach de la fase kk y ϱk\varrho_k una razón de densidades de referencia. Este término diverge cuando M→0M\to 0: es el primer término rígido y se trata de forma implícita igual que en los esquemas IMEX monofásicos.

El problema está en la quinta ecuación. La diferencia de velocidad la impulsa una diferencia de entalpía:

∂t(u1−u2)+∂x ⁣(h^1M12−h^2M22)=0\partial_t (u_1-u_2) + \partial_x\!\left(\frac{\hat{h}_1}{M_1^2} - \frac{\hat{h}_2}{M_2^2}\right) = 0

Aquí h^k\hat{h}_k es la entalpía truncada de la fase kk. En el denominador está el mismo Mk2M_k^2. Pasar la presión a implícita deja este término intacto.

Tres subsistemas y sus características en un solo gráfico#

El splitting del artículo corta el flujo en faf^a (acústica rápida), fbf^b (transporte material) y fcf^c (términos rígidos de mezcla), y añade al final el término fuente de relajación r(W)r(W). Cada pieza tiene sus propios autovalores. El dial de arriba abrió juntos el abanico azul y el rosa por este splitting. Llevar también fcf^c a implícito es todo lo que hace la sección 3.2.3.

Escribir los autovalores del subsistema de velocidad relativa#

En fcf^c quedan tres ecuaciones: densidad parcial, cantidad de movimiento y diferencia de velocidad. Los autovalores de este sistema 3×33\times 3 son

λ0=0,λ±=ϱ12(1−2χ1)(u1−u2)±12A\lambda^0 = 0, \qquad \lambda^{\pm} = \frac{\varrho_1}{2}(1-2\chi_1)(u_1-u_2) \pm \frac{1}{2}\sqrt{\mathcal{A}}

con el discriminante

A=ϱ12(1−2χ1)2(u1−u2)2+4ρ χ(1−χ) ⁣((c1RS)2α1M12ρ1RS+(c2RS)2α2M22ρ2RS)\mathcal{A} = \varrho_1^2(1-2\chi_1)^2(u_1-u_2)^2 + 4\rho\,\chi(1-\chi)\!\left(\frac{(c_1^{RS})^2}{\alpha_1 M_1^2 \rho_1^{RS}} + \frac{(c_2^{RS})^2}{\alpha_2 M_2^2 \rho_2^{RS}}\right)

donde χ\chi es la fracción másica y el superíndice RSRS marca valores de la solución de referencia. El segundo término de A\mathcal{A} conserva intacto 1/Mk21/M_k^2, de modo que λ±∼O(1/M)\lambda^{\pm} \sim \mathcal{O}(1/M).

Como A>0\mathcal{A} > 0, los autovalores son reales: el subsistema es hiperbólico y por eso se puede resolver por separado. Pero su velocidad característica va como 1/M1/M. Tratado de forma explícita, la condición CFL queda Δt≤Δx⋅M/const\Delta t \le \Delta x \cdot M / \text{const}. Todo lo ganado al hacer implícita la presión se devuelve aquí.

La ecuación de cantidad de movimiento corresponde a λ0=0\lambda^0=0, así que no restringe el paso temporal. Por eso el artículo acopla solo dos ecuaciones — densidad parcial y diferencia de velocidad — en la resolución implícita. En un IMEX que separa acústica y transporte bastaba con pasar a implícita la acústica rápida. Con dos fases hay dos términos rígidos. El 1/M21/M^2 de la diferencia de entalpía es el segundo.

La restricción verdadera al elegir el splitting#

El artículo enuncia dos condiciones sobre el splitting: cada subsistema debe ser hiperbólico por sí mismo y debe ser fácil de resolver. La primera es la exigente. Si los términos se agrupan a la ligera, los autovalores se vuelven complejos y el paso del subsistema se desestabiliza por su cuenta.

Cómo se resuelve el paso implícito también forma parte de la condición. Al sustituir la actualización de la diferencia de velocidad en la de la densidad parcial aparece un problema elíptico no lineal para (αρ1)⋆⋆⋆(\alpha\rho_1)^{\star\star\star}, que el artículo resuelve con una iteración linealizada. La matriz de coeficientes es simétrica definida positiva porque las dos cantidades

s(W)=ϱ1(αρ1)(1−ϱ1(αρ1)ρ),s~(W)=(c1RS)2ρ1RSM12 α1+(c2RS)2ρ2RSM22 α2s(W) = \varrho_1(\alpha\rho_1)\left(1 - \frac{\varrho_1(\alpha\rho_1)}{\rho}\right), \qquad \tilde{s}(W) = \frac{(c_1^{RS})^2}{\rho_1^{RS}M_1^2\,\alpha_1} + \frac{(c_2^{RS})^2}{\rho_2^{RS}M_2^2\,\alpha_2}

son ambas positivas. Para ss esto se deduce de ϱ1(αρ1)/ρ=χ∈(0,1)\varrho_1(\alpha\rho_1)/\rho = \chi \in (0,1). Ese único signo sostiene la frase "se resuelve de forma eficiente con resolvedores lineales estándar". Un paso temporal que sobrevive cuando la velocidad del sonido sale de la ecuación no lo hereda sola la discretización. El AP-IMEX para gas no ideal anota esa grieta desde el lado de la velocidad del sonido.

Explícito e implícito sobre la misma malla, en Python#

Al linealizar en torno a u1−u2=0u_1-u_2 = 0, el núcleo de fcf^c se reduce a un sistema de ondas 2×22\times 2,

∂tm+∂x(s w)=0,∂tw+∂x(s~ m)=0\partial_t m + \partial_x (s\,w) = 0, \qquad \partial_t w + \partial_x(\tilde{s}\,m) = 0

con m=αρ1m = \alpha\rho_1 y w=u1−u2w = u_1-u_2. La velocidad de onda es ss~\sqrt{s\tilde{s}} y, como s~∝1/M2\tilde{s} \propto 1/M^2, escala como 1/M1/M. Se corrieron ambos tratamientos sobre la misma malla periódica de 64 celdas. El caso explícito usa un flujo de Rusanov cuya viscosidad numérica emplea el λc\lambda_c correcto; el implícito elimina ww y resuelve el problema elíptico resultante con un resolvedor tridiagonal periódico. Δt\Delta t se mantiene fijo en un CFL material de 0,5.

import math
 
N, L = 64, 1.0
dx = L / N
RHO, ALPHA, CHI, U_MAT = 1.0, 0.5, 0.5, 0.2
M0 = CHI * RHO                 # alpha*rho_1, estado de fondo
S = M0 * (1.0 - M0 / RHO)      # s(W) de la Ec. (3.25)
 
def stiff_coeff(mach):
    """s-tilde: coeficiente de entalpia, O(1/M^2)"""
    return 1.0 / (mach**2 * ALPHA) + 1.0 / (mach**2 * (1.0 - ALPHA))
 
def relative_wave_speed(mach):
    return math.sqrt(S * stiff_coeff(mach))
 
def initial_state():
    m = [M0 + 1e-3 * math.sin(2*math.pi*(i+0.5)*dx) for i in range(N)]
    return m, [0.0] * N
 
def explicit_enthalpy(mach, dt, nstep):
    """Rusanov en (3.19a)+(3.19c), termino de entalpia explicito"""
    k, lam = stiff_coeff(mach), relative_wave_speed(mach)
    m, w = initial_state()
    for _ in range(nstep):
        fm = [0.0]*N; fw = [0.0]*N
        for i in range(N):
            j = (i+1) % N
            fm[i] = 0.5*S*(w[i]+w[j]) - 0.5*lam*(m[j]-m[i])
            fw[i] = 0.5*k*(m[i]+m[j]) - 0.5*lam*(w[j]-w[i])
        m = [m[i] - dt/dx*(fm[i]-fm[i-1]) for i in range(N)]
        w = [w[i] - dt/dx*(fw[i]-fw[i-1]) for i in range(N)]
        if not all(abs(v) < 1e12 for v in m):
            return float('inf')
    return max(abs(v-M0) for v in m)
 
def periodic_tridiag(a, b, c, d):
    """Resuelve el sistema tridiagonal periodico por Sherman-Morrison"""
    n = len(d)
    gam = -b[0]
    bb = b[:]; bb[0] -= gam; bb[n-1] -= c[n-1]*a[0]/gam
    def thomas(rhs):
        cp = [0.0]*n; dp = [0.0]*n
        cp[0] = c[0]/bb[0]; dp[0] = rhs[0]/bb[0]
        for i in range(1, n):
            den = bb[i] - a[i]*cp[i-1]
            cp[i] = c[i]/den
            dp[i] = (rhs[i] - a[i]*dp[i-1])/den
        x = [0.0]*n; x[n-1] = dp[n-1]
        for i in range(n-2, -1, -1):
            x[i] = dp[i] - cp[i]*x[i+1]
        return x
    u = [0.0]*n; u[0] = gam; u[n-1] = c[n-1]
    y = thomas(d); z = thomas(u)
    fac = (y[0] + a[0]*y[n-1]/gam) / (1.0 + z[0] + a[0]*z[n-1]/gam)
    return [y[i] - fac*z[i] for i in range(n)]
 
def implicit_enthalpy(mach, dt, nstep):
    """Ec. (3.23): elimina w y resuelve el problema eliptico para m"""
    k = stiff_coeff(mach)
    beta = dt*dt*S*k/(dx*dx)
    a = [-beta]*N; b = [1.0 + 2*beta]*N; c = [-beta]*N
    m, w = initial_state()
    for _ in range(nstep):
        rhs = [m[i] - dt/(2*dx)*S*(w[(i+1) % N]-w[i-1]) for i in range(N)]
        m = periodic_tridiag(a, b, c, rhs)
        w = [w[i] - dt/(2*dx)*k*(m[(i+1) % N]-m[i-1]) for i in range(N)]
    return max(abs(v-M0) for v in m)
 
def max_stable_dt(mach, nstep=200):
    lo, hi = 1e-9, 1.0
    for _ in range(40):
        mid = math.sqrt(lo*hi)
        if explicit_enthalpy(mach, mid, nstep) == float('inf'):
            hi = mid
        else:
            lo = mid
    return lo
 
dt_mat = 0.5*dx/U_MAT
print(f"dx={dx:.5f}  material CFL dt={dt_mat:.5f}  (u={U_MAT})")
print(f"{'M':>8} {'lambda_c':>10} {'dt_exp_max':>11} {'ratio':>7} {'|dm|_exp':>10} {'|dm|_imp':>10}")
for mach in (1.0, 0.3, 0.1, 0.03, 0.01):
    lam = relative_wave_speed(mach)
    dte = max_stable_dt(mach)
    e = explicit_enthalpy(mach, dt_mat, 200)
    i = implicit_enthalpy(mach, dt_mat, 200)
    es = "blow-up" if e == float('inf') else f"{e:.3e}"
    print(f"{mach:8.3g} {lam:10.2f} {dte:11.2e} {dte/dt_mat:7.3f} {es:>10} {i:10.3e}")
dx=0.01562  material CFL dt=0.03906  (u=0.2)
       M   lambda_c  dt_exp_max   ratio   |dm|_exp   |dm|_imp
       1       1.00    1.87e-02   0.479    blow-up  1.718e-06
     0.3       3.33    5.61e-03   0.144    blow-up  1.771e-14
     0.1      10.00    1.87e-03   0.048    blow-up  4.731e-13
    0.03      33.33    5.60e-04   0.014    blow-up  6.318e-12
    0.01     100.00    1.87e-04   0.005    blow-up  5.195e-11

Al desmarcar enthalpy implicit y empujar log10 M por debajo de −1-1, con el Δt\Delta t material fijo la amplitud logarítmica toca el techo.

step 0, |δ| 1.0e-3

Al marcarlo de nuevo, la amplitud se apaga con ese mismo Δt\Delta t. Al bajar material CFL hasta que el caso explícito revive, ese valor es la columna ratio de arriba.

Por qué la cota sigue a M exactamente#

En la columna dt_exp_max: cuando MM baja cien veces, de 1 a 0,01, la cota baja de 1.87×10−21.87\times 10^{-2} a 1.87×10−41.87\times 10^{-4}, exactamente el mismo factor. No es casualidad. En λc=ss~\lambda_c = \sqrt{s\tilde{s}}, ss no depende de MM mientras s~∝M−2\tilde{s} \propto M^{-2}, de modo que λc∝M−1\lambda_c \propto M^{-1}. Al sustituirlo en la condición de estabilidad de Rusanov, λcΔt/Δx≤1\lambda_c \Delta t/\Delta x \le 1, resulta Δtmax⁡∝M\Delta t_{\max} \propto M.

La columna ratio es la que duele en la práctica. En M=0.01M=0.01 solo puede usarse el 0,5 % del Δt\Delta t que pedía el CFL material, lo que significa doscientas veces más pasos para el mismo tiempo físico. La columna implícita, en cambio, completó los 200 pasos con el Δt\Delta t fijo sin divergir; en M=0.01M=0.01 eso corresponde a un CFL acústico de 256.

Conviene leer λc\lambda_c al revés. Vale 1.001.00 en M=1M=1, 10.0010.00 en M=0.1M=0.1 y 100.00100.00 en M=0.01M=0.01. El s=0.25s=0.25 y el s~=4/M2\tilde{s}=4/M^2 del código dan ss~=1/M\sqrt{s\tilde{s}}=1/M, los mismos casilleros impresos. Al meter el paso material Δt=0.03906\Delta t=0.03906 en M=1M=1 sale λcΔt/Δx=0.03906/0.01562=2.50\lambda_c\Delta t/\Delta x=0.03906/0.01562=2.50. Eso pasa el límite de Rusanov, 1, y por eso ratio imprime 0.4790.479. La cuenta 1.87×10−2/0.03906=0.4791.87\times10^{-2}/0.03906=0.479 cierra. Una entalpía explícita no aguanta el CFL material de 0,5 ni en M=1M=1. En M=0.01M=0.01 la razón es 0.0050.005. Entonces 0.479/0.005≈960.479/0.005\approx 96, pegado al factor 100 del arranque.

|dm|_imp es otra columna. Frente a una amplitud inicial de 10−310^{-3}, el residuo en M=1M=1 es 1.718×10−61.718\times10^{-6} y en M=0.01M=0.01 es 5.195×10−115.195\times10^{-11}. Las cinco filas explícitas dicen blow-up. Solo la columna implícita termina 200 pasos con el Δt\Delta t fijo. El CFL acústico impreso, 256, muestra adónde se fue ese límite explícito. Si el 1/M21/M^2 de s~\tilde{s} no pasa a implícito, ese número vuelve como CFL explícito.

Incondicionalmente estable no es incondicionalmente preciso#

Conviene leer con honestidad la columna |dm|_imp. La amplitud inicial era 10−310^{-3} y el caso implícito dejó 10−1110^{-11} o menos. El Euler retrógrado prácticamente aniquiló el modo rápido. No es un error: es lo que un esquema AP (asymptotic preserving, que preserva el límite asintótico) está diseñado para hacer. Cuando Δt\Delta t supera con mucho el tiempo acústico, las ondas de esa escala no se resuelven, se filtran. Lo que interesa conservar es la dinámica en la escala de la velocidad material.

Aun así, ese amortiguamiento no debe confundirse con precisión. Para usar el mismo esquema en regímenes compresibles (M∼1M \sim 1) hay que recuperar los términos truncados pˉk\bar{p}_k y hˉk\bar{h}_k y sumarlos de forma explícita, que es la tarea de la sección 3.2.4. Esos términos de orden superior se anulan en el límite de bajo Mach con datos iniciales bien preparados, así que añadirlos explícitamente no reintroduce dependencia de MM en la condición CFL. La divergencia y el amortiguamiento ya se separan en la curva logarítmica justo después de la tabla impresa.

Dos términos de relajación, dos tratos distintos#

Terminado el sistema homogéneo, queda el término fuente de relajación: relajación de presión sobre la fracción volumétrica y fricción sobre la diferencia de velocidad.

∂t(ρα)=−1τ(ϱ2p2M22−ϱ1p1M12),∂t(u1−u2)=−ζ χ(1−χ)(u1−u2)\partial_t (\rho\alpha) = -\frac{1}{\tau}\left(\frac{\varrho_2 p_2}{M_2^2} - \frac{\varrho_1 p_1}{M_1^2}\right), \qquad \partial_t (u_1-u_2) = -\zeta\,\chi(1-\chi)(u_1-u_2)

Aquí τ\tau es el tiempo de relajación de presión y ζ\zeta el coeficiente de fricción. Ambos pueden ser rígidos y ambos se integran de forma implícita, pero cuestan cosas muy distintas.

El término de fricción es lineal en u1−u2u_1-u_2, así que el Euler retrógrado se cierra con una sola división:

(1+Δt ζ χn+1(1−χn+1))(u1−u2)n+1=(u1−u2)⋆⋆⋆\left(1 + \Delta t\,\zeta\,\chi^{n+1}(1-\chi^{n+1})\right)(u_1-u_2)^{n+1} = (u_1-u_2)^{\star\star\star}

La relajación de presión es otra cosa: las presiones de fase son no lineales en α\alpha. El artículo aplica el método de Newton a g(α)=0g(\alpha)=0 y el jacobiano arrastra las velocidades del sonido:

∂g∂α=−1−Δtτ(ϱ2c22M221−χ1−α+ϱ1c12M12χα)\frac{\partial g}{\partial \alpha} = -1 - \frac{\Delta t}{\tau}\left(\frac{\varrho_2 c_2^2}{M_2^2}\frac{1-\chi}{1-\alpha} + \frac{\varrho_1 c_1^2}{M_1^2}\frac{\chi}{\alpha}\right)

Esta derivada diverge cuando α→0\alpha \to 0 o 11, justo donde Newton empieza a sufrir cerca de una fase pura. La costumbre de recortar α\alpha lejos de sus extremos queda explicada por esta sola expresión. Cabe notar que τ→0\tau \to 0 da relajación instantánea y τ→∞\tau \to \infty recupera el modelo homogéneo.

Dejar explícita la diferencia de entalpía vuelve a atar Δt a M#

Si solo el 1/M21/M^2 de la presión pasa a implícito, la ecuación de velocidad relativa conserva explícito h^1/M12−h^2/M22\hat{h}_1/M_1^2-\hat{h}_2/M_2^2. Su velocidad característica va como 1/M1/M, así que en M=0.01M=0.01 solo es usable el 0.5%0.5\% del CFL material. Ahí están el ratio impreso 0.0050.005 y el CFL acústico 256.

La relajación de presión es otro paso implícito. ∂g/∂α\partial g/\partial\alpha diverge cuando α→0\alpha\to 0 o 11, y Newton se atasca cerca de una fase pura. Resolver con dos presiones y luego fundirlas en una ya tiene libro propio en la relajación de presión de Saurel. Sacar la diferencia de entalpía de esa lista hace que la acústica implícita no devuelva el paso temporal.

Comparte si te resultó útil.