Traducción del original en coreano escrito por el autor. Leer el original (한국어)
Sobrevivir al régimen de baja viscosidad donde BGK explota — Colisión MRT en Lattice Boltzmann
Subir solo s_nu a 1.99 lleva la viscosidad hacia 0. Las barras que quedan, s_e y s_q, deciden si aparece el tablero.
Mismo retículo, mismo equilibrio. Uno gira. El otro se rompe en un tablero. BGK empuja las nueve distribuciones con un único tiempo de relajación. MRT (Multiple Relaxation Time, tiempo de relajación múltiple) las pasa a momentos y empuja cada uno a su propio ritmo.
Al llevar la barra hasta 1.99, el número de viscosidad cae hacia 0. Las barras y se quedan donde estaban.
ν = cs²(1/s_ν − 1/2) = 0.1111 (lattice units)Las barras conservadas , , siguen en cero. BGK ata todas las barras a un solo número. Ese nudo es el sitio del tablero a baja viscosidad.
La debilidad de relajarlo todo en un solo compás#
El método de lattice Boltzmann (LBM) repite dos pasos: las funciones de distribución se desplazan por el retículo (streaming) y, en cada punto, relajan hacia el equilibrio (collision). La colisión BGK más común se escribe como
donde es la distribución a lo largo de la velocidad , es el tiempo de relajación y es el equilibrio local. La viscosidad queda fijada solo por .
El problema empieza aquí. Para bajar la viscosidad (subir el número de Reynolds) hay que acercar a . Pero cuando , los modos de alto orden que nada tienen que ver con la viscosidad apenas relajan y recorren el retículo. Cuando esos modos crecen cerca del límite de resolución de la malla, surge una oscilación de tablero y la simulación diverge. En BGK, la perilla de la viscosidad y la de la estabilidad están atadas al mismo mango.
Mirar la colisión en el espacio de momentos#
No se relajan las nueve distribuciones tal como están. Primero se transforman en momentos con significado físico y después se relaja. Los momentos son combinaciones lineales de las distribuciones.
Aquí es el vector de distribuciones, es la matriz de transformación y es el vector de momentos. La colisión relaja hacia los momentos de equilibrio en el espacio de momentos y luego regresa al espacio de velocidades.
es la matriz diagonal con las tasas de relajación por momento. Si todos los se fijan al mismo valor , esta expresión vuelve exactamente a BGK. MRT no hace más que resolver esas entradas diagonales momento por momento.
Los nueve momentos de D2Q9 y la matriz de transformación M#
En el retículo D2Q9 (dos dimensiones, nueve velocidades) los momentos son estos nueve: densidad , energía , energía al cuadrado , momento , flujo de energía y los tipo tensión .
Entre ellos, son cantidades conservadas que la colisión no altera, así que sus tasas de relajación se fijan en . Los otros seis son las perillas ajustables. La matriz de transformación estándar de Lallemand–Luo se construye con filas ortogonales, por lo que la inversa es simplemente la transpuesta dividida por las normas de fila.
Los momentos de equilibrio cierran solo con densidad y momento.
Aquí , son las componentes del momento. El equilibrio de los momentos de tensión se acopla a los gradientes de velocidad, así que sus tasas de relajación fijan la viscosidad.
Una tasa distinta por momento — grados de libertad ajenos a la viscosidad#
Quien fija la viscosidad de corte es la tasa de relajación de los momentos de tensión, .
Las otras tasas (volumétrica), y (flujo de energía) no entran en la viscosidad. Son libres. Aunque se pegue a , los modos de alto orden pueden quedarse en la banda estable . Lo que BGK ataba a una sola perilla se separa aquí.
La viscosidad por defecto del listado es . Entonces , de modo que y . Al llevar la barra a 1.99, . Restar 0.5 de y dividir por 3 deja . Cerca de cero, no cero. A esa viscosidad BGK también empuja , y hasta 1.99. El MRT del listado fija esos tres sitios en , y . El vector que corre es [0, 1.64, 1.54, 0, 1.7, 0, 1.7, s_nu, s_nu], así que los únicos ceros son los tres sitios conservados.
Los momentos de equilibrio se cierran solo con densidad y momento porque la distribución ya se cortó a orden bajo. Ese corte está en Maxwell–Boltzmann dentro de nueve velocidades.
Colisión en el espacio de momentos, streaming en el de velocidades#
El flujo del algoritmo es el siguiente.
- Calcular las magnitudes macroscópicas a partir de
- Transformar a momentos con
- Calcular los momentos de equilibrio (a partir de densidad y momento)
- Relajar por momento:
- Restaurar al espacio de velocidades con
- Streaming: mover al vecino a lo largo de
- Aplicar condiciones de contorno y volver al paso 1
Solo la colisión ocurre en el espacio de momentos; el streaming transcurre en el espacio de velocidades como siempre. El costo adicional es apenas dos productos de matrices por celda.
Python — Medir el decaimiento viscoso con un vórtice de Taylor–Green#
Para la verificación usamos un vórtice de Taylor–Green. Este flujo tiene una solución exacta de decaimiento viscoso, así que se puede contrastar la implementación con números. La energía cinética debe decaer como , con el número de onda del vórtice.
import numpy as np
# Retículo D2Q9
cx = np.array([0, 1, 0, -1, 0, 1, -1, -1, 1])
cy = np.array([0, 0, 1, 0, -1, 1, 1, -1, -1])
w = np.array([4/9, 1/9, 1/9, 1/9, 1/9, 1/36, 1/36, 1/36, 1/36])
# Matriz de transformacion Lallemand-Luo (filas: rho,e,eps,jx,qx,jy,qy,pxx,pxy)
M = np.array([
[ 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-4,-1,-1,-1,-1, 2, 2, 2, 2],
[ 4,-2,-2,-2,-2, 1, 1, 1, 1],
[ 0, 1, 0,-1, 0, 1,-1,-1, 1],
[ 0,-2, 0, 2, 0, 1,-1,-1, 1],
[ 0, 0, 1, 0,-1, 1, 1,-1,-1],
[ 0, 0,-2, 0, 2, 1, 1,-1,-1],
[ 0, 1,-1, 1,-1, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 1,-1, 1,-1],
], dtype=float)
Minv = np.linalg.inv(M)
def d2q9_equilibrium(rho, ux, uy):
eq = np.zeros((9,) + rho.shape)
for i in range(9):
cu = cx[i] * ux + cy[i] * uy
eq[i] = w[i] * rho * (1 + 3*cu + 4.5*cu**2 - 1.5*(ux**2 + uy**2))
return eq
def relaxation_rates(nu):
s_nu = 1.0 / (3*nu + 0.5) # la tasa que fija la viscosidad
# conservados (rho,jx,jy)=0, modos de alto orden fijos en la banda estable
return np.array([0, 1.64, 1.54, 0, 1.7, 0, 1.7, s_nu, s_nu])
def taylor_green_init(N, U0):
x = np.arange(N)
X, Y = np.meshgrid(x, x, indexing='ij')
k = 2*np.pi / N
ux = -U0 * np.cos(k*X) * np.sin(k*Y)
uy = U0 * np.sin(k*X) * np.cos(k*Y)
rho = 1 - 0.75 * U0**2 * (np.cos(2*k*X) + np.cos(2*k*Y))
return d2q9_equilibrium(rho, ux, uy), k
def macros(f):
rho = f.sum(axis=0)
ux = (cx[:, None, None] * f).sum(axis=0) / rho
uy = (cy[:, None, None] * f).sum(axis=0) / rho
return rho, ux, uy
def mrt_collide(f, s):
rho, ux, uy = macros(f)
jx, jy = rho*ux, rho*uy
m = np.tensordot(M, f, axes=([1], [0])) # al espacio de momentos
meq = np.zeros_like(m)
meq[0] = rho
meq[1] = -2*rho + 3*(jx**2 + jy**2)
meq[2] = rho - 3*(jx**2 + jy**2)
meq[3], meq[4] = jx, -jx
meq[5], meq[6] = jy, -jy
meq[7] = jx**2 - jy**2
meq[8] = jx*jy
m -= s[:, None, None] * (m - meq) # relajacion por momento
return np.tensordot(Minv, m, axes=([1], [0])) # de vuelta al espacio de velocidades
def stream(f):
for i in range(9):
f[i] = np.roll(f[i], (cx[i], cy[i]), axis=(0, 1))
return f
def run_mrt_lbm(N=64, nu=0.004, U0=0.04, steps=2000):
f, k = taylor_green_init(N, U0)
s = relaxation_rates(nu)
e0 = None
for t in range(steps):
f = mrt_collide(f, s)
f = stream(f)
if t % 400 == 0:
_, ux, uy = macros(f)
E = np.mean(ux**2 + uy**2)
e0 = E if e0 is None else e0
print(f"t={t:5d} KE/KE0={E/e0:.4f} analytic={np.exp(-4*nu*k**2*t):.4f}")
run_mrt_lbm()El valor analítico que el print pone al lado de la energía cinética es . Los valores por defecto son , , , así que . En el exponente vale cerca de y el factor cerca de 0.940. En queda cerca de y el factor cerca de 0.781. Con range(2000) el último impreso es 1600. Coincidir a dos decimales es comparar ese factor con la energía cinética numérica. BGK en el mismo retículo y la misma diverge antes, a una viscosidad más baja.
BGK y MRT lado a lado al mismo Re#
El control de viscosidad frena el decaimiento. El botón BGK/MRT decide si el retículo aguanta con esa misma .
Al bajar la viscosidad hasta cerca de y dejar BGK, un patrón rugoso invade el retículo y aparece "diverged". Al pasar a MRT con la misma viscosidad y reiniciar, el vórtice decae con suavidad. Con , . BGK empuja también los modos altos a ese número. Los , y del listado se quedan al lado.
Dejar los modos fantasma cuando s_ν se acerca a 2#
MRT solo separa la perilla de la viscosidad de las perillas de estabilidad y . Copiar de a todos los modos es BGK. Dejar , y mientras solo sube es MRT. El costo extra son dos productos por celda.
Sin esa separación, un Taylor–Green de baja viscosidad muere en tablero. Otro camino para frenar la misma escapada es un teorema H dentro de la colisión. La comprobación del decaimiento sigue siendo la línea .
Relacionados
Comparte si te resultó útil.