Resolución de problemas

Guía de diagnóstico: Cómo solucionar FOAM FATAL ERROR y Floating Point Exception

Metodología sistemática para interpretar trazas de error, resolver excepciones de punto flotante, divergencia en la ecuación de presión y celdas no-ortogonales.

I

Ing. Carlos Mendoza

Especialista en CFD Industrial

Publicado: 28 de enero de 202512 min de lectura

Guía Exhaustiva de Diagnóstico y Depuración en OpenFOAM

Uno de los mayores desafíos al comenzar con OpenFOAM es enfrentarse a las trazas de error en la terminal. Cuando el código se interrumpe abruptamente con un volcado de pila (stack trace), la información parece críptica a primera vista:

text
1
2
3
4
5
6
#0 Foam::error::printStack(Foam::Ostream&) #1 Foam::sigFpe::sigFpeHandler(int) #2 /lib/x86_64-linux-gnu/libc.so.6(+0x42520) #3 Foam::divide(Foam::Field<double>&, Foam::UList<double> const&, Foam::UList<double> const&) ... Floating point exception (core dumped)

A continuación, analizamos las causas raíz de los 5 errores más frecuentes en la industria y la receta exacta para solucionarlos.


1. Floating Point Exception (FPE / SigFpe)

¿Qué significa?

La CPU ha intentado ejecutar una operación matemática indeterminada:

  • División por cero: Típicamente al calcular densidades nulas, volúmenes de celda degenerados o escalas turbulentas sin límite inferior.
  • Logaritmo o raíz cuadrada de número negativo: Típicamente en leyes de pared o modelos de gas ideal si la temperatura o entalpía caen a valores bajo cero absolutos.
  • Desbordamiento (overflow)*: Valores que superan el límite de precisión de doble coma flotante ($10^{308}$).

Solución paso a paso:

  1. Verificar el número de Courant ($Co$):

En solvers transitorios como pimpleFoam o interFoam, si el paso de tiempo $\Delta t$ es demasiado grande, las ondas de velocidad desestabilizan el acoplamiento presión-velocidad.

  • Acción: En system/controlDict, activa adjustTimeStep yes; y fija maxCo 0.8; (o maxAlphaCo 0.5; en multifase).
  1. Sub-relajación excesivamente agresiva en `simpleFoam`:

Si los residuales divergen en las primeras 50 iteraciones, reduce los factores de relajación en system/fvSolution:

text
1
2
3
4
5
6
7
8
9
10
11
12
13
relaxationFactors { fields { p 0.2; // Reducir de 0.3 a 0.2 } equations { U 0.5; // Reducir de 0.7 a 0.5 k 0.5; omega 0.5; } }
  1. Comprobar la calidad de malla:

Ejecuta checkMesh -allTopology -allGeometry. Si encuentras celdas con volumen negativo o no-ortogonalidad $> 80^\circ$, la discretización del gradiente generará vectores de flujo no físicos.


2. FOAM FATAL IO ERROR: Cannot find file "..."

¿Qué significa?

El solver no encuentra un archivo de campo, propiedad o diccionario requerido en la jerarquía del caso.

Causas más habituales:

  • Olvidar inicializar la malla: Si no has ejecutado blockMesh o snappyHexMesh, la carpeta constant/polyMesh/ estará vacía.
  • Diferencia de nombres entre ramas: Por ejemplo, en OpenFOAM Foundation se utiliza constant/turbulenceProperties mientras que en ciertas versiones antiguas de OpenCFD se empleaba constant/momentumTransport.
  • Campos de turbulencia faltantes: Si cambias el modelo en turbulenceProperties de laminar a kOmegaSST, el solver fallará al buscar 0/k, 0/omega y 0/nut.

3. Advertencia: "bounding k, lower limit 1e-15..."

¿Qué significa?

Los valores de la energía cinética turbulenta $k$ se han vuelto negativos en ciertas celdas durante la resolución de la ecuación de transporte y el solver los ha forzado al límite inferior para evitar el colapso numérico.

Solución:

En system/fvSchemes, asegúrate de que todos los términos convectivos de turbulencia estén protegidos por el prefijo bounded:

text
1
2
3
4
5
6
7
8
divSchemes { default none; div(phi,U) bounded Gauss linearUpwind grad(U); div(phi,k) bounded Gauss upwind; div(phi,omega) bounded Gauss upwind; div(phi,epsilon) bounded Gauss upwind; }

4. Divergencia en el Solver Lineal de Presión (GAMG / PCG)

Síntomas:

El solver reporta un número creciente de iteraciones (hasta alcanzar el maxIter 1000) y los residuales de presión crecen exponencialmente:

text
1
GAMG: Solving for p, Initial residual = 0.9842, Final residual = 0.9120, No Iterations 1000

Solución:

  1. Añade correctores no ortogonales en system/fvSolution:
text
1
2
3
4
SIMPLE { nNonOrthogonalCorrectors 2; }
  1. Cambia el esquema del Laplaciano en system/fvSchemes a una formulación con corrección limitada:
text
1
2
3
4
laplacianSchemes { default Gauss linear limited corrected 0.5; }

5. Script automatizado para diagnóstico rápido

Puedes añadir este pequeño script diagnostico.sh a la raíz de tu caso:

bash
1
2
3
4
5
6
7
8
9
#!/bin/bash echo "=== 1. VERIFICANDO MALLA ===" checkMesh | grep -E "(Mesh OK|FAILED|Non-orthogonality|Skewness)" echo "=== 2. VERIFICANDO CONDICIONES EN 0/ ===" ls -la 0/ echo "=== 3. COMPROBANDO SINTAXIS DE fvSchemes ===" foamDictionary system/fvSchemes -entry divSchemes