icoFoamPrincipianteFlujo IncompresibleAmbas·OpenFOAM 14 / v2606~25 minutos

Cavidad con Tapa Móvil (Lid-Driven Cavity) con icoFoam

El tutorial canónico de validación hidrodinámica: flujo laminar incompresible 2D en un recinto cuadrado cerrado con tapa móvil a velocidad constante.

Qué aprenderás y validarás en este caso:

  • Configurar condiciones de contorno tipo movingWall y no-slip en paredes fijas.
  • Definir esquemas de discretización espacial y temporal en fvSchemes.
  • Comprender el criterio de convergencia del algoritmo PISO en fvSolution.
  • Visualizar líneas de corriente y vórtices secundarios en ParaView.
  • Extraer datos sobre líneas con Plot Over Line y validar con datos experimentales.
Visualización de resultados CFD para Cavidad con Tapa Móvil (Lid-Driven Cavity) con icoFoam

Estructura del caso OpenFOAM

Estructura del caso: icoFoam
cavity/
├── 0/
│   ├── p
│   └── U
├── constant/
│   └── transportProperties
├── system/
│   ├── blockMeshDict
│   ├── controlDict
│   ├── fvSchemes
│   └── fvSolution
├── Allrun
├── Allclean
└── plot_ghia_validation.py

Guía de ejecución paso a paso

1

Definición de la geometría y malla estructurada

Generamos una malla cuadrada de 0.1 m x 0.1 m con 20x20 celdas uniformes en el plano X-Y y 1 celda de espesor en Z con parches tipo "empty".

system/blockMeshDict(text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } scale 0.1; vertices ( (0 0 0) (1 0 0) (1 1 0) (0 1 0) (0 0 1) (1 0 1) (1 1 1) (0 1 1) ); blocks ( hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1) ); edges (); boundary ( movingWall { type patch; faces ( (3 7 6 2) ); } fixedWalls { type wall; faces ( (0 4 7 3) (2 6 5 1) (1 5 4 0) ); } frontAndBack { type empty; faces ( (0 3 2 1) (4 5 6 7) ); } );
Nota técnica: Las caras con tipo "empty" indican a OpenFOAM que el caso es estrictamente bidimensional (2D), resolviendo únicamente en los ejes X e Y.
2

Condiciones iniciales y de contorno de velocidad y presión

Asignamos una velocidad tangencial de 1 m/s en la pared superior (movingWall) y condición no-slip (0 m/s) en el resto. Para la presión cinemática, usamos zeroGradient en todas las paredes.

0/U(text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
FoamFile { version 2.0; format ascii; class volVectorField; object U; } dimensions [0 1 -1 0 0 0 0]; internalField uniform (0 0 0); boundaryField { movingWall { type fixedValue; value uniform (1 0 0); } fixedWalls { type noSlip; } frontAndBack { type empty; } }
Nota técnica: En OpenFOAM 14 y v2606, la condición "noSlip" es un atajo nativo equivalente a fixedValue uniform (0 0 0).
3

Propiedades físicas del fluido (viscosidad cinemática)

Fijamos la viscosidad cinemática nu = 0.001 m²/s en constant/transportProperties para obtener un número de Reynolds Re = (U * L) / nu = (1 * 0.1) / 0.001 = 100.

constant/transportProperties(text)
1
2
3
4
5
6
7
8
9
10
FoamFile { version 2.0; format ascii; class dictionary; object transportProperties; } transportModel Newtonian; nu 0.001; // Re = (1 m/s * 0.1 m) / 0.001 m^2/s = 100
Nota técnica: Al modificar nu a 0.0001 m²/s, el caso pasará automáticamente a Re = 1000 con vórtices secundarios más intensos.
4

Discretización numérica y algoritmo PISO

Configuramos esquemas lineales de segundo orden y el solver de Poisson de presión en fvSchemes y fvSolution.

system/fvSolution(text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FoamFile { version 2.0; format ascii; class dictionary; object fvSolution; } solvers { p { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0; } U { solver smoothSolver; smoother GaussSeidel; tolerance 1e-05; relTol 0; } } PISO { nCorrectors 2; nNonOrthogonalCorrectors 0; pRefCell 0; pRefValue 0; }
Nota técnica: Dado que todas las fronteras tienen gradiente nulo de presión, se fija pRefCell y pRefValue para anclar el nivel de referencia de presión.
5

Control temporal, ejecución y postprocesado cuantitativo

Fijamos deltaT = 0.005 s para un tiempo final de 0.5 s, ejecutamos el mallado y el solver, y extraemos perfiles para comparar contra Ghia (1982).

system/controlDict(text)
1
2
3
4
5
6
7
8
9
10
11
12
application icoFoam; startFrom startTime; startTime 0; stopAt endTime; endTime 0.5; deltaT 0.005; writeControl timeStep; writeInterval 20; purgeWrite 0; writeFormat ascii; writePrecision 6; runTimeModifiable true;
Nota técnica: Ejecuta en tu terminal: ```bash chmod +x Allrun ./Allrun ```

Diccionarios y Archivos Completos del Caso

Explorador de Archivos Completos del Caso

Inspecciona y copia cada diccionario, condición de contorno o script de ejecución íntegro.

Archivos del Caso (10)
cavidad-lid-driven-icofoam/0/U
25 líneas
0/U(text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FoamFile { version 2.0; format ascii; class volVectorField; object U; } dimensions [0 1 -1 0 0 0 0]; internalField uniform (0 0 0); boundaryField { movingWall { type fixedValue; value uniform (1 0 0); } fixedWalls { type noSlip; } frontAndBack { type empty; } }
Sintaxis nativa verificada para OpenFOAM 12 y v2412UTF-8 · Formato ASCII

Validación Cuantitativa vs Datos Experimentales / Canónicos

Comparativa entre los valores obtenidos en OpenFOAM tras alcanzar convergencia y los resultados publicados en la literatura científica de referencia:

Parámetro / MétricaDato Experimental / ReferenciaResultado OpenFOAMDesviación Relativa
Centro del vórtice primario (X)0.61720.6185< 0.3%
Centro del vórtice primario (Y)0.73440.7380< 0.5%
Velocidad mínima Ux (x=0.5)-0.2140 m/s-0.2118 m/s< 1.1%

Guía de Análisis y Postprocesado en ParaView

### Guía de Postprocesado en ParaView: 1. Abre el caso ejecutando `paraFoam` o creando un archivo `cavity.foam` con `touch cavity.foam` y abriéndolo con ParaView. 2. Haz clic en **Apply** en el panel *Properties*. 3. En la barra superior, cambia la variable visualizada de `p` a **`U`** con representación **Surface**. 4. Para visualizar la estructura del vórtice: - Ve a **Filters > Alphabetical > Stream Tracer**. - En *Seed Type*, selecciona **Line Source** y fija la línea desde $(0.05, 0, 0.005)$ hasta $(0.05, 0.1, 0.005)$. - Haz clic en **Apply** para ver las líneas de corriente cerradas del vórtice principal. 5. Para extraer el perfil de velocidad cuantitativo: - Selecciona el objeto principal en el *Pipeline Browser*. - Aplica el filtro **Filters > Data Analysis > Plot Over Line**. - Fija *Point 1* en $(0.05, 0, 0.005)$ y *Point 2* en $(0.05, 0.1, 0.005)$. - En el gráfico, desmarca todo excepto `U_X` para comparar contra los datos de Ghia et al.

Problemas frecuentes y resolución de errores

⚠️ El solver lanza FOAM FATAL ERROR al inicio de la ejecución
Causa probable: Las dimensiones en el archivo 0/p no coinciden con las esperadas para flujo incompresible.
Solución: Verifica que 0/p tenga dimensions [0 2 -2 0 0 0 0]; (presión cinemática P/rho en m²/s²).

Variaciones sugeridas del ejercicio

  • Aumentar el número de Reynolds variando la viscosidad cinemática nu en constant/transportProperties a 0.0001 (Re = 1000).
  • Refinar la malla a 40x40 y 80x80 celdas para estudiar la independencia de malla.

Referencias bibliográficas y de validación

  • Ghia, U., Ghia, K. N., & Shin, C. T. (1982). High-Re solutions for incompressible flow using the Navier-Stokes equations and a multigrid method. Journal of Computational Physics, 48(3), 387-411.