Skip to content
cfd-lab:~/es/posts/2026-03-27-simpleFoam-pr…● online

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

NOTE #012DAY FRI CFD기법DATE 2026.03.27UPDATED 2026.10.19READ 4 min read#CFD-Practice#QA#OpenFOAM#SIMPLE#Convergence

[CFD Q&A] Cuando el residual de presión de simpleFoam no converge

Subir la relajación porque el residual de velocidad se ve bien es como la corrección de presión pasó de 8 a 20 iteraciones internas.

simpleFoam se llevó media jornada la semana pasada. El residual de presión no bajaba de 1e-3. Subía. La malla fue el primer sospechoso. El mando que importaba era el factor de relajación.

Al empujar el control de αp por encima de 0.6, la curva del residual de presión se dobla otra vez hacia arriba cerca de la iteración 30.

αp를 0.7 이상으로 올리면 30 iter 부근에서 잔차가 다시 튀어오른다 — simpleFoam이 발산하는 전형 패턴. 0.3 / 0.7 이 안정 기본값.

Cerca de 0.3, la misma curva sigue bajando hasta la iteración 200. Time=80 del registro de abajo, residual inicial 0.891, cae en ese mismo tramo.

Situación del problema#

OpenFOAM v2312. Canal rectangular 2D, de inlet a outlet. Modelo de turbulencia, k-ε estándar. Solver, simpleFoam estacionario.

El residual bajó durante las primeras 20 a 30 iteraciones. Después saltó solo la presión.

Time = 50
 
smoothSolver:  Solving for Ux, Initial residual = 0.0023, Final residual = 1.2e-5, No Iterations 3
smoothSolver:  Solving for Uy, Initial residual = 0.0019, Final residual = 9.8e-6, No Iterations 3
GAMG:  Solving for p, Initial residual = 0.412, Final residual = 0.038, No Iterations 8
time step continuity errors : sum local = 4.2e-5, global = 1.1e-5, cumulative = 3.4e-4
...
Time = 80
 
GAMG:  Solving for p, Initial residual = 0.891, Final residual = 0.21, No Iterations 20

La velocidad se asentó. La presión no. Esa es la cara de un acoplamiento presión-velocidad que se balancea.

Proceso de análisis de causa raíz#

Paso 1: Verificación de la calidad de la malla#

Lo primero fue checkMesh.

checkMesh -case .

No-ortogonalidad máxima de 32 grados, skewness máxima de 0.8. Números demasiado quietos para culpar a la malla.

Paso 2: Revisión de las condiciones de contorno#

La presión en inlet quedó en zeroGradient y la de outlet en fixedValue 0. Pareja habitual en un canal. Hasta ahí no había fallo.

El campo inicial de p todavía guardaba un valor grande cerca de la entrada. Restos de una prueba con funkySetFields que se daba por borrada.

Paso 3: Verificación de fvSolution#

// fvSolution (configuración original)
relaxationFactors
{
    fields
    {
        p               0.7;
    }
    equations
    {
        U               0.9;
        k               0.7;
        epsilon         0.7;
    }
}

U=0.9 es un ajuste rápido. Sube la relajación de la velocidad y el residual parece más ágil. Si la actualización de presión no sigue, el bucle se balancea.

Se apilaron dos causas. La relajación estaba alta. Quedaba basura en el p inicial. Cómo la corrección de presión queda atada al campo de velocidad está escrito en SIMPLE cuando la presión se pone a cuadros.

Solución#

Reducción de los factores de relajación#

// fvSolution (después de la modificación)
relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        k               0.5;
        epsilon         0.5;
    }
}

La primera corrida arranca baja. Los factores suben solo después de que el residual se haya sentado.

Inicialización del campo p#

# Inicializar limpiamente el archivo p en el directorio 0
cp 0.orig/p 0/p

Abrir 0/p y dejar internalField uniform 0; hace el mismo trabajo.

// 0/p
dimensions      [0 2 -2 0 0 0 0];
internalField   uniform 0;
 
boundaryField
{
    inlet
    {
        type            zeroGradient;
    }
    outlet
    {
        type            fixedValue;
        value           uniform 0;
    }
    walls
    {
        type            zeroGradient;
    }
}

Verificación#

El mismo caso, corrido de nuevo, cambia el registro a esto.

Time = 50
 
smoothSolver:  Solving for Ux, Initial residual = 0.0018, Final residual = 8.3e-6, No Iterations 3
GAMG:  Solving for p, Initial residual = 0.089, Final residual = 0.0041, No Iterations 5
time step continuity errors : sum local = 2.1e-6, global = 4.3e-7, cumulative = 8.9e-6
 
Time = 200
 
GAMG:  Solving for p, Initial residual = 3.2e-4, Final residual = 1.1e-5, No Iterations 3

Cerca de la iteración 200 el residual de presión había bajado a un nivel de 1e-4. Las iteraciones internas volvieron a un dígito.

Las razones que deja el registro#

Antes del arreglo, en Time=50, Ux bajó de 0.0023 a 1.2e-5 en tres iteraciones internas, unas 192 veces. Uy pasó de 0.0019 a 9.8e-6, unas 194 veces. La presión solo fue de 0.412 a 0.038, unas 11 veces en ocho iteraciones. La velocidad cayó cerca de 200 veces. La presión alcanzó unas 11.

Time=80 queda treinta pasos después. El residual inicial de presión subió de 0.412 a 0.891, unas 2.2 veces. Las iteraciones internas crecieron de 8 a 20, un factor de 2.5. El corte, 0.891 dividido entre 0.21, se encogió a unas 4.2. Más iteraciones, menos descenso.

Después del arreglo, en Time=50 la presión baja de 0.089 a 0.0041, unas 22 veces en cinco iteraciones. Time=200 va de 3.2e-4 a 1.1e-5, unas 29 veces en tres. La continuity acumulada pasó de 3.4e-4 a 8.9e-6, unas 38 veces más chica. p en 0.3 es cerca del 43% del antiguo 0.7. U pasó de 0.9 a 0.7, y k y epsilon de 0.7 a 0.5. Recortar la corrección de presión por debajo de la mitad bajó el conteo interno de 20 a un dígito.

El residual final de Time=200, 1.1e-5, se pone al lado del final viejo de Time=80, 0.21. Dividir 0.21 entre 1.1e-5 da cerca de 19100. Mismo canal, misma malla. Solo cambiaron la relajación de presión y el campo inicial. Esa razón es el número que conviene leer antes de regenerar una malla.

El valor que se baja antes de abrir la malla#

Una no-ortogonalidad de 32 grados y una skewness de 0.8 no son motivo para reconstruir la malla primero. El valor que se baja es la relajación de p. En 0.7 la corrección de presión no seguía a la velocidad en 0.9. La primera corrida usa p 0.3 y U 0.7. Los factores suben solo después de que el residual de Time=200 se siente cerca de 1e-4.

El resto de funkySetFields en el p inicial arruinó la misma corrida. Si no se vacía con internalField uniform 0, una relajación más baja sigue arrastrando un gradiente basura desde la entrada. Bajar la relajación no garantiza la misma física. El caso Rhie–Chow en el que un solo cambio de relajación movió la solución convergida sirve para ver si el paso de 0.7 a 0.3 se queda en la curva del residual o se cuela en el campo final.

Comparte si te resultó útil.