Skip to content
cfd-lab:~/es/posts/2026-05-25-lbm-equilibri…● online

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

NOTE #052DAY MON CFD기법DATE 2026.05.25UPDATED 2026.10.19READ 7 min read#CFD#LBM#Lattice-Boltzmann#Kinetic-Theory#Hermite-Polynomial

Maxwell–Boltzmann en nueve flechas — por qué el equilibrio del LBM es un polinomio

El sesgo hacia el este del código queda en velocidad 0.0891, Mach cerca de 0.154. El polinomio de orden dos solo tiene que aguantar hasta una velocidad de malla próxima a 0.173.

El gas de red murió en 1986. La ocupación era cero o uno, y el ruido no se iba con el promedio. En 1992 esos enteros pasaron a una distribución real fif_i. El ruido desapareció. La pregunta se quedó. Cómo nueve números reales sustituyen a un Maxwell–Boltzmann de dimensión infinita.

Al mover la deriva uu y el orden de truncamiento NN, la curva sólida de Maxwell–Boltzmann se apoya en el polinomio discontinuo o se separa de él.

Maxwell–Boltzmann과 그 Hermite 절단의 비교. 표의 세 모멘트(밀도·운동량·에너지)가 같아지는 차수가 바로 LBM이 멈추는 자리다.
N=2면 ρ·ρu·에너지 세 모멘트가 정확히 일치한다. u가 |u|/c_s ≈ 1을 넘어가면 절단오차가 폭주하며 격자가 깨진다 — LBM이 저속(낮은 마하수)에 묶이는 이유.

Con N=2N=2 y u=0.4u=0.4, densidad, cantidad de movimiento y energía quedan superpuestas. Pasado u=1u=1, solo la curva discontinua se despega. El techo de Mach ∣u∣/cs≲0.3|\mathbf{u}|/c_s \lesssim 0.3 no es ese despegue. Los números se parten más adelante.

De enteros a reales — el LGCA murió en 1986 y nació el LBM#

El LGCA (Lattice Gas Cellular Automaton) era una malla cuadrada, seis direcciones, una regla de colisión. El promedio macroscópico volvía como Navier–Stokes. Las partículas booleanas (cero o uno) agrandaban el ruido estadístico. Alargar el promedio temporal mata el ruido y, con él, el transitorio que se quería ver.

McNamara y Zanetti colocaron una distribución real fi(x,t)f_i(\mathbf{x}, t) en cada nodo. fif_i es el recuento esperado de partículas en la posición x\mathbf{x} y el instante tt que se mueven a lo largo de ci\mathbf{c}_i. Un paso se parte en dos. Colisión, luego streaming.

fi(x+ciΔt,t+Δt)=fi(x,t)−fi(x,t)−fieq(ρ,u)τf_i(\mathbf{x} + \mathbf{c}_i \Delta t, t + \Delta t) = f_i(\mathbf{x}, t) - \frac{f_i(\mathbf{x}, t) - f_i^{eq}(\rho, \mathbf{u})}{\tau}

τ\tau es el tiempo de relajación (relaxation time). fieqf_i^{eq} es la distribución de equilibrio. La colisión recorta la parte de no equilibrio a escala τ\tau, y el streaming desplaza esa distribución una celda. Nueve números alcanzan solo por la forma de fieqf_i^{eq}.

Maxwell–Boltzmann carga una bomba de tiempo#

En la teoría cinética continua el equilibrio es Maxwell–Boltzmann.

fMB(c)=ρ (2πRT)−D/2exp⁡ ⁣(−(c−u)22RT)f^{MB}(\mathbf{c}) = \rho \, (2\pi R T)^{-D/2} \exp\!\left( -\frac{(\mathbf{c} - \mathbf{u})^2}{2 R T} \right)

c\mathbf{c} es la velocidad molecular, u\mathbf{u} la velocidad macroscópica, DD la dimensión, TT la temperatura, RR la constante de los gases. La bomba es que c\mathbf{c} es continua. Dejar solo nueve o diecinueve direcciones exige adelgazar esta distribución.

Sustituir la integral gaussiana por una suma de rectángulos falla. Los momentos que pide Navier–Stokes — ρ\rho, ρu\rho\mathbf{u}, el tensor de cantidad de movimiento ρuu\rho\mathbf{u}\mathbf{u}, la energía — no coinciden con la suma reticular. Rota la conservación y el LBM se detiene ahí.

El camino que queda es un desarrollo. Se expande Maxwell–Boltzmann en polinomios ortogonales y se conservan solo los momentos necesarios. Esos polinomios son los de Hermite.

Los polinomios de Hermite cortan la distribución a tajadas#

Los polinomios probabilísticos de Hermite (probabilist Hermite polynomial) Hen(c)He_n(c) son ortogonales bajo el peso gaussiano estándar w(c)=(2π)−1/2e−c2/2w(c)=(2\pi)^{-1/2}e^{-c^2/2}.

∫Hen(c) Hem(c) w(c) dc=n! δnm\int He_n(c)\, He_m(c)\, w(c)\, dc = n!\, \delta_{nm}

Los primeros son He0=1He_0=1, He1=cHe_1=c, He2=c2−1He_2=c^2-1, He3=c3−3cHe_3=c^3-3c. Con el equilibrio unidimensional en isotermo, es decir RT=1RT=1, la función generatriz da lo siguiente.

fMB(c)=w(c) ρexp⁡ ⁣(uc−u22)=w(c) ρ∑n=0∞unn!Hen(c)f^{MB}(c) = w(c)\, \rho \exp\!\left( u c - \frac{u^2}{2} \right) = w(c)\, \rho \sum_{n=0}^{\infty} \frac{u^n}{n!} He_n(c)

n=0n=0 es una gaussiana en reposo. n=1n=1 es una deriva pequeña. n=2n=2 corrige la energía cinética media. Los nn más altos son colas asimétricas. El LBM corta la suma en un orden finito.

En ese desarrollo isotermo RT=1RT=1, así que la velocidad térmica vale 1. La uu de la figura ya está dividida por esa velocidad. El techo escrito como 0.3 es ∣u∣|u| en esta escala. u=0.4u=0.4 queda 0.1 por encima del techo, y los tres primeros momentos con N=2N=2 siguen coincidiendo. El despegue en ∣u∣>1|u|>1 ya pasó Mach 1. El 0.3 y el 1 no son el mismo fallo.

El término n=3n=3 es (u3/6) He3(c)(u^3/6)\,He_3(c), con He3=c3−3cHe_3=c^3-3c. El coeficiente solo vale 0.33/6=0.027/6=0.00450.3^3/6=0.027/6=0.0045 en u=0.3u=0.3. En u=0.4u=0.4 vale 0.43/6=0.064/6≈0.01070.4^3/6=0.064/6\approx 0.0107, cerca de 2.37 veces el valor del techo. En u=1u=1 vale 1/6≈0.16671/6\approx 0.1667, cerca de 37 veces 0.0045. Esa razón es 13/0.33=1/0.0271^3/0.3^3=1/0.027. N=2N=2 tira el término entero. Así, densidad, cantidad de movimiento y energía pueden coincidir en u=0.4u=0.4 mientras el cúbico descartado ya supera el doble de su tamaño en el techo. El despegue en u=1u=1 es donde ese coeficiente ha subido hasta cerca de 0.17. El techo de Mach en 0.3 no es el punto en que la curva se separa a simple vista. Es una línea trazada de antemano, en el instante en que el coeficiente cúbico pasa de 0.0045.

Qué compra el truncamiento de segundo orden#

Navier–Stokes viscoso de primer orden necesita tres capas. ρ\rho, ρu\rho\mathbf{u} y el flujo de cantidad de movimiento Παβ=ρuαuβ+pδαβ\Pi_{\alpha\beta}=\rho u_\alpha u_\beta+p\delta_{\alpha\beta}. Como ρuu\rho\mathbf{u}\mathbf{u} es u2u^2, la distribución tiene que cargar un término en u2u^2.

La serie se corta en N=2N=2.

feq(c)=w(c) ρ[1+uc+u22(c2−1)]f^{eq}(c) = w(c)\, \rho \left[ 1 + uc + \frac{u^2}{2}(c^2 - 1) \right]

Esa es la forma continua del equilibrio. N=3N=3 y más alimentan el flujo de calor. El LBM isotermo estándar no los conserva. Los términos descartados dejan a la vez la hipótesis isoterma y el techo de Mach 0.3. Al devolver el cúbico, la hipótesis isoterma se rompe primero. El flujo de calor es el trozo que carga ese término, así que un código detenido en segundo orden no puede tomar un problema donde la temperatura fluye y seguir con este polinomio. El techo de Mach y la hipótesis isoterma son dos caras de un mismo corte. Aunque la velocidad se mantenga bajo 0.173, una pared caliente y una pared fría en la misma malla no reciben transporte de calor de este equilibrio.

Cómo se construyó D2Q9#

Pasar la integral ∫feq(c) ϕ(c) dc\int f^{eq}(c)\,\phi(c)\,dc a la suma reticular ∑iwifieqϕ(ci)\sum_i w_i f_i^{eq}\phi(\mathbf{c}_i) pide una cuadratura. Igualar hasta orden NN significa integrar con exactitud los polinomios de ese orden.

En dos dimensiones, la exactitud hasta u2u^2 exige polinomios de quinto orden exactos bajo el peso gaussiano. El tensor de cantidad de movimiento produce un término c2×u2c^2\times u^2. La cuadratura de Gauss–Hermite de tres puntos hace esa integral.

Los nodos unidimensionales son c∈{−3,0,+3}c\in\{-\sqrt{3},0,+\sqrt{3}\}, con pesos {1/6,2/3,1/6}\{1/6,2/3,1/6\}. Por qué esas tres raíces caen ahí lo cuenta la cuadratura de Hermite que plegó un momento de sexto orden sobre nueve velocidades. El producto tensorial bidimensional es 3×3=93\times 3=9. Eso es D2Q9. En unidades de malla cs=1/3c_s=1/\sqrt{3}, y las velocidades caen en coordenadas enteras (0,0),(±1,0),(0,±1),(±1,±1)(0,0),(\pm 1,0),(0,\pm 1),(\pm 1,\pm 1). Los pesos wiw_i son los de Gauss–Hermite con el factor gaussiano absorbido.

Índiceci\mathbf{c}_iwiw_i
0(0,0)(0, 0)4/94/9
1–4(±1,0),(0,±1)(\pm 1, 0), (0, \pm 1)1/91/9
5–8(±1,±1)(\pm 1, \pm 1)1/361/36

El equilibrio sobre la malla es la forma continua con cs2=1/3c_s^2=1/3 sustituido.

fieq=wi ρ[1+3(ci⋅u)+92(ci⋅u)2−32 u⋅u]f_i^{eq} = w_i\, \rho \left[ 1 + 3 (\mathbf{c}_i \cdot \mathbf{u}) + \frac{9}{2}(\mathbf{c}_i \cdot \mathbf{u})^2 - \frac{3}{2}\, \mathbf{u} \cdot \mathbf{u} \right]

1/cs2=31/c_s^2=3, 1/(2cs4)=9/21/(2c_s^4)=9/2, 1/(2cs2)=3/21/(2c_s^2)=3/2. El 3, el 9/29/2 y el 3/23/2 del polinomio son esos tres números. Con u=0\mathbf{u}=0 el corchete vale 1 y fieq=wiρf_i^{eq}=w_i\rho. Los pesos suman 4/9+4⋅(1/9)+4⋅(1/36)=14/9+4\cdot(1/9)+4\cdot(1/36)=1. Cuatro novenos de una masa en reposo quedan en la dirección 0. Los tres pesos de la tabla son productos del conjunto unidimensional {1/6, 2/3, 1/6}\{1/6,\ 2/3,\ 1/6\}. El reposo es (2/3)×(2/3)=4/9(2/3)\times(2/3)=4/9. Una dirección de eje es (2/3)×(1/6)=1/9(2/3)\times(1/6)=1/9. Una diagonal es (1/6)×(1/6)=1/36(1/6)\times(1/6)=1/36. Cuatro ejes y cuatro diagonales cierran otra vez la suma, 4/9+4⋅(1/9)+4⋅(1/36)=14/9+4\cdot(1/9)+4\cdot(1/36)=1. El nueve y los tres denominadores salen del mismo producto tensorial.

Esa línea es el equilibrio de un código LBM isotermo. Un polinomio, con los tres primeros momentos de Maxwell–Boltzmann encerrados dentro.

Python — un paso de colisión BGK#

Un paso de colisión, un nodo.

import numpy as np
 
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])
 
def equilibrium(rho, ux, uy):
    """Equilibrio D2Q9 — nueve polinomios"""
    ciu = cx * ux + cy * uy            # producto escalar
    usq = ux * ux + uy * uy
    return w * rho * (1 + 3 * ciu + 4.5 * ciu**2 - 1.5 * usq)
 
def bgk_collision(f, tau):
    rho = f.sum()
    ux  = (cx * f).sum() / rho
    uy  = (cy * f).sum() / rho
    feq = equilibrium(rho, ux, uy)
    return f - (f - feq) / tau, rho, ux, uy
 
# distribución inicial fuera de equilibrio
f = w * 1.0
f[1] += 0.05; f[3] -= 0.04          # ligero sesgo hacia el este
 
for step in range(20):
    f, rho, ux, uy = bgk_collision(f, tau=0.8)
    err = np.linalg.norm(f - equilibrium(rho, ux, uy))
    print(f"step {step:2d}: rho={rho:.4f}, u=({ux:+.4f},{uy:+.4f}), ||delta||={err:.2e}")
D2Q9 격자 위에서 9개 분포 함수가 BGK 충돌을 통해 평형으로 끌려가는 과정. 노란 화살표는 거시 속도 u, 가는 화살표는 각 격자 방향 c_i의 분포 크기.
τ→0.5에 가까울수록 한 스텝에 평형으로 끌려가지만, 점성 ν = c_s²(τ−1/2)도 작아져 안정성이 흔들린다.

El estado inicial parte de f=wf=w, suma 0.05 a f1f_1 y resta 0.04 de f3f_3. La masa es 1+0.05−0.04=1.011+0.05-0.04=1.01. La cantidad de movimiento en xx es 1⋅0.05+(−1)⋅(−0.04)=0.091\cdot 0.05+(-1)\cdot(-0.04)=0.09. Así ux=0.09/1.01≈0.0891u_x=0.09/1.01\approx 0.0891 y uy=0u_y=0. Al dividir por cs=1/3c_s=1/\sqrt{3} el Mach queda cerca de 0.154. La velocidad de malla del techo 0.3 es 0.3/3≈0.1730.3/\sqrt{3}\approx 0.173, y 0.0891 queda por debajo. El residuo que la corrida lleva bajo 10−610^{-6} en unos veinte pasos es el acercamiento al equilibrio sobre el par conservado (1.01, 0.0891)(1.01,\ 0.0891). Cada colisión conserva solo ρ\rho y ρu\rho\mathbf{u}.

Al bajar τ\tau hacia 0.55 el residuo desaparece en uno o dos pasos. La viscosidad es ν=cs2(τ−1/2)\nu=c_s^2(\tau-1/2). Con el τ=0.8\tau=0.8 del código, ν=(1/3)⋅0.3=0.1\nu=(1/3)\cdot 0.3=0.1. Con τ=0.55\tau=0.55, ν=(1/3)⋅0.05=1/60≈0.0167\nu=(1/3)\cdot 0.05=1/60\approx 0.0167, un sexto del valor del código. Si τ\tau llega a 1/21/2, la viscosidad se anula y la malla se vuelve inestable. Al subir τ\tau, la viscosidad crece y el arrastre hacia el equilibrio se vuelve lento. Un paso multiplica la parte de no equilibrio por 1−1/τ1-1/\tau. Con el τ=0.8\tau=0.8 del código, 1/τ=1.251/\tau=1.25, así que el factor es −0.25-0.25. El signo se invierte. Eso es sobrerrelajación. Veinte factores de 0.250.25 dan 0.2520≈9.1×10−130.25^{20}\approx 9.1\times 10^{-13}. Una desviación de orden 1 ya queda muy por debajo de 10−610^{-6} a los veinte pasos. Tomar veinte pasos como marca de 10−610^{-6} es holgado con este factor solo. Con τ=1\tau=1 el factor es 0 y el estado cae en el equilibrio en un paso. El 0.8 del código está un puesto al lado de ese equilibrio de un solo paso.

Pasado Mach 0.3, este polinomio no se sostiene#

N=2N=2 ajusta ρ\rho, ρu\rho\mathbf{u} y el flujo de cantidad de movimiento. Lo que está por encima se descartó. Cuando la velocidad de malla pasa de unos 0.173, los términos descartados dejan de ser pequeños. Bajar τ\tau para que la viscosidad caiga de 0.10.1 a 1/601/60 no cambia el polinomio de equilibrio. Cruzar el techo con la velocidad y bajar solo la viscosidad son fallos distintos.

Si una viscosidad ajustada en un marco en reposo sobrevive a un desplazamiento de ese marco no tiene respuesta en esta expresión. El término cúbico descartado guarda esa respuesta. Si el tercer momento ausente cambia la viscosidad al mover el marco sigue fuera de este polinomio.

Comparte si te resultó útil.