Skip to content
cfd-lab:~/es/posts/2026-08-04-nscbc-nonrefl…● online

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

NOTE #122DAY TUE 유체역학DATE 2026.08.04UPDATED 2026.10.19READ 10 min read#NSCBC#Boundary-Condition#Acoustics#Compressible#Characteristics

La salida está abierta y la onda regresa — NSCBC y el precio de σ

Una reflexión nula no sujeta la presión media. Pasado un punto, subir σ pierde también el desplazamiento.

La salida está abierta. Aun así, la onda regresa. Basta con tratar la frontera de salida de un código compresible mediante una extrapolación descuidada y calcular una llama o una zona turbulenta: en pleno centro del dominio crece una oscilación sin causa física. Al medir su periodo, casi siempre coincide con la longitud del dominio dividida por la velocidad del sonido. La caja de cálculo se ha convertido en un tubo resonante. En la frontera que fabrica esa resonancia se separa lo que se calcula de lo que hay que inventar. El coeficiente que mueve ese invento tiene un precio, y el precio está en la tabla.

Al llevar el deslizador de Mach desde un valor subsónico positivo más allá de lo sónico, las flechas que entraban salen. Con el signo negativo, el número de condiciones de esa misma cara salta.

boundary

Una salida subsónica lleva una condición. Pasado lo sónico, la cuenta es cero. Al volver la cara una entrada, pasa a cuatro. La onda es un número inventado solo mientras la flecha apunta hacia el interior.

El borde de la caja no es física#

Un dominio físico no tiene borde. Más allá de la salida de la cámara de combustión el espacio continúa. La malla, en cambio, tiene que terminar en algún punto, y la última celda no tiene vecina. Sin vecina no hay derivada, y sin derivada no hay ecuación de gobierno que avanzar.

En los códigos RANS el problema estuvo oculto mucho tiempo. La viscosidad turbulenta y la artificial son grandes, así que una onda mal fabricada en la frontera muere a las pocas celdas. Con LES y DNS las cuentas cambian. La viscosidad artificial es casi nula y la turbulenta está en su mínimo. El error creado por la frontera no se disipa: cruza el dominio y vuelve.

La receta que Poinsot y Lele articularon en 1992 invierte el enfoque. En lugar de extrapolar variables en la frontera, se cuentan las ondas que la atraviesan y se fija la amplitud de cada una. Extiende las condiciones de contorno características de Euler (ECBC) a Navier–Stokes con sus términos viscosos, de ahí el nombre NSCBC (Navier–Stokes Characteristic Boundary Conditions). No se usa ni una línea de extrapolación.

Lo que una frontera puede contar y lo que debe inventar#

La frontera queda en x1=Lx_1 = L. Al reagrupar los términos en dirección x1x_1 como ondas, la ecuación de continuidad queda:

∂ρ∂t+d1+∂(ρu2)∂x2+∂(ρu3)∂x3=0\frac{\partial \rho}{\partial t} + d_1 + \frac{\partial (\rho u_2)}{\partial x_2} + \frac{\partial (\rho u_3)}{\partial x_3} = 0

Aquí ρ\rho es la densidad, uiu_i las componentes de velocidad y d1d_1 reúne las contribuciones normales a la frontera. Ese vector dd es el producto del análisis característico, y dentro viven las amplitudes de onda Li\mathcal{L}_i.

L1=(u1−c)(∂p∂x1−ρc∂u1∂x1)\mathcal{L}_1 = (u_1 - c)\left( \frac{\partial p}{\partial x_1} - \rho c \frac{\partial u_1}{\partial x_1} \right) L5=(u1+c)(∂p∂x1+ρc∂u1∂x1)\mathcal{L}_5 = (u_1 + c)\left( \frac{\partial p}{\partial x_1} + \rho c \frac{\partial u_1}{\partial x_1} \right)

cc es la velocidad local del sonido (c2=γp/ρc^2 = \gamma p / \rho) y pp la presión. L1\mathcal{L}_1 es la variación de amplitud de la onda acústica que corre en el sentido negativo de x1x_1, y L5\mathcal{L}_5 la que corre en el positivo. Las tres restantes viajan con el fluido: L2\mathcal{L}_2 transporta entropía, L3\mathcal{L}_3 y L4\mathcal{L}_4 las velocidades transversales u2u_2 y u3u_3, todas a velocidad u1u_1.

Lo que separa los casos es el signo de esas velocidades. Si una onda sale del dominio, su amplitud se calcula desde los puntos interiores. Si entra, esa información no está en ninguna parte de la solución: hay que inventarla. El número de ondas entrantes es exactamente el número de condiciones de contorno físicas que admite esa frontera.

Cómo las características parten el sonido en todo el dominio está en por qué un flujo supersónico no conoce su aguas arriba. Aquí solo se cuenta cuántas de esas líneas corta una cara de salida.

Al subir MM de +0.3+0.3 a +1.4+1.4, la flecha que cambió de sentido arriba es L1\mathcal{L}_1. La cuenta pasa de uno a cero. Con signo negativo la cara es una entrada y la cuenta es cuatro. Un código que corría con salida subsónica y diverge al volverse supersónica suele imponer una condición más de las que este registro admite.

LODI: la regla que fabrica una amplitud#

Inventar una amplitud entrante exige una justificación. En cada punto de la frontera, NSCBC construye un sistema local unidimensional no viscoso, eliminando todos los términos transversales, viscosos y de reacción. Son las relaciones LODI (Local One Dimensional Inviscid).

∂p∂t+12(L5+L1)=0\frac{\partial p}{\partial t} + \frac{1}{2}\left( \mathcal{L}_5 + \mathcal{L}_1 \right) = 0 ∂u1∂t+12ρc(L5−L1)=0\frac{\partial u_1}{\partial t} + \frac{1}{2 \rho c}\left( \mathcal{L}_5 - \mathcal{L}_1 \right) = 0

Las relaciones LODI no son condiciones físicas ni son las ecuaciones que se resuelven. Existen solo para estimar las Li\mathcal{L}_i entrantes. El procedimiento tiene tres pasos: eliminar del sistema cada ecuación de conservación cuya variable esté impuesta físicamente, usar la relación LODI correspondiente para escribir la Li\mathcal{L}_i desconocida en función de las conocidas, y avanzar el resto de variables con las ecuaciones que quedan.

Una salida perfectamente no reflectante toma aquí la decisión más simple posible: declara que ninguna onda acústica llega desde fuera.

L1=0\mathcal{L}_1 = 0

Onda entrante nula, reflexión nula. Parece limpio. Pero en esa afirmación no aparece por ningún lado la presión exterior p∞p_\infty.

Lo que cuesta σ = 0: la presión que nunca vuelve a p∞#

Sin p∞p_\infty, la frontera no tiene idea de cuál debería ser la presión. El calor liberado dentro del dominio la sube, y no hay en ninguna parte una fuerza restauradora que devuelva ese desplazamiento. El problema deja de estar bien planteado.

La corrección de Rudy y Strikwerda consiste en no anular la onda entrante, sino atarla a la diferencia de presión:

L1=K(p−p∞),K=σ(1−M2)cL\mathcal{L}_1 = K \left( p - p_\infty \right), \qquad K = \sigma \left( 1 - M^2 \right) \frac{c}{L}

LL es una longitud característica del dominio, MM el número de Mach máximo y σ\sigma el único parámetro libre de toda la receta. Con σ=0\sigma = 0 se vuelve al caso perfectamente no reflectante. Al subir σ\sigma, la frontera empieza a arrastrar la presión hacia p∞p_\infty.

El conducto cerrado, con sigma y source q, queda justo después de la tabla impresa.

La ventana estrecha entre dos fracasos#

σ\sigma vive entre dos fracasos que tiran en sentidos opuestos.

TratamientoQué hace en la salidaCómo falla
B1 (extrapolación + invariantes de Riemann)Extrapola velocidad y densidad, relaja solo la presiónOndas espurias fabricadas por la extrapolación
B2 (NSCBC, σ=0\sigma = 0)L1=0\mathcal{L}_1 = 0La presión media nunca queda anclada a p∞p_\infty
B3 (NSCBC, σ>0\sigma > 0)L1=K(p−p∞)\mathcal{L}_1 = K(p - p_\infty)Reflexión en cuanto σ\sigma crece
B4 (salida reflectante)Presión fija, L1=L5\mathcal{L}_1 = \mathcal{L}_5Reflexión total: la caja es un resonador

Con σ\sigma pequeño la presión media se va a la deriva; con σ\sigma grande la frontera se endurece hasta devolver energía acústica al interior. Los valores que Poinsot y Lele emplearon fueron σ≈0.25\sigma \approx 0.25, y σ=0.58\sigma = 0.58 para el coeficiente equivalente en el B1 basado en extrapolación. Ninguno de los dos sale de la teoría: ambos se eligieron entre los dos fracasos.

La dependencia con la frecuencia explica por qué es un compromiso. Para una onda acústica de frecuencia angular ω\omega, esta frontera refleja con

∣R∣=KK2+4ω2|R| = \frac{K}{\sqrt{K^2 + 4\omega^2}}

Cuanto más baja la frecuencia, mayor la reflexión. Es decir, σ\sigma funciona como un filtro que agarra las frecuencias bajas y deja pasar las altas. La presión media es la componente ω→0\omega \to 0, así que queda agarrada; la acústica que se quiere evacuar pasa. La ventana en la que esa separación funciona es estrecha.

Medir reflexión y desplazamiento con código#

En acústica lineal unidimensional el estado se parte exactamente en dos amplitudes características: A±=p′±ρcu′A^\pm = p' \pm \rho c u', que viajan a ±c\pm c. Con Δt=Δx/c\Delta t = \Delta x / c cada una se desplaza exactamente una celda por paso, de modo que toda ondulación en pantalla proviene de la condición de contorno y no del esquema.

import numpy as np
 
N, C, L = 240, 1.0, 1.0
DX = L / N
DT = DX / C                       # desplazamiento exacto de una celda: sin difusion del esquema
 
 
def outlet_relax_k(sigma, mach=0.0):
    """Coeficiente de relajacion NSCBC K = sigma (1 - M^2) c / L"""
    return sigma * (1.0 - mach ** 2) * C / L
 
 
def duct_step(ap, am, am_b, k_relax, q):
    """A+ una celda a la derecha, A- una a la izquierda. En la salida hay que inventar A-."""
    ap[1:] = ap[:-1].copy()
    ap[0] = 0.0
    am[:-1] = am[1:].copy()
 
    p_b = 0.5 * (ap[-1] + am[-1])
    am_b -= DT * k_relax * p_b     # L1 = K (p - p_inf)
    am[-1] = am_b
 
    ap[0] = am[0]                  # extremo cerrado en x = 0 (u = 0)
    ap += q * DT                   # liberacion de calor debil y uniforme
    am += q * DT
    return am_b
 
 
def measure_outlet(sigma, q, steps, pulse):
    ap, am, am_b = np.zeros(N), np.zeros(N), 0.0
    x = (np.arange(N) + 0.5) * DX
    if pulse:
        ap += np.exp(-((x - 0.30) / 0.09) ** 2)
    k = outlet_relax_k(sigma)
    refl = 0.0
    for n in range(steps):
        am_b = duct_step(ap, am, am_b, k, q)
        if pulse and n > 0.85 * N:
            refl = max(refl, np.abs(am[:-8]).max())
    return refl, float(np.mean(0.5 * (ap + am)))
 
 
for sigma in (0.0, 0.25, 1.0, 4.0, 10.0):
    r, _ = measure_outlet(sigma, q=0.0, steps=650, pulse=True)
    _, p = measure_outlet(sigma, q=0.3, steps=6000, pulse=False)
    print(f"sigma={sigma:5.2f}   reflejado={r * 100:5.1f}%   p media - p_inf={p:+.4f}")

Lo que imprime:

sigma= 0.00   reflejado=  0.0%   p media - p_inf=+0.3000
sigma= 0.25   reflejado=  1.9%   p media - p_inf=+0.0007
sigma= 1.00   reflejado=  7.3%   p media - p_inf=+0.0006
sigma= 4.00   reflejado= 24.5%   p media - p_inf=+0.0227
sigma=10.00   reflejado= 46.8%   p media - p_inf=-0.1142
fire a pulse and watch the red curve at the outlet — that is the reflection. then drop sigma to 0 and watch the white curve settle above p_inf instead of returning to it.

Cuando el pulso de fire pulse llega a la salida, una curva roja A−A^- que sube es la reflexión. Con source q alto y σ=0\sigma = 0, la curva blanca se queda por encima de p∞p_\infty. La reflexión no está. La presión tampoco queda sujeta.

Con σ=0\sigma = 0 la reflexión desaparece por completo, y el desplazamiento de 0.3 creado por la liberación de calor se queda intacto. Con σ=0.25\sigma = 0.25 la reflexión baja del 2% y la presión se mantiene a menos de 0.0007 de p∞p_\infty. Hasta aquí, lo esperado.

La sorpresa está en las dos últimas filas. Llevar σ\sigma a 4 y a 10 sube la reflexión al 25% y al 47%, lo cual no extraña; pero el desplazamiento de presión vuelve a empeorar. Una frontera tan rígida empieza a resonar por su cuenta, y esa resonancia mueve la media. Subir σ\sigma no es un canje en el que se compre control de presión pagando con reflexión. Pasado cierto punto se pierden las dos cosas.

La columna de reflexión lee 0,0, 1,9, 7,3, 24,5 y 46,8%. En el código C=1C = 1, L=1L = 1 y el Mach es 0, así que K=σ(1−M2)cLK = \sigma \left( 1 - M^2 \right) \frac{c}{L} se reduce a K=σK = \sigma. Al pasar σ\sigma de 0,25 a 10, un factor 40, la reflexión pasa de 1,9 a 46,8. Unas 25 veces. No es lineal. ∣R∣=KK2+4ω2|R| = \frac{K}{\sqrt{K^2 + 4\omega^2}} se satura hacia 1 cuando K crece. El pulso no es una sola frecuencia: es una gaussiana de ancho 0,09. No hace falta invertir un ω\omega a partir de estos porcentajes. Basta la dirección. Al crecer K la reflexión sube y luego se aplana.

La columna de presión no sigue esa monotonía. En la ejecución con q=0.3q = 0.3, σ=0\sigma = 0 deja una media de +0,3000, el mismo tamaño que la fuente. σ=0.25\sigma = 0.25 deja +0,0007 y σ=1\sigma = 1 deja +0,0006. Frente a 0,3000, 0,0007 es el 0,23%. Hasta ahí la relajación casi borra el desplazamiento. Con σ=4\sigma = 4 el desplazamiento es +0,0227, unas 32 veces 0,0007. Con σ=10\sigma = 10 es −0,1142. El signo se invierte. El valor absoluto es unas 160 veces 0,0007. Una frontera que refleja el 46,8% no sujeta la media: la sacude. El suelo de esa columna está en 0,25 y 1,0. El 0,25 que usaron Poinsot y Lele es el borde izquierdo de ese suelo. 0,58 corresponde al coeficiente de B1, así que no cae tal cual sobre esta columna.

Las ondas que inventó la malla viajan al revés#

En la frontera no solo se refleja la acústica física. Las componentes con longitud de onda menor que unos cuatro espaciados de malla no son solución de Navier–Stokes: son artefactos de la discretización. Poinsot y Lele las llamaron "ondas q" para separarlas de las "ondas p" físicas.

Su firma es la velocidad de grupo. Incluso en la ecuación de advección unidimensional a velocidad VV, la velocidad de grupo ugu_g de las longitudes de onda cortas tiene signo opuesto a VV. El flujo avanza hacia la derecha y el error numérico repta aguas arriba, hacia la izquierda. Peor aún: ∣ug/V∣|u_g / V| crece con el orden del esquema espacial, así que los códigos de alto orden quedan más expuestos, no menos.

Por eso un tratamiento de frontera hay que juzgarlo con dos coeficientes de reflexión: Ap/A1A_p / A_1 para las ondas físicas y Aq/A1A_q / A_1 para las numéricas. Cualquier tratamiento utilizable necesita Aq/A1≪1A_q / A_1 \ll 1 en toda circunstancia; si además presume de no reflectante, necesita Ap/A1≪1A_p / A_1 \ll 1. Basta arrancar el cálculo desde un campo inicial con gradientes abruptos para generar ondas q, y en una DNS nada las elimina después.

Si el periodo es 2L/c, la sospecha cae primero sobre σ#

σ\sigma no es una perilla de ajuste. Un extremo es una presión sin anclaje. El otro es una caja convertida en resonador. Cerca de 0,25 la frontera agarra las frecuencias bajas y deja pasar el resto.

Una oscilación sin causa visible empieza por un conteo: características entrantes frente a condiciones impuestas. Un periodo múltiplo de 2L/c2L/c es la frontera, no la física. Al bajar σ\sigma, si la oscilación se reduce, la causa era la frontera. Si la presión media se va, el cálculo cruzó al otro lado. Contar esas ondas antes de tocar la salida es el motivo de una pasada anterior que deja NSCBC como salida no reflectante.

Comparte si te resultó útil.