Sunteți pe pagina 1din 168

ESCOLA TCNICA SUPERIOR DENGINYERIES INDUSTRIAL I

AERONUTICA DE TERRASSA

PROYECTO FINAL DE CARRERA

ESTUDIO DE FENMENOS DE TRANSFERENCIA


DE CALOR Y DINMICA DE FLUIDOS MEDIANTE
LOS MTODOS DE LATTICE BOLTZMANN Y
VOLMENES FINITOS

AUTOR: TIGRAN SARGSYAN


DIRECTOR: FRANCESC XAVIER TRIAS MIQUEL, ASENSI OLIVA
LLENA
INGENIERA AERONUTICA
CURSO 2011-2012

Resumen
El trabajo se divide en tres partes fundamentales. En la primera parte (captulo 1)
se tratan las ecuaciones que rigen la dinmica de fluidos, que son las de NavierStokes. Se presentan las adimensionalizaciones de las ecuaciones de Navier-Stokes
para problemas de conveccin natural y conveccin forzada, identificando en cada
caso los grupos adimensionales que rigen el problema. La segunda parte (captulo 2
y 3) trata sobre los mtodos numricos LBM (Lattice Boltzmann Method) y FVM
(Finite Volume Method). En cada caso se presentan el fundamento terico sobre el
que se basa y tambin su implementacin a nivel esquemtico. Por ltimo, en la
tercera parte (captulo 4) se presenta la aplicacin prctica (numrica) de LBM y
FVM en problemas de referencia (los cuales sirven para validar nuevas herramientas
de simulacin). Se discuten los resultados obtenidos de ambos mtodos y se comparan
entre ellos. En los ltimos captulos se presentan las conclusiones (captulo 5), el
impacto medioambiental (captulo 6), el presupuesto (captulo 7) y tambin diferentes
temas que son importantes pero han quedado fuera de alcance de este proyecto
(captulo 8). En los anexos se presentan los cdigos fuentes de los programas.

ndice general
0.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

0.2. Justificacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

0.3. Alcance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1. Las ecuaciones de Navier Stokes

1.1. Ecuaciones integrales de conservacin . . . . . . . . . . . . . . . . . .

1.2. Forma diferencial de las ecuaciones de conservacin . . . . . . . . . .

15

1.2.1. Conveccin forzada . . . . . . . . . . . . . . . . . . . . . . . .

19

1.2.2. Conveccin natural . . . . . . . . . . . . . . . . . . . . . . . .

21

2. Lattice Boltzmann Method (LBM)

24

2.1. La Ecuacin Continua de Boltzmann . . . . . . . . . . . . . . . . . .

24

2.2. Modelos de LBM . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.2.1. Single Relaxation Time (SRT)

. . . . . . . . . . . . . . . . .

35

2.2.2. Multiple Relaxation Time (MRT) . . . . . . . . . . . . . . . .

44

2.3. Aspectos de implementacin . . . . . . . . . . . . . . . . . . . . . . .

46

2.3.1. Tratamiento de las condiciones de contorno . . . . . . . . . .

51

2.3.2. Evaluacin de fuerzas . . . . . . . . . . . . . . . . . . . . . .

58

2.3.3. Adimensionalizacin . . . . . . . . . . . . . . . . . . . . . . .

59

2.3.4. Aspectos de implementacin paralela . . . . . . . . . . . . . .

59

3. Finite Volume Method (FVM)

61

4. Casos prcticos

78

4.1. Lid Driven Cavity . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

4.2. Differentially Heated Cavity . . . . . . . . . . . . . . . . . . . . . . .

88

5. Conclusiones

99
1

6. Impacto medioambiental

100

7. Presupuesto

101

8. Futuros estudios

102

A. Cdigo fuente de LBM

106

B. Cdigo fuente de FVM

133

C. Cdigo fuente de Driven Cavity

144

D. Cdigo fuente de Differentially Heated Cavity

153

ndice de figuras
1.1. Hiptesis del medio continuo

. . . . . . . . . . . . . . . . . . . . . .

1.2. Sistema aislado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.3. Sistema cerrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

1.4. Sistema abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.5. Flujos de masa para un volumen de control 2D . . . . . . . . . . . .

16

1.6. Flujos de momento lineal en la direccin x para un volumen de control


2D y las tensiones

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

2.1. Espacio de fases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

2.2. Modelo D2Q9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.3. Ejemplo de discretizacin D2Q9 . . . . . . . . . . . . . . . . . . . . .

47

2.4. Mtodo push de propagacin . . . . . . . . . . . . . . . . . . . . . .

48

2.5. Mtodo pull de propagacin . . . . . . . . . . . . . . . . . . . . . . .

48

2.6. Mtodo de propagacin utilizando una nica matriz . . . . . . . . . .

49

2.7. El estado postpropagacin . . . . . . . . . . . . . . . . . . . . . . . .

49

2.8. Ejemplo de un contorno horizontal . . . . . . . . . . . . . . . . . . .

52

2.9. Ejemplo de un contorno esquina . . . . . . . . . . . . . . . . . . . . .

54

3.1. Proyeccin del trmino convectivo/difusivo mediante el gradiente de


presiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

3.2. Ejemplo de una malla rectangular uniforme . . . . . . . . . . . . . .

65

3.3. Ejemplo de una malla rectangular no uniforme . . . . . . . . . . . .

66

3.4. Definicin de la malla . . . . . . . . . . . . . . . . . . . . . . . . . .

66

3.5. Ejemplo de colocacin de las variables . . . . . . . . . . . . . . . . .

67

3.6. Funcin de proyeccin . . . . . . . . . . . . . . . . . . . . . . . . . .

69

3.7. Definicin del volumen de control para evaluar la ecuacin de continuidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


3

69

3.8. Solver Gauss-Sheidel . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

3.9. Solver Conjugate Gradient . . . . . . . . . . . . . . . . . . . . . . . .

71

3.10. Definicin del volumen de control para evaluar la componente x de la


ecuacin de momentum . . . . . . . . . . . . . . . . . . . . . . . . .

72

3.11. Definicin del volumen de control para evaluar la componente y de la


ecuacin de momentum . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.12. Algoritmo de clculo para conveccin forzada . . . . . . . . . . . . .

75

3.13. Algoritmo de clculo para conveccin natural . . . . . . . . . . . . .

76

4.1. Driven Cavity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

4.2. Tiempo de computacin total, norma L2 del error relativo de la componente horizontal y vertical de la velocidad en funcin del error de
solver y error en estacionario para N = 40 y Re = 100 . . . . . . . .

81

4.3. Frecuencia de relajacin adimensional para Re = 100 y Re = 1000 . .

82

4.4. Tiempo de computacin total, norma L2 del error relativo de la componente horizontal y vertical de la velocidad en funcin de la frecuencia
de relajacin adimensional para N = 40, Re = 100 con est = 103 y
est = 106 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

4.5. Comparacin de LBM y FVM para diferentes tamaos de discretizacin 85


4.6. Comparacin de LBM y FVM para diferentes tamaos de discretizacin 86
4.7. Comparacin de LBM y FVM para diferentes tamaos de discretizacin 86
4.8. Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para
diferentes tamaos de discretizacin

. . . . . . . . . . . . . . . . . .

87

4.9. Heated Cavity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88

4.10. Frecuencia de relajacin adimensional para Ra =

103 ,

Ra =

104 ,

Ra =

105 y Ra = 106 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

4.11. Perfiles de velocidad horizontal y vertical para diferentes nmeros de


Rayleigh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

4.12. Perfil de temperatura para diferentes nmeros de Rayleigh . . . . . .

91

4.13. Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para el contorno de la velocidad horizontal para diferentes nmeros de
Rayleigh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

4.14. Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para


el contorno de la velocidad vertical para diferentes nmeros de Rayleigh 97

4.15. Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para


la funcin de corriente para diferentes nmeros de Rayleigh . . . . .

98

ndice de tablas
2.1. Cuadratura de Hermite de orden 3 . . . . . . . . . . . . . . . . . . .

37

2.2. Velocidades discretas D2Q9 . . . . . . . . . . . . . . . . . . . . . . .

38

2.3. Magnitudes caractersticas en unidades lattice . . . . . . . . . . . . .

59

4.1. Combinaciones del error del solver y del error estacionario para Re =
100 y N = 40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

4.2. Efecto de variacin de la frecuencia de relajacin adimensional y del


error estacionario para Re = 100 y N = 40 . . . . . . . . . . . . . . .

82

4.3. Comparacin de LBM y FVM para diferentes tamaos de discretizacin 84


4.4. Comparacin de LBM y FVM para Ra = 103 . . . . . . . . . . . . .

93

4.5. Comparacin de LBM y FVM para Ra =

. . . . . . . . . . . . .

94

4.6. Comparacin de LBM y FVM para Ra = 105 . . . . . . . . . . . . .

95

4.7. Comparacin de LBM y FVM para Ra =

96

104
106

. . . . . . . . . . . . .

0.1.

Objetivo

El objetivo de este trabajo es investigar, implementar y comparar mediante casos


de referencia, dos mtodos de simulacin de dinmica de fluidos: Finite Volume
Method (FVM) y Lattice Boltzmann Method (LBM).

0.2.

Justificacin

En la actualidad, las simulaciones de dinmica de fluidos son imprescindibles en


muchas industrias. Por ejemplo, en la industria aeronutica se utilizan las herramientas de simulacin de dinmica de fluidos para determinar los coeficientes de fuerzas y
momentos de los modelos de diseo de las aeronaves con el fin de hacer que stas sean
ms eficientes enrgicamente. En la industria de las energas renovables se utilizan
para disear los labes de las elicas y hacer que stos sean eficientes. En la industria
automotora se utilizan para hacer que los coches tengan coeficientes de resistencia
pequeos y, por tanto, consuman menos combustible.
La herramientas de simulacin pueden estar basadas en diferentes mtodos. El
ms extendido en el mbito de la dinmica de fluidos es el mtodo de volmenes
finitos (FVM en siglas inglesas). Sin embargo, en el mbito cientfico hay investigaciones continuas con el fin de descubrir nuevos mtodos de simulacin o mejorar los
existentes.
El mtodo de volmenes finitos es relativamente antiguo comparado con el mtodo de Lattice Boltzmann (LBM en siglas inglesas). En los ltimos aos ha habido
mucho movimiento en la comunidad cientfica en el desarrollo terico del LBM.

0.3.

Alcance

Para abordar el trabajo:


se presentarn las ecuaciones de Navier Stokes y sus adimensionalizaciones para
problemas de conveccin natural y conveccin forzada;
se presentar la teora sobre la cual se basa LBM;
se presentar la teora sobre la cual se basa FVM;
se implementarn y se compararn LBM y FVM para el caso de Driven Cavity
para diferentes nmeros de Reynolds;
7

y se implementarn y se compararn LBM y FVM para el caso de Heated


Cavity para diferentes nmeros de Rayleigh.

Captulo 1

Las ecuaciones de Navier Stokes


1.1.

Ecuaciones integrales de conservacin

En primer lugar, se introduce un concepto muy importante llamado hiptesis


del medio continuo. La velocidad en un punto del espacio es indefinida en un medio
molecular, ya que sera cero en todo el tiempo excepto cuando una molcula ocupa
dicho punto, y entonces sera la velocidad de la molcula y no la velocidad media de la
vecindad de las molculas en el punto. Otro ejemplo es la densidad de un fluido. Por
definicin, la densidad es igual a un incremento de masa dividido por un incremento
del volumen. Si el volumen escogido es muy pequeo (de escala de molcula), la
densidad oscilar. Existe un volumen mnimo a partir del cual la propiedad deja
de oscilar y se vuelve continuo. Esta oscilacin de la densidad se representa en la
Figura (1.1). De manera similar se puede hablar de la presin. En un recipiente que

Figura 1.1: A partir de un cierto valor del volumen del elemento escogido, para evaluar la
densidad, la densidad deja de oscilar.

contiene gas en equilibrio, el fluido ejerce presin en las paredes del recipiente, lo
que a nivel microscpico equivale a la fuerza de choque de las molculas con la pared
del recipiente. La presin se define como la fuerza normal dividida por la superficie.
Si la superficie escogida es muy pequea, el nmero de molculas que chocan con la
pared del recipiente es pequeo y por tanto se contemplar el choque individual de
las molculas haciendo que la presin sea una magnitud oscilante. Sin embargo, si se
escoge una superficie mayor, la presin se vuelve ms continua ya que el nmero de
molculas que impactan en dicha superficie es elevada.
Por motivos explicados anteriormente, la estructura molecular se reemplaza por
un medio hipottico llamado medio continuo. Esto supone que existen diferenciales
de volumen que engloban una vecindad de molculas. El diferencial de volumen tiene
las siguientes caractersticas:
es lo suficientemente grande como para albergar un nmero enorme de molculas de forma que las fluctuaciones en las propiedades se anulen entre s;
es lo suficientemente pequeo como para que la propiedad pueda ser considerada local.
Sistema aislado
Un sistema aislado es tal que no interacciona con el exterior, lo que implica
que el momento lineal, el momento angular y la energa permanecen constantes a
lo largo del tiempo. Sea un volumen material en el espacio que tiene un volumen

Figura 1.2: Representacin de un sistema aislado en el instante de tiempo t y t + t.

Vm (t) y un contorno Sm (t). El material dentro del volumen puede estar dotado de
movimiento y, por tanto el volumen como el contorno pueden ir modificndose a lo
largo del tiempo. La propiedad que cumple dicho volumen material es que la masa
10

que contiene se mantiene constante. Las ecuaciones que describen el comportamiento


del volumen material son las siguientes:
Z
D
dV = 0 Conservacin de la masa
Dt Vm (t)
Z
D
udV = 0 Conservacin del momento lineal
Dt Vm (t)
Z
D
r udV = 0 Conservacin del momento lineal
Dt Vm (t)
Z
D
(u + ec ) dV = 0 Conservacin de la energa
Dt Vm (t)
Z
D
sdV = S gen 0 Segundo principio de la termodinmica
Dt Vm (t)
La notacin

D
Dt

(1.1a)
(1.1b)
(1.1c)
(1.1d)
(1.1e)

indica que se trata de una derivada material (sustancial) y por tanto

se evala en un sistema Langrangiano. El planteamiento Lagrangiano fija una cierta


cantidad de masa y observa qu pasa con dicho material (planteamiento de volumen
material). En la ecuacin de la conservacin de la energa, la energa especfica se
separa en energa interna especfica u y en energa cintica especfica ec en [J/kg].
El segundo principio de la termodinmica, efectivamente, no es una ecuacin de
conservacin. S gen es la entropa generada por unidad de tiempo, y conforme el
segundo principio de la termodinmica, dicha propiedad es positiva para un proceso
real y para un hipottico caso llamado proceso reversible, dicha magnitud vale cero.
Sistema cerrado
Un sistema cerrado es tal que no intercambia masa con el exterior pero s energa
mediante flujo de calor por radiacin, conduccin o bien, mediante la aplicacin de
una fuerza distribuida sobre el contorno o en el interior del mismo material. El volumen material puede interaccionar con el exterior mediante los siguientes mecanismos:
f (n) es el vector de tensiones, fuerza por unidad de superficie actuando en el
contorno del volumen material. Dicha fuerza depender del punto del contorno
y del vector normal al contorno n;
b es la fuerza interna msica, fuerza por unidad de volumen actuando dentro del
volumen material. En cada punto del volumen puede tener un valor diferente.
Un ejemplo de la fuerza interna es la de la gravedad que tendr un nico
componente (segn el criterio de seleccin del sistema de referencia).
11

Figura 1.3: Representacin de un sistema cerrado en el instante de tiempo t y sus medios de


interaccin.

q es el flujo de calor por radiacin o conduccin a travs del contorno del


volumen material.
Las ecuaciones de conservacin para un sistema cerrado son:
Z
D
dV = 0
(1.2a)
Dt Vm (t)
Z
Z
Z
D
bdV
(1.2b)
udV =
f (n) dS +
Dt Vm (t)
Vm (t)
Sm (t)
Z
Z
Z
D
r udV =
r f (n) dS +
rb
(1.2c)
Dt Vm (t)
Sm (t)
Vm (t)
Z
Z
Z
Z
D
u bdV
(u + ec ) dV =
q ndS +
u f (n) dS +
Dt Vm (t)
Vm (t)
Sm (t)
Sm (t)
(1.2d)
D
Dt

Z
sdV =

Vm (t)

Sm (t)

q n
dS + S gen 0
T

(1.2e)

En la ecuacin de energa, el primer trmino representa el flujo de energa debido


al flujo de calor por conduccin / radiacin. Cuando el producto escalar es positivo,
significa que el flujo sale del volumen de control y, por tanto, la energa del volumen
material disminuye y debe haber un signo negativo para indicar dicha disminucin.
El segundo trmino representa el trabajo por unidad de tiempo que se genera por el
hecho de tener una fuerza aplicada en un punto y que dicho punto tenga una cierta
velocidad. La potencia es positiva si la componente paralela de la fuerza sobre la
velocidad tiene el mismo sentido que la velocidad. El tercer trmino es la potencia
generada por las fuerzas msicas internas. Por ejemplo, en el caso de considerar la
fuerza de gravedad, cuando el volumen material cae, la fuerza de gravedad produce
una potencia positiva y por tanto la energa del volumen material va aumentando
12

con el tiempo. Si hay un intercambio de calor, habr tambin un intercambio de


entropa. No hay intercambio de entropa por trabajo de fuerzas externas. Con el
segundo principio de la termodinmica, el trmino de la entropa generada sigue
siendo positivo, es decir la entropa generada puede aumentar o, en el caso de proceso
reversible, mantenerse constante, pero nunca puede disminuir.
Sistema abierto
Todas las ecuaciones de mecnica y termodinmica deducidas anteriormente se
refieren a volumen material. Es necesario deducirlas para un sistema abierto donde
s que pueda haber intercambio de masa. Un volumen de control es una zona del
espacio arbitraria que tiene una frontera y un volumen que pueden ir modificndose
de manera deseada. A diferencia del volumen material, el volumen de control no est
asociado a ninguna masa de material fija, sino a una cierta zona del espacio. Dicho
planteamiento es Euleriano, es decir, se fija una zona del espacio y se observa que pasa
en dicha zona. Para poder continuar es necesario introducir el Teorema de Transporte

Figura 1.4: Representacin de un sistema abierto en el instante de tiempo t en la que se ve


cmo la materia atraviesa a travs de su frontera.

de Reynolds. Se considera un volumen material y un volumen de control que en un


instante genrico t coinciden. En un instante posterior t + t, el volumen material
se mueve e incluso cambia su volumen debido a que el fluido que contiene puede ser
compresible, mientras que el volumen de control tambin puede ir modificndose con
una velocidad ub (definida en todos los puntos del contorno del volumen de control).
Se define una magnitud extensiva ; es la misma magnitud por unidad de masa del
fluido (dicha magnitud puede ser masa, momento lineal, energa, etc.). La relacin

13

entre las dos magnitudes mencionadas anteriormente es la siguiente:


Z
=
dV

(1.3)

V (t)

La integral anterior se evala en el volumen de control en un cierto instante del


tiempo t. A continuacin se definen las siguientes magnitudes asociadas al volumen
material y al volumen control, siendo la nica diferencia entre ellas el instante y la
regin de integracin:
Z
m =

dV

(1.4a)

Vm (t)

+
m

Z
dV

(1.4b)

Vm (t+t)

Z
a =

dV

(1.4c)

Va (t)

+
a

Z
=

dV

(1.4d)

Vm (t+t)

En el instante inicial t, el volumen de control coincide con el volumen material


(m = a ). La variacin de la magnitud durante el t ser:
m = +
m m

(1.5a)

a = +
a a

(1.5b)

A continuacin se define s , la cantidad que abandona el volumen de control, y e ,


la cantidad que ingresa en el volumen de control durante el intrvalo t. Teniendo
estas definiciones en cuenta, se puede afirmar que:
+
+
m = a + s e

(1.6)

Restando de los dos lados de la Ecuacin (1.6) m y a y teniendo en cuenta que


m = a (dado que en el instante inicial el volumen de control coincide con el
volumen material), se obtiene:
m = a + s e

(1.7)

A continuacin se divide la ecuacin anterior por t y se evala el lmite cuando el


incremento del tiempo tiende a cero.
lm

t0

m
a
s e
= lm
+ lm
t0 t
t0
t
t
14

(1.8)

El primer trmino corresponde a la derivada Lagrangiana ya que la derivada se evala


en el volumen material. El segundo trmino representa la derivada Euleriana ya que
se evala en el volumen de control. El ltimo trmino es el flujo de la cantidad
a travs de la superficie del volumen de control. Se obtiene la siguiente ecuacin
integral 1 :
D
Dt

Z
dV =
Vm (t)

d
dt

Z
(u ub ) ndS

dV +
Va (t)

(1.9)

Sa (t)

A continuacin, particularizando la magnitud a 1, u, u + ec y s, se obtienen las


ecuaciones integrales de conservacin de masa, momento lineal, energa y el segundo
principio de la termodinmica para un sistema abierto, respectivamente.
Z
Z
d
(u ub ) ndS = 0
dV +
dt Va (t)
Sa (t)
d
dt

Z
u (u ub ) ndS =

udV +
Sa (t)

Va (t)

d
dt

Z
Va (t)

Sa (t)

Z
q ndS +

Sa (t)

(u + ec ) (u ub ) ndS =
Z
u f (n) dS +
u bdV

Sa (t)

(1.11)

Z
s (u ub ) ndS =

sdV +

(1.12)

Va (t)

Va (t)

bdV
Va (t)

Z
(u + ec ) dV +

1.2.

f (n) dS +
Sa (t)

d
dt

(1.10)

Sa (t)

Sm (t)

q n
dS + S gen
T

(1.13)

Forma diferencial de las ecuaciones de conservacin

A partir de las ecuaciones de conservacin en forma integral se puede pasar a


forma diferencial utilizando teoremas matemticos (teorema de divergencia, etc.).
Pero su deduccin resulta ser poco intuitiva, as que se har de una forma diferente
aunque partiendo de la formulacin integral. Las deducciones se harn para el caso
bidimensional aunque su extensin a tres dimensiones es inmediata.
1

La notacin

D
Dt

hace referencia a que la derivada se evala en un volumen material, y se llama

derivada material o sustancial (asociada a un volumen material), mientras que la notacin

d
dt

hace

referencia a que la derivada se evala en un volumen de control asociado a un sistema abierto, y


se llama derivada total (asociada a un volumen de control). Por ltimo, la notacin de derivada
parcial

indica que la derivada se evala sobre un volumen de control esttico.

15

Conservacin de la masa (continuidad)


Se escoge un volumen de control cuadrado esttico centrado en una cierta zona
del espacio tal y como se muestra en la Figura (1.5). A continuacin se aplica la

Figura 1.5: Representacin de un volumen de control diferencial bidimensional con los flujos
de masa.

ecuacin de conservacin de masa integral (1.10). Al ser el volumen de control esttico


ub = 0, la derivada total se convierte en derivada parcial. Por otro lado, al ser el
volumen de control diferencial, hacer la integral es lo mismo que evaluar su valor.
Se introducen los trminos de flujos en las caras de entrada (m
x )x y (m
y )y y se
aproximan linealmente los flujos en las caras de salida (m
x )x+dx = (m
x )x +
y (m
y )y+dy = (m
y )y +

m
y
y dy.

m
x
x dx

Por ltimo, teniendo en cuenta que m


x = udydz,

m
y = vdxdz y dV = dxdydz, se obtiene la ecuacin diferencial de conservacin de
masa.

(u) (v)
+
+
=0
(1.14)
t
x
y
siendo u y v las dos componentes de la velocidad en el sistema de referencia inercial.
Utilizando la notacin vectorial y extendiendo a un caso tridimensional, la expresin
anterior se convierte en:

+ (u) = 0
(1.15)
t
Si la densidad no es homognea en el espacio pero s constante en los mismos puntos,
entonces el trmino transitorio desaparecer, pero al ser no homogneo, aunque no
haya variacin en el valor de la densidad en los mismos puntos, s que puede haber una
variacin de la densidad en el espacio y por tanto no se puede sacar la densidad del
operador de divergencia. Si el campo fluido es incompresible, la densidad no variar
en funcin del tiempo y tampoco en el espacio, y por tanto la Ecuacin (1.15) se
convierte en:
u=0
16

(1.16)

Conservacin del momento lineal


Se parte de la ecuacin de conservacin del momento lineal (1.11) particularizada
para la direccin x. El trmino de fuerzas superficiales se puede representar como
f (n) = n , siendo el tensor de tensiones que se puede separar en una parte
isotrpica representando los esfuerzos normales pI (siendo I la matriz identidad y
p la presin hidrosttica) y en una parte anisotrpica, con traza nula, representando
los esfuerzos tangenciales o viscosos . De esta manera:
= pI +

(1.17)

Si el fluido es Newtoniano, existe una expresin para el tensor de esfuerzos tangenciales para un problema de dimensin D (2 en el caso bidimensional y 3 en el caso
tridimensional):


2
= u + (u)T ( u) I + v ( u) I
D

(1.18)

siendo la viscosidad dinmica (o el primer coeficiente de viscosidad), el segundo


coeficiente de viscosidad y v el coeficiente de viscosidad volumtrica definida como
v = + 23 . La divergencia del tensor de esfuerzos tangenciales ser:
= u +

D2
( u) + v ( u)
D

(1.19)

Segn la hiptesis de Stokes v = 0 y por tanto:


= u +

D2
( u)
D

(1.20)

Se observa que el segundo trmino de la izquierda se anula cuando el flujo es incompresible o bien cuando se trata de un problema bidimensional.
Una vez discutido el trmino de fuerzas superficiales se utiliza el mismo procedimiento de evaluacin de flujos (en este caso el flujo de momento lineal en la direccin
x representados en la Figura (1.6)), y se obtiene la ecuacin del momento lineal para
la direccin x.
p xx yx
(u) (uu) (uv)
+
+
=
+
+
+ bx
t
x
y
x
x
y

(1.21)

Utilizando la notacin vectorial y extendiendo a un caso tridimensional la expresin


anterior se convierte en:
(u)
+ (uu) = p + + b
t
17

(1.22)

Figura 1.6: Representacin de un volumen de control diferencial bidimensional con los flujos
de momento lineal en la direccin x, junto a las tensiones que se ejercen en las caras del
volumen de control.

Si la variacin de la viscosidad es pequea en el dominio del espacio, entonces combinando la Ecuacin (1.22) con (1.19), se obtiene:
D2
(u)
+ (uu) = p + u +
( u) + b
t
D

(1.23)

Por otro lado, si el campo fluido es incompresible, la Ecuacin (1.23) se convierte en:
u
1
+ (uu) = p + u + b
t

(1.24)

siendo la viscosidad cinemtica definida como = . Por ltimo, si se desprecia el


trmino de las fuerzas viscosas se obtiene la ecuacin de Euler:
(u)
+ (uu) = p + b
t

(1.25)

Conservacin de la energa
De manera anloga, se puede obtener la ecuacin de conservacin de energa
diferencial a partir de la forma integral.


qyC
qyR
qxC
qxR
u v
(u) (uu) (vu)
+
+
=

p
+
+
t
x
y
x y x y
x y
v
u
v
u
+xx
+ xy
+ yx
+ yy
(1.26)
x
x
y
y
siendo q C y q R los flujos de calor por conduccin y radiacin, respectivamente.
Suponiendo que se trata de un gas semiperfecto (du = cv dT ) e introduciendo la
C

q
definicin de la conductividad trmica k = T
con unidades de [W/(mK)] se

obtiene:
cv

T
+ cv u T = (kT ) q R p u + : u
t
18

(1.27)

Normalmente se desprecia el ltimo trmino de la derecha de la Ecuacin (1.27),


que representa la disipacin de energa debida a los efectos viscosos. Si el medio es
transparente a la radiacin, tambin se puede despreciar el trmino de transferencia
de calor por radiacin.

1.2.1.

Conveccin forzada

Se habla de conveccin forzada para referirse al mecanismo de transferencia de


energa y momentum producido por una fuerza externa (ventilador, bomba de succin, etc.). Dicho de otra forma, el movimiento del fluido en las condiciones de contorno vienen impuesto por una fuerza externa de velocidad o presin, y son las
responsables de la generacin del movimiento dentro del dominio del problema. Para
la formulacin matemtica se va a suponer que:
el medio es transparente a la radiacin;
la conductividad trmica es constante;
la viscosidad dinmica es constante;
la variacin de la densidad ref es suficientemente pequea como para que se
pueda considerar el flujo incompresible;
y que la nica fuerza fuerza volumtrica que acta es la gravitacional b = gey .
Teniendo todas las suposiciones anteriores en cuenta, las Ecuaciones (1.15), (1.22)
y (1.22) se convierten en:
u=0
ref

siendo a =

k
ref cp

u
+ ref (u ) u = p + u + ref g
t
T
+ (u ) T = aT
t

(1.28a)
(1.28b)
(1.28c)

la difusividad trmica [m2 /s], que es una relacin entra la capacidad

de conduccin y acumulacin del calor (por ejemplo si un material o fluido tiene una
difusividad trmica alta significa que transfiere el calor por conduccin rpidamente).
Con el fin de disminuir la cantidad de parmetros (densidad, viscosidad, etc.)
y por otro lado revelar la importancia de los diferentes trminos de las ecuaciones
que rigen el movimiento, se adimensionalizan las Ecuaciones (1.31). Para hacerlo se
19

definen las variables adimensionales: t =


problema,

u
U0 ,

t
t0 ,

siendo t0 un tiempo caracterstico del

siendo U0 una velocidad caracterstica del problema, r =

siendo L0 una longitud caracterstica del problema, p =


presiones caractersticas del problema y por ltimo

pp0
p1 p0 ,
T T0
T1 T0 ,

r
L0

siendo p0 y p1 dos
siendo T0 y T1 dos

temperaturas caractersticas del problema. Introduciendo las definiciones anteriores


en las Ecuaciones (1.31) se obtienen:
u = 0

(1.29a)

L0
p1 p0
gL0

+ (u ) u =
u 2 ey
p +
2

U0 t0 t
U0 L0 0
U0
U0

a
L0 T
+ (u ) T =
T
U0 t0 t
U0 L0
El trmino

L0
U0 t0

es el nmero de Strouhal St =

L0
U0 t0 ,

(1.29b)
(1.29c)

y es la relacin entre el tiempo

de residencia (el invertido por una partcula en recorrer la longitud caracterstica L0 ,


con la velocidad caracterstica U0 ) y el tiempo caracterstico (que podra ser, por
ejemplo, el periodo de oscilacin de la fuerza de sustentacin que opone un cilindro
dentro de un conducto). En los movimientos oscilatorios de alta frecuencia St  1, el
movimiento resulta ser isentrpico y con un balance entre la fuerza de inercia debida
a la aceleracin local y las fuerzas de presin. Los efectos viscosos quedan confinados
en la llamada capa de Stokes, muy delgada frente a la longitud caracterstica L0 . El
caso lmite opuesto St  1, es el tpico del movimiento alrededor de aviones, el cual
puede tratarse como casiestacionario, si se utilizan ejes ligados al avin.
El trmino

gL0
U02

es la inversa al cuadrado del nmero de Froude Fr =

U0
gL0

y es la

relacin entre la energa cintica y la gravitatoria. En el movimiento del aire alrededor


de aviones y automviles el nmero de Froude es Fr  1 y la fuerza gravitatoria es
despreciable, lo que no es el caso de la hidrodinmica de buques, en la que Fr es del
orden de la unidad.
El trmino

U0 L0 0

es la inversa del nmero de Reynolds Re =

U0 L0 0
,

que mide la

relacin entre las fuerzas de inercia convectivas y las viscosas. Sirve para caracterizar
los flujos laminares (Re pequeo) y turbulentos (Re grande).
El trmino

p1 p0
U02

es el nmero de Euler Eu =

p1 p0
,
U02

y representa la relacin entre

la energa de presin y la energa cintica. Normalmente se utiliza para caracterizar la


prdida de carga en las tuberas o en los conductos. Cuando la diferencia de presiones
est asociada a la presin de vapor, se habla del nmero de Cavitacin Ca =

20

p0 pv
.
U02

El trmino

a
U0 L0

es la inversa del nmero de Peclet Pe =

U0 L0
a

que, a su vez,

es el producto de los nmeros de Reynolds y Prandtl, Pe = Pr Re. El nmero de


Prandtl, Pr = a , es la relacin entre las difusividades viscosa y trmica. Si el nmero
de Prantdl es pequeo, el espesor de la capa lmite trmica es mayor que el de la
capa lmite de momentum.
Identificando los nmeros adimensionales en las Ecuaciones (1.29) se obtienen:
u = 0
St
St

u
t
T
t

(1.30a)

+ (u ) u = Eu p +
+ (u ) T =

1
T
Pe

1
1
u 2 ey
Re
Fr

(1.30b)
(1.30c)

Si el problema a tratar carece de un tiempo caracterstico, se puede eliminar el nmero


de Strouhal definiendo el tiempo caracterstico como t0 = L0 /U0 . De manera anloga,
si el problema carece de una diferencia de presiones caracterstico, se puede eliminar
el nmero de Euler adimensionalizando la presin mediante la expresin p0 = 0 U02 .
Si se eliminan los nmeros de Euler y Strouhal, se puede ver que los dos principales
parmetros en conveccin forzada son los nmeros de Reynolds y Peclet (o Prandtl).

1.2.2.

Conveccin natural

Se habla de conveccin natural para referirse al mecanismo de transferencia de


energa y momentum producido por la diferencia de densidad en el fluido que, a su
vez, es causada debido al gradiente de temperatura impuesto. El fluido recibe calor
y, debido a que aumenta su temperatura, la densidad baja y se eleva respecto a la
masa de fluido con densidad mayor. Al elevarse la masa, el fluido de mayor densidad
ocupa el lugar de la masa de fluido de menor densidad. De esta forma, se forma el
flujo de conveccin natural. La fuerza que hace posible esto es la fuerza de flotacin. Es normal pensar que, al haber una variacin en la densidad, se tendran que
utilizar las ecuaciones de Navier-Stokes compresibles. Sin embargo, esto complicara mucho la solucin numrica ya que la ecuaciones se vuelven ms complicadas y
adems se establece un acoplamiento entre la ecuacin de energa y la de momentum. Para facilitar la resolucin se introduce la aproximacin de Boussinesq. Si la
variacin de la densidad no es muy grande, se pueden utilizar las mismas ecuaciones
de Navier-Stokes incompresibles pero haciendo que la densidad que aparece junto al
trmino de las fuerzas volumtricas (gravitatorias) sea funcin de la temperatura.
21

Esta aproximacin puede introducir errores de orden del 1 % si la diferencia entre


la temperatura mxima y mnima (T1 T0 ) est por debajo de 2 C para agua y
por debajo de 15 C para el aire [18]. Para encontrar la expresin de la variacin
de la densidad en funcin de la temperatura se define el coeficiente de expansin
volumtrica a presin constante:
=

1
T

!
(1.31)
p=cte.

Suponiendo que las desviaciones de la densidad y de la temperatura respecto a los


valores de referencia son pequeas, se puede aproximar la Ecuacin (1.31) de la
siguiente manera:

1
0

T T0

(1.32)

= = 0 (1 (T T0 ))

Teniendo en cuenta la Ecuacin (1.32) y definiendo el tiempo y presin caractersticos


como t0 = L0 /U0 y p0 = 0 U02 , respectivamente, se obtienen las siguientes ecuaciones
adimensionales:
u = 0
u
t

(1.33a)

+ (u ) u = p +

gL0 (T T0 )
T ey
u +
U0 L0 0
U02

T
a
+ (u ) T =
T
t
U0 L0

(1.33b)
(1.33c)

La nica novedad en la ecuacin anterior es el ltimo trmino de la derecha de la


ecuacin de momentum. Se puede ver fcilmente que el trmino

gL0 (T T0 )
U02

es el

nmero de Grashof dividido por el cuadrado del nmero de Reynolds. El nmero


de Grashof, Gr =

gL30 (T1 T0 )
,
2

representa la relacin entre la fuerza de flotacin y

la fuerza producida por la viscosidad. Para acabar, el nmero de Rayleigh se define


como el producto del nmero de Grashof y el nmero de Prandtl Ra = Pr Gr.
Es evidente que en conveccin natural no habr una velocidad de referencia (caracterstico del problema) U0 y por este motivo se define la velocidad caracterstica
como U0 = a/L0 , teniendo unidades de velocidad. Teniendo esto en cuenta, el nmero de Reynolds desaparece de la ecuacin de momentum y el nmero de Peclet

22

tambin desparece de la ecuacin de energa. Se obtienen las siguientes ecuaciones:


u = 0

(1.34a)

+ (u ) u = p + Pr u + Ra PrT ey
t
T
+ (u ) T = T
t

(1.34b)
(1.34c)

Se puede ver que los dos principales parmetros en conveccin natural son los nmeros
de Prandtl y Rayleigh.

23

Captulo 2

Lattice Boltzmann Method (LBM)


2.1.

La Ecuacin Continua de Boltzmann

Se puede caracterizar el estado de una partcula en el espacio mediante su vector


posicin r y su vector momentum o velocidad .
A continuacin se introduce el espacio de fases , que se define como un espacio
6-dimensional que est formado por las coordenadas de vector posicin y vector
velocidad, es decir, (r,). Un punto en dicho espacio representa el estado de una
partcula en un cierto instante de tiempo. Por tanto, el estado del sistema fsico
formado por N partculas en un cierto instante de tiempo quedar caracterizado por
N puntos en el espacio de fases. Las partculas interaccionan entre ellas y, por tanto,
a medida que avanza el tiempo, los N puntos en el espacio de fases irn movindose.
La idea principal de Boltzmann era que, en general, no es imprescindible conocer
el movimiento de cada partcula en detalle. Ms bien, es ms til el concepto de la
funcin de distribucin f (r, , t). Dicha funcin se define de tal manera que la cantidad f (r, , t)d3 rd3 (siendo d3 r un volumen en el espacio fsico y d3 un volumen en
espacio de velocidades1 ) representa la cantidad de partculas existentes en el volumen
6-dimensional del espacio de fases d3 rd3 centrado en el punto (r,) en el instante
t. En la Figura (2.1) se representa esquemticamente un espacio 2-dimensional de
fases y un volumen en dicho espacio. Por tanto, la cantidad f (r, , t)d3 rd3 por definicin indica la cantidad de partculas que tienen su estado (posicin y velocidad)
comprendido en el volumen dibujado en la Figura (2.1).
El objetivo principal es encontrar la dinmica que rige la funcin de distribucin.
1

Si r = (x, y, z) entonces d3 r = dxdydz, mientras que si = (x y z ) entonces d3 = dx dy dz

24

Figura 2.1: Representacin del espacio de fases y un volumen de dicho espacio para un cierto
instante del tiempo. La grfica es ilustrativa y no representa la realidad ya que se tendra
que dibujar en un espacio 6-dimensional.

Evidentemente la funcin de distribucin cambia con el tiempo ya que las partculas


entran y salen de los volmenes en el espacio . Si se supone la ausencia de colisiones,
una molculas en instante t con coordenadas en el espacio (r,)t se mover a otro
punto en el espacio (r 0 , 0 )t+t en el instante t + t, siendo:
r 0 = r + t
0 = + F

t
m

(2.1a)
(2.1b)

siendo F las fuerzas externas que actan sobre la partcula y m su masa. El intervalo
t se define de tal manera que es mayor que el Tiempo de Colisin Medio (la mayora
de las colisiones duran t). Sin embargo, t debe ser ms pequeo que el Tiempo de
Recorrido Medio (el tiempo medio que tarda una partcula que acaba de tener una
colisin en colisionar con otra partcula).
Con la ausencia de colisiones se puede afirmar que la cantidad de partculas en el
volumen d3 rd3 en el instante t ser igual a la cantidad de partculas en el volumen
d3 r0 d3 0 para el instante t + t. Escrito dicha igualdad de forma matemtica resulta:


t
3 3
(2.2)
f (r, , t)d rd = f r + t, + F , t d3 r0 d3 0
m
En el caso de la presencia de colisiones, la cantidad:


t
3 3
f (r, , t)d rd f r + t, + F , t d3 r0 d3 0 = C
m

25

(2.3)

representa la cantidad de partculas que entran en el volumen d3 rd3 menos la cantidad de partculas que salen del volumen d3 rd3 causadas por las colisiones durante
h i
de
el intervalo de tiempo t. A continuacin, se define el trmino de colisin f
t
c

la siguiente manera:

f
t

(2.4)

d3 rd3 = C

Se puede relacionar el volumen d3 rd3 con el volumen d3 r0 d3 0 calculando el determinante de la matriz Jacobiana J de la transformacin:
d3 r0 d3 0 = |J|d3 rd3

(2.5)

Para calcular el determinante se supone que la fuerza exterior F puede ser funcin
del vector de posicin y del vector de velocidad microscpica. De esta manera la
matriz Jacobiana resulta ser:

0
(r 0 , 0 )
=
|J| =

F
t
(r, )
rxx m
Fy
t

rx m
Fz t
rx m

0
Fx
ry
Fy
ry
Fz
ry

1
Fx
rz
Fy
rz
Fz
rz

t
m
t
m
t
m

0
t
m
t
m
t
m

x t
+ F
x m
Fy t
x m
Fz t
x m

0
1

Fx t
y m
F t
+ yy m
Fz t
y m

Fx t
z m
Fy t
z m
z t
+ F
z m

(2.6)

Calculando el determinante de la matriz J y quedndose con los trminos de primer


orden en t se obtiene el siguiente resultado:
|J| = 1 +
En la Ecuacin (2.7), la expresin
Tambin se introduce la notacin

t
F + O t2

(2.7)

representa el gradiente respecto la velocidad.

r , que representa el gradiente respecto la posi-

cin2 .

t
A continuacin se expande el trmino f (r, , t)d3 rd3 = f r + t, + F m
,t
en series de Taylor hasta el primer orden en t:





t
f
t f
f
f r + t, + F , t = f (r, , t)+t
+F
+t
+O(t2 )
m
r (r,,t)
m (r,,t)
t (r,,t)
(2.8)
2
r

r =

, ,
x y z

,
x y

26

Introduciendo las Ecuaciones (2.4,2.5,2.7) dentro de la Ecuacin (2.3), dividiendo


por t y evaluando el lmite cuando t 0, se obtiene la conocida ecuacin de
Boltzmann:
 
f (r, , t)
1
f
+ r f (r, , t) + (F f (r, , t)) =
t
m
t c

(2.9)

En el caso en el que la fuerza externa F no sea funcin de la velocidad de las


partculas, como por ejemplo en el caso de la fuerza de gravitacin, la Ecuacin (2.9)
se simplifica obteniendo la siguiente ecuacin:

 

F
f

+ r +
f (r, , t) =
t
m
t c

(2.10)

Se trata de una ecuacin integrodiferencial donde el trmino de colisin, como se


ver ms adelante, es una ecuacin integral. Otra caracterstica importante es la
linealidad del trmino de conveccin que, a diferencia de las Ecuaciones de Navier
Stokes, es lineal.
En un intervalo de tiempo t pueden ocurrir colisiones entre las partculas originalmente en d3 rd3 , que arrojan molculas fuera del volumen. Pero tambin pueden
haber colisiones en los volmenes vecinos que pueden mandar partculas al interior
del d3 rd3 . De esta manera se separa el trmino de colisiones en dos contribuciones:
 +  
 
f
f
f

(2.11)
=
Q
t c
t c
t c
siendo

i+
f
t c

la parte correspondiente a la ganancia de partculas y

correspondiente a la prdida de partculas.

i+
f
t c

la parte

El hecho de que tenga lugar una colisin entre dos partculas significa que ambas
deben ocupar una cierta configuracin en el espacio simultneamente en el instante
de tiempo t. Por ejemplo, deben ocupar posiciones r 1 y r 1 , y deben tener velocidades 1 y 2 . Para que ocurra una colisin la distancia entre ambas debe ser menor
o igual al alcance del potencial de interaccin y las velocidades tambin deben tener
direcciones apropiadas. El nmero total de partculas con las caractersticas descritas anteriormente proviene de la funcin de distribucin binaria, f2 (r 1 , r 2 , 1 , 2 , t).
Para poder avanzar, se introduce lo que se llama la hiptesis del caos molecular o
Stosszahlansatz (hiptesis sobre el nmero de colisiones) [1, 2]. La hiptesis supone
que la presencia de ambas partculas, en las condiciones apropiadas para la colisin,
solamente depende de la posicin y que es el producto de dos eventos totalmente
27

independientes. Al suponer esto, se suprimen todas las correlaciones entre las molculas. En otras palabras, las molculas que intervienen en una colisin no han
colisionado nunca ni lo harn en el futuro. Escrita la hiptesis del caos molecular
matemticamente resulta:
f2 (r 1 , r 2 , 1 , 2 , t) = f (r, 1 , t)f (r, 2 , t)
En [3, 4, 5] se puede encontrar la deduccin del trmino de colisiones:
Z


f (r, 01 , t)f (r, 02 , t) f (r, 1 , t)f (r, 2 , t) ()r dd3 2
Q(f, f ) =

(2.12)

(2.13)

siendo 1 , 2 las velocidades de las partculas antes de la colisin, 01 , 02 las velocidades despus de la colisin, () la seccin eficaz de colisin, el ngulo slido y
r el mdulo de la velocidad relativa antes de la colisin. El hecho de escribir Q(f, f )
en vez de Q(f ) sirve para remarcar que el trmino de colisin no es lineal (segundo
grado de no linealidad).
Se supone que cuando se deja evolucionar infinitamente el sistema, ste alcanza
el estado de equilibrio caracterizado por la funcin de distribucin de equilibrio g
definida como un estado en el que el trmino de colisiones se anula. Esto significa que
la prdida de partculas es igual a la ganancia de partculas durante las colisiones,
y no significa precisamente que no haya colisiones. De esta manera, si Q(g, g) = 0
implica que:
g(r, 01 )g(r, 02 ) = g(r, 1 )g(r, 2 )

(2.14)

A continuacin se evala el logaritmo en ambos lados de la Ecuacin (2.14) y se


obtiene:
ln(g(r, 01 )) + ln(g(r, 02 )) = ln(g(r, 1 )) + ln(g(r, 2 ))

(2.15)

En [5], la funcin ln(g) que cumple la Ecuacin (2.15) recibe el nombre de invariante
respecto la suma y debe ser de la siguiente forma:
ln(g) = A + B + C ||2

(2.16)

siendo A y C constantes y B un vector de la misma dimensin que el vector de


velocidad. Para demostrar la condicin de suficiencia de la Ecuacin (2.16) para
cumplir la Ecuacin (2.15), nicamente hace falta tener en cuenta que el proceso
de colisin es elstico y por tanto, tanto el momentum como la energa cintica se
2 2
conservan ( 1 + 2 = 01 + 02 y | 1 |2 + | 2 |2 = 01 + 02 , donde se ha supuesto
28

que todas la partculas tienen la misma masa). Demostrar la condicin necesaria ya


no es tan trivial y se puede encontrar en [5].
A continuacin se definen , y de la siguiente manera: A = ln() ||2 ,
B = 2 y C = . Introduciendo las definiciones anteriores en la Ecuacin (2.16)
se obtiene la funcin de distribucin de equilibrio local:


g = exp | |2

(2.17)

Para determinar las constantes , y se aplicaran las leyes de conservacin, las


cuales sern introducidas ms adelante.
Segn el trabajo de Bhatnager, Gross & Krook (BGK) 1954 [7], el trmino de
colisin se interpreta como un proceso de relajacin hasta el estado de equilibrio
local g. Dicho de otra forma, la variacin de la funcin de distribucin f debida a la
colisin es proporcional a la diferencia del estado de equilibrio local y el estado actual
del sistema. El parmetro de proporcionalidad se introduce mediante el tiempo de
relajacin , que es una funcin compleja de la funcin de distribucin (tambin se
habla del tiempo de relajacin adimensional y de la frecuencia de relajacin adimensional =

y=

t
,

respectivamente). Por tanto, el trmino de colisin se escribe

como:

f
Q(f )
t


c

1
= (f g)

(2.18)

A continuacin se va a deducir una propiedad muy importante que debe cumplir


el trmino de colisin. Para ello se multiplica el trmino de colisin Q(f, f ) por
una funcin escalar arbitraria (r, , t) y se integra en todo el rango de velocidades
microscpicas, y tal y como se demuestra en [5], da el siguiente resultado:
Z
ZZ

Z
ZZ

(r, , t)Q(f, f )d =

1
d =
4
c

Z
ZZ

(2 +1 20 10 )

f
t

d3
c

(2.19)

De la anterior expresin se deduce que, en el caso de que la funcin arbitraria sea


una combinacin lineal de las invariantes de colisin, la Ecuacin (2.19) se anula:
2

Z
ZZ

(r, , t) = A + B + C || =

(r, , t)Q(f, f )d3 = 0

(2.20)

En el caso de suponer el tiempo de relajacin constante, el trmino de colisin


BGK Q(f ) de la Ecuacin (2.18) tambin debe cumplir la Ecuacin (2.20), con lo
29

cual:
(r, , t) = A + B + C ||2

Z
ZZ

)
=

BGK con = constante

Z
ZZ

gd =

f d3

(2.21)

La Ecuacin (2.21) indica que los momentos3 de la Ecuacin de Boltzmann se pueden


evaluar tanto respecto la funcin de distribucin f , como respecto la funcin de
distribucin de equilibrio g.
La funcin de distribucin es una variable primaria y a partir de ella se deben
calcular las propiedades macroscpicas, que son de ms utilidad. Una propiedad
macroscpica, en un punto del dominio fsico en un cierto instante de tiempo, se
define como el promedio en todo el rango de velocidades microscpicas de la funcin
de distribucin. Cabe mencionar que, una vez evaluado el momento de la funcin de
distribucin, el resultado obtenido deja de ser funcin de la velocidad microscpica.
A continuacin se definen las siguientes cantidades macroscpicas:
h i
kg
Densidad de masa m
3
Z
ZZ
(r, t) =

mf (r, , t)d3

(2.22)

Densidad de momentum

kg
m3

m
s

i
Z
ZZ

(r, t)u(r, t) =

mf (r, , t)d3

(2.23)

Densidad de energa total

kg
m3


m 2
s

1
(r, t)e(r, t) =
2

Z
ZZ

m ||2 f (r, , t)d3

(2.24)

La velocidad peculiar C = u, es la velocidad de la partcula medida por un


observador que se encuentra en una referencia que se mueve a la velocidad macroscpica. Teniendo la definicin anterior en cuenta, se demuestra que la densidad de
energa total se puede separar en la densidad de energa cintica macroscpica y la
3

La expresin general del momento de grado n en el caso de tener una nica variable x es
R
Mn = Axn f (x)dx siendo A una constante.

30

densidad de energa interna definida con la velocidad peculiar:


1
e =
2

Z
ZZ

1
m |C|2 f (r, , t)d3 + |u|2
2

(2.25)

En la deduccin anterior se ha utilizado el hecho de que:


Z
ZZ

m |C| f (r, , t)d3 = |u| |u| = 0

(2.26)

Tensor de presin
Z
ZZ

mCi Cj f (r, , t)d3

pij (r, t) =

(2.27)

El tensor de tensiones ij se define con el signo negativo del tensor de presin (ij =
pij ). La presin hidrosttica se define como un tercio de la traza del tensor de
presin, es decir:
1
1
p(r, t) = tr(p) =
3
3

Z
ZZ

m |C|2 f (r, , t)d3

(2.28)

El tensor de tensiones ij se puede dividir en una parte isotrpica (esfuerzos normales) pij , siendo p la presin hidrosttica, y en una parte anisotrpica (esfuerzos
tangenciales) con traza nula ij .
ij = pij + ij

(2.29)

Comparando la Ecuacin (2.28) con la Ecuacin (2.25) se observa que hay una relacin entre la presin hidrosttica y la densidad de energa interna:
2
p(r, t) = (r, t)(r, t)
3

(2.30)

A continuacin se utiliza la ecuacin de estado de gases ideales p = nkB T (siendo n


la cantidad de partculas por unidad de volumen y kB la constante de Boltzmann)
para obtener una expresin para la temperatura:
T (r, t) =

2m
(r, t)
3 kB

(2.31)

Tensor de segundo orden (second order momentum flux tensor)


Z
ZZ
ij =

mi j f (r, , t)d3

31

(2.32)

Utilizando la definicin del tensor de tensiones se demuestra que:


(2.33)

ij = ij + ui uj
Flujo de calor
1
qi (r, t) =
2

Z
ZZ

m |C|2 Ci f (r, , t)d3

(2.34)

A continuacin se va a deducir la Ecuacin de Transferencia, que permitir recuperar las leyes de conservacin de las propiedades macroscpicas. La multiplicacin
de la Ecuacin de Boltzmann (2.10) por una funcin escalar arbitraria (r, , t) y la
integracin de la ecuacin en todo el rango de las velocidades microscpicas, da el
siguiente resultado:
Z
ZZ

f
d3 +
t

Z
ZZ

Z
ZZ 

( r f ) d +

F
f
m

Z
ZZ

d =

d3

(2.35)

A continuacin se desarrollan los diferentes trminos de la Ecuacin (2.35) utilizando


la regla de la cadena:

Z
ZZ

Z
ZZ

f d =

Z
ZZ
r

f d3 =

Z
ZZ

Z
ZZ 

Z
ZZ

f 3
d
t

(2.36a)

( r f ) d3

(2.36b)

Z
ZZ

( r ) f d3 +

F
f d3 =
m

3
fd +
t
Z
ZZ

F
f d3 +
m

Z
ZZ 

F
f
m

d3

(2.36c)

Introduciendo las Ecuaciones (2.36) en la Ecuacin (2.35) queda de la siguiente


manera:

Z
ZZ

Z
ZZ

f d + r

Z
ZZ

+ ( r ) +
t

Z
ZZ

f d +

F

m



Z
ZZ

fd =

32

F
f d3
m


d3
c

(2.37)

Se aplica el teorema de divergencia4 al tercer trmino de la izquierda de la Ecuacin (2.37):

Z
ZZ

F
f d3 =
m

F
nf dS 0
m

(2.38)

En la Ecuacin (2.38) la integral se evala sobre el contorno del espacio de velocidades, siendo n y dS el vector normal unitario y el elemento de superficie de dicho
contorno, respectivamente. La integral tiene un valor aproximadamente nulo ya que
la funcin de distribucin decrece rpidamente para los valores grandes de la velocidad microscpica, que es precisamente lo que pasa en el contorno del espacio de
velocidades.
En [5] se demuestra que el trmino de colisiones de la Ecuacin (2.37) se puede
escribir de la siguiente manera:
Z
ZZ

1
d =
4
c
3

Z
ZZ
(2 + 1

20

10 )

f
t

(2.39)

d3
c

siendo 1 y 2 el valor de la funcin para las partculas antes de la colisin, y 10


y 20 el valor de la funcin despus de la colisin binaria.
A continuacin se definen las siguientes magnitudes:
=

RRR

f d3

P = P1 + P2

RRR
RRR
=
Cd3
S=

i
h
RRR

3
P1 =
t + ( r ) f d

h i

RRR
P2 = 41
(2 + 1 20 10 ) f
d3
t

F
m


f d3

(2.40)

Introduciendo las definiciones en la Ecuacin (2.37) se obtiene la Ecuacin de Transferencia:

+ r (u + ) = S + P
(2.41)
t
Escogiendo de forma apropiada la funcin se pueden obtener las leyes de con-

servacin macroscpicas:
4

El teorema de divergencia relaciona la integral de la divergencia de un campo vectorial sobre

un voumen con la integral sobre su frontera .


Z

Z
a=

(a n) dS

siendo n el vector normal a la frontera y dS un elemento diferencial de superficie en la frontera.

33

Conservacin de la masa: = m
Al particularizar = m, la cantidad representa la densidad. El trmino
se anula ya que = u u. El trmino fuente S tambin se anula ya que
el gradiente de una constante es 0. Por otro lado, los trminos de produccin
tambin son 0, ya que en P1 tanto la derivada respecto el tiempo como el
gradiente de una constante son 0 y, por ltimo, P2 es 0 ya que la masa es
un invariante de colisin. Teniendo todo lo dicho anteriormente en cuenta, se
obtiene la ecuacin de continuidad macroscpica:

+ r (u) = 0
t

(2.42)

Conservacin del momento lineal (componente i): = mi


Al particularizar = mi en la Ecuacin (2.41), la cantidad representa el
momento lineal ui , representa una parte del tensor de presiones pi definida

T
como pi1 pi2 pi3
, S representa el trmino de fuerzas externas Fi , P2
vale 0 ya que el momento lineal es un invariante de colisin y, por ltimo, P1
tambin vale 0.

(ui )
+ r (ui u + pi ) = Fi
t

(2.43)

Al tener en cuenta todos los componentes de la velocidad microscpica se obtiene una ecuacin vectorial.
(u)
+ r (uu) = r + F
t

(2.44)

Conservacin de la energa: = m||2 /2


De manera anloga a los dos casos anteriores, se obtiene la siguiente ecuacin
escalar:
 

 



1 2
1 2
+ |u|
+ r + |u| u + q + pu = F u
t
2
2

(2.45)

Ahora que se conoce como calcular las propiedades macroscpicas se procede a


determinar las constantes , y de la funcin de distribucin de equilibrio (2.17).
Para hacerlo se utiliza la propiedad (2.21), de manera que se evalan la densidad
de masa, la densidad de momentum y la densidad de energa interna utilizando la

34

funcin de distribucin de equilibrio.


Z

 D
2
d = m

(2.46a)

 D
2
d = m

(2.46b)



D
D
3
m ||2 exp | |2 dD = m 2 2 1
4

(2.46c)

m exp | |

m exp | |

u =

1
2

siendo D la dimensin del problema (2 en caso bidimensional y 3 en caso tridimen D


2
sional). Comparando las dos primeras ecuaciones resulta ser que = m
y
= u. Por ltimo, combinando la tercera ecuacin con la Ecuacin (2.31) se obtiene
=

1
2RT ,

donde se ha introducido la definicin de la constante del gas R =

kB
m.

Finalmente la Ecuacin de Distribuacin de Equilibrio local queda de la siguiente


manera:

g=

m (2RT )

2.2.

e
D/2

|u|2
2RT

(2.47)

Modelos de LBM

El Mtodo de Lattice Boltzmann (LBM) se fundamenta en la discretizacin del


espacio de velocidades de la Ecuacin continua de Boltzmann (2.10). Para poder
implementarlo es necesario tambin una discretizacin en el espacio y en el tiempo.
En esta seccin se van a discutir los dos principales mtodos de discretizacin del
espacio de velocidades (SRT y MRT). Se utilizar la notacin DDQq para designar
el modelo de discretizacin, siendo la segunda D el nmero de dimensiones y q la
cantidad de velocidades discretas.

2.2.1.

Single Relaxation Time (SRT)

El modelo con un nico parmetro de relajacin o SRT, se basa en la utilizacin de


la Ecuacin de Boltzmann (2.10) con el trmino de colisin BGK (2.18), y suponiendo
5

Para resolver las integrales es de utilidad hacer el cambio de variable x = y utiliq


R x
R x

,
zar los siguientes resultados para las integrales impropias:
e
dx =
xe
dx = 0 y

2 x

x e

dx =

1
2

.
3

35

que el tiempo de relajacin es constante. Las deducciones que se hacen en este


apartado para construir los diferentes modelos se basan en el trabajo de Li-Shi Luo
expuesto en [8], quien es el primero en obtener las ecuaciones del LBM a partir de
la Ecuacin continua de Boltzmann.
En este apartado se va a deducir el modelo D2Q9, el cual es el ms utilizado para
el caso bidimensional. Para el caso tridimensional se utiliza con mucha frecuencia el
modelo D3Q19.
Se parte de la ecuacin continua de Boltzmann (2.10), sin trmino de fuerzas
externas y utilizando el trmino de colisin BGK (2.18), y se transforma en una
ecuacin diferencial ordinaria (EDO) utilizando la derivada a lo largo de la lnea
caracterstica :

d
dt

+ .
1
1
df
+ f= g
dt

(2.48)

Seguidamente, se integra la Ecuacin (2.48) entre 0 y t. Se queda con los trminos


de hasta el orden 1 en t y de esta manera se obtiene la ecuacin de evolucin de la
funcin de distribucin en tiempo discreto.

1
f (r + t, , t + t) f (r, , t) = (f (r, , t) g(r, , t)) + O t2

(2.49)

Para evaluar g es necesario calcular las propiedades macroscpicas evaluando


los momentos de la funcin de distribucin , u y e de forma exacta utilizando
mtodos de cuadratura. Para ello se desarrolla en series de Taylor6 la Funcin de
Distribucin de Equilibrio (2.47), y se queda con los trminos de hasta orden 2 de
|u|.
f (eq) =

m (2RT )D/2

||2
2RT

u
( u)2
|u|2
1+
+

RT
2 (RT )2 2RT

)
(2.50)

La aproximacin anterior limita el nmero de Mach y hace imposible realizar simulaciones con nmeros de Mach altos.
De esta forma, el objetivo de la discretizacin del espacio de velocidades es poder
6

Teniendo en cuenta que | u|2 = ||2 + |u|2 2 u

36

evaluar fcilmente y de manera exacta los momentos de la funcin de distribucin:


(r, t) =

q1
X

W f (eq) (r, , t) =

=0
q1
X

(r, t) u (r, t) =

(r, t) e (r, t) =

f(eq) (r, t)

(2.51a)

=0

W f (eq) (r, , t) =

=0
q1
X

q1
X

q1
X

f(eq) (r, t) (2.51b)

=0

| u|2 W f (eq) (r, , t) =

q1
X

| u|2 f(eq) (r, t)

(2.51c)

=0

=0

A continuacin se van a deducir las ecuaciones que rigen el modelo de discretizacin D2Q9. Para ello se define la expresin general del momento respecto la funcin

RR
de distribucin de equilibrio I =
() f (eq) d2 y, teniendo en cuenta que la fun

cin puede ser de forma m,n () = xm yn , se obtiene el siguiente resultado para el


momento:
Im,n

=
2RT

ZZ

||2
2RT

xm yn e

( u)2
|u|2
u
+

1+
RT
2 (RT )2 2RT

Introduciendo el cambio de variable =

,
2RT

y definiendo Im =

(2.52)

d2
R

m e d, la

Ecuacin (2.52) se escribe como:


(
!
m+n

|u|2
2
1
Im,n =
2RT
(uIm+1 In + vIm In+1 ) +
Im In +
2RT
2RT
2RT


1
2
2
+
u Im+2 In + v Im In+2 + 2uvIm+1 In+1 (2.53)
RT
La cuadratura de Hermite de orden 3 es la ms adecuada para evaluar de forma
exacta la integral Im :

Z
Im =

m e d =

3
X

k km

(2.54)

k=1

siendo k y k el peso y la abscisa de la cuadratura recogidas en la siguiente tabla:


k

k
k

2
3

6
q
32

q6

3
2

Tabla 2.1: Cuadratura de Hermite de orden 3.

37

Introduciendo la Ecuacin (2.54) en la Ecuacin (2.53) y agrupando trminos, se


obtiene la siguiente ecuacin:
Im,n

3 X
3
X

k l m,n;k,l
=

k=1 l=1


2 )
k,l u
k,l u
|u|2
1
+
+
2RT
RT
2 (RT )2

(2.55)

m n y
siendo m,n;k,l = x,k
k,l = (x,k , y,l ). Para simplificar la notacin en vez
y,l

de utilizar un doble sumatorio se reduce a un nico sumatorio de nueve elementos


coincidentes con la cantidad de velocidades discretas:
)
(
8
X

|u|2
( u) ( u)2
Im,n =
m,n; w 1
+
+

2RT
RT
2 (RT )2
=0

(2.56)

siendo las velocidades discretas representadas en la Tabla (2.2) y w los pesos


asociados.

k l
=
w =

,x

,y

3RT
0

4
9
1
9
1
36

2
0

3RT

k=l=2

=0

k = 1, l = 2; k = 2, l = 1; ... = 1, 2, 3, 4
k = l = 1; k = l = 3; ...

3RT
0

4
0

3RT

= 5, 6, 7, 8

(2.57)

3RT
3RT

3RT

3RT

3RT

3RT

3RT

3RT

Tabla 2.2: Representacin de los componentes de las velocidades discretas del modelo D2Q9.

En la Figura (2.2) se representan las velocidades discretas.

Figura 2.2: Representacin del modelo de discretizacin D2Q9 del espacio de velocidades.
Se representan los vectores de velocidad discretos.

38

A continuacin se define la velocidad de la luz como c x


t , que en este caso vale

p
7
c = 3RT . Por otro lado, se define la velocidad del sonido cs =
= RT .
Identificando trminos de la Ecuacin (2.56) e introduciendo la definicin de la
velocidad de la luz se obtiene la distribucin de equilibrio discretizada (en la cual se
hace un cambio de notacin para indicar las velocidades discretas e ):
(

f(eq)

3 (e u) 9 (e u)2 3 |u|2
+

= w 1 +
c2
2c4
2c2

)
(2.58)

A continuacin se resumen las ecuaciones del modelo SRT para el modelo D2Q9:


1
f (r + e t, t + t) f (r, t) =
f (r, t) f(eq) (r, t)

(
)
2
2
3
(e

u)
9
(e

u)
3
|u|

f(eq) = w 1 +
+

c2
2c4
2c2
(r, t) =

8
X

(2.59a)
(2.59b)

f (r, t)

(2.59c)

e f (r, t)

(2.59d)

=0

(r, t) u (r, t) =

8
X
=0

Expansin multiescala de Chapman-Enskog


Llegados a este punto queda an una pregunta importante sin responder: cmo
se sabe que las Ecuaciones (2.59) son equivalentes a las ecuaciones de Navier Stokes?
Para responder a esta pregunta se utilizar la expansin multiescala de ChapmanEnskog que, bsicamente, relaciona el tiempo de relajacin del trmino de colisin
BGK con las propiedades macroscpicas del fluido. La idea bsica de la expansin
de Chapman-Enskog es separar la funcin de distribucin y sus derivadas respecto
7

Suponiendo la validez de la ecuacin del gas ideal (p = RT ) y suponiendo que el gas es

p
= RT , mientras que si se supone que el gas es

isotrmico (T = cte.) se obtiene cs = p


= RT

isentrpico ( p = cte.) se obtiene cs =

39

el tiempo y el espacio en diferentes escalas caracterizadas por su orden de magnitud.


f =

=
t

=
rj

n f(n)

(2.60)

n

t(n)

(2.61)

n

(2.62)

n=0

X
n=1

X
n=1

(n)

rj

siendo  un parmetro adimensional para caracterizar el orden de magnitud del


(0)

(eq)

trmino. El primer trmino f es por definicin el estado de equilibrio f

y, como

consecuencia, el resto de trminos caracterizan el estado de no equilibrio. Respecto a


las derivadas, en vez de coger infinitos trminos, es lgico pensar que en el dominio
del espacio hace falta considerar nicamente una escala, mientras que en el dominio
del tiempo s que hace faltar tener en cuenta ms escalas para diferenciar las escalas
rpidas de las lentas. Finalmente se escogen una escala en el dominio del espacio y
dos escalas en el dominio del tiempo quedando las derivadas de la siguiente manera:


=  (1) + 2 (2)
t
t
t

=  (1)
rj
r

(2.63)
(2.64)

Para empezar, se desarrolla en serie de Taylor el trmino f (r + t, t + t) y se


desprecian los trminos superiores o iguales a t3 :



f (r + e t, t + t) = f (r, t) + t
+ e r f (r, t) +
t

2

(t)2
+ e r f (r, t) + O t3
+
2
t

(2.65)

Sustituyendo la Ecuacin (2.65) en la Ecuacin (2.59a) y dividiendo por t se obtiene:





2

t
+ e r f (r, t) +
+ e r f (r, t) =
t
2 t


1 
=
f (r, t) f(eq) (r, t) + O t2
(2.66)
t
A continuacin se sustituyen las derivadas aproximadas y los infinitos trminos de
la funcin de distribucin en la Ecuacin (2.66), y se separan las diferentes escalas
asociadas a , 2 , :




1 (1)
:
+ e r(1) f(0) =
f + O t2
(1)
t
t
40

(2.67)



(0)
f

 : (2) +
+ e r(1) f(1) +
t
t(1)
2

1 (2)
+ e r(1) f(0) =
f + O t2
t
2

t
+
2

t(1)

(2.68)

Combinando las Ecuaciones (2.67) y (2.68) se obtiene:





(0)


f
1
1 (2)
(1)
2
+
1

+
e

f
=

f
+
O
t
(1)

r
2
t
t(2)
t(1)

(2.69)

Antes de proceder a determinar los momentos de las ecuaciones anteriores se va a


deducir una propiedad importante que ser de utilidad. La densidad se puede escribir
como sigue:
=

8
X
=0

f =

8 X

n f(n) = f(0) +

=0 n=0

8
X

n f(n)

(2.70)

=0 n=1

Teniendo en cuenta la propiedad (2.21) y que


resultado:

8 X

(0)
f

(eq)

= f , se obtiene el siguiente

f(n) = 0 n 1

(2.71)

=0

La Ecuacin (2.71) quiere decir que el momento de orden 0 de la parte de no equilibrio


de la funcin de distribucin vale 0. De forma anloga se puede deducir para los
P
momentos de orden 1 y 2. A continuacin, se evala el momento de orden 0 ( 8=0 )
de las las Ecuaciones (2.67) y (2.69):


+ r(1) (u) = O t2
(1)
t


= O t2
(2)
t

(2.72a)
(2.72b)

Multiplicando la Ecuacin (2.72a) por , y sumndolo a la Ecuacin (2.72b) multiplicada por 2 , se obtiene la ecuacin de conservacin de masa (salvo por el error de

orden O t2 ):


+ r (u) = O t2
(2.73)
t
P
A continuacin se evala el momento de orden 1 ( 8=0 e ) de las Ecuaciones (2.67)
y (2.69) obteniendo el siguiente resultado:

(u)
+ r(1) (0) = O t2
(1)
 t


(u)
1
(1)
2
+
1

=
O
t
(1)
r
2
t(2)
41

(2.74a)
(2.74b)

(n)

(n)
=0 e,i e,j f el tensor de momento de segundo orden de la fun(n)
cin de distribucin f . Tambin se define el tensor de momento de tercer orden
P
(n)
(n)
Qijk = 8=0 e,i e,j e,k f . Teniendo en cuenta la configuracin de las velocidades

siendo ij =

P8

discretas del modelo D2Q9 y la funcin de equilibrio (2.59b) se demuestra que:


1
(0)
ij = c2 ij + ui uj
3
1
(0)
Qijk = c2 (uk ij + uj ik + ui jk )
3
!
(0)
ij
(1)
(n)
ij = t
+ r(1) Qijk = tc2s
k
t(1)

(2.75a)
(2.75b)
uj
(1)
xi

ui
(1)
xj

!
+ O M a3

(2.75c)
Identificando trminos, se obtiene la siguiente expresin que relaciona la frecuencia de relajacin adimensional con la viscosidad cinemtica :


x2 1
1
=

3t 2

(2.76)

Para que la viscosidad cinemtica sea positiva, la frecuencia de relajacin debe ser
inferior a 2, o dicho de otra manera, el tiempo de relajacin debe ser superior a 0, 5.
Como se ver ms adelante, cuando la frecuencia de relajacin se acerca a 2 ocurren
inestabilidades.
Modelo incompresible
Como se ha visto anteriormente el modelo SRT D2Q9 con la funcin de distribucin de equilibrio (2.59b) simula las ecuaciones compresibles de Navier-Stokes.
Sin embargo, el nmero de Mach debe ser pequeo para respetar la validez de las
ecuaciones obtenidas.
A continuacin se va a obtener un modelo para los flujos incompresibles. Idealmente, cuando se habla de la incompresibilidad se refiere a que la densidad es constante. Sin embargo, en el modelo obtenido es prcticamente imposible mantener la
densidad exactamente constante. Esta imposibilidad proviene bsicamente del hecho
de que la densidad y la presin no son dos variables independientes en los modelos
LBM. La relacin que se establece entre la presin y la densidad es la ecuacin de
estado de los gases ideales. Evidentemente esto implica que siempre se cometer un
error a la hora de simular las ecuaciones incompresibles de Navier-Stokes. Por ello,
lo que se hace es proponer una modificacin del modelo SRT D2Q9 para minimizar
42

los efectos de compresibilidad y, de esta manera, aproximar mejor las ecuaciones de


Navier-Stokes incompresibles. Se basar en el mtodo propuesto en [16]. El procedimiento se basa en separar la densidad en una parte constante (ref ) y en una parte
fluctuante () que se demuestra que es de orden O(M a2 ). Despreciando el error debido a los trminos iguales o superiores a O(M a3 ) se obtiene el modelo incompresible.


1
f (r, t) f(eq) (r, t)
f (r + e t, t + t) f (r, t) =

(
!)
3 (e u) 9 (e u)2 3 |u|2
(eq)
f = w + ref
+

c2
2c4
2c2
(r, t) = ref + =

8
X

(2.77a)
(2.77b)

f (r, t)

(2.77c)

e f (r, t)

(2.77d)

=0

ref u (r, t) =

8
X
=0

Normalmente se toma valor unitario para ref .


Modelo trmico
Para poder simular problemas de conveccin natural es necesario incorporar el
clculo de la temperatura y tambin un termino adicional de fuerza de flotacin en
la ecuacin de momentum. En [22] se proponen tres maneras de incorporar la fuerza
adicional. De las tres, se ha escogido la que aade simplemente un trmino extra F
(eq)

a la funcin de equilibrio f :
F = w F e

1
c2s

(2.78)

siendo F la fuerza que se calcula de la siguiente manera: F = g (T T0 ), siendo


T la temperatura y T0 una temperatura caracterstica del problema (ver apartado
de adimensionalizacin).
Por otro lado, para calcular el campo de la temperatura, se introduce otra funcin
de distribucin g (no confundir con la funcin de distribucin de equilibrio). El
modelo utilizado para la funcin de distribucin g es tambin D2Q9.

43

Resumiendo, se tiene las siguientes ecuaciones:




f (r + e t, t + t) f (r, t) = f f (r, t) f(eq) (r, t)


g (r + e t, t + t) g (r, t) = g g (r, t) g(eq) (r, t)
(
)
3 (e u) 9 (e u)2 3 |u|2
(eq)
f = w 1 +
+

+ F
c2
2c4
2c2
(
)
3 (e u) 9 (e u)2 3 |u|2
(eq)
g = w T 1 +
+

c2
2c4
2c2
(r, t) =

8
X

(2.79a)
(2.79b)
(2.79c)
(2.79d)

f (r, t)

(2.79e)

e f (r, t)

(2.79f)

=0

(r, t) u (r, t) =

8
X
=0

T (r, t) =

8
X

g (r, t)

(2.79g)

=0

(2.79h)
Antes se tena nicamente una frecuencia de relajacin adimensional para la funcin
de distribucin f , en cambio, ahora se tienen dos, una para la funcin de distribucin
f y la otra para g:
1
3 + 0, 5
1
g =
3a + 0, 5

f =

(2.80a)
(2.80b)

siendo a la difusividad trmica definida anteriormente y que est relacionada con el


nmero de Prandtl y la viscosidad cinemtica (ver apartado de adimensionalizacin).

2.2.2.

Multiple Relaxation Time (MRT)

Debido a su simplicidad, el modelo SRT con el operador de colisin BGK, tambin


llamado LBGK, se ha convertido en el mtodo ms popular en LBM a pesar de
presentar problemas de estabilidad cuando el nmero de Reynolds es alto. El modelo
MRT LBE es la generalizacin del modelo LBGK que a diferencia del otro tiene ms
de un parmetro de relajacin, y adems se ha demostrado su superioridad en el
aspecto de estabilidad [14].
Al igual que el modelo LBGK, MRT LBE tiene un conjunto de velocidades discretas {e0 , e1 , . . . , eq1 , } y un conjunto de funciones de distribucin para cada velocidad
44

discreta {f0 , f1 , . . . , fq1 , }. La diferencia est en la manera de tratar el proceso de


colisin. En MRT LBE el proceso de colisin se realiza a travs de la matriz de colisin S de dimensin q q. De esta manera la ecuacin de evolucin de las funciones
de distribucin en el tiempo discreto es:

f0 (r + e0 t, t + t) f0 (r, t)
f1 (r + e1 t, t + t) f1 (r, t)
..
.

(2.81)

fq1 (r + eq1 t, t + t) fq1 (r, t)

(eq)

f0 (r, t) f0 (r, t)

S11 S1q

f1 (r, t) f (eq) (r, t)


1
..
..
..

.
.
.
..

Sq1 Sqq
(eq)
f
q1 (r, t) fq1 (r, t)

que escrito en forma vectorial adquiere un aspecto ms compacto:




f (r + e t, t + t) f (r, t) = S f (r, t) f (eq) (r, t)

(2.82)

Las frecuencias de relajacin son los valores propios de la matriz de colisin S.


En el caso de tener todos los valores propios iguales, la matriz de colisin adquiere
la forma S = I (siendo I la matriz identidad) y se recupera el modelo LBGK.
En modelos MRT habrn q momentos m que son combinaciones lineales de las
funciones de distribucin y, por tanto, se pueden representar como una transformacin lineal mediante una matriz M de dimensin q q:
m (r, t) = M f (r, t)

(2.83)

Si se escoge de manera adecuada la matriz S se puede simplificar la Ecuacin (2.82):




f (r + e t, t + t) f (r, t) = M 1 S m (r, t) m(eq) (r, t)

(2.84)

siendo S = M SM 1 una matriz diagonal: S = diag (s0 , s1 , . . . , sq1 ). Los q momentos se pueden dividir en dos grupos: los momentos hidrodinmicos (conservados)
y los momentos cinticos (no conservados). El primer grupo consiste en momentos
localmente conservados en el proceso de colisin, es decir, m (r, t) = m(eq) (r, t). El
segundo grupo consiste en momentos no conservados en el proceso de colisin, es

45

decir, m (r, t) 6= m(eq) (r, t). Para las simulaciones de flujos isotrmicos, los momentos conservados son la densidad de masa y la densidad de momentum j = u.
Los valores s correspondientes a los momentos conservados valen 0 mientras que
los otros son parmetros de ajuste de la simulacin. La descripcin ms detallada de
los modelos MRT en 2D se puede encontrar en [15], mientras que para los modelos
MRT en 3D en [14].

2.3.

Aspectos de implementacin

En el apartado anterior se han introducido los diferentes modelos de LBM. En


particular, se ha presentado con mucho detalle la deduccin de la Ecuacin de Boltzmann discretizada y las funciones de equilibrio para el modelo D2Q9 SRT. A partir
de ahora se centra en el modelo D2Q9 SRT ya que, como ya se ha dicho anteriormente, es el modelo ms utilizado. En este apartado se van a discutir las diferentes
maneras de implementar el LBM incluyendo el tratamiento de las condiciones de
contorno.
En el apartado anterior se ha discretizado la Ecuacin de Boltzmann en el espacio
de fases (de velocidades microscpicas) y tambin en el dominio de tiempo, y se ha
obtenido la siguiente ecuacin:


f (r + e t, t + t) = f (r, t) f (r, t) f(eq) (r, t)

(2.85)

Para discretizar en el dominio del espacio de manera uniforme basta con modificar
el vector de posicin de la siguiente manera:
r r ij = ixex + jyey

(2.86)

siendo ex y ey los vectores ortonormales que definen la base en el espacio, x y y


las distancias entre dos nodos consecutivos en las dos direcciones del espacio y por
ltimo, i y j nmeros enteros que permiten apuntar el vector posicin a cualquier
nodo en el espacio. A partir de ahora se entender que el vector posicin r es la
versin discretizada r ij . Para cada nodo ubicado en r habrn q valores de la funcin
de distribucin llamados f , donde va de 0 a 8, y que caracterizan el estado local
del nodo.
En la Figura (2.3) se representa un ejemplo de discretizacin con el modelo D2Q9.

46

Figura 2.3: Discretizacin de un dominio cuadrado mediante el modelo D2Q9. Los nodos
amarillos representan el dominio de fluido, mientras que los nodos gris definen el contorno.
Las flechas representan los vectores de velocidad microscpica para cada nodo e .

Normalmente, para inicializar los valores f para cada nodo se supone que el
estado inicial es el correspondiente al de equilibrio con una cierta velocidad y densidad
dadas, y por tanto se inicializa tal y como se muestra a continuacin:


f (r, t = 0) = f(eq) u=u0

(2.87)

=0

Una vez se tienen todos los valores f para cada nodo que forma el dominio
fsico en el tiempo t (incluido la inicial t = 0), se quieren calcular los valores de
f para cada nodo en el siguiente instante de tiempo t + t. Es evidente que se
tiene que aplicar la Ecuacin (2.85), sin embargo, aplicar dicha ecuacin de forma
directa no es posible ya que los nodos que forman la condicin de contorno deben
recibir un tratamiento especial. Por este motivo, se separa la Ecuacin (2.85) en dos
etapas llamadas de propagacin (streaming) y de colisin. Durante la primera etapa
se produce una propagacin de las funciones de distribucin segn las direcciones
microscpicas a los nodos vecinos. Si se utilizan dos matrices (una correspondiente
al estado de prepropagacin y otra correspondiente al estado postpropagacin) se
puede realizar la etapa de propagacin con un nico ciclo barriendo todos los nodos
y propagando (push) o bien recibiendo (pull) las funciones de distribucin. Dichos
mtodos se representan en las Figuras (2.4) y (2.5).
Si se decide utilizar una nica matriz, entonces se debe hacer ms de un reco47

Figura 2.4: Representacin del mtodo push. A la izquierda y a la derecha se representan el


estado pre y postpropagacin para un nodo, respectivamente.

Figura 2.5: Representacin del mtodo pull. A la izquierda y a la derecha se representan el


estado pre y postpropagacin para un nodo, respectivamente.

rrido por todos los nodos con el fin de realizar la etapa de propagacin sin perder
informacin. Dicho mtodo se representa en la Figura (2.6).
En ambos casos, utilizando una nica matriz o bien dos matrices, en el estado
de postpropagacin habrn direcciones en los nodos del contorno en las que no se
conocer el valor de la funcin de distribucin. Dichas direcciones se ilustran con
flechas grises en la Figura (2.7).
El papel de las condiciones de contorno es, conociendo las propiedades macroscpicas en el contorno, determinar las funciones de distribucin que no han quedado
definidas despus del proceso de propagacin. El tratamiento de las condiciones de
contorno se discutir en los siguientes apartados.
En funcin de si primero se realiza la etapa de propagacin y posteriormente la
de colisin o viceversa, se obtienen dos esquemas diferentes de implementacin:
Esquema propagacin-colisin
1. El ciclo empieza para el instante t propagando las funciones de distribucin segn las direcciones microscpicas a los nodos vecinos. Matemticamente, dicho
48

(a)

(b)

(c)

(d)

(e)

(f)

(g)

(h)

Figura 2.6: En el caso de utilizar una nica matriz, el sentido de barrido difiere segn la
direccin. Las flechas negras indican los valores de la funcin de distribucin propagados
despus de la etapa de propagacin para cada direccin.

Figura 2.7: Una vez realizada la etapa de propagacin hay ciertas direcciones (flechas grises)
en las que se desconoce el valor de la funcin de distribucin.

proceso se escribe de la siguiente manera:


fpost (r + e t, t) = f (r, t)

(2.88)

siendo fpost el estado postpropagacin en el instante t.


2. Se aplican las condiciones de contorno con el fin de determinar los valores de
fpost (r, t), para r perteneciente al contorno, que no han quedado definidos
despus de la etapa de propagacin.
49

3. Una vez calculados todos las valores fpost se procede a calcular las propiedades
macroscpicas para las funciones de distribucin fpost para todos los nodos:
X
fpost
(2.89)
(r, t) =

1 X
u (r, t) =
(e ex ) fpost
(r, t)
1 X
(e ey ) fpost
v (r, t) =
(r, t)

(2.90)
(2.91)
(eq)

4. A continuacin se calculan las funciones de distribucin de equilibrio f

(r, t)

utilizando las propiedades macroscpicas ya calculadas.


5. Por ltimo, se realiza la etapa de colisin en la que se actualizan todos los
valores de f para el siguiente instante de tiempo t + t, y por tanto se cierra
el ciclo:


f (r, t + t) = fpost (r, t) fpost (r, t) f(eq) (r, t)

(2.92)

Esquema colisin-propagacin
1. El ciclo empieza para el instante t calculando las propiedades macroscpicas
para las funciones de distribucin f para todos los nodos:
X
(r, t) =
f

(2.93)

1 X
(e ex ) f
u (r, t) =
(r, t)
1 X
v (r, t) =
(e ey ) f
(r, t)

(2.94)
(2.95)
(eq)

2. A continuacin se calculan las funciones de distribucin de equilibrio f

(r, t)

utilizando las propiedades macroscpicas ya calculadas.


3. Se realiza la etapa de colisin en la que se actualizan todos los valores de f y
de esta manera se llega al estado de postcolisin fpost :


fpost (r, t) = f (r, t) f (r, t) f(eq) (r, t)

(2.96)

4. Se realiza la etapa de propagacin:


f (r + e t, t + t) = fpost (r, t)
50

(2.97)

5. Por ltimo, se aplican las condiciones de contorno con el fin de determinar los
valores de f (r, t + t) para r perteneciente al contorno, y que no han quedado
definidas despus de la etapa de propagacin.

2.3.1.

Tratamiento de las condiciones de contorno

Cada modelo LBM puede llegar a tener un tratamiento diferente de las condiciones de contorno. Dependiendo de si se trata de un caso bidimensional o tridimensional, y tambin dependiendo de la cantidad de velocidades discretas, el tratamiento de
las condiciones de contorno es diferente. Aun fijando un modelo LBM, la dimensin
del problema y la cantidad de velocidades discretas, existen varios tratamientos de
las condiciones de contorno propuestas por diferentes autores. Debido a tal diversidad, en este apartado se centrar nicamente sobre el modelo LBGK D2Q9 y se
discutirn algunos de los tratamientos ms conocidos.
Antes de entrar en la discusin de los diferentes mtodos de tratamiento de las
condiciones de contorno, se introduce un concepto importante respecto a la clasificacin del tipo de nodo. Los nodos pueden ser clasificados como wet (mojado) o
dry (seco). Un nodo dry es aquel que se encuentra infinitamente cerca de la pared
y forma parte de la condicin de contorno, o bien est dentro de un cuerpo y no
forma parte de la condicin de contorno. Por tanto un nodo dry no forma parte del
dominio fluido y no se ejecuta la etapa de colisin tradicional (en el sentido de un
proceso de relajacin de las funciones de distribucin). Por otro lado, un nodo wet s
que se encuentra en el dominio fluido y puede o no formar parte de la condicin de
contorno. Por tanto en un nodo wet s que se ejecuta la etapa de colisin tradicional.
Bounce-Back
Bounce-Back (BB) es la condicin de contorno de pared ms famosa en LBM.
Se basa en la idea intuitiva de que las funciones de distribucin que se dirigen a
la pared rebotan al tocarla y vuelven al dominio fluido. Hay dos tipos diferentes:
BB Half-Way y BB Full-Way. En el caso de BB Half-Way se debe utilizar el orden
propagacin-colisin en el que despus de la etapa de propagacin tradicional se
produce la sustitucin de las funciones de distribucin desconocidas mediante un
proceso de inversin para los nodos del contorno. Por el contrario, en el caso de
BB Full-Way se debe utilizar el orden colisin-propagacin en el que se produce la
inversin en todas las direcciones sin importar la orientacin de la pared durante la
51

etapa de colisin. En BB Half-Way, el nodo de contorno es de tipo wet mientras que


en BB Full-Way, es de tipo dry. A continuacin se representa la expresin que rige
la condicin de contorno de tipo BB Half-Way:
fpost (r, t) = fpost (r, t)

(2.98)

siendo fpost el estado postpropagacin y


la direccin inversa de (e = e ).
Hay que especificar que r apunta a los nodos de contorno y son las direcciones en
las que se da el rebote, y que dependen de la orientacin de la pared.
La ecuacin que rige la condicin de contorno de tipo BB Full-Way es:
(2.99)

f (r, t + t) = f (r, t)
para todos los valores de .

Las Ecuaciones (2.98-2.99) son para condicin de contorno de velocidad nula.


w
a la
Para imponer una cierta velocidad uw se aade un trmino extra 2w ecu
2
s

derecha de la Ecuacin (2.99) [13].


Zou & He
En este mtodo los nodos que forman parte del contorno son de tipo wet y,
en el caso de una condicin de contorno horizontal, tal y como se muestra en la
Figura (2.8), despus del proceso de propagacin los valores f2 , f5 y f6 quedan
indeterminados. Para obtener los valores indeterminados se dispone de las siguientes

Figura 2.8: Representacin de un contorno horizontal. La lnea roja representa la pared y


los nodos que estn encima de la lnea roja representan los nodos en los que hay que aplicar
la condicin de contorno.

52

ecuaciones:
= f0 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8

(2.100a)

u = f1 + f5 + f8 f6 f3 f7

(2.100b)

v = f5 + f2 + f6 f8 f4 f7

(2.100c)

Por tanto, habrn 6 variables (las tres distribuciones de funciones, los dos componentes de la velocidad y la densidad (presin)) y 3 ecuaciones. En consecuencia, para
resolver las incgnitas se tendran que proporcionar 3 valores de las 6 variables en la
condicin de contorno. Es evidente que falta otra ecuacin ya que, por ejemplo, en
el caso de una condicin de contorno de velocidad nula no se conocer la densidad.
En el trabajo de Q. Zou y X. He [9] se propone utilizar como tercera ecuacin la
condicin de rebote de la parte de no equilibrio de la funcin de distribucin. Para
el caso horizontal representado en la Figura (2.8) la ecuacin adicional ser:
(neq)

f2

(neq)

= f4

(eq)

= f2 f2

(eq)

= f4 f4

(2.101)

Teniendo la ecuacin anterior en cuenta pueden haber los siguientes casos:


Conocidos los dos componentes de la velocidad, encontrar la densidad (presin)
y las funciones de distribucin desconocidas. De las Ecuaciones (2.100a) y (2.100c)
se despeja el trmino f5 + f2 + f6 y se igualan entre ellos. De esta manera se obtiene
la densidad:

1
[f0 + f1 + f3 + 2 (f4 + f7 + f8 )]
(2.102)
1v
A continuacin se remplazan las expresiones de la funcin de distribucin de equili=

(eq)

brio f2

(eq)

y f4

dentro de la Ecuacin (2.101) obteniendo el siguiente resultado:


2
f2 = f4 + v
3

(2.103)

Por ltimo, resolviendo las Ecuaciones (2.100b) y (2.100c) se obtienen las funciones
de distribucin f5 y f6 :
1
(f1 f3 ) +
2
1
f5 = f8 + (f1 f3 )
2
f5 = f7

1
u +
2
1
u +
2

1
v
6
1
v
6

(2.104a)
(2.104b)

Conocidos la densidad (presin) y el componente tangencial (a la condicin de


contorno) de la velocidad, determinar la velocidad normal y las funciones de distribucin desconocidas. Entre los dos casos lo nico que cambia es el primer paso, siendo
53

para el primer caso el clculo de la densidad (presin), y para el segundo el clculo


de la velocidad normal. De las Ecuaciones (2.100a) y (2.100c) se despeja el trmino
f5 + f2 + f6 y se igualan entre ellos. De esta manera se obtiene la componente vertical
de la velocidad:
v =1

1
[f0 + f1 + f3 + 2 (f4 + f7 + f8 )]

(2.105)

Se utilizan las Ecuaciones (2.103) y (2.104) para obtener las funciones de distribucin
desconocidas.
Los nodos que se encuentran en las esquinas reciben un tratamiento particular
ya que habr dos direcciones ms en las que se desconocern los valores de la funcin
de distribucin y, en consecuencia, se tendran que proporcionar dos ecuaciones ms
para poder determinar todas las incgnitas en el nodo de contorno. Una incorrecta
aplicacin de la condicin de contorno a dichos nodos implicar la propagacin del
error por todo el dominio a travs de la etapa de propagacin. En la Figura (2.9) se

Figura 2.9: Representacin de un contorno esquina. La lnea roja representa la pared y los
nodos que estn encima de la lnea roja representan los nodos en los que hay que aplicar la
condicin de contorno.

representa un nodo que se encuentra en la interseccin de un contorno horizontal y


vertical. En este caso se aplica la misma idea propuesta en el trabajo de Q. Zou y
X. He [CC1]. Habr dos direcciones(1 y 2) en las qu se producir el rebote de las
partes de no equilibrio de la funcin de distribucin.
(neq)

f2

(neq)
f1

(neq)

(2.106a)

(neq)
f3

(2.106b)

= f4
=

54

Sustituyendo las expresiones de equilibrio en las Ecuaciones (2.106) se obtiene:


1
f5 = f7 + (u + v)
6
2
f2 = f4 + v
3
2
f1 = f3 + u
3

(2.107a)
(2.107b)
(2.107c)

Suponiendo que la condicin de contorno es de velocidad nula, las Ecuaciones (2.107)


se convierten en f2 = f4 , f1 = f3 y f5 = f7 . A partir de las Ecuaciones (2.100b)
y (2.100c) se deduce que f6 = f8 y f5 = f7 . Por ltimo, de la Ecuacin (2.100a) se
obtiene el valor de f6 y f8 :
f6 = f8 =

1
[ (f0 + f1 + f2 + f3 + f4 + f5 + f7 )]
2

(2.108)

Por tanto, conociendo la densidad (presin) se podr obtener f6 y f8 . En el caso de


desconocer el valor de la densidad (presin) se puede extrapolar a partir de los nodos
vecinos.
Chih-Fung et al.
La solucin propuesta en el apartado anterior tiene ciertos inconvenientes debido
a que la hiptesis del rebote de la parte de no equilibrio de la funcin de distribucin
viola las leyes de conservacin y hace que la densidad total aumente. Tambin es ms
laboriosa a la hora de resolver los nodos en las esquinas.
La idea principal de [10], que es la misma que en [9], consiste en encontrar las
funciones de distribucin desconocidas despus del proceso de propagacin. Sin embargo, las ecuaciones adicionales que se introducen suponen que las funciones de
distribucin desconocidas son funciones de las funciones de distribucin locales y del
vector corrector. Posteriormente se ajustar el vector corrector para cumplir las leyes
de conservacin (de masa y de momento). Matemticamente se escribe como:
f (r, t) = f (r, t) + w e Q

(2.109)

siendo f (r, t) la funcin de distribucin desconocida en la direccin , f (r, t) la


funcin de distribucin local y Q es el vector corrector con componentes Qx , Qy y Qz
(para el caso de un modelo 3D). Para escoger f (r, t) hay varias opciones: f (r, t) =
(eq)

f (r, t), f (r, t) = f (r, t t) o f (r, t) = f

(r, t). Segn el autor del [10], la

diferencia de resultados debido a la diferente eleccin de f (r, t) es despreciable.


55

Como ejemplo se va a resolver un nodo de la cara norte donde las funciones


de distribucin f4 , f7 y f8 quedan indefinidas despus de la etapa de propagacin.
Aplicando la Ecuacin (2.109) para las direcciones donde las funciones de distribucin
quedan indefinidas se obtienen:
f4 = f4 w4 Qy

(2.110a)

f7 = f7 w7 (Qx + Qy )

(2.110b)

f8 = f8 + w8 (Qx Qy )

(2.110c)

A continuacin, sustituyendo las Ecuaciones (2.110) en las Ecuaciones (2.100) y


despejando Qx y Qy se obtiene:
1
(u f1 f5 f8 + f6 + f3 + f7 )
18
1
(v f5 f2 f6 + f8 + f4 + f7 )
Qy =
18

(2.111a)

Qx =

(2.111b)

Inamuro et al.
En el trabajo [11] Inamuro et al. proponen un manera diferente de abordar el
problema de las condiciones de contorno de pared. La idea se basa en la utilizacin
de la funcin de distribucin de equilibrio para obtener las funciones de distribucin
indeterminadas despus de la etapa de propagacin. Se demostrar su uso para una
pared horizontal, representada en la Figura (2.8), donde las funciones f2 , f5 y f6
son las que hay que determinar. Si se intentan evaluar las funciones de equilibrio
con la velocidad (uw ) y la densidad (w ) de la pared y asignarlas a las funciones de
distribucin indeterminadas se puede demostrar que la velocidad obtenida en la pared
no es exactamente la velocidad impuesta. Para hacer que la velocidad impuesta a
travs de la funcin de distribucin de equilibrio concuerde con la velocidad calculada
a partir de los momentos se introducen dos variables 0 y u0 . Se calculan 0 y u0 de
tal manera que cumplan las siguientes ecuaciones:



(eq)
(eq)
(eq)
w = f0 + f1 + f2 u=uw +u0 + f3 + f4 + f5 u=uw +u0 + f6 u=uw +u0 + f7 + f8
v=vw
=0

v=vw
=0

v=vw
=0

(2.112a)


(eq)
(eq)
w uw = f1 + f5 u=uw +u0 + f8 f6 u=uw +u0 f3 f7
v=vw
=0

(eq)
u=uw +u0
v=vw
=0

w vw = f5

v=vw
=0

(eq)
u=uw +u0
v=vw
=0

+ f2


u=uw +u0 f8 f4 f7

(eq)

+ f6

56

v=vw
=0

(2.112b)
(2.112c)

Resolviendo las Ecuaciones anteriores se obtienen la densidad de pared y las dos


variables introducidas:
1
[f0 + f1 + f3 + 2 (f4 + f7 + f8 )]
1 vw
w vw + f4 + f7 + f8
0 = 6
2
1 + 3vw + 3vw


1
w uw f1 + f3 f8 + f7
0
u =
6
uw 3uw vw
1 + 3vw
0

w =

(2.113a)
(2.113b)
(2.113c)

Una vez conocidas la densidad de pared y las dos variables introducidas, se evalan
las funciones de distribucin de equilibrio y se asignan a las funciones de distribucin
desconocidas. El tratamiento de las esquinas es un poco ms laborioso y se puede
encontrar en [11].
Condicin de contorno para dominios abiertos
En muchas ocasiones pueden haber casos en los que hayan contornos en los que se
desconozcan las propiedades macroscpicas (como por ejemplo, la velocidad). Para
encontrar las funciones de distribucin que quedan indeterminadas despus de la
etapa de propagacin se utilizan mtodos de extrapolacin. Por ejemplo si se trata
del contorno que est ubicado en la posicin i = N x, entonces la extrapolacin
cuadrtica ser:
f3 (N x, j) = 2f3 (N x 1, j) f3 (N x 2, j)

(2.114a)

f6 (N x, j) = 2f6 (N x 1, j) f6 (N x 2, j)

(2.114b)

f7 (N x, j) = 2f7 (N x 1, j) f7 (N x 2, j)

(2.114c)

La extrapolacin cuadrtica puede llevar a inestabilidades y es preferible utilizar la


extrapolacin lineal:
f3 (N x, j) = f3 (N x 1, j)

(2.115a)

f6 (N x, j) = f6 (N x 1, j)

(2.115b)

f7 (N x, j) = f7 (N x 1, j)

(2.115c)

Condicin de contorno para modelo trmico


Han surgido dos casos para imponer condiciones de contorno para la temperatura.
El primer caso es cuando se trata de una condicin de contorno de tipo adiabtico,
57

es decir, en el cual el flujo de calor debe ser nulo. En este caso se utiliza la condicin
de derivada nula para la funcin de distribucin g (igual que en el apartado de
condiciones de contorno para dominios abiertos). El segundo caso es cuando se trata
de una condicin de contorno fijo isotrmico, en la cual la temperatura se fija a un
valor Tdado y la velocidad es nula. En este caso, se utiliza la funcin de equilibrio
g (eq) (T = Tdado , u = 0) para calcular las funciones de distribucin en el contorno.
[12] incluye una discusin ms profunda sobre las condiciones de contorno del modelo
trmico.

2.3.2.

Evaluacin de fuerzas

El clculo de las fuerzas sobre un obstculo es una de las finalidades ms importantes que se persiguen cuando se hace una simulacin en el mbito de CFD.
Por esta razn, se dedica esta seccin a hablar exclusivamente sobre la evaluacin
de fuerzas en LBM. En el marco de este mtodo de simulacin hay bsicamente dos
maneras de evaluar la fuerza [17]. La primera de ellas se basa en la integracin del
tensor de tensiones sobre el contorno del obstculo, mientras que la segunda manera
se basa en el intercambio de momentum que sufren las partculas cuando chocan
contra el contorno del obstculo. A continuacin se van a discutir los dos mtodos
introducidos anteriormente.
Integracin del tensor de tensiones
La fuerza sobre un obstculo de contorno se evala de la siguiente manera:
Z
F =
(pI + ) ndS
(2.116)

La presin p se calcula a partir de la densidad mediante la ecuacin de estado p = c2s


y el tensor de tensiones tangenciales se evala utilizando la parte de no equilibrio de
la funcin de distribucin.




1
1 X (neq)
f
e,i e,j e e ij
ij = 1
2
D

(2.117)

Se tendr que extrapolar para obtener los valores adecuados de presin y tensor
viscoso en el contorno del obstculo. Este mtodo es muy laborioso y por eso se
utilizar el mtodo de intercambio de momentum.

58

Intercambio de momentum
Para utilizar este mtodo se definen dos variables w(i, j) y wb (i, j). w(i, j) vale 0
si el nodo (i, j) pertenece al dominio fluido (wet node), y por el contrario, si vale 1
significa que se encuentra en el interior del slido (dry node). wb (i, j) vale 0 en todos
los sitios excepto en los nodos que forman parte del contorno del obstculo, en los
cuales vale 1. Teniendo esto en cuenta, dado un nodo en el contorno que se encuentra
en el interior del obstculo caracterizado por la posicin r b (w = 1 y wb = 1), es
posible el intercambio de momentum con los nodos vecinos de valor:
X
e [f (r b , t) + f (r b + e t, t)] [1 w (r + e t)]

(2.118)

6=0

La fuerza total ser la suma de las contribuciones individuales de cada nodo.


X X
e [f (r b , t) + f (r b + e t, t)] [1 w (r + e t)]
(2.119)
F =
todos r b 6=0

siendo e la direccin opuesta de e . Un detalle importante es el hecho de que la


fuerza se debe evaluar despus de la etapa de colisin.

2.3.3.

Adimensionalizacin

En las simulaciones LBM se utilizan unidades de lattice, es decir, al tener x = 1,


y = 1 y t = 1, el tiempo y la posicin sern nmeros enteros. Para obtener las
variables adimensionalizadas se utilizan magnitudes caractersticas que tambin estn
en unidades de lattice. En la siguiente tabla se resumen las principales magnitudes
caractersticas mediante las cuales se deben adimensionalizar los resultados obtenidos
mediante LBM:
Conveccin forzada

Conveccin natural

Distancia

Velocidad

U0

Tiempo

N
U0

a
N
N2
a

Tabla 2.3: Magnitudes caractersticas en unidades lattice.

2.3.4.

Aspectos de implementacin paralela

Este apartado debera ser uno de los ms importantes y ms extensos ya que la


implementacin paralela es uno de los puntos ms fuertes de LBM. La importancia
59

radica en que el proceso de colisin es totalmente local (se refiere nicamente al nodo
y no a sus vecinos) y que el proceso de propagacin es uniforme y no requiere mucho
esfuerzo computacional. Sin embargo, debido al tiempo limitado, no se han hecho
estudios de implementacin paralela.

60

Captulo 3

Finite Volume Method (FVM)


El mtodo de volmenes finitos divide el dominio espacial en un nmero finito
de pequeos volmenes de control que se definen mediante el proceso de mallado.
Una vez definidos los volmenes de control, se integran las ecuaciones gobernantes
(diferenciales) sobre cada volumen de control y se obtienen, en consecuencia, las
ecuaciones algebraicas que representan las leyes de conservacin de masa, momento,
etc. sobre cada volumen de control.
Las ecuaciones gobernantes adimensionalizadas para el caso de problemas de
conveccin forzada son las siguientes:
u=0
1
u
+ (uu) = p +
u
t
Re
T
1
+ (uT ) =
T
t
Pe

(3.1a)
(3.1b)
(3.1c)

en las que se ha hecho un cambio de notacin respecto a las ecuaciones presentadas


en el apartado de adimensionalizacin omitiendo el smbolo de asterisco para indicar
la variable adimensionalizada. Se agrupan los trminos convectivo y difusivo de las
ecuaciones de momentum y de energa en R (u) y Q (u, T ) definidas de la siguiente
manera:
1
u (uu)
Re
1
Q (u, T ) =
T (uT )
Pe
R (u) =

(3.2a)
(3.2b)

Antes de entrar en la metodologa de resolucin de las ecuaciones de Navier-Stokes,


se debe entender mejor el papel que juega el gradiente de presin en la ecuacin de
61

momentum utilizando el teorema de Helmholtz-Hodge.


El teorema de Helmholtz-Hodge afirma que dado un campo vectorial definido
en un dominio acotado con el contorno liso , puede ser descompuesto en la suma
de dos campos vectoriales a y b de manera que uno de ellos tiene divergencia nula
y el otro rotacional nulo dentro del dominio acotado . En el contorno se debe
cumplir la condicin de a n = 0.
=a+b

(3.3)

a=0 a

(3.4a)

b=0 b

(3.4b)

donde

(3.4c)

a n = 0 a

Para demostrar el teorema basta con demostrar que los campos vectoriales a y b son
ortogonales entre ellos y por tanto podrn construir cualquier otro campo vectorial.
En primer lugar, es evidente que si el rotacional del campo vectorial b es nulo quiere
decir que proviene del gradiente de un campo escalar y en consecuencia b = . A
continuacin se integra (a) en el dominio :
Z
Z
Z
(a) d =
ad +
() ad

(3.5)

Teniendo en cuenta la Ecuacin (3.4a) y aplicando el teorema de divergencia al


trmino de la izquierda de la Ecuacin (3.5), se obtiene:
Z
Z
(a) ndS =
() ad

(3.6)

Por ltimo teniendo en cuenta la Ecuacin (3.4c) se obtiene:


Z
() ad = 0

(3.7)

que quiere decir que el campo vectorial es perpendicular al campo vectorial a.


Hace falta notar que si a la funcin se le suma un valor constante, su gradiente
queda inalterado y, por tanto, existen infinitos campos escalares que cumplen el
teorema.
A continuacin se aplica el teorema de Helmholtz-Hodge a la Ecuacin (3.1b)
particularizando a =

u
t ,

b = p y = R (u). Es fcil comprobar que las variables


62

Figura 3.1: Representacin de cmo se proyecta el trmino convectivo/difusivo mediante el


gradiente de presiones y se obtiene la derivada temporal de la velocidad.

escogidas cumplen las Ecuaciones (3.4) y por tanto satisfacen el teorema. En la


Figura (3.1) se representa la configuracin espacial de los campos vectoriales.
Se puede ver que si se resuelve la ecuacin de momentum sin considerar el trmino
de gradiente de presin, la solucin obtenida no cumplir la condicin de incompresibilidad (divergencia nula). Por tanto, como se ve en la Figura (3.1), el gradiente de
presin es el encargado de proyectar el trmino convectivo/difusivo de la ecuacin
de momentum y, en consecuencia, forzar que se cumpla la condicin de incompresibilidad impuesta por la Ecuacin (3.1a).
El mtodo de Proyeccin o Fractional Step Method se basa en el teorema de
Helmholtz Hodge y tiene la ventaja que desacopla el clculo de la presin del clculo
de la velocidad. El algoritmo se basa en dos etapas consecutivas. En primer lugar,
se calcula una velocidad intermedia (llamada velocidad predictora), la cual no satisface la condicin de incompresibilidad. En segundo y ltimo lugar, se utiliza la
pseudopresin (que se definir ms adelante) para proyectar la velocidad intermedia
en un espacio de divergencia nula y por tanto hacer que se cumpla la condicin de
incompresibilidad.
Se discretizan las Ecuaciones (3.1) en el dominio temporal utilizando el mtodo

63

explcito de segundo orden de Adams-Bashforth 1 :


(3.8a)

u(n+1) = 0
u(n+1)

u(n)

t(n)
T (n+1) T (n)
t(n)

3
1
= R u(n) R
2
2


3
= Q u(n) , T (n)
2


u(n1) p(n+1)

(3.8b)

1  (n1) (n1) 
Q u
,T
2

(3.8c)

Se define la velocidad predictora up como aquella velocidad que se obtendra al


resolver u(n+1) de la Ecuacin (3.1b) sin tener en cuenta el gradiente de presin.
up u(n)
3  (n)  1  (n1) 
=
R u
R u
2
2
t(n)
Despejando de la ecuacin anterior la velocidad predictora se obtiene:

 1 


(n)
(n) 3
(n)
(n1)
R u
R u
up = u + t
2
2

(3.9)

(3.10)

La relacin que se establece entre el campo de velocidad en el instante de tiempo


n + 1 y la velocidad predictora es la siguiente:
u(n+1) = up
p(n+1)

(3.11)

siendo p la pseudopresin, definida como p(n+1) = t(n) p(n+1) . Se puede aplicar otra
vez el teorema de Helmholtz Hodge a la Ecuacin (3.11) particularizando a = u(n+1) ,
b =
p(n+1) y = up .
A continuacin, se evala la divergencia de la Ecuacin (3.11) y, teniendo en
cuenta que el campo de velocidad en el instante de tiempo n+1 debe ser incompresible
como se impone en la Ecuacin (3.8a), se obtiene la Ecuacin de Poisson:
(3.12)

p(n+1) = up

Para resolver la Ecuacin (3.12) se impone como condicin de contorno derivada nula
de presin en el contorno.
1

Se utiliza la siguiente notacin:

(n)

= t

(0)

(n)

n10

siendo n un nmero entero que cuantifica la cantidad de incrementos de tiempos calculados en el


tiempo, una funcin arbitraria que depende del tiempo, t(n) el incremento de tiempo empleado
para el instante n y t(0) el tiempo inicial de simulacin.

64

A continuacin, se procede a detallar el proceso de mallado, el cual sirve para


definir las caras de los volmenes de control. Para que el desarrollo no sea muy complicado, se utilizar malla cartesiana rectangular no uniforme y un dominio espacial
rectangular de dimensiones Lx Ly . Se divide el eje x e y en Nx + 1 y Ny + 1 caras de
manera que habrn Nx Ny volmenes de control internos. Las posiciones de cada
cara, que van de 0 a Nx o Ny , vienen impuestas por dos funciones, xi e yj . Para el
caso de una malla cartesiana rectangular uniforme las expresiones para xi e yj son
las siguientes:
Lx
i = 0, 1, . . . , Nx
Nx
Ly
yj =
j = 0, 1, . . . , Ny
Ny
xi =

(3.13a)
(3.13b)

En la Figura (3.2) se representa un ejemplo de una malla cartesiana rectangular


uniforme. Normalmente en las paredes se coloca una malla ms fina para poder

Figura 3.2: Representacin de una malla cartesiana rectangular uniforme de Nx = 40, Ny =


40, Lx = 1 y Ly = 1.

aproximar mejor la solucin. En estos casos se utilizan mallas no uniformes. Una


manera fcil de generar una malla cartesiana rectangular no uniforme es utilizar la
funcin de tangente hiperblica para las funciones xi e yj :
 

N
L
dk = A tanh C k
+
k = 0, 1, . . . , N
2
2

(3.14)

L/2
y C un parmetro de ajuste. En la Figura (3.3) se representa
siendo A = tanh(CN/2)

un ejemplo de una malla cartesiana rectangular no uniforme. La generacin de la


malla no se refiere nicamente a la definicin de las caras sino que se refiere tambin
al clculo de parmetros geomtricos, que son las distancias entre los centroides
de los volmenes de control vecinos y los tamaos de los volmenes de control. A
65

Figura 3.3: Representacin de una malla cartesiana rectangular no uniforme de Nx = 40,


Ny = 40, Lx = 1, Ly = 1 y C = 0, 09.

continuacin se presentan las expresiones que sirven para calcular los parmetros
geomtricos de la malla representada en la Figura (3.4).

Figura 3.4: Representacin de una malla genrica.

xWi,j = xi xi1

dW P i,j =

xEi,j = xi+2 xi+1

dP E i,j =

yNi,j = yj+2 yj+1

dSP i,j =

ySi,j = yj yj1

dP N i,j =

1
2
1
2
1
2
1
2


xWi,j + xi,j

xEi,j + xi,j

ySi,j + yi,j

yNi,j + yi,j

(3.15)

xi,j = xi+1 xi
yi,j = yj+1 yj
Una vez generada la malla se debe especificar dnde colocar las incgnitas (campo
66

de velocidad, presin, temperatura, etc.) sobre la malla. Hay dos maneras de hacerlo. La primera de ellas es el Colocated Arrangement, que coloca todas las variables
en los centroides de los volmenes de control y de esta manera utiliza los mismos
volmenes de control para integrar las ecuaciones gobernantes. La segunda manera
es el Staggered Arrangement, que coloca la presin en los centroides de los volmenes de control y las velocidades en las caras de los volmenes de control y adems
perpendiculares a stas. Para obtener ms informacin sobre la ventaja/desventaja
de ambas maneras de colocacin de variables se puede consultar en [18].
De aqu en adelante se escoge el mtodo Staggered Arrangement. En la Figura (3.5) se puede ver un ejemplo de colocacin de las variables para el caso de tener
Nx = 2 y Ny = 2. A nivel de implementacin, se agrupan las velocidades y presiones

Figura 3.5: Representacin de un ejemplo de colocacin de las variables para el caso 2 2.


La cruz indica la ubicacin de las variables de presin y coincide con los centroides de
los volmenes de control para los nodos internos. La cruz negra indica que la presin est
definida en el interior del dominio mientras que la de color verde indica que se encuentra en
el contorno. Los vectores de velocidad de color naranja tambin estn en el contorno y por
tanto forman parte de las condiciones de contorno del problema.

discretas en tres matrices de diferentes dimensiones:

u0,0
u1,0

uNx ,0

u0,1

u
1,1
N
,1
x

U = .

..
..
..
..

.
.
.

u0,Ny +1 u1,Ny +1 uNx ,Ny +1


67

(3.16)

v0,0

v1,0

vNx +1,0

V =

v0,1
..
.

v1,1
..
.

..
.

vNx +1,1
..
.

v0,Ny v1,Ny vNx +1,Ny

p1,1
p2,1 pNx ,1

p1,2

p
2,2
N
,2
x

P = .
..
..
..
..
.
.
.

p1,Ny p2,Ny pNx ,Ny

(3.17)

(3.18)

Las presiones de contorno no se incluyen en la matriz P ya que la condicin de


contorno de la Ecuacin de Poisson (3.12) es de derivada de presin nula en la
direccin normal al contorno y por tanto, los valores de presin en el contorno no
intervienen en la resolucin del problema y en consecuencia no hay necesidad de
guardarlos.
A continuacin se va a desarrollar la funcin proyectora (ver la Figura (3.6)).
Dado un campo de velocidad compresible uc (que a nivel de implementacin sern
dos matrices Uc y Vc ), los parmetros del solver y la geometra de la malla, devuelve
un campo de velocidad incompresible ui (que a nivel de implementacin sern dos
matrices Ui y Vi ) y tambin la pseudopresin p que la hace posible (que a nivel de
implementacin ser una matriz P ). El campo de entrada de velocidad compresible ser la velocidad predictora up , mientras que el campo de salida de velocidad
incompresible ser la velocidad u(n+1) en el siguiente instante del tiempo.
Para resolver la Ecuacin (3.12) se aplica el mtodo de volmenes finitos a la
Ecuacin de Poisson. El mtodo consiste en la integracin de la Ecuacin (3.12)
sobre el volumen de control representado en la Figura (3.7).
Z
Z

pd =
up d

(3.19)

A continuacin se aplica el teorema de divergencia a los dos trminos de la Ecuacin (3.19):

p ndS =

up ndS

(3.20)

Seguidamente se dividen las caras del volumen de control en cuatro partes correspondientes a la cara este (e), oeste (w), norte (n) y sur (s), y la Ecuacin (3.20)

68

Figura 3.6: Representacin esquemtica de la funcin que, dado un campo de velocidad


compresible, proyecta en un espacio de velocidades incompresibles.

Figura 3.7: Representacin del volumen de control (punteado) para la evaluacin de la


ecuacin de continuidad.

se convierte en:
Z
e

Z
Z
Z
p
p
p
p
dS
dS +
dS
dS =
x
w xZ
n yZ
s y
Z
Z
= up dS
up dS + vp dS vp dS
e

69

(3.21)

Por un lado, se supone que la derivada de la pseudopresin en las caras es constante


y se aproxima mediante diferencias finitas y, por otro lado, se supone que las velocidades en las caras son constantes y se pueden extraer fuera de la integral obteniendo:
pP pW
pN pP
pP pS
pE pP
yi,j
yi,j +
xi,j
yi,j =
dP E i,j
dW P i,j
dP N i,j
dSP i,j
= upi,j yi,j upi1,j yi,j + vpi,j xi,j vpi,j1 xi,j

(3.22)

siendo pP = pi,j , pE = pi+1,j , pW = pi1,j , pN = pi,j+1 y pS = pi,j1 . A continuacin


se reordena la Ecuacin (3.22) y se obtiene:
aP (i, j) pP = aE (i, j) pE +aE (i, j) pE +aW (i, j) pW +aN (i, j) pN +aS (i, j) pS +bP (i, j)
(3.23)
siendo:
yi,j
dP E i,j
yi,j
aW (i, j) =
dW P i,j
xi,j
aN (i, j) =
dP N i,j
xi,j
aS (i, j) =
dSP i,j

(3.24a)

aE (i, j) =

(3.24b)
(3.24c)
(3.24d)

aP (i, j) = aE (i, j) + aW (i, j) + aN (i, j) + aS (i, j)

(3.24e)

bP (i, j) = upi,j yi,j upi1,j yi,j + vpi,j xi,j vpi,j1 xi,j

(3.24f)

Para resolver el sistema lineal A


p = b, representado mediante la Ecuacin (3.24),
se utilizan mtodos iterativos. En este trabajo se han implementado dos mtodos
iterativos. El primero de ellos es el mtodo Gauss-Sheidel con factor de relajacin,
representado en la Figura (3.8).
El segundo mtodo iterativo es el Conjugate Gradient [20], que se representa en
la Figura (3.9). Para poder aplicar el mtodo, la matriz A tiene que ser simtrica y
definida positiva.
Hace falta especificar que el sistema lineal tiene determinante nulo (detA = 0)
y por tanto es indeterminado y tiene infinitas soluciones. Para fijar una solucin, lo
que se hace es, o bien fijar la presin en un nodo interno del dominio (por ejemplo
p1,1 = 1), o bien multiplicar el coeficiente aP (i, j) de un nodo interno por una
constante (por ejemplo aP (1, 1) 1, 1aP (1, 1)). El primer mtodo para fijar la
70

Figura 3.8: Esquema de implementacin del solver Gauss-Sheidel

Figura 3.9: Esquema de implementacin del solver Conjugate Gradient

presin hace que la matriz A deje de ser simtrica, y por tanto hace que no se pueda
aplicar el mtodo Conjugate Gradient.
Una vez calculado el campo p, se proyecta la velocidad predictora mediante la
Ecuacin (3.11):
pE pP
dP E i,j
pN pP

dP N i,j

(n+1)

= upi,j

(3.25a)

(n+1)

= vpi,j

(3.25b)

ui,j
vi,j

Llegados a este punto queda pendiente el mtodo de clculo de la velocidad pre71

dictora. Para hacerlo se definen dos volmenes de control (ver Figuras (3.10 - 3.11))
segn la direccin de la componente de la velocidad, y se integra la Ecuacin (3.10)
sobre los respectivos volmenes de control.

Figura 3.10: Representacin del volumen de control (punteado) para la evaluacin del componente x de la ecuacin de momentum.

Z
up d =

(n)

(n)

d + t

 Z
Z

 


1
3
(n)
(n1)
d
d
(3.26)
R u
R u
2
2

Particularizando para las direcciones x e y se obtiene:


 Z
Z



 
t(n)
3
1
(n)
(n)
(n1)
upi,j = ui,j +
d
d
Rx u
Rx u
yi,j dP E i,j 2
2
 Z
Z

 


t(n)
1
3
(n)
vpi,j = vi,j +
Ry u(n) d
Ry u(n1) d
xi,j dP N i,j 2
2

(3.27a)
(3.27b)

La integral de Rx se evala utilizando otra vez el teorema de divergencia:


Z
Z
Z
Z
1
Rx (u) d = (uu) d +
ud =
(uu) ndS +
Re

Z
1
+
u ndS =
Re

ui,j ui1,j
ui+1,j ui,j
ui,j+1 ui,j
1
=

yi,j +
yi,j +
dP E i,j
Re
xi,j
xi+1,j
dP N i,j


ui,j ui,j1

dP E i,j uei,j Fei,j + uni,j Fni,j uwi,j Fwi,j usi,j Fsi,j (3.28)
dSP i,j
72

Figura 3.11: Representacin del volumen de control (punteado) para la evaluacin del componente y de la ecuacin de momentum.

siendo:
uei,j =
uwi,j =
uni,j =
usi,j =
Fei,j =
Fwi,j =
Fni,j =
Fsi,j =

1
(ui+1,j + ui,j )
2
1
(ui1,j + ui,j )
2
1
(ui,j+1 + ui,j )
2
1
(ui,j1 + ui,j )
2
1
(ui,j yi,j + ui+1,j yi,j )
2
1
(ui,j yi,j + ui1,j yi,j )
2
1
(vi,j xi,j + vi+1,j xi+1,j )
2
1
(vi,j1 xi,j + vi+1,j1 xi+1,j )
2

73

(3.29a)
(3.29b)
(3.29c)
(3.29d)
(3.29e)
(3.29f)
(3.29g)
(3.29h)

De manera anloga, se obtiene para Ry :


Z
Z
Z
Z
1
Ry (u) d = (vu) d +
vd =
(vu) ndS +
Re

Z
1
v ndS =
+
Re

vi,j vi,j1
vi,j+1 vi,j
vi+1,j vi,j
1
=

xi,j +
xi,j +
dP N i,j
Re
yi,j
yi,j+1
dP E i,j


vi,j vi1,j

dP N i,j vei,j Fei,j + vni,j Fni,j vwi,j Fwi,j vsi,j Fsi,j (3.30)
dW P i,j
siendo:
vei,j =
vwi,j =
vni,j =
vsi,j =
Fei,j =
Fwi,j =
Fni,j =
Fsi,j =

1
(vi+1,j + vi,j )
2
1
(vi1,j + vi,j )
2
1
(vi,j+1 + vi,j )
2
1
(vi,j1 + vi,j )
2
1
(ui,j yi,j + ui,j+1 yi,j+1 )
2
1
(ui1,j yi,j + ui1,j+1 yi,j+1 )
2
1
(vi,j xi,j + vi,j+1 xi,j )
2
1
(vi,j xi,j + vi,j1 xi,j )
2

(3.31a)
(3.31b)
(3.31c)
(3.31d)
(3.31e)
(3.31f)
(3.31g)
(3.31h)

El esquema de resolucin para problemas de conveccin forzada se representa en


la Figura (3.12). Para problemas de conveccin natural las ecuaciones gobernantes
cambian y son las siguientes:
(3.32a)

u=0
u
+ (u ) u = p + Pru + Ra PrT ey
t
T
+ (u ) T = T
t

(3.32b)
(3.32c)

y por tanto los trminos convectivo y difusivo de las ecuaciones de momentum y de


energa R (u) y Q (u, T ) se redefinen de la siguiente manera:
R (u) = Pru + Ra PrT ey (uu)
Q (u, T ) = T (uT )
74

(3.33a)
(3.33b)

Figura 3.12: Representacin del algoritmo de implementacin del mtodo de volmenes


finitos basado en Fractional Step Method para conveccin forzada.

El esquema de resolucin para problemas de conveccin natural se representa en la


Figura (3.13).
Para visualizar el flujo se utiliza el concepto de lnea de corriente, que es el lugar
geomtrico de los puntos tangentes al vector velocidad para un cierto instante de
tiempo. Para visualizar las lneas de corriente se trazan las curvas de nivel de la

75

Figura 3.13: Representacin del algoritmo de implementacin del mtodo de volmenes


finitos basado en Fractional Step Method para conveccin natural.

funcin de corriente , definida de la siguiente manera:

v=
x

u=

(3.34a)
(3.34b)

A partir de la definicin anterior se puede llegar a la siguiente expresin:


2 = ( u) ez
76

(3.35)

siendo ez el vector normal que apunta a la direccin z y que es perpendicular al campo


de velocidad u. Se puede utilizar el mtodo de volmenes finitos para integrar la
Ecuacin (3.35) sobre un volumen de control (en el cual el centroide es la interseccin
de las caras mediante las que se han discretizado el dominio de espacio) y obtener
as un sistema lineal de estilo aP P = aE E + aW W + aN N + aS S + bP . Sin
embargo, es ms fcil utilizar la definicin de la funcin de corriente y, mediante
diferencias finitas, obtener el valor de para cada nodo. La condicin de contorno
es de un valor fijo para un nodo del contorno, por ejemplo, 0,0 = 0.

77

Captulo 4

Casos prcticos
4.1.

Lid Driven Cavity

El flujo laminar incompresible en una cavidad cuya pared superior se mueve con
una velocidad uniforme, se ha utilizado multitud de veces para comprobar nuevos mtodos de simulacin de flujos a pesar de tener dos singularidades en las dos esquinas
superiores (ver la Figura (4.1) ).

Figura 4.1: Representacin esquemtica del problema de Driven Cavity.

La velocidad en la cara superior, U , es la que genera el movimiento dentro de la


cavidad formando un vrtice principal en el centro y otros ms pequeos en las esquinas, dependiendo del nmero de Reynolds. Al tratarse de un problema de conveccin
forzada, el nmero de Reynolds es el nico parmetro adimensional que caracteriza la
dinmica del problema (representado mediante el campo de velocidad adimensional).
78

Como solucin de referencia se utilizar el trabajo de Ghia [19], el cual proporciona,


entre otras cosas, los perfiles de velocidad horizontal en funcin de la coordenada y
fijando x = 0, 5, y los perfiles de velocidad vertical en funcin de la coordenada x
fijando y = 0, 5, para diferentes nmeros de Reynolds.
Para cuantificar la desviacin de la solucin de referencia (error) se utilizar el
mdulo L2 del error relativo, que est definido de la siguiente manera para una
variable genrica u:

v

2
uP
u q
ref
u n=1 un un
eu = u
t Pq  ref 2
n=1 un

(4.1)

siendo u la variable calculada, uref la variable de referencia (el valor exacto) y q la


cantidad de puntos que se van a comparar.
Para definir el estado estacionario se introduce el concepto de error estacionario
definido de la siguiente manera:
(
est = min

u(n) u(n1) v (n) v (n1)


,
t(n)
t(n)

)
(4.2)

Se utiliza est como condicin para saber cuando parar la simulacin, y entonces se
dice que se ha alcanzado el estado estacionario con un error est .
Para caracterizar los resultados se han utilizado los siguientes indicadores: tiempo
de computacin total tcomp en segundos, tiempo de computacin promedio por ciclo
tciclo en segundos, tiempo de simulacin total tsim , nmero de ciclos n, norma L2 del
error relativo ( %) de la componente horizontal de la velocidad eu y norma L2 del
error relativo ( %) de la componente vertical de la velocidad ev .
FVM
Para estudiar el problema mediante el mtodo de Volmenes Finitos se establecen
U = 1 y L = 1. Los parmetros Cconv y Cvisc son muy importantes ya que de
ellos depende si la simulacin converge o diverge. En [21] se recomienda utilizar
Cconv = 0, 35 y Cvisc = 0, 2, sin embargo se ha comprobado que utilizando dichos
valores la simulacin diverge y en consecuencia se ha aplicado un factor de 0, 4 a
dichos valores resultando finalmente en Cconv = 0, 14 y Cvisc = 0, 08. Se ha escogido
el solver Gauss-Sheidel con factor de relajacin de 1, 1. La simulacin parte de una
condicin inicial de velocidad nula en los nodos interiores y, cumpliendo la condicin
79

de contorno en los nodos de contorno (hay que tener en cuenta que el campo de
velocidad inicial debe cumplir la condicin de incompresibilidad).
Los otros principales parmetros de simulacin son el tamao de discretizacin
N (N x = N y), el error del solver sol y el error estacionario est .
Para estudiar el efecto del error del solver y del error estacionario se ha fijado el
tamao de discretizacin uniforme en N = 40, y se han probado varias combinaciones
de los dos parmetros mencionados para el nmero de Reynolds de Re = 100.
sol

est

tciclo

tcomp

tsim

eu ( %)

ev ( %)

101

109

0,002633

19,647489

28,352834

7461

15,80969121

61,28635407

102

109

0,002624

19,575273

28,352834

7461

15,80969121

61,28635407

103

109

0,002626

17,166172

25,155441

6537

8,54051378

24,58180936

104

109

0,002626

18,543157

27,008739

7062

3,300697041

8,061219044

105

109

0,002644

19,466036

28,039319

7362

0,667783351

2,792519723

106

109

0,00272

21,70997

30,372852

7982

0,37264222

2,714343715

107

109

0,002477

25,139456

31,021903

8154

0,384320466

2,80524605

101

106

0,002631

11,982813

17,331499

4554

15,80969121

61,28635407

102

106

0,002635

11,997843

17,331499

4554

15,80969121

61,28635407

103

106

0,002643

11,324689

16,565296

4300

8,539982951

24,58180936

104

106

0,002633

12,151368

17,691901

4615

3,300697041

8,061219044

105

106

0,002655

12,997901

18,683995

4896

0,667783351

2,792519723

106

106

0,002766

15,152452

20,879791

5478

0,37264222

2,714343715

107

106

0,003299

18,588529

21,459131

5634

0,384320466

2,80524605

101

103

0,002631

4,443024

6,469348

1689

15,89037728

61,80086129

102

103

0,002643

4,463317

6,569348

1689

15,89037728

61,80086129

103

103

0,002631

5,300961

7,790762

2015

8,543698757

24,81451933

104

103

0,002471

5,725661

8,382573

2170

3,335731779

8,326653861

105

103

0,002683

6,379051

9,13132

2378

0,660882569

2,79979191

106

103

0,00294

7,055221

9,210349

2400

0,385382125

2,294374929

107

103

0,004185

10,114714

9,273949

2417

0,394937053

2,338008049

Tabla 4.1: Combinaciones del error del solver y del error estacionario para Re = 100 y
N = 40.

Observando los datos expuestos en la Tabla (4.1) y representados en la Figura (4.2), se llega a la conclusin de que el error del solver es un parmetro importante
ya que de l depende la calidad de la solucin obtenida. Cuanto ms pequeo es el
error del solver, menor es el error en los perfiles de la velocidad pero mayor es el tiempo de computacin total. Por otro lado, se observa que el error estacionario no vara
mucho la calidad de la solucin, sin embargo s que aumenta el tiempo computacin
considerablemente.

80

Figura 4.2: Tiempo de computacin total, norma L2 del error relativo de la componente
horizontal y vertical de la velocidad en funcin del error de solver y error en estacionario
para N = 40 y Re = 100.

LBM
En el mtodo de Lattice Boltzmann, al tener x = 1, L = xN = N (siendo
N la cantidad de nodos en cada cara), el nmero de Reynolds depende del tamao
de la discretizacin. Por otro lado, como se ha visto anteriormente, para mantener el
nmero de Mach pequeo la velocidad ms grande del problema debe ser pequea,
luego U no puede ser igual a 1. Para escoger la frecuencia de relajacin adimensional,
sta debe ser inferior a 2 (en la prctica, a 1, 8) para que la viscosidad cinemtica no
sea negativa (segn la Ecuacin (2.76)). En la Figura (4.3) se representa la frecuencia
de relajacin adimensional =

1
N
3 URe
+ 12

en funcin de la velocidad U y el tamao de

la discretizacin N para Re = 100 y Re = 1000, respectivamente.


Se puede ver que a mayor nmero de Reynolds el tamao de la discretizacin debe
aumentar inevitablemente para mantener la velocidad U pequea y la frecuencia de
relajacin adimensional inferior a 1, 8.
Respecto a la condicin de contorno se han utilizado la condicin de contorno
de Zou & He para la cara superior y BB Full-Way para el resto de las caras. La
condicin inicial es de velocidad nula y densidad de masa de valor 0 = 1, 0.
81

Figura 4.3: Representacin de la frecuencia de relajacin adimensional en funcin de la


velocidad U y el tamao de la discretizacin N para Re = 100 y Re = 1000.

Los parmetros ms importantes son la frecuencia de relajacin adimensional


y el error estacionario est . Para estudiar el efecto de dichos parmetros, se fijan
el nmero de Reynolds a Re = 100 y el tamao de discretizacin a N = 40. Los
resultados se exponen en la Tabla (4.2) y se representan en la Figura (4.4).
est

tciclo

106

0,625

0,8

DIVER.

106

0,416666667

0,001147

106

0,340909091

1,1

0,001138

106

0,277777778

1,2

0,001137

106

0,224358974

1,3

0,001139

106

0,178571429

1,4

0,001138

106

0,138888889

1,5

106

0,104166667

106
106

tcomp

tsim

eu ( %)

ev ( %)

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

4,348877

39,48958333

3791

2,890275506

21,7008184

4,839645

36,25568182

4254

2,471456865

19,67257395

5,602876

34,21527778

4927

2,229331864

18,49438162

6,544935

32,1786859

5737

2,08170854

17,77796327

7,59971

29,81696429

6679

1,99814116

17,37728297

0,001139

9,134651

27,85416667

8022

1,96644882

17,22635278

1,6

0,00114

11,281971

25,77604167

9898

1,984753228

17,28013337

0,073529412

1,7

0,001132

14,078148

22,86764706

12440

2,082624986

17,45464319

0,046296296

1,8

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

103

0,625

0,8

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

103

0,416666667

0,001171

2,010088

17,88541667

1717

2,884447093

21,7285509

103

0,340909091

1,1

0,001155

2,29768

16,96022727

1990

2,463608804

19,69523566

103

0,277777778

1,2

0,001148

2,672986

16,17361111

2329

2,240882254

18,48678414

103

0,224358974

1,3

0,001146

3,133317

15,3349359

2734

2,093856382

17,77753028

103

0,178571429

1,4

0,001149

3,606782

14,01339286

3139

2,014377518

17,39035971

103

0,138888889

1,5

0,001153

4,24113

12,76736111

3677

1,989030229

17,26396025

103

0,104166667

1,6

0,001135

5,08511

11,671875

4482

2,017394562

17,3589108

103

0,073529412

1,7

0,001133

6,364865

10,33088235

5620

2,134216206

17,65039618

103

0,046296296

1,8

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

DIVER.

Tabla 4.2: Efecto de variacin de la frecuencia de relajacin adimensional y del error estacionario para Re = 100 y N = 40.

82

Figura 4.4: Tiempo de computacin total, norma L2 del error relativo de la componente
horizontal y vertical de la velocidad en funcin del error de solver y error en estacionario
para N = 40, Re = 100 con est = 103 y est = 106 .

Examinando los datos se concluye que para valores pequeos de la velocidad


U es grande y se cometen errores debidos a los efectos de compresibilidad, los cuales
pueden crear inestabilidades. Para valores grandes de la viscosidad cinemtica
tiende a 0 y crea problemas de inestabilidad. Se observa que el valor ptimo de
para obtener la mejor calidad de la solucin (menor error) es, para este caso,
= 1, 5. A menor error estacionario ms tiempo de computacin se requiere para
llegar al estado estacionario. El aumento del tiempo de computacin se hace ms
notable para valores grandes de . Para valores pequeos de el error estacionario
no influye mucho en el error en los perfiles de velocidad, sin embargo, para valores
grandes de el error estacionario s que puede afectar considerablemente al valor del
error en los perfiles de velocidad.
Comparacin de FVM y LBM
Al tratarse de mtodos muy diferentes, la tarea de comparacin se hace muy difcil
ya que en ambos mtodos intervienen muchos parmetros. Lo que se ha hecho es un
estudio de cmo varan los indicadores definidos anteriormente al ir aumentando el
83

tamao de la discretizacin (para un mismo error estacionario). La comparacin se


ha realizado para Re = 100 y para una malla uniforme de N = 10 hasta N = 110
utilizando para FVM sol = 106 y est = 106 ; y para LBM est = 106 y 1, 6.
Los resultados se exponen en la Tabla (4.3) y se representan en la Figura (4.5).
Tipo

tciclo

tcomp

tsim

eu ( %)

ev ( %)

LBM

10

0,000063

0,337067

224,3488

5393

12,61547474

58,10955721

FVM

10

0,000198

0,199607

22,117957

1008

4,814622412

17,14236228

LBM

20

0,000272

3,094082

118,2168

11367

3,923162064

34,00134626

FVM

20

0,00073

1,831419

21,1398

2508

1,036178936

3,759720564

LBM

30

0,000619

8,655016

64,7462

13974

2,654125664

23,36469975

FVM

30

0,0016

6,474764

21,215062

4046

0,291425326

2,496178112

LBM

40

0,001131

11,193615

25,7348

9898

1,984971688

17,28068926

FVM

40

0,002768

15,165121

20,879791

5478

0,37264222

2,714343715
13,23095379

LBM

50

0,001799

26,375467

24,3439

14665

1,567776546

FVM

50

0,004286

28,153579

19,659997

6568

0,247897317

2,79979191

LBM

60

0,002655

53,449234

23,15295

20133

1,27523334

10,48754794

FVM

60

0,005535

52,66939

19,222222

8650

0,286117032

2,928873225

LBM

70

0,003662

95,066817

22,25142857

25960

1,071144715

8,470193284

FVM

70

0,00818

97,615392

19,484082

11934

0,280277909

2,961598065

LBM

80

0,004863

161,953105

21,64695

33303

0,926211175

6,964638409

FVM

80

0,009681

168,143565

20,085

16068

0,265945516

3,085225241

LBM

90

0,006035

247,970333

21,45811111

41090

0,813810508

5,810444777

FVM

90

0,01394

264,447754

18,735802

18970

0,221355848

2,814336283

LBM

100

0,007504

381,764157

21,36876

50878

0,729284732

4,894698619

FVM

100

0,016298

386,337645

18,964

23705

0,210208432

2,943417598

LBM

110

0,008954

555,94125

21,44789091

62086

0,665483159

4,167879895

FVM

110

0,020029

577,129717

19,050579

28814

0,205961797

2,948871739

Tabla 4.3: Comparacin de LBM y FVM para diferentes tamaos de discretizacin.

Analizando los datos se ve claramente que el tiempo de computacin total es


prcticamente igual en ambos mtodos para un mismo tamao de discretizacin y
error estacionario. Por otro lado, la diferencia en el tiempo de computacin promedio
por ciclo aumenta de manera proporcional a cN 2 dando ventaja al LBM. La calidad
de la solucin va mejorando a medida que aumenta el tamao de la discretizacin.
FVM proporciona resultados con menor porcentaje de error en los perfiles de velocidad. Por ltimo, las ltimas dos grficas muestran los errores eu y ev en funcin del
tiempo de computacin total. En ellas se puede ver que para un mismo tiempo de
computacin FVM proporciona resultados con menor error que LBM.
A continuacin se van a comparar los resultados obtenidos para Re = 1000. Para
LBM se escogen los siguientes parmetros: N = 150, = 1, 5 y est = 6 104 ;
84

Figura 4.5: Comparacin de LBM y FVM para diferentes tamaos de discretizacin.

85

2.5

0.2
LBM
FVM

LBM Componente u
LBM Componente v
FVM Componente u
FVM Componente v

0.15

0.1

2.45

Velocidad en el centro

Pression en el centro

0.05

2.4

0.05

0.1
2.35

0.15

0.2

2.3

0.5

1.5

2.5

3.5

Ciclo

0.25

4.5

0.5

1.5

2.5

3.5

Ciclo

x 10

4.5
4

x 10

Figura 4.6: Comparacin de LBM y FVM para diferentes tamaos de discretizacin.


1

0.4

0.9

0.3

0.8

0.2
Solucin de referencia
LBM
FVM

0.7

0.1

0.6

0.5

0.1

Solucin de referencia
LBM
FVM

0.4

0.2

0.3

0.3

0.2

0.4

0.1

0.5

0
0.4

0.2

0.2

0.4

0.6

0.8

0.6

0.1

0.2

0.3

0.4

0.5
x

0.6

0.7

0.8

0.9

Figura 4.7: Comparacin de LBM y FVM para diferentes tamaos de discretizacin.

mientras que para FVM se escogen los siguientes: N = 150, sol = 108 (Conjugate
Gradient) y est = 6 104 . Se obtienen los siguientes resultados: para LBM tcomp =
672, 40s, eu = 2, 75017 % y ev = 12, 61961 % ; para FVM tcomp = 6463, 68s, eu =
0, 47886 % y ev = 4, 21449 %. Los resultados se muestran en las Figuras (4.6-4.8).
Analizando de forma cualitativa se observa que los resultados coinciden de manera
considerable entre LBM (lnea continua) y FVM (lnea discontinua). En la grfica del
campo de presin se observa que LBM tiene fluctuaciones de presin considerables en
las dos singularidades (las dos esquinas superiores) mientras que FVM proporciona
una solucin ms suave. Los perfiles de velocidad coinciden de manera notable con
la solucin de referencia en ambos mtodos.

86

Figura 4.8: Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para diferentes
tamaos de discretizacin.

87

4.2.

Differentially Heated Cavity

Se trata de una cavidad cuadrada cerrada de lado L en la que la pared izquierda


de la cavidad se mantiene isotrmica a temperatura Thot mientras que la pared de
la derecha se mantiene a temperatura Tcold . La diferencia de temperatura de ambas
paredes se denota T = Thot Tcold . Las paredes superior e inferior son adiabticas y
por tanto no permiten la transferencia de calor a travs de ellas. El fluido se calienta
a lo largo de la pared izquierda y, por el efecto de la flotacin, va subiendo y cuando
llega a la pared derecha se enfra y baja y de esta forma hay una circulacin de
fluido dentro de la cavidad. Como ya se ha dicho anteriormente, los dos parmetros
importantes en este tipo de problemas son el nmero de Prandtl y el nmero de
Rayleigh definidos en el apartado de adimensionalizacin.

Figura 4.9: Representacin esquemtica del problema de Heated Cavity.

El nmero de Nusselt es el flujo de calor adimensional. El nmero de Nusselt


local depende de la posicin y se calcula de la siguiente manera:
Nux y =

T
+ u T
x

(4.3)

siendo T y u la temperatura y la velocidad horizontal adimensional. Se define el


nmero de Nusselt Nux como:
Nux =

y =1

y =0

Nux y dy

(4.4)

Nux debe de ser independiente de la posicin x ya que el flujo de calor total para
una seccin que est ubicada en la posicin x es la misma, sin embargo, debido a
los errores en la simulacin puede haber variacin.
88


El nmero de Nusselt medio Nu:
=
Nu

x =1

x =0

Nux dx

(4.5)

Como solucin de referencia se utilizar el trabajo de de Vahl [24] el cul proporciona, entre otras cosas, la velocidad horizontal mxima umax y su posicin y
(x = 0, 5), la velocidad vertical mxima vmax y su posicin x (y = 0, 5), la funcin
el
de corriente en el centro de la cavidad centro , el nmero de Nusselt medio Nu,

nmero de Nusselt local mximo en la pared caliente Nuhot


max y su posicin y y por

ltimo, el nmero de Nusselt local mnimo en la pared caliente Nuhot


min y su posicin
y.
Para caracterizar los resultados se han utilizado los siguientes indicadores: tiempo de computacin total tcomp en segundos, tiempo de simulacin total tsim , y las
variables que tienen soluciones de referencia y sus respectivos errores relativos ( %).
Para definir el estado estacionario se utilizar el error estacionario est definido
en la Ecuacin (4.2).
FVM
Para que los resultados sean adimensionales se toman L = 1, Thot = 1 y Tcold =
0 (T = 1). Para adimensionalizar el campo de velocidad se utiliza la velocidad
caracterstica U0 = a/L0 siendo L0 = L = 1. Los parmetros Cconv y Cvisc son
los mismos que en caso de Driven Cavity, Cconv = 0, 14 y Cvisc = 0, 08. En este
caso se han utilizado dos solvers: por un lado el Gauss-Sheidel (GS) con factor de
relajacin de 1, 1, y por otro lado el Conjugate Gradient (CG). La simulacin parte
de una condicin inicial de velocidad nula y temperatura inicial de 0, 5 en los nodos
interiores.
LBM
Para que los resultados sean adimensionales se toman L = N , Thot = 1 y Tcold =
0 (T = 1). Para adimensionalizar el campo de velocidad se utiliza la velocidad
caracterstica U0 = a/N . En LBM hace falta definir otra velocidad caracterstica

U = gT L para calcular el nmero de Mach y mantenerlo inferior a un cierto


valor para que los errores debido a los efectos de la compresibilidad sean menores.
La relacin entre U0 y U es la siguiente:

U = U0 PrRaT
89

(4.6)

Figura 4.10: Representacin de la frecuencia de relajacin adimensional en funcin de la


velocidad U y el tamao de la discretizacin N para Ra = 103 , Ra = 104 , Ra = 105 y
Ra = 106 .

El procedimiento para calcular todos los parmetros es, dado un valor para la viscosidad cinemtica , calcular el trmino g de la definicin del nmero de Rayleigh,
posteriormente calcular la velocidad U , calcular U0 y por ltimo calcular las frecuencias de relajacin f y g . En [23] se propone otra manera para calcular el valor
de la velocidad caracterstica U utilizando la definicin del nmero de Knudsen. Sin
embargo, los resultados obtenidos no son coherentes ya que proporcionan valores de
viscosidad cinemtica muy pequeos, los cuales hacen que las frecuencias de relajacin se acerquen mucho a 2 y por tanto introduzca inestabilidades a la hora de hacer
la simulacin.
En la Figura (4.10) se representa la frecuencia de relajacin adimensional f =
3U N

q1

Pr
+ 21
Ra

en funcin de la velocidad U y el tamao de la discretizacin N para

Ra = 103 , Ra = 104 , Ra = 105 y Ra = 106 , respectivamente.


Respecto a la condicin de contorno, se han utilizado la condicin de contorno BB
90

Full-Way para la velocidad y condicin adiabtica y isotrmica para la temperatura


(ver apartado Condicin de contorno para modelo trmico). La condicin inicial es de
velocidad nula, densidad de masa de valor 0 = 1, 0 y temperatura de valor T = 0, 5.
Se han hecho simulaciones para diferentes nmeros de Rayleigh en el caso de
tener aire en la cavidad (Pr = 0, 71) y los resultados obtenidos se muestran en las
Tablas (4.4-4.7) para Ra = 103 -106 , respectivamente.
1

250
LBM Ra=1E3
LBM Ra=1E4
LBM Ra=1E5
LBM Ra=1E6
FVM Ra=1E3
FVM Ra=1E4
FVM Ra=1E5
FVM Ra=1E6

0.9

0.8

0.7

150

100

50

0.5

0.6

0.4

50

0.3

100

0.2

150

0.1

200

0
80

LBM Ra=1E3
LBM Ra=1E4
LBM Ra=1E5
LBM Ra=1E6
FVM Ra=1E3
FVM Ra=1E4
FVM Ra=1E5
FVM Ra=1E6

200

60

40

20

0
u

20

40

60

250

80

0.1

0.2

0.3

0.4

0.5
x

0.6

0.7

0.8

0.9

Figura 4.11: Perfiles de velocidad horizontal y vertical para diferentes nmeros de Rayleigh.

1
LBM Ra=1E3
LBM Ra=1E4
LBM Ra=1E5
LBM Ra=1E6
FVM Ra=1E3
FVM Ra=1E4
FVM Ra=1E5
FVM Ra=1E6

0.9

0.8

0.7

0.6

0.5

0.4

0.3

0.2

0.1

0.1

0.2

0.3

0.4

0.5
x

0.6

0.7

0.8

0.9

Figura 4.12: Perfil de temperatura para diferentes nmeros de Rayleigh.

Analizando los resultados, se llega a la conclusin de que LBM es apto para hacer
simulaciones de conveccin natural para nmeros de Rayleigh relativamente altos.
Sin embargo, respecto a la precisin, se ve claramente la superioridad de FVM, ya que
proporciona resultados que son ms concordantes con las soluciones de referencia. A
medida que se aumenta el nmero de Rayleigh los errores tambin aumentan si se
mantiene el mismo tamao de discretizacin.

91

Figura 4.13: Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para el contorno de la velocidad horizontal para diferentes nmeros de Rayleigh.

92

93

40

40

40

40

40

40

100

40

80

Tipo

Ref.

LBM

LBM

LBM

LBM

LBM

LBM

LBM

FVM

FVM

108

108

sol

0,03

0,11

0,09

0,07

0,05

0,03

0,01

104

104

104

104

104

104

104

104

104

est

568

128

1596

14

15

18

23

38

0,576

0,553

0,509

0,632

0,595

0,538

0,495

0,481

DIVER.

tsim

18413

7859

120435

6630

7507

8728

11242

18227

DIVER.

1,118(0,036 %)

1,119(0,104 %)

1,123(0,488 %)

1,105(1,206 %)

1,111(0,582 %)

1,118(0,031 %)

1,125(0,634 %)

1,132(1,226 %)

DIVER.

1,118(0,000 %)

Nu

0,690(0,290 %)
y =0,9917

y =0,0917

y =0,9875
1,509(0,284 %)

0,689(0,467 %)
y =0,0875

y =0,9899

1,513(0,512 %)

0,695(0,362 %)

y =0,0000

y =1,0000

1,520(1,016 %)

0,702(1,410 %)

y =0,0000

y =1,0000

1,485(1,344 %)

0,702(1,391 %)

y =0,0000

y =1,0000

1,499(0,375 %)

0,701(1,361 %)

y =0,0000

y =1,0000

1,514(0,602 %)

0,702(1,421 %)

y =0,0000

y =1,0000

y =0,0000
1,529(1,573 %)

0,703(1,538 %)

1,543(2,515 %)

DIVER.

y =1,0000

DIVER.

0,692(0,000 %)

y =0,0920

Nuhot
min

1,505(0,000 %)

Nuhot
max

Tabla 4.4: Comparacin de LBM y FVM para Ra = 103 .

DIVER.

tcomp

y =0,8083

3,654(0,134 %)

y =0,8125

3,658(0,236 %)

y =0,8182

3,618(0,859 %)

y =0,8205

3,501(4,067 %)

y =0,8205

3,519(3,555 %)

y =0,8205

3,537(3,063 %)

y =0,8205

3,555(2,589 %)

y =0,8205

3,571(2,133 %)

DIVER.

y =0,8130

3,649(0,000 %)

umax

x =0,1750

3,712(0,412 %)

x =0,1875

3,710(0,340 %)

x =0,1818

3,664(0,883 %)

x =0,1795

3,563(3,630 %)

x =0,1795

3,576(3,261 %)

x =0,1795

3,591(2,880 %)

x =0,1795

3,605(2,488 %)

x =0,1795

3,620(2,083 %)

DIVER.

x =0,1780

3,697(0,000 %)

vmax

1,177 (0,273 %)

1,180 (0,545 %)

1,133 (3,521 %)

1,130 (3,789 %)

1,133 (3,521 %)

1,136 (3,224 %)

1,140 (2,898 %)

1,144 (2,541 %)

DIVER.

1,174(0,000 %)

centro

94

60

60

LBM

FVM

40

LBM

40

Ref.

FVM

Tipo

108

108

sol

0,03

0,03

104

104
995

198

184

21317

9408

38824

18868

2,251(0,375 %)

2,260(0,742 %)

2,238(0,211 %)

2,299(2,497 %)

2,243(0,000 %)

Nu

0,582(0,750 %)
y =0,9917

y =0,1417

y =0,9875

3,556(0,787 %)

0,579(1,129 %)

y =0,1375

y =1,0000

3,585(1,616 %)

y =0,0000

0,581(0,781 %)

y =1,0000

3,629(2,865 %)

0,578(1,444 %)

y =0,0000

y =1,0000

y =0,1430
3,723(5,528 %)

0,586(0,000 %)

Nuhot
min

3,528(0,000 %)

Nuhot
max

Tabla 4.5: Comparacin de LBM y FVM para Ra = 104 .

0,667

0,663

0,456

0,498

39

104

104

tsim

tcomp

est

umax

y =0,8250

16,142(0,225 %)

y =0,8125

16,089(0,549 %)

y =0,8305

16,343(1,019 %)

y =0,8205

16,511(2,057 %)

y =0,8230

16,178(0,000 %)

vmax

x =0,1250

19,676(0,301 %)

x =0,1125

19,756(0,707 %)

x =0,1186

19,830(1,087 %)

x =0,1282

19,922(1,556 %)

x =0,1190

19,617(0,000 %)

centro

5,080 (0,183 %)

5,089 (0,345 %)

5,136 (1,272 %)

5,185 (2,254 %)

5,071(0,000 %)

95

40

60

FVM

60

LBM

FVM

40

LBM

80

Ref.

LBM

Tipo

108

108

sol

0,03

0,03

0,03

104

104

104

104

104

est

1104

285

563

200

46

tcomp

17509

11491

66250

41946

21816

4,567(1,063 %)

4,623(2,305 %)

4,661(3,132 %)

4,696(3,919 %)

4,748(5,066 %)

4,519(0,000 %)

Nu

0,720(1,226 %)
y =0,9917

y =0,0750

y =0,9875

7,925(2,691 %)

0,713(2,174 %)

y =0,0625

y =1,0000

8,168(5,846 %)

0,685(5,998 %)

y =0,0000

y =1,0000

8,215(6,450 %)

0,654(10,354 %)

y =0,0000

y =1,0000

8,368(8,441 %)

0,556(23,788 %)

y =0,0000

y =1,0000

8,336(8,018 %)

0,729(0,000 %)

y =0,0810

Nuhot
min

7,717(0,000 %)

Nuhot
max

Tabla 4.6: Comparacin de LBM y FVM para Ra = 105 .

0,546

0,578

0,437

0,492

0,576

tsim

y =0,8583

34,268(1,330 %)

y =0,8625

34,015(2,058 %)

y =0,8481

35,815(3,125 %)

y =0,8475

36,374(4,733 %)

y =0,8462

37,676(8,482 %)

y =0,8550

34,730(0,000 %)

umax

x =0,0583

68,550(0,058 %)

x =0,0625

69,324(1,070 %)

x =0,0633

70,626(2,969 %)

x =0,0678

71,659(4,475 %)

x =0,0769

72,937(6,337 %)

x =0,0660

68,590(0,000 %)

vmax

9,159 (0,527 %)

9,213 (1,116 %)

9,480 (4,054 %)

9,680 (6,246 %)

10,207 (12,029 %)

9,111(0,000 %)

centro

96

60

200

LBM

FVM

100

LBM

40

Ref.

FVM

Tipo

108

108

sol

0,03

0,03

104

104
2608

614

20630

31877

21017

320463

105042

9,102(3,427 %)

9,427(7,120 %)

9,036(2,676 %)

9,119(3,623 %)

8,800(0,000 %)

Nu

0,956(3,304 %)
y =0,9917

y =0,0250

y =0,9875

19,388(8,162 %)

0,928(6,137 %)

y =0,0375

y =0,9950

20,384(13,716 %)

y =0,0000

0,793(19,783 %)

y =0,9899

18,582(3,668 %)

0,466(52,852 %)

y =0,0000

y =1,0000

y =0,0378
19,536(8,986 %)

0,989(0,000 %)

Nuhot
min

17,925(0,000 %)

Nuhot
max

Tabla 4.7: Comparacin de LBM y FVM para Ra = 106 .

0,336

0,327

0,339

0,444

1356

104

104

tsim

tcomp

est

umax

y =0,8417

65,121(0,760 %)

y =0,8375

65,484(1,321 %)

y =0,8543

67,710(4,766 %)

y =0,8586

73,656(13,966 %)

y =0,8500

64,630(0,000 %)

vmax

x =0,0417

219,985(0,285 %)

x =0,0375

224,246(2,228 %)

x =0,0402

227,072(3,516 %)

x =0,0404

238,920(8,917 %)

x =0,0379

219,360(0,000 %)

centro

16,695 (2,298 %)

17,015 (4,260 %)

17,048 (4,462 %)

18,328 (12,306 %)

16,320(0,000 %)

Figura 4.14: Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para el contorno de la velocidad vertical para diferentes nmeros de Rayleigh.

97

Figura 4.15: Comparacin de LBM (lnea continua) y FVM (lnea discontinua) para la
funcin de corriente para diferentes nmeros de Rayleigh.

98

Captulo 5

Conclusiones
A continuacin se listan las conclusiones principales.
La teora sobre la que se basa LBM resulta ser ms complicada y laboriosa que
la de FVM.
La implementacin prctica de LBM es ms fcil que en FVM.
A nivel de implementacin, en LBM es ms fcil incorporar fronteras dentro
del dominio que en FVM.
LBM puede ofrecer soluciones precisas a problemas de dinmica de fluidos.
Sin embargo, hay restricciones que se deben considerar. La ms importante de
ellas es mantener el nmero de Mach pequeo, con lo cual no es posible hacer
simulaciones compresibles.
Para un mismo tamao de discretizacin y error estacionario, FVM requiere
un tiempo de computacin similar a LBM. Sin embargo, el error en la solucin
del FVM es ms pequeo que en LBM.

99

Captulo 6

Impacto medioambiental
El estudio apenas ha tenido impacto ambiental alguno ya que tanto la energa
elctrica consumida por los ordenadores, como los recursos fsicos utilizados (el papel,
CD, etc.) son de cantidad reducida. Sin embargo, el estudio hecho puede llegar a tener
efectos favorables (o menos desfavorables) para el medio ambiente, en el sentido de
que el trabajo puede llegar a motivar a otros a hacer un estudio ms profundo
para mejorar las herramientas de simulacin de dinmica de fluidos y que stas
puedan llegar a disear mquinas que sean ms eficientes enrgicamente y, por tanto,
respecten ms el medio ambiente.

100

Captulo 7

Presupuesto
Segn los crditos que posee un Proyecto de Final de Carrera en la Escuela Tcnica Superior de Ingenieras Industrial y Aeronutica de Terrassa de la Universidad
Politcnica de Catalunya, las horas de trabajo correspondientes son 338. Aun as,
se han aadido 300 horas ms de dedicacin extra. Suponiendo que el sueldo de un
ingeniero becario es de 10 /hora el coste personal asciende a 6380 .
Para la realizacin del estudio ha sido necesario cierto material informtico. En
concreto, se ha utilizado un ordenador personal de coste de 1500 .
Finalmente, se debe de tener en cuenta el coste del software empleado. Se han
utilizado el sistema operativo de Mac OS incorporado en el porttil, el software de
programacin gratuito NetBeans, el software Matlab para representar los resultados
y LaTeX para escribir la memoria. Matlab (versin de estudiante) tiene un coste de
80 euros mientras que la distribucin de LaTeX utilizado es gratuito.
El coste total del trabajo asciende a 7960 .

101

Captulo 8

Futuros estudios
Debido a que el tiempo que se ha dedicado para realizar este proyecto es limitado, hay muchos aspectos que han quedado fuera del alcance pero que son muy
importantes de estudiar. A continuacin se van a listar estudios futuros posibles.
Estudio ms profundo sobre los mtodos de implementacin optimizados de
LBM.
Utilizacin del modelo MRT.
Utilizacin del modelo Extended Lattice Boltzmann Method (ELBE) que introduce modelos de turbulencia y hace posible simular problemas con nmero
de Reynolds o Rayleigh altos.
Extensin a casos 3D.
Geometras curvas.
Implementacin paralela.

102

Bibliografa
[1] Ricardo Brito Lpez, Teora cintica de gases de red, Tesis Doctoral, 2001.
[2] Leopoldo Garca-Coln Scherer, La fsica de los procesos irreversibles.
[3] Kerson Huang, Statical Mechanics (second edition), Massachusetts Institute
of Technology, 1987.
[4] Sauro Succi, The Lattice Boltzmann Equation for Fluid Dynamics and Beyond,
Oxford University Press, 2001.
[5] Gilberto Medeiros Kremer, An Introduction to the Boltzmann Equation and
Transport Processes in Gases, Springer, 2010.
[6] Dieter A. Wolf-Gladrow, Lattice-Gas Cellular Automata and Lattice Boltzmann Models An Introduction, Springer, 2005.
[7] P. L. Bhatnagar, E. P. Gross, and M. Krook, A model for collision processes
in gas. I. Small amplitude processes in charged and neutral one-component systems, Phys. Rev., 94 (1954), pp. 511525.
[8] X. He and L.-S. Luo. Theory of the lattice Boltzmann method: from Boltzmann
equation to the lattice Boltzmann equation. Physical Review E, 56:6811, 1997.
[9] Q. Zou and X. He, On Pressure and Velocity Flow Boundary Conditions and
Bounceback for the Lattice Boltzmann BGK Model, Physics of Fluids, Vol. 9,
1997, pp. 1591-1598. doi:10.1063/1.869307.
[10] Chih-Fung Ho, Cheng Chang, Kuen-Hau Lin and Chao-An Lin, Consistent
Boundary Conditions for 2D and 3D Lattice Boltzmann Simulations, CMES
(Computer Modeling in Engineering & Sciences), vol.44, no. 2, pp. 137-155,
2009.
103

[11] Inamuro T, Yoshino M, Ogino F. A non-slip boundary condition for lattice


Boltzmann simulations. Phys Fluids 1995;7:292830.
[12] Chih-Hao Liu, Kuen-Hau Lin, Hao-Chueh Mai, Chao-An Lin, Thermal boundary conditions for thermal lattice Boltzmann simulations, Computers &
Mathematics with Applications, Volume 59, Issue 7, April 2010, Pages 21782193, ISSN 0898-1221, 10.1016/j.camwa.2009.08.043.
[13] Yu, D., Mei, R., Luo L.S., and Shyy, W., Viscous flow computations with the
method of lattice Boltzmann equation, Progress in Aerospace Sciences, 2003,
39, pp. 329-367.
[14] D. dHumires, I. Ginzburg, M. Krafczyk, P. Lallemand and Li-Shi Luo.
Multiple-relaxation-time lattice Boltzmann models in threedimensions. Philosophical Transactions of Royal Society of London A,360(1792):437451, 2002.
[15] Bouzidi M, dHumires D, Lallemand P, Luo L-S. Lattice Boltzmann equation
on a two-dimensional rectangular grid. J Comput Phys 2001;172:704-17.
[16] X.He, L.-S. Luo: Lattice Boltzmann model for the incompressible Navier-Stokes
equation, J. Stat. Phys. 88,927(1997).
[17] R. Mei, D. Yu, W. Shyy, L.-S. Luo, Force evaluation in the lattice Boltzmann
method involving curved geometry, Phys. Rev. E 65 (2002) 041203.
[18] J.H. Ferziger, M. Peric, Computational Methods for Fluid Dynamics, 3rd Edition, Springer, 2002
[19] U. Ghia, K.N. Ghia, C.T. Shin, High-Re solutions for incompressible flow using
the NavierStokes equations and a multigrid method, Journal of Computational
Physics 48 (3) (1982) 387411.
[20] J. Shewchuk, An introduction to the Conjugate Gradient Method without the
agonizing pain, Carnegie Mellon University, 1994.
[21] Introduction to the Fractional Step Method by CTTC, UPC
[22] A.A. Mohamad, A. Kuzmin, A critical evaluation of force term in lattice Boltzmann method, natural convection problem, International Journal of Heat and
Mass Transfer, Volume 53, Issues 56, February 2010, Pages 990-996, ISSN 00179310, 10.1016/j.ijheatmasstransfer.2009.11.014.
104

[23] P.-H. Kao, Y.-H. Chen, R.-J. Yang, Simulations of the macroscopic and mesoscopic natural convection flows within rectangular cavities, International Journal
of Heat and Mass Transfer, Volume 51, Issues 1516, 15 July 2008, Pages 37763793, ISSN 0017-9310, 10.1016/j.ijheatmasstransfer.2008.01.003.
[24] de Vahl Davis G.: Natural convection of air in a square cavity: a bench mark
numerical solution. Int J Numer Methods Fluids, 3:249-264, 1983.

105

Anexo A

Cdigo fuente de LBM


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

#i f n d e f LBM_H
#d e f i n e LBM_H
#i n c l u d e <v e c t o r . h>
c l a s s ComputationTime {
clock_t s t a r t ;
public :
void Start ( ) {
start = clock () ;
}
d o u b l e Stop ( ) {
r e t u r n ( ( ( d o u b l e ) ( c l o c k ( ) s t a r t ) ) / CLOCKS_PER_SEC) ;
}
};
v o i d Swap ( d o u b l e &A, d o u b l e &B) {
d o u b l e tmp = A;
A = B;
B = tmp ;
}
c l a s s LatticeModel {
public :
L a t t i c e M o d e l ( i n t D, i n t Q, d o u b l e w, i n t e_x , i n t e_y , i n t e_z , i n t
opp , d o u b l e c s ) {
t h i s >D = D;
t h i s >Q = Q;
t h i s >c s = c s ;
t h i s >w = new d o u b l e [ Q ] ;
t h i s >e_x = new i n t [ Q ] ;
t h i s >e_y = new i n t [ Q ] ;
t h i s >opp = new i n t [ Q ] ;
f o r ( i n t i = 0 ; i < Q; i++ ) {
t h i s >w [ i ] = w [ i ] ;
t h i s >opp [ i ] = opp [ i ] ;
switch ( D ) {
case 1:
t h i s >e_x [ i ] = e_x [ i ] ;
break ;
case 2:
t h i s >e_x [ i ] = e_x [ i ] ;
t h i s >e_y [ i ] = e_y [ i ] ;
break ;
case 3:
t h i s >e_x [ i ] = e_x [ i ] ;
t h i s >e_y [ i ] = e_y [ i ] ;
t h i s >e_z [ i ] = e_z [ i ] ;

106

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

break ;

}
}
d o u b l e w ;
i n t e_x ;
i n t e_y ;
i n t e_z ;
i n t opp ;
double cs ;
i n t D;
i n t Q;

};
class Lattice {
public :
Lattice () {
}
void SetLatticeModel ( LatticeModel lattice_model ) {
t h i s >l a t t i c e _ m o d e l = l a t t i c e _ m o d e l ;
t h i s >f = new d o u b l e [ l a t t i c e _ m o d e l >Q ] ;
isWet = t r u e ;
isBC = f a l s e ;
}
i n l i n e double CalculateMacroscopicProperties ( void ) {
rho = 0 ;
u = 0;
v = 0;
f o r ( i n t i = 0 ; i < l a t t i c e _ m o d e l >Q; i++ ) {
rho += f [ i ] ;
u += f [ i ] l a t t i c e _ m o d e l >e_x [ i ] ;
v += f [ i ] l a t t i c e _ m o d e l >e_y [ i ] ;
}
u /= rho ;
v /= rho ;
}
double f ;
d o u b l e rho ;
double u ;
double v ;
LatticeModel lattice_model ;
b o o l isWet ;
b o o l isBC ;
};
c l a s s Point {
public :
Point ( ) {
i = j = 0;
}
Point ( const i n t i , const i n t j ) {
t h i s >i = i ;
t h i s >j = j ;
}
int i , j ;
};
enum BC_TYPE { NORTH_VELOCITY_ZOU_HE, SOUTH_VELOCITY_ZOU_HE,
EAST_VELOCITY_ZOU_HE, WEST_VELOCITY_ZOU_HE, NORTH_PRESSURE_ZOU_HE,
SOUTH_PRESSURE_ZOU_HE, EAST_PRESSURE_ZOU_HE, WEST_PRESSURE_ZOU_HE,
NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE,
NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE,
SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE,
SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE,
NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE,
NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE,

107

99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE,
SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE, HALF_WAY_BOUNCEBACK,
FULL_WAY_BOUNCEBACK, EAST_OPEN_BOUNDARY} ;
c l a s s BoundaryCondition {
public :
BoundaryCondition ( BC_TYPE type , P o i n t s t a r t _ p o i n t , P o i n t end_point ,
d o u b l e u , d o u b l e v , d o u b l e rho ) {
t h i s >t y p e = t y p e ;
t h i s >s t a r t _ p o i n t = s t a r t _ p o i n t ;
t h i s >end_point = end_point ;
t h i s >u = u ;
t h i s >v = v ;
t h i s >rho = rho ;
}
BC_TYPE t y p e ;
Point start_point ;
P o i n t end_point ;
double u ;
double v ;
d o u b l e rho ;
};
c l a s s Simulation {
public :
S i m u l a t i o n ( i n t Nx , i n t Ny , L a t t i c e M o d e l l a t t i c e _ m o d e l , d o u b l e omega ) {
domain = new L a t t i c e [ Nx ] ;
t h i s >Nx = Nx ;
t h i s >Ny = Ny ;
t h i s >l a t t i c e _ m o d e l = l a t t i c e _ m o d e l ;
time = 0 ;
t h i s >omega = omega ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
domain [ i ] = new L a t t i c e [ Ny ] ;
}
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
domain [ i ] [ j ] . S e t L a t t i c e M o d e l ( l a t t i c e _ m o d e l ) ;
}
}
startPointForceEvaluation . i = startPointForceEvaluation . j =
endPointForceEvaluation . i = endPointForceEvaluation . j = 0;
}
void I n i t E q u i l i b r i u m ( double densit y ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t a l f a = 0 ; a l f a < l a t t i c e _ m o d e l >Q; a l f a++ ) {
domain [ i ] [ j ] . f [ a l f a ] = l a t t i c e _ m o d e l >w [ a l f a ]
density ;
}
domain [ i ] [ j ] . rho = d e n s i t y ;
}
}
}
v o i d StreamStep ( ) {
int ii , j j ;
int alfa ;
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 1;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;

108

154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [ a l f a
];
}

}
}
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [
== f a l s e ) ) {
alfa = 3;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o (
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [
alfa ] ;
}
}
}

] . isWet

alfa ] ] ;
alfa ] ] ;
j j , 0 , Ny
jj

]. f [

}
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 4;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}
alfa = 7;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}
}
}
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 8;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}
}
}
}
f o r ( i n t j = Ny1; j >= 0 ; j ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 2;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;

109

203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233

234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}
alfa = 6;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}

}
}
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 5;
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
}
}
}

}
}
void C o l l i s i o n S t e p ( ) {
double feq ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
i f ( domain [ i ] [ j ] . isWet == t r u e ) {
f o r ( i n t a l f a = 0 ; a l f a < l a t t i c e _ m o d e l >Q; a l f a++ ) {
f e q = l a t t i c e _ m o d e l >w [ a l f a ] domain [ i ] [ j ] . rho ( 1 +
3 . 0 ( l a t t i c e _ m o d e l >e_x [ a l f a ] domain [ i ] [ j ] . u +
l a t t i c e _ m o d e l >e_y [ a l f a ] domain [ i ] [ j ] . v ) +
( 9 . 0 / 2 . 0 ) pow ( l a t t i c e _ m o d e l >e_x [ a l f a ] domain [ i ] [ j
] . u + l a t t i c e _ m o d e l >e_y [ a l f a ] domain [ i ] [ j ] . v , 2 . 0 )
( 3 . 0 / 2 . 0 ) ( domain [ i ] [ j ] . u domain [ i ] [ j ] . u + domain
[ i ] [ j ] . v domain [ i ] [ j ] . v ) ) ;
domain [ i ] [ j ] . f [ a l f a ] = domain [ i ] [ j ] . f [ a l f a
] omega ( domain [ i ] [ j ] . f [ a l f a ] f e q ) ;
}
}
}
}
}
void MacroscopicProperties ( ) {
d o u b l e old_u , old_v , old_rho ;
d o u b l e error_u , error_v , e r r o r _ r h o ;
convergence_u = convergence_v = c o n v e r g e n c e _ r h o = 0 . 0 ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
i f ( domain [ i ] [ j ] . isWet == t r u e ) {
old_u = domain [ i ] [ j ] . u ;
old_v = domain [ i ] [ j ] . v ;
old_rho = domain [ i ] [ j ] . rho ;
domain [ i ] [ j ] . C a l c u l a t e M a c r o s c o p i c P r o p e r t i e s ( ) ;
e r r o r _ u = f a b s ( old_u domain [ i ] [ j ] . u ) ;

110

252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307

e r r o r _ v = f a b s ( old_v domain [ i ] [ j ] . v ) ;
e r r o r _ r h o = f a b s ( old_rho domain [ i ] [ j ] . rho ) ;
i f ( e r r o r _ u > convergence_u ) convergence_u = e r r o r _ u ;
i f ( e r r o r _ v > convergence_v ) convergence_v = e r r o r _ v ;
i f ( error_rho > convergence_rho ) convergence_rho =
error_rho ;

}
}
v o i d Bo u nd ar yC on d it io ns ( ) {
f o r ( i n t i = 0 ; i < bc . s i z e ( ) ; i++ ) {
ApplySimpleBoundaryCondition ( bc [ i ] ) ;
}
}
v o i d AddBoundaryCondition ( BoundaryCondition newBC ) {
bc . push_back ( newBC ) ;
s w i t c h ( newBC . t y p e ) {
c a s e NORTH_VELOCITY_ZOU_HE:
c a s e SOUTH_VELOCITY_ZOU_HE:
c a s e EAST_VELOCITY_ZOU_HE:
c a s e WEST_VELOCITY_ZOU_HE:
c a s e NORTH_PRESSURE_ZOU_HE:
c a s e SOUTH_PRESSURE_ZOU_HE:
c a s e EAST_PRESSURE_ZOU_HE:
c a s e WEST_PRESSURE_ZOU_HE:
c a s e NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e EAST_OPEN_BOUNDARY:
f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++
){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = t r u e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}
break ;
c a s e HALF_WAY_BOUNCEBACK:
f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++
){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = t r u e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}
break ;
c a s e FULL_WAY_BOUNCEBACK:
f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++
){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}

111

308
309
310
311
312
313
314
315
316
317
318

319

320

321

322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351

break ;

}
v o i d AddSolidBoxBoundaryConditionZouHe ( P o i n t s t a r t P o i n t , P o i n t end Po in t )
{
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
AddBoundaryCondition ( BoundaryCondition ( NORTH_VELOCITY_ZOU_HE,
s t a r t P o i n t , P o i n t ( end Po in t . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( EAST_VELOCITY_ZOU_HE,
s t a r t P o i n t , P o i n t ( s t a r t P o i n t . i , en dPo in t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( SOUTH_VELOCITY_ZOU_HE, P o i n t (
s t a r t P o i n t . i , e nd Poi nt . j ) , endPoint , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( WEST_VELOCITY_ZOU_HE,
endPoint , P o i n t ( e nd Po int . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition (
SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE, s t a r t P o i n t , s t a r t P o i n t ,
0.0 , 0.0 , 0.0) ) ;
AddBoundaryCondition ( BoundaryCondition (
NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE, endPoint , endPoint , 0 . 0 ,
0.0 , 0.0) ) ;
AddBoundaryCondition ( BoundaryCondition (
NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE, P o i n t ( s t a r t P o i n t . i ,
en dP oi nt . j ) , P o i n t ( s t a r t P o i n t . i , en dP oin t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition (
SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE, P o i n t ( e nd Poi nt . i ,
s t a r t P o i n t . j ) , P o i n t ( end Po int . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
f o r ( i n t i = s t a r t P o i n t . i + 1 ; i <= en dPo in t . i 1 ; i++ ) {
f o r ( i n t j = s t a r t P o i n t . j +1; j <= en dP oin t . j 1 ; j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = f a l s e ;
}
}
}
v o i d AddSolidBoxBoundaryConditionBBFW ( P o i n t s t a r t P o i n t , P o i n t en dP oin t )
{
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK,
s t a r t P o i n t , P o i n t ( end Po in t . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK,
s t a r t P o i n t , P o i n t ( s t a r t P o i n t . i , en dPo in t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK, P o i n t (
s t a r t P o i n t . i , e nd Poi nt . j ) , endPoint , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK, endPoint
, P o i n t ( en dP oi nt . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
f o r ( i n t i = s t a r t P o i n t . i + 1 ; i <= en dPo in t . i 1 ; i++ ) {
f o r ( i n t j = s t a r t P o i n t . j +1; j <= en dP oin t . j 1 ; j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = f a l s e ;
}
}
}
void SetLatticeInsideBody ( Point cord ) {
domain [ c o r d . i ] [ c o r d . j ] . isWet = f a l s e ;
domain [ c o r d . i ] [ c o r d . j ] . isBC = f a l s e ;
}
d o u b l e Tick ( ) {
computation_time . S t a r t ( ) ;
MacroscopicProperties () ;
CalculateTotalProperties () ;
CollisionStep () ;

112

352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398

399
400

401

CalculateForce ( startPointForceEvaluation ,
Fx1 , Fy1 ) ;
StreamStep ( ) ;
CalculateForce ( startPointForceEvaluation ,
Fx2 , Fy2 ) ;
B ou nd ar yC on d it io ns ( ) ;
CalculateForce ( startPointForceEvaluation ,
Fx3 , Fy3 ) ;
time++;
r e t u r n computation_time . Stop ( ) ;

endPointForceEvaluation ,
endPointForceEvaluation ,
endPointForceEvaluation ,

}
L a t t i c e domain ;
LatticeModel lattice_model ;
i n t Nx , Ny ;
i n t time ;
d o u b l e omega ;
v e c t o r <BoundaryCondition> bc ;
Point startPointForceEvaluation , endPointForceEvaluation ;
d o u b l e Fx1 , Fy1 ;
d o u b l e Fx2 , Fy2 ;
d o u b l e Fx3 , Fy3 ;
double total_density ;
double total_density_u ;
double total_density_v ;
d o u b l e convergence_u ;
d o u b l e convergence_v ;
double convergence_rho ;
ComputationTime computation_time ;
b o o l I n d i c e L o g i c o ( i n t n , i n t min , i n t max) {
i f ( n >= min && n <= max ) r e t u r n t r u e ;
e l s e return f a l s e ;
}
void CalculateTotalProperties ( void ) {
total_density = total_density_u = total_density_v = 0 . 0 ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
i f ( domain [ i ] [ j ] . isWet == t r u e ) {
t o t a l _ d e n s i t y += domain [ i ] [ j ] . rho ;
t o t a l _ d e n s i t y _ u += domain [ i ] [ j ] . rho domain [ i ] [ j ] . u
;
t o t a l _ d e n s i t y _ v += domain [ i ] [ j ] . rho domain [ i ] [ j ] . v
;
}
}
}
}
v o i d ApplySimpleBoundaryCondition ( BoundaryCondition bc ) {
s w i t c h ( bc . t y p e ) {
c a s e NORTH_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . + bc . v ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[5]) ) ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;

113

402
403
404
405
406
407
408

409
410

411

412
413
414
415
416
417
418

419
420

421

422
423
424
425
426
427
428

429
430

431

432
433
434
435
436
437
438

}
}
break ;
c a s e SOUTH_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . bc . v ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 7 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] + ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e EAST_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . + bc . u ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
}
}
break ;
c a s e WEST_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . bc . u ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[7]) ) ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] + ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
}
}
break ;
c a s e NORTH_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . v = domain [ i ] [ j ] . v = 1. + ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f

114

439
440

441

442
443
444
445
446
447
448

449
450

451

452
453
454
455
456
457
458

459
460

461

462
463
464
465
466
467
468

469
470

471

[5]) ) ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ]
bc . v ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] +
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] )
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ]
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] )
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;

( 2 . / 3 . ) bc . rho
( 1 . / 2 . ) (
( 1 . / 2 . ) bc .
( 1 . / 2 . ) (
+ ( 1 . / 2 . ) bc .

}
}
break ;
c a s e SOUTH_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . v = domain [ i ] [ j ] . v = 1 . ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 7 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] + ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e EAST_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . u = domain [ i ] [ j ] . u = 1. + ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
}
}
break ;
c a s e WEST_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . u = domain [ i ] [ j ] . u = 1 . ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[7]) ) ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] + ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;

115

472
473
474
475
476
477
478
479
480
481

482
483
484
485
486
487
488
489
490
491

492
493
494
495
496
497
498
499
500
501

502
503
504
505
506
507
508
509
510
511

512
513
514
515
516
517
518

}
}
break ;
c a s e NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] = 0 . 5 ( 0 . 5 (
domain [ i + 1 ] [ j ] . rho+domain [ i ] [ j 1 ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 6 ] +
domain [ i ] [ j ] . f [ 8 ] ) ) ;
}
}
break ;
c a s e NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] = ( 1 . / 2 . )
( ( 1 . / 2 . ) ( domain [ i 1 ] [ j ] . rho+domain [ i ] [ j 1 ] . rho )
(domain [ i ] [ j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j
] . f [ 2 ] + domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [
i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f [ 7 ] ) ) ;
}
}
break ;
c a s e SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] = 0 . 5 ( 0 . 5 (
domain [ i + 1 ] [ j ] . rho+domain [ i ] [ j + 1 ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 5 ] +
domain [ i ] [ j ] . f [ 7 ] ) ) ;
}
}
break ;
c a s e SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] = 0 . 5 ( 0 . 5 (
domain [ i ] [ j + 1 ] . rho+domain [ i 1 ] [ j ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 6 ] +
domain [ i ] [ j ] . f [ 8 ] ) ) ;
}
}
break ;
c a s e NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;

116

519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580

domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ;

}
}
break ;
c a s e NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ;
}
}
break ;
c a s e SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] ;
}
}
break ;
c a s e SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
}
}
break ;
c a s e HALF_WAY_BOUNCEBACK:
break ;
c a s e FULL_WAY_BOUNCEBACK:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ;
swap ( domain [ i ] [ j ] . f [ 1 ] , domain [ i ] [ j ] . f [ 3 ] ) ;
swap ( domain [ i ] [ j ] . f [ 2 ] , domain [ i ] [ j ] . f [ 4 ] ) ;
swap ( domain [ i ] [ j ] . f [ 5 ] , domain [ i ] [ j ] . f [ 7 ] ) ;
swap ( domain [ i ] [ j ] . f [ 6 ] , domain [ i ] [ j ] . f [ 8 ] ) ;
}
}
break ;
c a s e EAST_OPEN_BOUNDARY:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i 1 ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i 1 ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i 1 ] [ j ] . f [ 7 ] ;
}
}
break ;

){
j++ ) {

){
j++ ) {

){
j++ ) {

){
j++ ) {

){
j++ ) {

}
}
v o i d C a l c u l a t e F o r c e ( P o i n t s t a r t P o i n t , P o i n t endPoint , d o u b l e& Fx , d o u b l e&
Fy ) {
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
int ii , j j ;
Fx = 0 . 0 ;
Fy = 0 . 0 ;
f o r ( i n t i = s t a r t P o i n t . i ; i <= en dPo in t . i ; i++ ) {

117

581
582
583
584
585
586
587

588

589
590
591
592
593
594
595
596

f o r ( i n t j = s t a r t P o i n t . j ; j <= e ndP oi nt . j ; j++ ) {


i f ( domain [ i ] [ j ] . isBC == t r u e ) {
f o r ( i n t a l f a = 1 ; a l f a < l a t t i c e _ m o d e l >Q; a l f a++ ) {
i i = i + l a t t i c e _ m o d e l >e_x [ l a t t i c e _ m o d e l >opp [ a l f a
] ];
j j = j + l a t t i c e _ m o d e l >e_y [ l a t t i c e _ m o d e l >opp [ a l f a
] ];
i f ( domain [ i i ] [ j j ] . isWet == t r u e ) {
Fx += l a t t i c e _ m o d e l >e_x [ a l f a ] ( domain [ i ] [ j
] . f [ a l f a ] + domain [ i i ] [ j j ] . f [
l a t t i c e _ m o d e l >opp [ a l f a ] ] ) ;
Fy += l a t t i c e _ m o d e l >e_y [ a l f a ] ( domain [ i ] [ j
] . f [ a l f a ] + domain [ i i ] [ j j ] . f [
l a t t i c e _ m o d e l >opp [ a l f a ] ] ) ;
}
}
}
}

};
#e n d i f

LBM1.h
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

#i f n d e f LBM_H
#d e f i n e LBM_H
#i n c l u d e <v e c t o r >
c l a s s ComputationTime {
clock_t s t a r t ;
public :
void Start ( ) {
start = clock () ;
}
d o u b l e Stop ( ) {
r e t u r n ( ( ( d o u b l e ) ( c l o c k ( ) s t a r t ) ) / CLOCKS_PER_SEC) ;
}
};
v o i d Swap ( d o u b l e &A, d o u b l e &B) {
d o u b l e tmp = A;
A = B;
B = tmp ;
}
c l a s s LatticeModel {
public :
L a t t i c e M o d e l ( i n t D, i n t Q, d o u b l e w, i n t e_x , i n t e_y , i n t e_z , i n t
opp , d o u b l e c s ) {
t h i s >D = D;
t h i s >Q = Q;
t h i s >c s = c s ;
t h i s >w = new d o u b l e [ Q ] ;
t h i s >e_x = new i n t [ Q ] ;
t h i s >e_y = new i n t [ Q ] ;
t h i s >opp = new i n t [ Q ] ;
f o r ( i n t i = 0 ; i < Q; i++ ) {
t h i s >w [ i ] = w [ i ] ;
t h i s >opp [ i ] = opp [ i ] ;
switch ( D ) {
case 1:
t h i s >e_x [ i ] = e_x [ i ] ;
break ;
case 2:
t h i s >e_x [ i ] = e_x [ i ] ;

118

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

t h i s >e_y [
break ;
case 3:
t h i s >e_x [
t h i s >e_y [
t h i s >e_z [
break ;

i ] = e_y [ i

];

i ] = e_x [ i
i ] = e_y [ i
i ] = e_z [ i

];
];
];

}
d o u b l e w ;
i n t e_x ;
i n t e_y ;
i n t e_z ;
i n t opp ;
double cs ;
i n t D;
i n t Q;

};
class Lattice {
public :
Lattice () {
}
v o i d S e t L a t t i c e M o d e l ( L a t t i c e M o d e l lattice_model_momentum , L a t t i c e M o d e l
lattice_model_energy ) {
t h i s >lattice_model_momentum = lattice_model_momentum ;
t h i s >l a t t i c e _ m o d e l _ e n e r g y = l a t t i c e _ m o d e l _ e n e r g y ;
t h i s >f = new d o u b l e [ lattice_model_momentum>Q ] ;
t h i s >g = new d o u b l e [ l a t t i c e _ m o d e l _ e n e r g y >Q ] ;
isWet = t r u e ;
isBC = f a l s e ;
}
i n l i n e double CalculateMacroscopicProperties ( void ) {
rho = 0 . 0 ;
u = 0.0;
v = 0.0;
T = 0.0;
f o r ( i n t i = 0 ; i < lattice_model_momentum>Q; i++ ) {
rho += f [ i ] ;
u += f [ i ] lattice_model_momentum>e_x [ i ] ;
v += f [ i ] lattice_model_momentum>e_y [ i ] ;
}
u /= rho ;
v /= rho ;
f o r ( i n t i = 0 ; i < l a t t i c e _ m o d e l _ e n e r g y >Q; i++ ) {
T += g [ i ] ;
}
}
double f ;
double g ;
d o u b l e rho ;
double u ;
double v ;
double T;
L a t t i c e M o d e l lattice_model_momentum ;
LatticeModel lattice_model_energy ;
b o o l isWet ;
b o o l isBC ;
};
c l a s s Point {
public :
Point ( ) {
i = j = 0;

119

100
101
102
103
104
105
106
107

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

}
Point ( const i n t i , const i n t j ) {
t h i s >i = i ;
t h i s >j = j ;
}
int i , j ;

};
enum BC_TYPE { NORTH_VELOCITY_ZOU_HE, SOUTH_VELOCITY_ZOU_HE,
EAST_VELOCITY_ZOU_HE, WEST_VELOCITY_ZOU_HE, NORTH_PRESSURE_ZOU_HE,
SOUTH_PRESSURE_ZOU_HE, EAST_PRESSURE_ZOU_HE, WEST_PRESSURE_ZOU_HE,
NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE,
NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE,
SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE,
SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE,
NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE,
NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE,
SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE,
SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE, HALF_WAY_BOUNCEBACK,
FULL_WAY_BOUNCEBACK, EAST_OPEN_BOUNDARY, EAST_TEMPERATURE,
WEST_TEMPERATURE, ADIABATIC, NORTH_ADIABATIC, SOUTH_ADIABATIC} ;
c l a s s BoundaryCondition {
public :
BoundaryCondition ( BC_TYPE type , P o i n t s t a r t _ p o i n t , P o i n t end_point ,
d o u b l e u , d o u b l e v , d o u b l e rho , d o u b l e T) {
t h i s >t y p e = t y p e ;
t h i s >s t a r t _ p o i n t = s t a r t _ p o i n t ;
t h i s >end_point = end_point ;
t h i s >u = u ;
t h i s >v = v ;
t h i s >rho = rho ;
t h i s >T = T ;
}
BC_TYPE t y p e ;
Point start_point ;
P o i n t end_point ;
double u ;
double v ;
d o u b l e rho ;
double T;
};
c l a s s Simulation {
public :
S i m u l a t i o n ( i n t Nx , i n t Ny , L a t t i c e M o d e l lattice_model_momentum ,
L a t t i c e M o d e l l a t t i c e _ m o d e l _ e n e r g y , d o u b l e omega_momentum , d o u b l e
omega_energy , d o u b l e g r a v i t y b e t a ) {
domain = new L a t t i c e [ Nx ] ;
t h i s >Nx = Nx ;
t h i s >Ny = Ny ;
t h i s >lattice_model_momentum = lattice_model_momentum ;
t h i s >l a t t i c e _ m o d e l _ e n e r g y = l a t t i c e _ m o d e l _ e n e r g y ;
time = 0 ;
t h i s >omega_momentum = omega_momentum ;
t h i s >omega_energy = omega_energy ;
t h i s >g r a v i t y b e t a = g r a v i t y b e t a ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
domain [ i ] = new L a t t i c e [ Ny ] ;
}
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
domain [ i ] [ j ] . S e t L a t t i c e M o d e l ( lattice_model_momentum ,
lattice_model_energy ) ;
}
}

120

147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193

startPointForceEvaluation . i = startPointForceEvaluation . j =
endPointForceEvaluation . i = endPointForceEvaluation . j = 0;

}
void I n i t E q u i l i b r i u m ( double density , double temperature ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t a l f a = 0 ; a l f a < lattice_model_momentum>Q; a l f a++ ) {
domain [ i ] [ j ] . f [ a l f a ] = lattice_model_momentum>w [
alfa ] density ;
}
domain [ i ] [ j ] . rho = d e n s i t y ;
f o r ( i n t a l f a = 0 ; a l f a < l a t t i c e _ m o d e l _ e n e r g y >Q; a l f a++ ) {
domain [ i ] [ j ] . g [ a l f a ] = l a t t i c e _ m o d e l _ e n e r g y >w [ a l f a
] temperature ;
}
domain [ i ] [ j ] . T = t e m p e r a t u r e ;
}
}
}
v o i d StreamStep ( ) {
int ii , j j ;
int alfa ;
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 1;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [ a l f a
];
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [ a l f a
];
}
}
}
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 3;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [
alfa ] ;
}
}
}
}
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 4;

121

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232

i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o (
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [
alfa ] ;
}
alfa = 7;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o (
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [
alfa ] ;
}

j j , 0 , Ny
jj

]. f [

jj

].g[

j j , 0 , Ny
jj

]. f [

jj

].g[

}
}
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 8;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [
alfa ] ;
}
}
}

}
f o r ( i n t j = Ny1; j >= 0 ; j ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 2;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [
alfa ] ;
}
alfa = 6;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;

122

233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

260

261

262
263
264

j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [
alfa ] ;
}

}
}
f o r ( i n t i = Nx1; i >= 0 ; i ) {
i f ( ! ( domain [ i ] [ j ] . isBC == f a l s e && domain [ i ] [ j ] . isWet
== f a l s e ) ) {
alfa = 5;
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( I n d i c e L o g i c o ( i i , 0 , Nx1) && I n d i c e L o g i c o ( j j , 0 , Ny
1) ) {
domain [ i ] [ j ] . f [ a l f a ] = domain [ i i ] [ j j ] . f [
alfa ] ;
domain [ i ] [ j ] . g [ a l f a ] = domain [ i i ] [ j j ] . g [
alfa ] ;
}
}
}

}
}
void C o l l i s i o n S t e p ( ) {
d o u b l e f e q , geq ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
i f ( domain [ i ] [ j ] . isWet == t r u e ) {
f o r ( i n t a l f a = 0 ; a l f a < lattice_model_momentum>Q; a l f a
++ ) {
f e q = lattice_model_momentum>w [ a l f a ] domain [ i ] [ j ] . rho
( 1 + 3 . 0 ( lattice_model_momentum>e_x [ a l f a ]
domain [ i ] [ j ] . u + lattice_model_momentum>e_y [ a l f a
] domain [ i ] [ j ] . v ) + ( 9 . 0 / 2 . 0 ) pow (
lattice_model_momentum>e_x [ a l f a ] domain [ i ] [ j ] . u +
lattice_model_momentum>e_y [ a l f a ] domain [ i ] [ j ] . v
, 2 . 0 ) ( 3 . 0 / 2 . 0 ) ( domain [ i ] [ j ] . u domain [ i ] [ j ] . u +
domain [ i ] [ j ] . v domain [ i ] [ j ] . v ) ) ;
domain [ i ] [ j ] . f [ a l f a ] = domain [ i ] [ j ] . f [ a l f a
] omega_momentum ( domain [ i ] [ j ] . f [ a l f a ]
feq )
+ ( lattice_model_momentum>w [ a l f a ] / pow (
lattice_model_momentum>cs , 2 . 0 ) ) (
g r a v i t y b e t a domain [ i ] [ j ] . rho
domain [ i ] [ j ] . T
lattice_model_momentum>e_y [ a l f a ] ) ;
}
f o r ( i n t a l f a = 0 ; a l f a < l a t t i c e _ m o d e l _ e n e r g y >Q; a l f a++
){
geq = l a t t i c e _ m o d e l _ e n e r g y >w [ a l f a ] domain [ i ] [ j ] . T ( 1
+ 3 . 0 ( l a t t i c e _ m o d e l _ e n e r g y >e_x [ a l f a ] domain [ i ] [ j
] . u + l a t t i c e _ m o d e l _ e n e r g y >e_y [ a l f a ] domain [ i ] [ j
] . v ) + ( 9 . 0 / 2 . 0 ) pow ( l a t t i c e _ m o d e l _ e n e r g y >e_x [ a l f a
] domain [ i ] [ j ] . u + l a t t i c e _ m o d e l _ e n e r g y >e_y [ a l f a
] domain [ i ] [ j ] . v , 2 . 0 ) ( 3 . 0 / 2 . 0 ) ( domain [ i ] [ j ] . u
domain [ i ] [ j ] . u + domain [ i ] [ j ] . v domain [ i ] [ j ] . v ) ) ;

123

265

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323

domain [ i ] [ j ] . g [ a l f a ] = domain [ i ] [ j ] . g [ a l f a
] omega_energy ( domain [ i ] [ j ] . g [ a l f a ]
geq ) ;

}
void MacroscopicProperties ( ) {
d o u b l e old_u , old_v , old_rho , old_T ;
d o u b l e error_u , error_v , e r r o r _ r h o , error_T ;
convergence_u = convergence_v = c o n v e r g e n c e _ r h o = convergence_T = 0 . 0 ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
i f ( domain [ i ] [ j ] . isWet == t r u e ) {
old_u = domain [ i ] [ j ] . u ;
old_v = domain [ i ] [ j ] . v ;
old_rho = domain [ i ] [ j ] . rho ;
old_T = domain [ i ] [ j ] . T ;
domain [ i ] [ j ] . C a l c u l a t e M a c r o s c o p i c P r o p e r t i e s ( ) ;
e r r o r _ u = f a b s ( old_u domain [ i ] [ j ] . u ) ;
e r r o r _ v = f a b s ( old_v domain [ i ] [ j ] . v ) ;
e r r o r _ r h o = f a b s ( old_rho domain [ i ] [ j ] . rho ) ;
error_T = f a b s ( old_T domain [ i ] [ j ] . T ) ;
i f ( e r r o r _ u > convergence_u ) convergence_u = e r r o r _ u ;
i f ( e r r o r _ v > convergence_v ) convergence_v = e r r o r _ v ;
i f ( error_rho > convergence_rho ) convergence_rho =
error_rho ;
i f ( error_T > convergence_T ) convergence_T = error_T ;
}
}
}
}
v o i d Bo u nd ar yC on d it io ns ( ) {
f o r ( i n t i = 0 ; i < bc . s i z e ( ) ; i++ ) {
ApplySimpleBoundaryCondition ( bc [ i ] ) ;
}
}
v o i d AddBoundaryCondition ( BoundaryCondition newBC ) {
bc . push_back ( newBC ) ;
s w i t c h ( newBC . t y p e ) {
c a s e NORTH_VELOCITY_ZOU_HE:
c a s e SOUTH_VELOCITY_ZOU_HE:
c a s e EAST_VELOCITY_ZOU_HE:
c a s e WEST_VELOCITY_ZOU_HE:
c a s e NORTH_PRESSURE_ZOU_HE:
c a s e SOUTH_PRESSURE_ZOU_HE:
c a s e EAST_PRESSURE_ZOU_HE:
c a s e WEST_PRESSURE_ZOU_HE:
c a s e NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
c a s e EAST_OPEN_BOUNDARY:
c a s e EAST_TEMPERATURE:
c a s e WEST_TEMPERATURE:
c a s e NORTH_ADIABATIC:
c a s e SOUTH_ADIABATIC:

124

324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357

358

359

360

361
362
363
364
365
366

f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++


){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = t r u e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}
break ;
c a s e HALF_WAY_BOUNCEBACK:
f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++
){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = t r u e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}
break ;
c a s e FULL_WAY_BOUNCEBACK:
c a s e ADIABATIC :
f o r ( i n t i = newBC . s t a r t _ p o i n t . i ; i <= newBC . end_point . i ; i++
){
f o r ( i n t j = newBC . s t a r t _ p o i n t . j ; j <= newBC . end_point . j ;
j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = t r u e ;
}
}
break ;

}
}
v o i d AddSolidBoxBoundaryConditionZouHe ( P o i n t s t a r t P o i n t , P o i n t end Po in t )
{
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
AddBoundaryCondition ( BoundaryCondition ( NORTH_VELOCITY_ZOU_HE,
s t a r t P o i n t , P o i n t ( end Po in t . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( EAST_VELOCITY_ZOU_HE,
s t a r t P o i n t , P o i n t ( s t a r t P o i n t . i , en dPo in t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( SOUTH_VELOCITY_ZOU_HE, P o i n t (
s t a r t P o i n t . i , e nd Poi nt . j ) , endPoint , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( WEST_VELOCITY_ZOU_HE,
endPoint , P o i n t ( e nd Po int . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition (
SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE, s t a r t P o i n t , s t a r t P o i n t ,
0.0 , 0.0 , 0.0 , 0.0) ) ;
AddBoundaryCondition ( BoundaryCondition (
NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE, endPoint , endPoint , 0 . 0 ,
0.0 , 0.0 , 0.0) ) ;
AddBoundaryCondition ( BoundaryCondition (
NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE, P o i n t ( s t a r t P o i n t . i ,
en dP oi nt . j ) , P o i n t ( s t a r t P o i n t . i , en dP oin t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition (
SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE, P o i n t ( e nd Poi nt . i ,
s t a r t P o i n t . j ) , P o i n t ( end Po int . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 )
);
f o r ( i n t i = s t a r t P o i n t . i + 1 ; i <= en dPo in t . i 1 ; i++ ) {
f o r ( i n t j = s t a r t P o i n t . j +1; j <= en dP oin t . j 1 ; j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = f a l s e ;
}
}

125

367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424

}
v o i d AddSolidBoxBoundaryConditionBBFW ( P o i n t s t a r t P o i n t , P o i n t en dP oin t )
{
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK,
s t a r t P o i n t , P o i n t ( end Po in t . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK,
s t a r t P o i n t , P o i n t ( s t a r t P o i n t . i , en dPo in t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK, P o i n t (
s t a r t P o i n t . i , e nd Poi nt . j ) , endPoint , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
AddBoundaryCondition ( BoundaryCondition ( FULL_WAY_BOUNCEBACK, endPoint
, P o i n t ( en dP oi nt . i , s t a r t P o i n t . j ) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
f o r ( i n t i = s t a r t P o i n t . i + 1 ; i <= en dPo in t . i 1 ; i++ ) {
f o r ( i n t j = s t a r t P o i n t . j +1; j <= en dP oin t . j 1 ; j++ ) {
domain [ i ] [ j ] . isWet = f a l s e ;
domain [ i ] [ j ] . isBC = f a l s e ;
}
}
}
void SetLatticeInsideBody ( Point cord ) {
domain [ c o r d . i ] [ c o r d . j ] . isWet = f a l s e ;
domain [ c o r d . i ] [ c o r d . j ] . isBC = f a l s e ;
}
d o u b l e Tick ( ) {
computation_time . S t a r t ( ) ;
MacroscopicProperties () ;
CalculateTotalProperties () ;
CollisionStep () ;
StreamStep ( ) ;
B ou nd ar yC on d it io ns ( ) ;
time++;
r e t u r n computation_time . Stop ( ) ;
}
L a t t i c e domain ;
L a t t i c e M o d e l lattice_model_momentum ;
LatticeModel lattice_model_energy ;
i n t Nx , Ny ;
i n t time ;
d o u b l e omega_momentum ;
d o u b l e omega_energy ;
v e c t o r <BoundaryCondition> bc ;
Point startPointForceEvaluation , endPointForceEvaluation ;
d o u b l e Fx1 , Fy1 ;
d o u b l e Fx2 , Fy2 ;
d o u b l e Fx3 , Fy3 ;
double total_density ;
double total_density_u ;
double total_density_v ;
d o u b l e convergence_u ;
d o u b l e convergence_v ;
double convergence_rho ;
d o u b l e convergence_T ;
double g r a v i t y b e t a ;
ComputationTime computation_time ;
b o o l I n d i c e L o g i c o ( i n t n , i n t min , i n t max) {
i f ( n >= min && n <= max ) r e t u r n t r u e ;
e l s e return f a l s e ;
}
void CalculateTotalProperties ( void ) {
total_density = total_density_u = total_density_v = 0 . 0 ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {

126

425
426
427
428
429
430
431
432
433
434
435
436
437
438

439
440

441

442
443
444
445
446
447
448

449
450

451

452
453
454
455
456
457
458

459
460

461

i f ( domain [ i ] [ j ] . isWet == t r u e ) {
t o t a l _ d e n s i t y += domain [ i ] [ j ] . rho ;
t o t a l _ d e n s i t y _ u += domain [ i ] [ j ] . rho domain [ i
;
t o t a l _ d e n s i t y _ v += domain [ i ] [ j ] . rho domain [ i
;
}

][

].u

][

].v

}
v o i d ApplySimpleBoundaryCondition ( BoundaryCondition bc ) {
s w i t c h ( bc . t y p e ) {
c a s e NORTH_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . + bc . v ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[5]) ) ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e SOUTH_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . bc . v ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 7 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] + ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e EAST_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . + bc . u ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;

127

462
463
464
465
466
467
468

469
470

471

472
473
474
475
476
477
478

479
480

481

482
483
484
485
486
487
488

489
490

491

492
493
494
495
496
497
498

}
}
break ;
c a s e WEST_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . rho = domain [ i ] [ j ] . rho = ( 1 . / ( 1 . bc . u ) ) ( domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[7]) ) ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] + ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
}
}
break ;
c a s e NORTH_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . v = domain [ i ] [ j ] . v = 1. + ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[5]) ) ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e SOUTH_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . v = domain [ i ] [ j ] . v = 1 . ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 3 ] + 2 . (
domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 7 ] + domain [ i ] [ j ] . f
[8]) ) ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] + ( 2 . / 3 . ) bc . rho
bc . v ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) + ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 1 ] domain [ i ] [ j ] . f [ 3 ] ) ( 1 . / 2 . ) bc .
rho bc . u + ( 1 . / 6 . ) bc . rho bc . v ;
}
}
break ;
c a s e EAST_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . u = domain [ i ] [ j ] . u = 1. + ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f

128

499
500

501

502
503
504
505
506
507
508

509
510

511

512
513
514
515
516
517
518
519
520
521

522
523
524
525
526
527
528
529
530
531

532
533
534
535
536
537
538
539

[8]) ) ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ]
bc . u ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] +
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] )
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ]
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] )
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;

( 2 . / 3 . ) bc . rho
( 1 . / 2 . ) (
( 1 . / 6 . ) bc .
( 1 . / 2 . ) (
( 1 . / 6 . ) bc .

}
}
break ;
c a s e WEST_PRESSURE_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
bc . u = domain [ i ] [ j ] . u = 1 . ( 1 . / bc . rho ) ( domain [ i ] [ j
] . f [ 0 ] + domain [ i ] [ j ] . f [ 2 ] + domain [ i ] [ j ] . f [ 4 ] + 2 . (
domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 6 ] + domain [ i ] [ j ] . f
[7]) ) ;
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] + ( 2 . / 3 . ) bc . rho
bc . u ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u + ( 1 . / 2 . ) bc . rho bc . v ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] + ( 1 . / 2 . ) (
domain [ i ] [ j ] . f [ 2 ] domain [ i ] [ j ] . f [ 4 ] ) + ( 1 . / 6 . ) bc .
rho bc . u ( 1 . / 2 . ) bc . rho bc . v ;
}
}
break ;
c a s e NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] = 0 . 5 ( 0 . 5 (
domain [ i + 1 ] [ j ] . rho+domain [ i ] [ j 1 ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 6 ] +
domain [ i ] [ j ] . f [ 8 ] ) ) ;
}
}
break ;
c a s e NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] = ( 1 . / 2 . )
( ( 1 . / 2 . ) ( domain [ i 1 ] [ j ] . rho+domain [ i ] [ j 1 ] . rho )
(domain [ i ] [ j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j
] . f [ 2 ] + domain [ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [
i ] [ j ] . f [ 5 ] + domain [ i ] [ j ] . f [ 7 ] ) ) ;
}
}
break ;
c a s e SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;

129

540
541

542
543
544
545
546
547
548
549
550
551

552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594

domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] = 0 . 5 ( 0 . 5 (
domain [ i + 1 ] [ j ] . rho+domain [ i ] [ j + 1 ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 5 ] +
domain [ i ] [ j ] . f [ 7 ] ) ) ;

}
}
break ;
c a s e SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] = 0 . 5 ( 0 . 5 (
domain [ i ] [ j + 1 ] . rho+domain [ i 1 ] [ j ] . rho ) (domain [ i ] [
j ] . f [ 0 ] + domain [ i ] [ j ] . f [ 1 ] + domain [ i ] [ j ] . f [ 2 ] + domain
[ i ] [ j ] . f [ 3 ] + domain [ i ] [ j ] . f [ 4 ] + domain [ i ] [ j ] . f [ 6 ] +
domain [ i ] [ j ] . f [ 8 ] ) ) ;
}
}
break ;
c a s e NORTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i ] [ j ] . f [ 8 ] ;
}
}
break ;
c a s e NORTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 2 ] = domain [ i ] [ j ] . f [ 4 ] ;
domain [ i ] [ j ] . f [ 5 ] = domain [ i ] [ j ] . f [ 7 ] ;
}
}
break ;
c a s e SOUTH_WEST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
domain [ i ] [ j ] . f [ 3 ] = domain [ i ] [ j ] . f [ 1 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i ] [ j ] . f [ 5 ] ;
}
}
break ;
c a s e SOUTH_EAST_CONVEX_CORNER_VELOCITY_ZOU_HE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 1 ] = domain [ i ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 8 ] = domain [ i ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 4 ] = domain [ i ] [ j ] . f [ 2 ] ;
}
}
break ;
c a s e HALF_WAY_BOUNCEBACK:
break ;
c a s e FULL_WAY_BOUNCEBACK:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {

130

595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651

f o r ( i n t j = bc . s t a r t _ p o i n t .
swap ( domain [ i ] [ j ] . f [ 1 ] ,
swap ( domain [ i ] [ j ] . f [ 2 ] ,
swap ( domain [ i ] [ j ] . f [ 5 ] ,
swap ( domain [ i ] [ j ] . f [ 6 ] ,
}

j ; j <= bc . end_point . j ; j++ ) {


domain [ i ] [ j ] . f [ 3 ] ) ;
domain [ i ] [ j ] . f [ 4 ] ) ;
domain [ i ] [ j ] . f [ 7 ] ) ;
domain [ i ] [ j ] . f [ 8 ] ) ;

}
break ;
c a s e EAST_OPEN_BOUNDARY:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
domain [ i ] [ j ] . f [ 3 ] = domain [ i 1 ] [ j ] . f [ 3 ] ;
domain [ i ] [ j ] . f [ 6 ] = domain [ i 1 ] [ j ] . f [ 6 ] ;
domain [ i ] [ j ] . f [ 7 ] = domain [ i 1 ] [ j ] . f [ 7 ] ;
}
}
break ;
c a s e EAST_TEMPERATURE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
f o r ( i n t a l p h a = 0 ; a l p h a < l a t t i c e _ m o d e l _ e n e r g y >Q;
a l p h a++ ) {
domain [ i ] [ j ] . g [ a l p h a ] = l a t t i c e _ m o d e l _ e n e r g y >w [
a l p h a ] bc . T ;
}
}
}
break ;
c a s e WEST_TEMPERATURE:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
f o r ( i n t a l p h a = 0 ; a l p h a < l a t t i c e _ m o d e l _ e n e r g y >Q;
a l p h a++ ) {
domain [ i ] [ j ] . g [ a l p h a ] = l a t t i c e _ m o d e l _ e n e r g y >w [
a l p h a ] bc . T ;
}
}
}
break ;
c a s e ADIABATIC :
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
swap ( domain [ i ] [ j ] . g [ 1 ] , domain [ i ] [ j ] . g [ 3 ] ) ;
swap ( domain [ i ] [ j ] . g [ 0 ] , domain [ i ] [ j ] . g [ 2 ] ) ;
}
}
break ;
c a s e NORTH_ADIABATIC:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
f o r ( i n t a l p h a = 0 ; a l p h a < l a t t i c e _ m o d e l _ e n e r g y >Q;
a l p h a++ ) {
domain [ i ] [ j ] . g [ a l p h a ] = domain [ i ] [ j 1 ] . g [ a l p h a ] ;
}
}
}
break ;
c a s e SOUTH_ADIABATIC:
f o r ( i n t i = bc . s t a r t _ p o i n t . i ; i <= bc . end_point . i ; i++ ) {
f o r ( i n t j = bc . s t a r t _ p o i n t . j ; j <= bc . end_point . j ; j++ ) {
f o r ( i n t a l p h a = 0 ; a l p h a < l a t t i c e _ m o d e l _ e n e r g y >Q;
a l p h a++ ) {
domain [ i ] [ j ] . g [ a l p h a ] = domain [ i ] [ j + 1 ] . g [ a l p h a ] ;

131

652

653

}
break ;

654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671

672

673
674
675
676
677
678
679

};

}
}
v o i d C a l c u l a t e F o r c e ( P o i n t s t a r t P o i n t , P o i n t endPoint , d o u b l e& Fx , d o u b l e&
Fy ) {
i f ( s t a r t P o i n t . i >= en dP oin t . i | | s t a r t P o i n t . j >= en dPo in t . j )
return ;
int ii , j j ;
Fx = 0 . 0 ;
Fy = 0 . 0 ;
f o r ( i n t i = s t a r t P o i n t . i ; i <= en dPo in t . i ; i++ ) {
f o r ( i n t j = s t a r t P o i n t . j ; j <= e ndP oi nt . j ; j++ ) {
i f ( domain [ i ] [ j ] . isBC == t r u e ) {
f o r ( i n t a l f a = 1 ; a l f a < lattice_model_momentum>Q; a l f a
++ ) {
i i = i + lattice_model_momentum>e_x [
lattice_model_momentum>opp [ a l f a ] ] ;
j j = j + lattice_model_momentum>e_y [
lattice_model_momentum>opp [ a l f a ] ] ;
i f ( domain [ i i ] [ j j ] . isWet == t r u e ) {
Fx += lattice_model_momentum>e_x [ a l f a ] ( domain [
i ] [ j ] . f [ a l f a ] + domain [ i i ] [ j j ] . f [
lattice_model_momentum>opp [ a l f a ] ] ) ;
Fy += lattice_model_momentum>e_y [ a l f a ] ( domain [
i ] [ j ] . f [ a l f a ] + domain [ i i ] [ j j ] . f [
lattice_model_momentum>opp [ a l f a ] ] ) ;
}
}
}
}
}
}

680
681

#e n d i f

LBM2.h

132

Anexo B

Cdigo fuente de FVM


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

#i f n d e f FVM_H
#d e f i n e FVM_H
#i n c l u d e <math . h>
enum ENUMERATION { ZERO_TO_MINUS_ONE_N = 1 , ONE_TO_N } ;
enum MESH { UNIFORM = 1 , NONUNIFORM } ;
class ScalarField {
public :
S c a l a r F i e l d ( i n t Nx , i n t Ny , ENUMERATION enumeration_type ) {
t h i s >enumeration_type = enumeration_type ;
t h i s >Nx = Nx ;
t h i s >Ny = Ny ;
v a l u e = new d o u b l e [ Nx ] ;
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
v a l u e [ i ] = new d o u b l e [ Ny ] ;
}
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
f o r ( i n t j = 0 ; j < Ny ; j++ ) {
value [ i ] [ j ] = 0 . 0 ;
}
}
}
double getValue ( i n t i , i n t j ) {
i f ( enumeration_type == ZERO_TO_MINUS_ONE_N )
return value [ i ] [ j ] ;
e l s e i f ( enumeration_type == ONE_TO_N )
r e t u r n v a l u e [ i 1 ] [ j 1 ] ;
}
void setValue ( i n t i , i n t j , double v ) {
i f ( enumeration_type == ZERO_TO_MINUS_ONE_N )
value [ i ] [ j ] = v ;
e l s e i f ( enumeration_type == ONE_TO_N )
v a l u e [ i 1 ] [ j 1 ] = v ;
}
d o u b l e &o p e r a t o r ( ) ( i n t i , i n t j ) {
i f ( enumeration_type == ZERO_TO_MINUS_ONE_N )
return value [ i ] [ j ] ;
e l s e i f ( enumeration_type == ONE_TO_N )
r e t u r n v a l u e [ i 1 ] [ j 1 ] ;
}
void print ( ) {
p r i n t f ( " \ n E s c a l a r \n" ) ;
f o r ( i n t j = Ny1; j >= 0 ; j ) {
f o r ( i n t i = 0 ; i < Nx ; i++ ) {
p r i n t f ( " %15.9 f " , v a l u e [ i ] [ j ] ) ;

133

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

}
p r i n t f ( " \n" ) ;

}
p r i n t f ( " \n" ) ;

}
d o u b l e v a l u e ;
i n t Nx , Ny ;
ENUMERATION enumeration_type ;
};
c l a s s Mesh{
public :
Mesh ( d o u b l e Lx , d o u b l e Ly , i n t Nx , i n t Ny , MESH mesh_type ) {
t h i s >Lx = Lx ;
t h i s >Ly = Ly ;
t h i s >Nx = Nx ;
t h i s >Ny = Ny ;
t h i s >mesh_type = mesh_type ;
delta_xP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
delta_yP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
d_WP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
d_PE = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
d_PN = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
d_SP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
aP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
aE = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
aW = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
aN = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
aS = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
bP = new S c a l a r F i e l d (Nx , Ny , ONE_TO_N) ;
}
v o i d CalcMesh ( ) {
d o u b l e delta_xE , delta_xW , delta_yN , delta_yS ;
f o r ( i n t i = 1 ; i <= Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= Ny ; j++ ) {
( d_WP) ( i , j ) = 0 . 0 ;
( d_PE) ( i , j ) = 0 . 0 ;
( d_PN) ( i , j ) = 0 . 0 ;
( d_SP) ( i , j ) = 0 . 0 ;
delta_xW = delta_xE = delta_yN = delta_yS = 0 . 0 ;
( aP ) ( i , j ) = 0 . 0 ;
( aN) ( i , j ) = 0 . 0 ;
( aS ) ( i , j ) = 0 . 0 ;
( aW) ( i , j ) = 0 . 0 ;
( aE ) ( i , j ) = 0 . 0 ;
( bP ) ( i , j ) = 0 . 0 ;
( delta_xP ) ( i , j ) = x i ( i ) x i ( i 1) ;
( delta_yP ) ( i , j ) = y j ( j ) y j ( j 1) ;
delta_xW = x i ( i 1)x i ( i 2) ;
delta_xE = x i ( i +1)x i ( i ) ;
delta_yN = y j ( j +1)y j ( j ) ;
delta_yS = y j ( j 1)y j ( j 2) ;
i f ( i != 1 ) ( d_WP) ( i , j ) = 0 . 5 ( delta_xW+( delta_xP ) ( i
else
( d_WP) ( i , j ) = 0 . 5 ( delta_xP ) ( i , j ) ;
i f ( i != Nx ) ( d_PE) ( i , j ) = 0 . 5 ( delta_xE +( delta_xP ) ( i
else
( d_PE) ( i , j ) = 0 . 5 ( delta_xP ) ( i , j ) ;
i f ( j != 1 ) ( d_SP) ( i , j ) = 0 . 5 ( delta_yS +( delta_yP ) ( i
else
( d_SP) ( i , j ) = 0 . 5 ( delta_yP ) ( i , j ) ;
i f ( j != Ny ) ( d_PN) ( i , j ) = 0 . 5 ( delta_yN +( delta_yP ) ( i
else
( d_PN) ( i , j ) = 0 . 5 ( delta_yP ) ( i , j ) ;
i f ( i != 1 ) ( aW) ( i , j ) = ( delta_yP ) ( i , j ) / ( d_WP) ( i
i f ( i != Nx ) ( aE ) ( i , j ) = ( delta_yP ) ( i , j ) / ( d_PE) ( i
i f ( j != 1 ) ( aS ) ( i , j ) = ( delta_xP ) ( i , j ) / ( d_SP) ( i
i f ( j != Ny ) ( aN) ( i , j ) = ( delta_xP ) ( i , j ) / ( d_PN) ( i

134

, j));
, j));
, j));
, j));
,
,
,
,

j);
j);
j);
j);

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168

( aP ) ( i , j ) = ( aE ) ( i , j ) + ( aW) ( i , j ) + ( aN) ( i , j ) + ( aS ) ( i , j )
;
i f ( i == 1 && j == 1 ) {
( aP ) ( i , j ) = ( aP ) ( i , j ) 1 . 1 ;
}

}
d o u b l e Lx , Ly ;
i n t Nx , Ny ;
MESH mesh_type ;
double C;
S c a l a r F i e l d delta_xP ;
S c a l a r F i e l d delta_yP ;
S c a l a r F i e l d d_WP, d_PE, d_PN, d_SP ;
S c a l a r F i e l d aP , aE , aW, aN , aS ;
S c a l a r F i e l d bP ;
private :
double xi ( i n t i ) {
d o u b l e A;
i f ( mesh_type == UNIFORM ) {
r e t u r n ( Lx i ) / (Nx) ;
} e l s e i f ( mesh_type == NONUNIFORM ) {
A = Lx 0 . 5 / ( tanh(CNx 0 . 5 ) ) ;
r e t u r n A tanh (C ( i Nx 0 . 5 ) )+Lx 0 . 5 ;
}
}
double yj ( i n t j ) {
d o u b l e A;
i f ( mesh_type == UNIFORM ) {
r e t u r n ( Ly j ) / (Ny) ;
} e l s e i f ( mesh_type == NONUNIFORM ) {
A = Ly 0 . 5 / ( tanh(CNy 0 . 5 ) ) ;
r e t u r n A tanh (C ( j Ny 0 . 5 ) )+Ly 0 . 5 ;
}
}
};
class VelocityField {
public :
V e l o c i t y F i e l d ( i n t Nx , i n t Ny) {
t h i s >Nx = Nx ;
t h i s >Ny = Ny ;
u = new S c a l a r F i e l d (Nx+1 , Ny+2 , ZERO_TO_MINUS_ONE_N) ;
v = new S c a l a r F i e l d (Nx+2 , Ny+1 , ZERO_TO_MINUS_ONE_N) ;
}
S c a l a r F i e l d C a l c D i v e r g e n c e ( Mesh& mesh ) {
S c a l a r F i e l d d i v (Nx , Ny , ONE_TO_N) ;
f o r ( i n t i = 1 ; i <= Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= Ny ; j++ ) {
d i v ( i , j ) =(mesh . delta_yP ) ( i , j ) ( ( u ) ( i , j ) (u ) ( i 1 , j ) ) +(mesh .
delta_xP ) ( i , j ) ( ( v ) ( i , j ) (v ) ( i , j 1) ) ;
}
}
return div ;
}
void print ( ) {
p r i n t f ( " \ nComponente u\n" ) ;
f o r ( i n t j = Ny+1; j >= 0 ; j ) {
f o r ( i n t i = 0 ; i <= Nx ; i++ ) {
p r i n t f ( " %15.9 f " , ( u ) ( i , j ) ) ;
}
p r i n t f ( " \n" ) ;
}

135

169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222

p r i n t f ( " \n" ) ;
p r i n t f ( " \ nComponente v\n" ) ;
f o r ( i n t j = Ny ; j >= 0 ; j ) {
f o r ( i n t i = 0 ; i <= Nx+1; i++ ) {
p r i n t f ( " %15.9 f " , ( v ) ( i , j ) ) ;
}
p r i n t f ( " \n" ) ;
}
p r i n t f ( " \n" ) ;

}
S c a l a r F i e l d u ;
S c a l a r F i e l d v ;
i n t Nx , Ny ;

};
v o i d CalcMomentumConvectiveDifusiveTerm_ForcedConvection ( Mesh& mesh ,
V e l o c i t y F i e l d& u , d o u b l e Re , S c a l a r F i e l d& Rx , S c a l a r F i e l d &Ry ) {
d o u b l e Rei = 1 . 0 / Re ;
double d i f u s i v e ;
double convective ;
d o u b l e F_E, F_W, F_e , F_w, F_N, F_S, F_n, F_s , F_P;
d o u b l e u_e , u_n , u_w, u_s ;
d o u b l e v_e , v_n , v_w, v_s ;
f o r ( i n t i = 1 ; i <= mesh . Nx1; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
F_P = ( u . u ) ( i , j ) ( mesh . delta_yP ) ( i , j ) ;
F_E = ( u . u ) ( i +1 , j ) ( mesh . delta_yP ) ( i , j ) ;
F_W = ( u . u ) ( i 1 , j ) ( mesh . delta_yP ) ( i , j ) ;
F_e = . 5 (F_P + F_E) ;
F_w = . 5 (F_W + F_P) ;
F_n = . 5 ( ( u . v ) ( i , j ) ( mesh . delta_xP ) ( i , j ) + ( u . v ) ( i +1 , j )
( mesh . delta_xP ) ( i +1 , j ) ) ;
F_s = . 5 ( ( u . v ) ( i , j 1) ( mesh . delta_xP ) ( i , j ) + ( u . v ) ( i +1 , j
1) ( mesh . delta_xP ) ( i +1 , j ) ) ;
u_e = . 5 ( ( u . u ) ( i +1 , j ) + ( u . u ) ( i , j ) ) ;
u_w = . 5 ( ( u . u ) ( i 1 , j ) + ( u . u ) ( i , j ) ) ;
u_n = . 5 ( ( u . u ) ( i , j +1) + ( u . u ) ( i , j ) ) ;
u_s = . 5 ( ( u . u ) ( i , j 1) + ( u . u ) ( i , j ) ) ;
d i f u s i v e = ( ( ( u . u ) ( i , j ) ( u . u ) ( i 1 , j ) ) ( mesh . delta_yP ) ( i ,
j ) / ( mesh . delta_xP ) ( i , j )
+ ( ( u . u ) ( i +1 , j ) ( u . u ) ( i , j ) ) ( mesh . delta_yP ) ( i ,
j ) / ( mesh . delta_xP ) ( i +1 , j )
+ ( ( u . u ) ( i , j +1) ( u . u ) ( i , j ) ) ( mesh . d_PE) ( i , j ) /
( mesh .d_PN) ( i , j )
( ( u . u ) ( i , j ) ( u . u ) ( i , j 1) ) ( mesh . d_PE) ( i , j ) /
( mesh . d_SP) ( i , j )
) Rei ;
c o n v e c t i v e = u_e F_e + u_n F_n u_w F_w u_s F_s ;
Rx( i , j ) = d i f u s i v e c o n v e c t i v e ;
Rx( i , j ) = Rx( i , j ) / ( ( mesh . d_PE) ( i , j ) ( mesh . delta_yP ) ( i , j ) ) ;
}
}
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny1; j++ ) {
F_P = ( u . v ) ( i , j ) ( mesh . delta_xP ) ( i , j ) ;
F_N = ( u . v ) ( i , j +1) ( mesh . delta_xP ) ( i , j ) ;
F_S = ( u . v ) ( i , j 1) ( mesh . delta_xP ) ( i , j ) ;
F_e = . 5 ( ( u . u ) ( i , j ) ( mesh . delta_yP ) ( i , j ) + ( u . u ) ( i , j +1)
( mesh . delta_yP ) ( i , j +1) ) ;
F_w = . 5 ( ( u . u ) ( i 1 , j ) ( mesh . delta_yP ) ( i , j ) + ( u . u ) ( i 1 , j
+1) ( mesh . delta_yP ) ( i , j +1) ) ;
F_n = . 5 (F_P + F_N) ;
F_s = . 5 (F_P + F_S) ;
v_e = . 5 ( ( u . v ) ( i +1 , j ) + ( u . v ) ( i , j ) ) ;

136

223
224
225
226
227
228
229
230
231
232
233
234
235
236
237

238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272

v_w = . 5 ( ( u . v ) ( i 1 , j ) + ( u . v ) ( i , j ) ) ;
v_n = . 5 ( ( u . v ) ( i , j +1) + ( u . v ) ( i , j ) ) ;
v_s = . 5 ( ( u . v ) ( i , j 1) + ( u . v ) ( i , j ) ) ;
d i f u s i v e = ( ( ( u . v ) ( i , j ) ( u . v ) ( i 1 , j ) ) ( mesh .d_PN) ( i , j ) /
( mesh .d_WP) ( i , j )
+ ( ( u . v ) ( i +1 , j ) ( u . v ) ( i , j ) ) ( mesh .d_PN) ( i , j ) /
( mesh . d_PE) ( i , j )
+ ( ( u . v ) ( i , j +1) ( u . v ) ( i , j ) ) ( mesh . delta_xP ) ( i ,
j ) / ( mesh . delta_yP ) ( i , j +1)
( ( u . v ) ( i , j ) ( u . v ) ( i , j 1) ) ( mesh . delta_xP ) ( i ,
j ) / ( mesh . delta_yP ) ( i , j )
) Rei ;
c o n v e c t i v e = v_e F_e + v_n F_n v_w F_w v_s F_s ;
Ry( i , j ) = d i f u s i v e c o n v e c t i v e ;
Ry( i , j ) = Ry( i , j ) / ( ( mesh .d_PN) ( i , j ) ( mesh . delta_xP ) ( i , j ) ) ;

}
v o i d CalcMomentumConvectiveDifusiveTerm_NaturalConvection ( Mesh& mesh ,
V e l o c i t y F i e l d& u , S c a l a r F i e l d& T, d o u b l e Pr , d o u b l e Ra , S c a l a r F i e l d& Rx ,
S c a l a r F i e l d &Ry ) {
d o u b l e RaPr = Ra Pr ;
double d i f u s i v e ;
double convective ;
d o u b l e F_E, F_W, F_e , F_w, F_N, F_S, F_n, F_s , F_P;
d o u b l e u_e , u_n , u_w, u_s ;
d o u b l e v_e , v_n , v_w, v_s ;
f o r ( i n t i = 1 ; i <= mesh . Nx1; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
F_P = ( u . u ) ( i , j ) ( mesh . delta_yP ) ( i , j ) ;
F_E = ( u . u ) ( i +1 , j ) ( mesh . delta_yP ) ( i , j ) ;
F_W = ( u . u ) ( i 1 , j ) ( mesh . delta_yP ) ( i , j ) ;
F_e = . 5 (F_P + F_E) ;
F_w = . 5 (F_W + F_P) ;
F_n = . 5 ( ( u . v ) ( i , j ) ( mesh . delta_xP ) ( i , j ) + ( u . v ) ( i +1 , j )
( mesh . delta_xP ) ( i +1 , j ) ) ;
F_s = . 5 ( ( u . v ) ( i , j 1) ( mesh . delta_xP ) ( i , j ) + ( u . v ) ( i +1 , j
1) ( mesh . delta_xP ) ( i +1 , j ) ) ;
u_e = . 5 ( ( u . u ) ( i +1 , j ) + ( u . u ) ( i , j ) ) ;
u_w = . 5 ( ( u . u ) ( i 1 , j ) + ( u . u ) ( i , j ) ) ;
u_n = . 5 ( ( u . u ) ( i , j +1) + ( u . u ) ( i , j ) ) ;
u_s = . 5 ( ( u . u ) ( i , j 1) + ( u . u ) ( i , j ) ) ;
d i f u s i v e = ( ( ( u . u ) ( i , j ) ( u . u ) ( i 1 , j ) ) ( mesh . delta_yP ) ( i ,
j ) / ( mesh . delta_xP ) ( i , j )
+ ( ( u . u ) ( i +1 , j ) ( u . u ) ( i , j ) ) ( mesh . delta_yP ) ( i ,
j ) / ( mesh . delta_xP ) ( i +1 , j )
+ ( ( u . u ) ( i , j +1) ( u . u ) ( i , j ) ) ( mesh . d_PE) ( i , j ) /
( mesh .d_PN) ( i , j )
( ( u . u ) ( i , j ) ( u . u ) ( i , j 1) ) ( mesh . d_PE) ( i , j ) /
( mesh . d_SP) ( i , j )
) Pr ;
c o n v e c t i v e = u_e F_e + u_n F_n u_w F_w u_s F_s ;
Rx( i , j ) = d i f u s i v e c o n v e c t i v e ;
Rx( i , j ) = Rx( i , j ) / ( ( mesh . d_PE) ( i , j ) ( mesh . delta_yP ) ( i , j ) ) ;
}
}
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny1; j++ ) {
F_P = ( u . v ) ( i , j ) ( mesh . delta_xP ) ( i , j ) ;
F_N = ( u . v ) ( i , j +1) ( mesh . delta_xP ) ( i , j ) ;
F_S = ( u . v ) ( i , j 1) ( mesh . delta_xP ) ( i , j ) ;
F_e = . 5 ( ( u . u ) ( i , j ) ( mesh . delta_yP ) ( i , j ) + ( u . u ) ( i , j +1)
( mesh . delta_yP ) ( i , j +1) ) ;

137

273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324

F_w = . 5 ( ( u . u ) ( i 1 , j ) ( mesh . delta_yP ) ( i , j ) + ( u . u ) ( i 1 , j


+1) ( mesh . delta_yP ) ( i , j +1) ) ;
F_n = . 5 (F_P + F_N) ;
F_s = . 5 (F_P + F_S) ;
v_e = . 5 ( ( u . v ) ( i +1 , j ) + ( u . v ) ( i , j ) ) ;
v_w = . 5 ( ( u . v ) ( i 1 , j ) + ( u . v ) ( i , j ) ) ;
v_n = . 5 ( ( u . v ) ( i , j +1) + ( u . v ) ( i , j ) ) ;
v_s = . 5 ( ( u . v ) ( i , j 1) + ( u . v ) ( i , j ) ) ;
d i f u s i v e = ( ( ( u . v ) ( i , j ) ( u . v ) ( i 1 , j ) ) ( mesh .d_PN) ( i , j ) /
( mesh .d_WP) ( i , j )
+ ( ( u . v ) ( i +1 , j ) ( u . v ) ( i , j ) ) ( mesh .d_PN) ( i , j ) /
( mesh . d_PE) ( i , j )
+ ( ( u . v ) ( i , j +1) ( u . v ) ( i , j ) ) ( mesh . delta_xP ) ( i ,
j ) / ( mesh . delta_yP ) ( i , j +1)
( ( u . v ) ( i , j ) ( u . v ) ( i , j 1) ) ( mesh . delta_xP ) ( i ,
j ) / ( mesh . delta_yP ) ( i , j )
) Pr ;
c o n v e c t i v e = v_e F_e + v_n F_n v_w F_w v_s F_s ;
Ry( i , j ) = d i f u s i v e c o n v e c t i v e ;
Ry( i , j ) = Ry( i , j ) / ( ( mesh .d_PN) ( i , j ) ( mesh . delta_xP ) ( i , j ) ) ;
Ry( i , j ) += RaPr T( i , j ) ;

}
v o i d C a l c E n e r g y C o n v e c t i v e D i f u s i v e T e r m _ N a t u r a l C o n v e c t i o n ( Mesh& mesh ,
V e l o c i t y F i e l d& u , S c a l a r F i e l d& T, S c a l a r F i e l d& Q) {
double d i f u s i v e ;
double convective ;
d o u b l e F_e , F_w, F_n, F_s ;
d o u b l e T_e , T_n, T_w, T_s ;
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
F_e = ( mesh . delta_yP ) ( i , j ) ( u . u ) ( i , j ) ;
F_w = ( mesh . delta_yP ) ( i , j ) ( u . u ) ( i 1 , j ) ;
F_n = ( mesh . delta_xP ) ( i , j ) ( u . v ) ( i , j ) ;
F_s = ( mesh . delta_xP ) ( i , j ) ( u . v ) ( i , j 1) ;
T_e = . 5 ( T( i +1 , j ) + T( i , j ) ) ;
T_w = . 5 ( T( i 1 , j ) + T( i , j ) ) ;
T_n = . 5 ( T( i , j +1) + T( i , j ) ) ;
T_s = . 5 ( T( i , j 1) + T( i , j ) ) ;
d i f u s i v e = ( (T( i , j ) T( i 1 , j ) ) ( mesh . delta_yP ) ( i , j ) /
mesh .d_WP) ( i , j )
+ (T( i +1 , j ) T( i , j ) ) ( mesh . delta_yP ) ( i , j ) /
mesh . d_PE) ( i , j )
+ (T( i , j +1) T( i , j ) ) ( mesh . delta_xP ) ( i , j ) /
mesh .d_PN) ( i , j )
(T( i , j ) T( i , j 1) ) ( mesh . delta_xP ) ( i , j ) /
mesh . d_SP) ( i , j )
);
c o n v e c t i v e = T_e F_e + T_n F_n T_w F_w T_s F_s ;
Q( i , j ) = d i f u s i v e c o n v e c t i v e ;
Q( i , j ) = Q( i , j ) / ( ( mesh . delta_xP ) ( i , j ) ( mesh . delta_yP ) ( i
}
}
}
d o u b l e C a l c T i m e I n t e r v a l ( Mesh& mesh , V e l o c i t y F i e l d& u , d o u b l e nu , d o u b l e
C_conv , d o u b l e C_visc ) {
d o u b l e tmp ;
d o u b l e max1 = 0 . 0 , max2 = 0 . 0 ;
f o r ( i n t i = 1 ; i <= mesh . Nx1; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
tmp = ( f a b s ( ( u . u ) ( i , j ) ) / ( mesh . delta_xP ) ( i , j ) ) ;
i f ( tmp > max1 ) max1 = tmp ;

138

(
(
(
(

, j));

325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358

359
360
361
362
363
364
365
366
367
368
369
370
371

372
373
374
375
376
377
378
379
380

tmp = ( nu / pow ( ( mesh . delta_xP ) ( i , j ) , 2 . 0 ) ) ;


i f ( tmp > max2 ) max2 = tmp ;

}
}
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny1; j++ ) {
tmp = ( f a b s ( ( u . v ) ( i , j ) ) / ( mesh . delta_yP ) ( i , j ) ) ;
i f ( tmp > max1 ) max1 = tmp ;
tmp = ( nu / pow ( ( mesh . delta_yP ) ( i , j ) , 2 . 0 ) ) ;
i f ( tmp > max2 ) max2 = tmp ;
}
}
r e t u r n fmin ( ( C_conv/max1 ) , ( C_visc /max2 ) ) ;

}
d o u b l e C a l c M a x D e r i v a t i v e ( S c a l a r F i e l d& s c a l a r _ f i e l d 1 , S c a l a r F i e l d&
s c a l a r _ f i e l d 2 , double delta_t ) {
d o u b l e m a x _ d e r i v a t i v e = 0 . 0 , tmp = 0 . 0 ;
i f ( s c a l a r _ f i e l d 1 . enumeration_type == ZERO_TO_MINUS_ONE_N ) {
f o r ( i n t i = 0 ; i < s c a l a r _ f i e l d 1 . Nx ; i++ ) {
f o r ( i n t j = 0 ; j < s c a l a r _ f i e l d 1 . Ny ; j++ ) {
tmp = f a b s ( ( s c a l a r _ f i e l d 1 . g e t V a l u e ( i , j ) s c a l a r _ f i e l d 2 .
getValue ( i , j ) ) / delta_t ) ;
i f ( tmp > m a x _ d e r i v a t i v e ) m a x _ d e r i v a t i v e = tmp ;
}
}
} e l s e i f ( s c a l a r _ f i e l d 1 . enumeration_type == ONE_TO_N ) {
f o r ( i n t i = 1 ; i <= s c a l a r _ f i e l d 1 . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= s c a l a r _ f i e l d 1 . Ny ; j++ ) {
tmp = f a b s ( ( s c a l a r _ f i e l d 1 . g e t V a l u e ( i , j ) s c a l a r _ f i e l d 2 .
getValue ( i , j ) ) / delta_t ) ;
i f ( tmp > m a x _ d e r i v a t i v e ) m a x _ d e r i v a t i v e = tmp ;
}
}
}
r e t u r n max_derivative ;
}
v o i d MultiplySparseMatrixByVector_A ( S c a l a r F i e l d& aP , S c a l a r F i e l d& aW,
S c a l a r F i e l d& aE , S c a l a r F i e l d& aS , S c a l a r F i e l d& aN , S c a l a r F i e l d& x ,
S c a l a r F i e l d& y ) {
i n t nodoP = 1 ;
f o r ( i n t j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i n t i = 1 ; i <= aP . Nx ; i++ ) {
y ( 1 , nodoP ) = aP ( i , j ) x ( 1 , nodoP ) ;
i f ( i +1 <= aP . Nx) y ( 1 , nodoP ) = aE ( i , j ) x ( 1 , nodoP + 1 ) ;
i f ( i 1 >= 1 ) y ( 1 , nodoP ) = aW( i , j ) x ( 1 , nodoP 1 ) ;
i f ( j +1 <= aP . Ny) y ( 1 , nodoP ) = aN( i , j ) x ( 1 , nodoP + aP . Nx) ;
i f ( j 1 >= 1 ) y ( 1 , nodoP ) = aS ( i , j ) x ( 1 , nodoP aP . Nx) ;
nodoP++;
}
}
}
v o i d MultiplySparseMatrixByVector_B ( S c a l a r F i e l d& aP , S c a l a r F i e l d& aW,
S c a l a r F i e l d& aE , S c a l a r F i e l d& aS , S c a l a r F i e l d& aN , S c a l a r F i e l d& x ,
S c a l a r F i e l d& y ) {
f o r ( i n t j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i n t i = 1 ; i <= aP . Nx ; i++ ) {
y ( i , j ) = aP ( i , j ) x ( i , j ) ;
i f ( i +1 <= aP . Nx) y ( i , j ) = aE ( i , j ) x ( i +1 , j ) ;
i f ( i 1 >= 1 ) y ( i , j ) = aW( i , j ) x ( i 1 , j ) ;
i f ( j +1 <= aP . Ny) y ( i , j ) = aN( i , j ) x ( i , j +1) ;
i f ( j 1 >= 1 ) y ( i , j ) = aS ( i , j ) x ( i , j 1) ;
}
}

139

381
382

383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415

416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437

}
i n t SolverConjugateGradient_A ( S c a l a r F i e l d& aP , S c a l a r F i e l d& aW, S c a l a r F i e l d&
aE , S c a l a r F i e l d& aS , S c a l a r F i e l d& aN , S c a l a r F i e l d& bP , S c a l a r F i e l d& x ,
d o u b l e e p s i l o n , S c a l a r F i e l d& tmp_r , S c a l a r F i e l d& tmp_p , S c a l a r F i e l d&
tmp_Ap) {
i n t DIM = aP . Nx aP . Ny ;
int iteraciones = 0;
int i , j ;
d o u b l e r s o l d = 0 . 0 , a l p h a = 0 . 0 , rsnew = 0 . 0 ;
MultiplySparseMatrixByVector_A ( aP , aW, aE , aS , aN , x , tmp_r ) ;
f o r ( j = 1 ; j <= DIM ; j++ ) {
tmp_r ( 1 , j ) = ( 1) tmp_r ( 1 , j ) + bP ( 1 , 1 ) ;
tmp_p ( 1 , j ) = tmp_r ( 1 , j ) ;
r s o l d += tmp_r ( 1 , j ) tmp_r ( 1 , j ) ;
}
f o r ( i n t k = 1 ; k <= DIM ; k++ ) {
alpha = 0 . 0 ;
rsnew = 0 . 0 ;
i t e r a c i o n e s ++;
MultiplySparseMatrixByVector_A ( aP , aW, aE , aS , aN , tmp_p , tmp_Ap) ;
f o r ( j = 1 ; j <= DIM ; j++ ) {
a l p h a += tmp_p ( 1 , j ) tmp_Ap( 1 , j ) ;
}
alpha = r s o l d / alpha ;
f o r ( j = 1 ; j <= DIM ; j++ ) {
x ( 1 , j ) = x ( 1 , j ) + a l p h a tmp_p ( 1 , j ) ;
tmp_r ( 1 , j ) = tmp_r ( 1 , j ) a l p h a tmp_Ap( 1 , j ) ;
rsnew += tmp_r ( 1 , j ) tmp_r ( 1 , j ) ;
}
i f ( s q r t ( rsnew ) < e p s i l o n ) r e t u r n i t e r a c i o n e s ;
f o r ( j = 1 ; j <= DIM ; j++ ) {
tmp_p ( 1 , j ) = tmp_r ( 1 , j ) + ( rsnew / r s o l d ) tmp_p ( 1 , j ) ;
}
r s o l d = rsnew ;
}
r e t u r n 1;
}
i n t S o l v e r C o n j u g a t e G r a d i e n t _ B ( S c a l a r F i e l d& aP , S c a l a r F i e l d& aW, S c a l a r F i e l d&
aE , S c a l a r F i e l d& aS , S c a l a r F i e l d& aN , S c a l a r F i e l d& bP , S c a l a r F i e l d& x ,
d o u b l e e p s i l o n , S c a l a r F i e l d& tmp_r , S c a l a r F i e l d& tmp_p , S c a l a r F i e l d&
tmp_Ap) {
i n t DIM = aP . Nx aP . Ny ;
int iteraciones = 0;
int i , j ;
d o u b l e r s o l d = 0 . 0 , a l p h a = 0 . 0 , rsnew = 0 . 0 ;
MultiplySparseMatrixByVector_B ( aP , aW, aE , aS , aN , x , tmp_r ) ;
f o r ( j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i = 1 ; i <= aP . Nx ; i++ ) {
tmp_r ( i , j ) = ( 1) tmp_r ( i , j ) + bP( i , j ) ;
tmp_p( i , j ) = tmp_r ( i , j ) ;
r s o l d += tmp_r ( i , j ) tmp_r ( i , j ) ;
}
}
f o r ( i n t k = 1 ; k <= DIM ; k++ ) {
alpha = 0 . 0 ;
rsnew = 0 . 0 ;
i t e r a c i o n e s ++;
MultiplySparseMatrixByVector_B ( aP , aW, aE , aS , aN , tmp_p , tmp_Ap) ;
f o r ( j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i = 1 ; i <= aP . Nx ; i++ ) {
a l p h a += tmp_p( i , j ) tmp_Ap( i , j ) ;
}
}

140

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456

457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493

alpha = r s o l d / alpha ;
f o r ( j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i = 1 ; i <= aP . Nx ; i++ ) {
x ( i , j ) = x ( i , j ) + a l p h a tmp_p( i , j ) ;
tmp_r ( i , j ) = tmp_r ( i , j ) a l p h a tmp_Ap( i , j ) ;
rsnew += tmp_r ( i , j ) tmp_r ( i , j ) ;
}
}
i f ( s q r t ( rsnew ) < e p s i l o n ) r e t u r n i t e r a c i o n e s ;
f o r ( j = 1 ; j <= aP . Ny ; j++ ) {
f o r ( i = 1 ; i <= aP . Nx ; i++ ) {
tmp_p( i , j ) = tmp_r ( i , j ) + ( rsnew / r s o l d ) tmp_p( i , j ) ;
}
}
r s o l d = rsnew ;

}
r e t u r n 1;

}
i n t C a l c I n c o m p r e s s i b l e V e l o c i t y F i e l d _ G a u s s S h e i d e l ( Mesh& mesh , V e l o c i t y F i e l d&
u_comp , V e l o c i t y F i e l d& u_incomp , S c a l a r F i e l d& p , S c a l a r F i e l d& p_supuesta ,
d o u b l e e p s i l o n , d o u b l e omega ) {
d o u b l e max_error , e r r o r ;
i n t it_count = 0 ;
d o u b l e tmp ;
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
i f ( ! ( i == 1 && j == 1 ) ) {
( mesh . bP ) ( i , j ) = ( mesh . delta_yP ) ( i , j ) ( ( u_comp . u ) ( i , j ) (
u_comp . u ) ( i 1 , j ) ) +
( mesh . delta_xP ) ( i , j ) ( ( u_comp . v ) ( i , j ) (
u_comp . v ) ( i , j 1) ) ;
}
}
}
do {
max_error = 0 . 0 ;
i t _ c o u n t++;
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
tmp = 0 . 0 ;
i f ( i +1 <= mesh . Nx) tmp += ( mesh . aE ) ( i , j ) p_supuesta ( i +1 , j )
;
i f ( i 1 >= 1 )
tmp += ( mesh .aW) ( i , j ) p ( i 1 , j ) ;
i f ( j +1 <= mesh . Ny) tmp += ( mesh . aN) ( i , j ) p_supuesta ( i , j +1)
;
i f ( j 1 >= 1 )
tmp += ( mesh . aS ) ( i , j ) p ( i , j 1) ;
p ( i , j ) = ( ( mesh . bP) ( i , j ) + tmp ) / ( mesh . aP ) ( i , j ) ;
e r r o r = f a b s ( p ( i , j ) p_supuesta ( i , j ) ) ;
i f ( e r r o r > max_error ) max_error = e r r o r ;
}
}
i f ( max_error > e p s i l o n ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
p_supuesta ( i , j ) = p_supuesta ( i , j ) + omega ( p ( i , j )
p_supuesta ( i , j ) ) ;
}
}
}
} w h i l e ( max_error > e p s i l o n ) ;
f o r ( i n t i = 0 ; i <= mesh . Nx+1; i++ ) {
f o r ( i n t j = 0 ; j <= mesh . Ny+1; j++ ) {
i f ( i <= mesh . Nx )

141

494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509

510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544

( u_incomp . u ) ( i , j ) = ( u_comp . u ) ( i , j ) ;
i f ( j <= mesh . Ny )
( u_incomp . v ) ( i , j ) = ( u_comp . v ) ( i , j ) ;

}
}
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
i f ( i < mesh . Nx )
( u_incomp . u ) ( i , j ) = ( u_incomp . u ) ( i , j ) ( p ( i +1 , j ) p ( i , j )
) / ( mesh . d_PE) ( i , j ) ;
i f ( j < mesh . Ny )
( u_incomp . v ) ( i , j ) = ( u_incomp . v ) ( i , j ) ( p ( i , j +1) p ( i , j )
) / ( mesh .d_PN) ( i , j ) ;
}
}
return it_count ;

}
i n t C a l c I n c o m p r e s s i b l e V e l o c i t y F i e l d _ C o n j u g a t e G r a d i e n t ( Mesh& mesh ,
V e l o c i t y F i e l d& u_comp , V e l o c i t y F i e l d& u_incomp , S c a l a r F i e l d& p , d o u b l e
e p s i l o n , S c a l a r F i e l d& tmp_r , S c a l a r F i e l d& tmp_p , S c a l a r F i e l d& tmp_Ap) {
i n t it_count = 0 ;
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
( mesh . bP ) ( i , j ) = ( mesh . delta_yP ) ( i , j ) ( ( u_comp . u ) ( i , j ) (
u_comp . u ) ( i 1 , j ) ) +
( mesh . delta_xP ) ( i , j ) ( ( u_comp . v ) ( i , j ) (
u_comp . v ) ( i , j 1) ) ;
}
}
i t _ c o u n t = S o l v e r C o n j u g a t e G r a d i e n t _ B ( mesh . aP , mesh .aW, mesh . aE , mesh .
aS , mesh . aN , mesh . bP , p , e p s i l o n , tmp_r , tmp_p , tmp_Ap) ;
f o r ( i n t i = 0 ; i <= mesh . Nx+1; i++ ) {
f o r ( i n t j = 0 ; j <= mesh . Ny+1; j++ ) {
i f ( i <= mesh . Nx )
( u_incomp . u ) ( i , j ) = ( u_comp . u ) ( i , j ) ;
i f ( j <= mesh . Ny )
( u_incomp . v ) ( i , j ) = ( u_comp . v ) ( i , j ) ;
}
}
f o r ( i n t i = 1 ; i <= mesh . Nx ; i++ ) {
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
i f ( i < mesh . Nx )
( u_incomp . u ) ( i , j ) = ( u_incomp . u ) ( i , j ) ( p ( i +1 , j ) p ( i , j )
) / ( mesh . d_PE) ( i , j ) ;
i f ( j < mesh . Ny )
( u_incomp . v ) ( i , j ) = ( u_incomp . v ) ( i , j ) ( p ( i , j +1) p ( i , j )
) / ( mesh .d_PN) ( i , j ) ;
}
}
return it_count ;
}
v o i d C a l c S t r e a m F u n c t i o n ( Mesh& mesh , V e l o c i t y F i e l d& u , S c a l a r F i e l d&
f_corriente ){
f_corriente (0 ,0) = 0.0;
f o r ( i n t i = 1 ; i <= mesh . Nx ; i ++){
f _ c o r r i e n t e ( i , 0 ) = f _ c o r r i e n t e ( i 1 ,0) + ( u . v ) ( i , 0 ) ( mesh . delta_xP ) ( i
,1) ;
}
f o r ( i n t i = 0 ; i <= mesh . Ny ; i ++){
f o r ( i n t j = 1 ; j <= mesh . Ny ; j++ ) {
f _ c o r r i e n t e ( i , j ) = f _ c o r r i e n t e ( i , j 1) ( u . u ) ( i , j ) ( mesh .
delta_yP ) ( 1 , j ) ;
}

142

545
546
547

}
}
#e n d i f

FVM.h

143

Anexo C

Cdigo fuente de Driven Cavity


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

#i n c l u d e <c s t d l i b >
#i n c l u d e <math . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e <i o s t r e a m >
#i n c l u d e <iomanip>
#i n c l u d e <time . h>
#i n c l u d e " //FVM. h"
u s i n g namespace s t d ;
c l a s s ComputationTime {
clock_t s t a r t ;
public :
void Start ( ) {
start = clock () ;
}
d o u b l e Stop ( ) {
r e t u r n ( ( ( d o u b l e ) ( c l o c k ( ) s t a r t ) ) / CLOCKS_PER_SEC) ;
}
};
enum SOLVER {GAUSS_SHEIDEL = 1 , CONJUGATE_GRADIENT} ;
i n t main ( i n t a r g c , c h a r a r g v ) {
SOLVER s o l v e r _ t y p e = CONJUGATE_GRADIENT;
MESH mesh_type = UNIFORM;
const double C = 0 . 0 1 5 ;
c o n s t d o u b l e Lx = 1 . 0 , Ly = 1 . 0 ;
c o n s t i n t Nx = 1 5 0 , Ny = 1 5 0 ;
c o n s t d o u b l e Re = 1 0 0 0 ;
const double U = 1 . 0 ;
d o u b l e time = 0 . 0 ;
int ciclos = 0;
double delta_t = 0 ;
int iteraciones = 0;
V e l o c i t y F i e l d un (Nx , Ny) ;
V e l o c i t y F i e l d un1 (Nx , Ny) ;
V e l o c i t y F i e l d up (Nx , Ny) ;
V e l o c i t y F i e l d temp (Nx , Ny) ;
S c a l a r F i e l d p (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d p_supuesta (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_r (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_p(Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_Ap(Nx , Ny , ONE_TO_N) ;

144

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

Mesh mesh ;
FILE f i l e _ o u t _ d a t a = f o p e n ( " Data . t x t " , "w" ) ;
int i , j ;
d o u b l e convergence_u , convergence_v ;
const double f a c t o r _ r e l a j a c i o n _ s o l v e r = 1 . 1 ;
c o n s t d o u b l e e p s i l o n _ s o l v e r = 1E8;
c o n s t d o u b l e e p s i l o n = 6E4;
c o n s t d o u b l e tiempo_max_simulacion = 2 0 0 ;
c o n s t d o u b l e tiempo_min_simulacion = 0 . 0 5 ;
ComputationTime computation_time ;
d o u b l e ct_max = 0 . 0 , ct_min = 1 , c t _ t o t a l = 0 . 0 ;
d o u b l e ct_temporal = 0 . 0 ;
mesh = new Mesh ( Lx , Ly , Nx , Ny , mesh_type ) ;
mesh>C = C ;
mesh>CalcMesh ( ) ;
f o r ( i = 1 ; i <= Nx1; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
( un1 . u ) ( i , j ) = 0 . 0 ;
( un . u ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny1; j++ ) {
( un1 . v ) ( i , j ) = 0 . 0 ;
( un . v ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 0 ; i <= Nx ; i++ ) {
( temp . u ) ( i , Ny+1) = U;
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
p( i , j ) = 1 . 0 ;
p_supuesta ( i , j ) = 1 . 0 ;
}
}
do {
computation_time . S t a r t ( ) ;
d e l t a _ t = C a l c T i m e I n t e r v a l ( mesh , un , 1 . 0 / Re , . 3 5 0 . 4 , . 2 0 . 4 ) ;
CalcMomentumConvectiveDifusiveTerm_ForcedConvection ( mesh , un , Re ,
Rxn , Ryn ) ;
CalcMomentumConvectiveDifusiveTerm_ForcedConvection ( mesh , un1 , Re ,
Rxn1 , Ryn1 ) ;
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
i f ( i < mesh>Nx ) {
( up . u ) ( i , j ) = ( un . u ) ( i , j ) + d e l t a _ t ( 1 . 5 Rxn ( i , j )
0 . 5 Rxn1 ( i , j ) ) ;
}
i f ( j < mesh>Ny ) {
( up . v ) ( i , j ) = ( un . v ) ( i , j ) + d e l t a _ t ( 1 . 5 Ryn ( i , j )
0 . 5 Ryn1 ( i , j ) ) ;
}
}
}
f o r ( i = 0 ; i <= Nx ; i++ ) {
( up . u ) ( i , Ny+1) = U;
}
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( i <= mesh>Nx ) {
( un1 . u ) ( i , j ) = ( un . u ) ( i , j ) ;
}

145

104
105
106
107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

i f ( j <= mesh>Ny ) {
( un1 . v ) ( i , j ) = ( un . v ) ( i , j ) ;
}

}
}
i f ( s o l v e r _ t y p e == GAUSS_SHEIDEL ) {
i t e r a c i o n e s = C a l c I n c o m p r e s s i b l e V e l o c i t y F i e l d _ G a u s s S h e i d e l ( mesh ,
up , un , p , p_supuesta , e p s i l o n _ s o l v e r ,
factor_relajacion_solver ) ;
} e l s e i f ( s o l v e r _ t y p e == CONJUGATE_GRADIENT ) {
i t e r a c i o n e s = CalcIncompressibleVelocityField_ConjugateGradient (
mesh , up , un , p , e p s i l o n _ s o l v e r , tmp_r , tmp_p , tmp_Ap) ;
}
ct_temporal = computation_time . Stop ( ) ;
i f ( ct_max < ct_temporal ) ct_max = ct_temporal ;
i f ( ct_min > ct_temporal ) ct_min = ct_temporal ;
c t _ t o t a l += ct_temporal ;
p r i n t f ( "Tiempo = %f ( %d, %f , % f ) " , time , i t e r a c i o n e s , d e l t a _ t ,
ct_temporal ) ;
convergence_u = C a l c M a x D e r i v a t i v e ( ( un . u ) , ( un1 . u ) , d e l t a _ t ) ;
convergence_v = C a l c M a x D e r i v a t i v e ( ( un . v ) , ( un1 . v ) , d e l t a _ t ) ;
i = j = Nx / 2 ;
f p r i n t f ( f i l e _ o u t _ d a t a , " %d %.9 f %.9 f %.9 f %d %.9 f %.9 f %.9 f %.9 f %.9 f \
n" , c i c l o s , time , d e l t a _ t , ct_temporal , i t e r a c i o n e s , convergence_u
, convergence_v , ( un . u ) ( i , j ) / U, ( un . v ) ( i , j ) / U, p ( i , j ) /
delta_t ) ;
p r i n t f ( " { %f , %f }\n" , convergence_u , convergence_v ) ;
time += d e l t a _ t ;
c i c l o s ++;
i f ( convergence_u <= e p s i l o n && convergence_v <= e p s i l o n && time >
tiempo_min_simulacion | | time >= tiempo_max_simulacion ) {
FILE f i l e _ o u t _ u ;
FILE f i l e _ o u t _ v ;
FILE f i l e _ o u t _ p ;
FILE f i l e _ o u t _ f i ;
FILE f i l e _ o u t _ x m e s h f a c e , file_out_xmeshnode ,
f i l e _ o u t _ y m e s h f a c e , file_out_ymeshnode ;
f i l e _ o u t _ u = f o p e n ( "u . t x t " , "w" ) ;
f i l e _ o u t _ v = f o p e n ( "v . t x t " , "w" ) ;
f i l e _ o u t _ p = f o p e n ( "p . t x t " , "w" ) ;
f i l e _ o u t _ f i = f o p e n ( " f i . t x t " , "w" ) ;
f i l e _ o u t _ x m e s h f a c e = f o p e n ( " x_mesh_face . t x t " , "w" ) ;
file_out_xmeshnode = f o p e n ( "x_mesh_node . t x t " , "w" ) ;
f i l e _ o u t _ y m e s h f a c e = f o p e n ( " y_mesh_face . t x t " , "w" ) ;
file_out_ymeshnode = f o p e n ( "y_mesh_node . t x t " , "w" ) ;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ u , " %.9 f " , ( un . u ) ( i , j ) /U) ;
}
f p r i n t f ( f i l e _ o u t _ u , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f p r i n t f ( f i l e _ o u t _ v , " %.9 f " , ( un . v ) ( i , j ) /U) ;
}
f p r i n t f ( f i l e _ o u t _ v , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i +1 , j ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i 1 , j ) / d e l t a _ t ) ;

146

159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220

} e l s e i f ( j == 0 && i != 0 && i != mesh>Nx+1){


f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j +1) / d e l t a _ t ) ;
} e l s e i f ( j == mesh>Ny+1 && i != 0 && i != mesh>Nx+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j 1) / d e l t a _ t ) ;
} e l s e i f ( i == 0 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , 1 ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , 1 ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , mesh>Ny) /
delta_t ) ;
} e l s e i f ( i == 0 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , mesh>Ny) / d e l t a _ t ) ;
} else {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j ) / d e l t a _ t ) ;
}

}
f p r i n t f ( f i l e _ o u t _ p , " \n" ) ;

}
S c a l a r F i e l d f i (Nx+1 , Ny+1 , ZERO_TO_MINUS_ONE_N) ;
C a l c S t r e a m F u n c t i o n ( mesh , un , f i ) ;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ f i , " %.9 f " , f i ( i , j ) ) ;
}
f p r i n t f ( f i l e _ o u t _ f i , " \n" ) ;
}
double p o s i t i o n ;
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx+1 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>d_WP) ( i , 1 ) ;
f p r i n t f ( file_out_xmeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
i f ( i == 0 ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>delta_xP ) ( i , 1 ) ;
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( j == 0 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny+1 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>d_SP) ( 1 , j ) ;
f p r i n t f ( file_out_ymeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {

147

i f ( j == 0 ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>delta_yP ) ( 1 , j ) ;
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}

221
222
223
224
225
226
227
228

}
f c l o s e ( file_out_u ) ;
f c l o s e ( file_out_v ) ;
f c l o s e ( file_out_p ) ;
fclose ( file_out_fi ) ;
f c l o s e ( file_out_data ) ;
f c l o s e ( file_out_xmeshface ) ;
f c l o s e ( file_out_xmeshnode ) ;
f c l o s e ( file_out_ymeshface ) ;
f c l o s e ( file_out_ymeshnode ) ;
p r i n t f ( " C o n v e r g e n c i a a l a c a n z a d a o tiempo maximo de s i m u l a c i o n
a l c a n z a d o . \ n" ) ;
p r i n t f ( "Re : %f \nNx : %d\nNy : %d\n" , Re , Nx , Ny) ;
p r i n t f ( " E r r o r d e l s o l v e r : %e \ n E r r o r en e s t a c i o n a r i o : %e \n" ,
epsilon_solver , epsilon ) ;
p r i n t f ( "Tiempo de computacion maximo por c i c l o [ ms ] : %f \n" , ct_max )
;
p r i n t f ( "Tiempo de computacion minimo por c i c l o [ ms ] : %f \n" , ct_min )
;
p r i n t f ( "Tiempo de computacion t o t a l [ ms ] : %f \n" , c t _ t o t a l ) ;
p r i n t f ( "Tiempo de computacion promedio por c i c l o [ ms ] : %f \n" ,
ct_total /( double ) c i c l o s ) ;
p r i n t f ( "Numero de c i c l o s : %d\n" , c i c l o s ) ;
p r i n t f ( "Tiempo t o t a l de s i m u l a c i o n : %f \n" , time ) ;
return 1;

229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252

}
} while ( 1 ) ;
return 0;

main_1_lbm.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#i n c l u d e <c s t d l i b >
#i n c l u d e <math . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e <i o s t r e a m >
#i n c l u d e <iomanip>
#i n c l u d e <time . h>
#i n c l u d e " //FVM. h"
u s i n g namespace s t d ;
c l a s s ComputationTime {
clock_t s t a r t ;
public :
void Start ( ) {
start = clock () ;
}
d o u b l e Stop ( ) {
r e t u r n ( ( ( d o u b l e ) ( c l o c k ( ) s t a r t ) ) / CLOCKS_PER_SEC) ;
}
};
enum SOLVER {GAUSS_SHEIDEL = 1 , CONJUGATE_GRADIENT} ;
i n t main ( i n t a r g c , c h a r a r g v ) {
SOLVER s o l v e r _ t y p e = CONJUGATE_GRADIENT;
MESH mesh_type = UNIFORM;
const double C = 0 . 0 1 5 ;

148

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

c o n s t d o u b l e Lx = 1 . 0 , Ly = 1 . 0 ;
c o n s t i n t Nx = 1 5 0 , Ny = 1 5 0 ;
c o n s t d o u b l e Re = 1 0 0 0 ;
const double U = 1 . 0 ;
d o u b l e time = 0 . 0 ;
int ciclos = 0;
double delta_t = 0 ;
int iteraciones = 0;
V e l o c i t y F i e l d un (Nx , Ny) ;
V e l o c i t y F i e l d un1 (Nx , Ny) ;
V e l o c i t y F i e l d up (Nx , Ny) ;
V e l o c i t y F i e l d temp (Nx , Ny) ;
S c a l a r F i e l d p (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d p_supuesta (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_r (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_p(Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_Ap(Nx , Ny , ONE_TO_N) ;
Mesh mesh ;
FILE f i l e _ o u t _ d a t a = f o p e n ( " Data . t x t " , "w" ) ;
int i , j ;
d o u b l e convergence_u , convergence_v ;
const double f a c t o r _ r e l a j a c i o n _ s o l v e r = 1 . 1 ;
c o n s t d o u b l e e p s i l o n _ s o l v e r = 1E8;
c o n s t d o u b l e e p s i l o n = 6E4;
c o n s t d o u b l e tiempo_max_simulacion = 2 0 0 ;
c o n s t d o u b l e tiempo_min_simulacion = 0 . 0 5 ;
ComputationTime computation_time ;
d o u b l e ct_max = 0 . 0 , ct_min = 1 , c t _ t o t a l = 0 . 0 ;
d o u b l e ct_temporal = 0 . 0 ;
mesh = new Mesh ( Lx , Ly , Nx , Ny , mesh_type ) ;
mesh>C = C ;
mesh>CalcMesh ( ) ;
f o r ( i = 1 ; i <= Nx1; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
( un1 . u ) ( i , j ) = 0 . 0 ;
( un . u ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny1; j++ ) {
( un1 . v ) ( i , j ) = 0 . 0 ;
( un . v ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 0 ; i <= Nx ; i++ ) {
( temp . u ) ( i , Ny+1) = U;
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
p( i , j ) = 1 . 0 ;
p_supuesta ( i , j ) = 1 . 0 ;
}
}
do {
computation_time . S t a r t ( ) ;
d e l t a _ t = C a l c T i m e I n t e r v a l ( mesh , un , 1 . 0 / Re , . 3 5 0 . 4 , . 2 0 . 4 ) ;
CalcMomentumConvectiveDifusiveTerm_ForcedConvection ( mesh , un , Re ,
Rxn , Ryn ) ;

149

85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122

123
124
125
126
127
128
129
130
131
132
133
134
135
136

CalcMomentumConvectiveDifusiveTerm_ForcedConvection ( mesh , un1 , Re ,


Rxn1 , Ryn1 ) ;
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
i f ( i < mesh>Nx ) {
( up . u ) ( i , j ) = ( un . u ) ( i , j ) + d e l t a _ t ( 1 . 5 Rxn ( i , j )
0 . 5 Rxn1 ( i , j ) ) ;
}
i f ( j < mesh>Ny ) {
( up . v ) ( i , j ) = ( un . v ) ( i , j ) + d e l t a _ t ( 1 . 5 Ryn ( i , j )
0 . 5 Ryn1 ( i , j ) ) ;
}
}
}
f o r ( i = 0 ; i <= Nx ; i++ ) {
( up . u ) ( i , Ny+1) = U;
}
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( i <= mesh>Nx ) {
( un1 . u ) ( i , j ) = ( un . u ) ( i , j ) ;
}
i f ( j <= mesh>Ny ) {
( un1 . v ) ( i , j ) = ( un . v ) ( i , j ) ;
}
}
}
i f ( s o l v e r _ t y p e == GAUSS_SHEIDEL ) {
i t e r a c i o n e s = C a l c I n c o m p r e s s i b l e V e l o c i t y F i e l d _ G a u s s S h e i d e l ( mesh ,
up , un , p , p_supuesta , e p s i l o n _ s o l v e r ,
factor_relajacion_solver ) ;
} e l s e i f ( s o l v e r _ t y p e == CONJUGATE_GRADIENT ) {
i t e r a c i o n e s = CalcIncompressibleVelocityField_ConjugateGradient (
mesh , up , un , p , e p s i l o n _ s o l v e r , tmp_r , tmp_p , tmp_Ap) ;
}
ct_temporal = computation_time . Stop ( ) ;
i f ( ct_max < ct_temporal ) ct_max = ct_temporal ;
i f ( ct_min > ct_temporal ) ct_min = ct_temporal ;
c t _ t o t a l += ct_temporal ;
p r i n t f ( "Tiempo = %f ( %d, %f , % f ) " , time , i t e r a c i o n e s , d e l t a _ t ,
ct_temporal ) ;
convergence_u = C a l c M a x D e r i v a t i v e ( ( un . u ) , ( un1 . u ) , d e l t a _ t ) ;
convergence_v = C a l c M a x D e r i v a t i v e ( ( un . v ) , ( un1 . v ) , d e l t a _ t ) ;
i = j = Nx / 2 ;
f p r i n t f ( f i l e _ o u t _ d a t a , " %d %.9 f %.9 f %.9 f %d %.9 f %.9 f %.9 f %.9 f %.9 f \
n" , c i c l o s , time , d e l t a _ t , ct_temporal , i t e r a c i o n e s , convergence_u
, convergence_v , ( un . u ) ( i , j ) / U, ( un . v ) ( i , j ) / U, p ( i , j ) /
delta_t ) ;
p r i n t f ( " { %f , %f }\n" , convergence_u , convergence_v ) ;
time += d e l t a _ t ;
c i c l o s ++;
i f ( convergence_u <= e p s i l o n && convergence_v <= e p s i l o n && time >
tiempo_min_simulacion | | time >= tiempo_max_simulacion ) {
FILE f i l e _ o u t _ u ;
FILE f i l e _ o u t _ v ;
FILE f i l e _ o u t _ p ;
FILE f i l e _ o u t _ f i ;
FILE f i l e _ o u t _ x m e s h f a c e , file_out_xmeshnode ,
f i l e _ o u t _ y m e s h f a c e , file_out_ymeshnode ;
f i l e _ o u t _ u = f o p e n ( "u . t x t " , "w" ) ;
f i l e _ o u t _ v = f o p e n ( "v . t x t " , "w" ) ;
f i l e _ o u t _ p = f o p e n ( "p . t x t " , "w" ) ;
f i l e _ o u t _ f i = f o p e n ( " f i . t x t " , "w" ) ;

150

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198

f i l e _ o u t _ x m e s h f a c e = f o p e n ( " x_mesh_face . t x t " , "w" ) ;


file_out_xmeshnode = f o p e n ( "x_mesh_node . t x t " , "w" ) ;
f i l e _ o u t _ y m e s h f a c e = f o p e n ( " y_mesh_face . t x t " , "w" ) ;
file_out_ymeshnode = f o p e n ( "y_mesh_node . t x t " , "w" ) ;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ u , " %.9 f " , ( un . u ) ( i , j ) /U) ;
}
f p r i n t f ( f i l e _ o u t _ u , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f p r i n t f ( f i l e _ o u t _ v , " %.9 f " , ( un . v ) ( i , j ) /U) ;
}
f p r i n t f ( f i l e _ o u t _ v , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i +1 , j ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i 1 , j ) / d e l t a _ t ) ;
} e l s e i f ( j == 0 && i != 0 && i != mesh>Nx+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j +1) / d e l t a _ t ) ;
} e l s e i f ( j == mesh>Ny+1 && i != 0 && i != mesh>Nx+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j 1) / d e l t a _ t ) ;
} e l s e i f ( i == 0 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , 1 ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , 1 ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , mesh>Ny) /
delta_t ) ;
} e l s e i f ( i == 0 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , mesh>Ny) / d e l t a _ t ) ;
} else {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j ) / d e l t a _ t ) ;
}
}
f p r i n t f ( f i l e _ o u t _ p , " \n" ) ;
}
S c a l a r F i e l d f i (Nx+1 , Ny+1 , ZERO_TO_MINUS_ONE_N) ;
C a l c S t r e a m F u n c t i o n ( mesh , un , f i ) ;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ f i , " %.9 f " , f i ( i , j ) ) ;
}
f p r i n t f ( f i l e _ o u t _ f i , " \n" ) ;
}
double p o s i t i o n ;
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx+1 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>d_WP) ( i , 1 ) ;
f p r i n t f ( file_out_xmeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {

151

i f ( i == 0 ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>delta_xP ) ( i , 1 ) ;
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}

199
200
201
202
203
204
205
206

}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( j == 0 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny+1 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>d_SP) ( 1 , j ) ;
f p r i n t f ( file_out_ymeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
i f ( j == 0 ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>delta_yP ) ( 1 , j ) ;
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}
}
f c l o s e ( file_out_u ) ;
f c l o s e ( file_out_v ) ;
f c l o s e ( file_out_p ) ;
fclose ( file_out_fi ) ;
f c l o s e ( file_out_data ) ;
f c l o s e ( file_out_xmeshface ) ;
f c l o s e ( file_out_xmeshnode ) ;
f c l o s e ( file_out_ymeshface ) ;
f c l o s e ( file_out_ymeshnode ) ;
p r i n t f ( " C o n v e r g e n c i a a l a c a n z a d a o tiempo maximo de s i m u l a c i o n
a l c a n z a d o . \ n" ) ;
p r i n t f ( "Re : %f \nNx : %d\nNy : %d\n" , Re , Nx , Ny) ;
p r i n t f ( " E r r o r d e l s o l v e r : %e \ n E r r o r en e s t a c i o n a r i o : %e \n" ,
epsilon_solver , epsilon ) ;
p r i n t f ( "Tiempo de computacion maximo por c i c l o [ ms ] : %f \n" , ct_max )
;
p r i n t f ( "Tiempo de computacion minimo por c i c l o [ ms ] : %f \n" , ct_min )
;
p r i n t f ( "Tiempo de computacion t o t a l [ ms ] : %f \n" , c t _ t o t a l ) ;
p r i n t f ( "Tiempo de computacion promedio por c i c l o [ ms ] : %f \n" ,
ct_total /( double ) c i c l o s ) ;
p r i n t f ( "Numero de c i c l o s : %d\n" , c i c l o s ) ;
p r i n t f ( "Tiempo t o t a l de s i m u l a c i o n : %f \n" , time ) ;
return 1;

207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252

}
} while ( 1 ) ;
return 0;

main_1_fvm.cpp

152

Anexo D

Cdigo fuente de Differentially


Heated Cavity
1
2
3
4
5
6
7
8

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

#i n c l u d e <c s t d l i b >
#i n c l u d e <s t d i o . h>
#i n c l u d e <math . h>
#i n c l u d e <time . h>
#i n c l u d e " . . / /LBM. h"
u s i n g namespace s t d ;
i n t main ( i n t a r g c , c h a r a r g v ) {
L a t t i c e M o d e l lattice_model_momentum ( 2 , 9 , ( d o u b l e [ ] ) { 4 . 0 / 9 . 0 , 1 . 0 / 9 . 0 ,
1.0/9.0 , 1.0/9.0 , 1.0/9.0 , 1.0/36.0 , 1.0/36.0 , 1.0/36.0 , 1.0/36.0 } , (
i n t [ ] ) { 0 , 1 , 0 , 1, 0 , 1 , 1, 1, 1 } , ( i n t [ ] ) { 0 , 0 , 1 , 0 , 1, 1 , 1 ,
1, 1 } , NULL, ( i n t [ ] ) { 0 , 3 , 4 , 1 , 2 , 7 , 8 , 5 , 6 } , 1 . 0 / s q r t ( 3 . 0 ) ) ;
LatticeModel lattice_model_energy (2 , 9 ,( double [ ] ) { 4 . 0 / 9 . 0 , 1 . 0 / 9 . 0 ,
1.0/9.0 , 1.0/9.0 , 1.0/9.0 , 1.0/36.0 , 1.0/36.0 , 1.0/36.0 , 1.0/36.0 } , (
i n t [ ] ) { 0 , 1 , 0 , 1, 0 , 1 , 1, 1, 1 } , ( i n t [ ] ) { 0 , 0 , 1 , 0 , 1, 1 , 1 ,
1, 1 } , NULL, ( i n t [ ] ) { 0 , 3 , 4 , 1 , 2 , 7 , 8 , 5 , 6 } , 1 . 0 / s q r t ( 3 . 0 ) ) ;
Simulation simulation ;
int H = 40;
i n t Nx = H, Ny = H;
c o n s t d o u b l e Ra = 1E3 ;
c o n s t d o u b l e Pr = 0 . 7 1 ;
c o n s t d o u b l e Thot = 1 . 0 ;
c o n s t d o u b l e Tcold = 0 . 0 ;
d o u b l e nu = 0 . 0 5 ;
double a ;
d o u b l e omega_momentum , omega_energy ;
d o u b l e Ma;
i n t it_output = 1 ;
i n t it_movie_output = 1 0 0 0 0 0 ;
int i , j , alfa ;
d o u b l e e p s i l o n = 1E4;
double U _ c a r a c t e r i s t i c a ;
double U_adimensionalizacion ;
double g r a v i t y b e t a ;
FILE output_u = NULL;
FILE output_v = NULL;
FILE output_rho = NULL;
FILE output_T = NULL;
FILE o u t p u t _ p r e s s u r e = NULL;
FILE o u t p u t _ v e l o c i t y = NULL;
FILE output_data = NULL;
FILE o u t p u t _ i n f o = NULL;

153

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
61
62
63
64

65

66

67

68
69
70
71
72
73
74
75
76

FILE output_Nu = NULL;


c h a r output_file_name [ 1 0 0 ] ;
c h a r keyboard ;
d o u b l e u_old , v_old , rho_old , T_old ;
d o u b l e ct_max = 0 . 0 , ct_min = 1 , c t _ t o t a l = 0 . 0 ;
d o u b l e ct_temporal = 0 . 0 ;
a = nu / Pr ;
U _ a d i m e n s i o n a l i z a c i o n = a / ( d o u b l e ) Ny ;
U _ c a r a c t e r i s t i c a = U _ a d i m e n s i o n a l i z a c i o n s q r t ( RaPr ( ThotTcold ) ) ;
g r a v i t y b e t a = pow ( U _ c a r a c t e r i s t i c a , 2 . 0 ) / ( ( ThotTcold ) Ny ) ;
omega_momentum = 1 . 0 / ( 3 . 0 nu + 0 . 5 ) ;
omega_energy = 1 . 0 / ( 3 . 0 a + 0 . 5 ) ;
Ma = U _ c a r a c t e r i s t i c a / lattice_model_momentum . c s ;
p r i n t f ( " Parametros de s i m u l a c i o n \nRa = %f \ nPr = %f \nU c a r a c t e r i s t i c a = %f \
nU a d i m e n s i o n a l i z a c i o n = %f \nMa = %f \nnu = %f \ na = %f \nomega momentum
= %f \nomega e n e r g y = %f \n" ,
Ra , Pr , U _ c a r a c t e r i s t i c a , U _ a d i m e n s i o n a l i z a c i o n , Ma,
nu , a , omega_momentum , omega_energy ) ;
output_data = f o p e n ( " Data . t x t " , "w" ) ;
o u t p u t _ i n f o = f o p e n ( " i n f o . t x t " , "w" ) ;
f p r i n t f ( o u t p u t _ i n f o , " %d %d %f %f %f %f %f %f %f %f %f " , Nx , Ny ,
U _ c a r a c t e r i s t i c a , U _ a d i m e n s i o n a l i z a c i o n , nu , a , omega_momentum ,
omega_energy , Ra , Ma, Pr ) ;
f c l o s e ( output_info ) ;
s i m u l a t i o n = new S i m u l a t i o n ( Nx , Ny , &lattice_model_momentum , &
l a t t i c e _ m o d e l _ e n e r g y , omega_momentum , omega_energy , g r a v i t y b e t a ) ;
s i m u l a t i o n >I n i t E q u i l i b r i u m ( 1 . 0 , ( Thot + Tcold ) 0 . 5 ) ;
u_old = v_old = 0 ;
rho_old = 1 . 0 ;
T_old = ( Thot + Tcold ) 0 . 5 ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( NORTH_VELOCITY_ZOU_HE
, P o i n t ( 1 , Ny1) , P o i n t (Nx2 ,Ny1) , 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( SOUTH_VELOCITY_ZOU_HE
, P o i n t ( 1 , 0 ) , P o i n t (Nx2 ,0) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( WEST_VELOCITY_ZOU_HE,
P o i n t ( 0 , 1 ) , P o i n t ( 0 , Ny2) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( EAST_VELOCITY_ZOU_HE,
P o i n t (Nx1 ,1) , P o i n t (Nx1 ,Ny2) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition (
NORTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE, P o i n t ( 0 , Ny1) , P o i n t ( 0 , Ny
1) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition (
NORTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE, P o i n t (Nx1 ,Ny1) , P o i n t (Nx
1 ,Ny1) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition (
SOUTH_WEST_CONCAVE_CORNER_VELOCITY_ZOU_HE, P o i n t ( 0 , 0 ) , P o i n t ( 0 , 0 ) ,
0.0 , 0.0 , 0.0 ,0.0) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition (
SOUTH_EAST_CONCAVE_CORNER_VELOCITY_ZOU_HE, P o i n t (Nx1 ,0) , P o i n t (Nx
1 ,0) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( SOUTH_ADIABATIC,
P o i n t ( 1 , 0 ) , P o i n t (Nx2 ,0) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( NORTH_ADIABATIC,
P o i n t ( 1 , Ny1) , P o i n t (Nx2 ,Ny1) , 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( WEST_TEMPERATURE,
P o i n t ( 0 , 0 ) , P o i n t ( 0 , Ny1) , 0 . 0 , 0 . 0 , 0 . 0 , Thot ) ) ;
s i m u l a t i o n >AddBoundaryCondition ( BoundaryCondition ( EAST_TEMPERATURE,
P o i n t (Nx1 ,0) , P o i n t (Nx1 ,Ny1) , 0 . 0 , 0 . 0 , 0 . 0 , Tcold ) ) ;
while ( 1 ){
ct_temporal = s i m u l a t i o n >Tick ( ) ;
i f ( ct_max < ct_temporal ) ct_max = ct_temporal ;
i f ( ct_min > ct_temporal ) ct_min = ct_temporal ;
c t _ t o t a l += ct_temporal ;

154

77
78
79

80
81
82

83

84

85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

s i m u l a t i o n >convergence_u = pow (Ny , 2 . 0 ) / ( a U _ a d i m e n s i o n a l i z a c i o n ) ;


s i m u l a t i o n >convergence_v = pow (Ny , 2 . 0 ) / ( a U _ a d i m e n s i o n a l i z a c i o n ) ;
p r i n t f ( "Tiempo : %d ( %.11 f %.11 f %.11 f %.11 f ) \n" , s i m u l a t i o n >time ,
s i m u l a t i o n >convergence_rho , s i m u l a t i o n >convergence_u , s i m u l a t i o n
>convergence_v , s i m u l a t i o n >convergence_T ) ;
i = j = (Nx1) 0 . 5 ;
f p r i n t f ( output_data , " %d %.9 f %.9 f %.9 f %.9 f %.9 f %.9 f %.9 f %.9 f %.9 f
%.9 f %.9 f %.9 f %.9 f %.9 f %.9 f \n" ,
s i m u l a t i o n >time , ( d o u b l e ) ( s i m u l a t i o n >time ) / ( pow (Ny , 2 . 0 ) / a )
, ct_temporal , s i m u l a t i o n >convergence_u , s i m u l a t i o n >
convergence_v ,
s i m u l a t i o n >convergence_rho ,
s i m u l a t i o n >domain [ i ] [ j ] . u / U _ a d i m e n s i o n a l i z a c i o n ,
s i m u l a t i o n >domain [ i ] [ j ] . v / U _ a d i m e n s i o n a l i z a c i o n ,
s i m u l a t i o n >domain [ i ] [ j ] . rho , s i m u l a t i o n >domain [ i ] [
j ] . rho pow ( s i m u l a t i o n >lattice_model_momentum>cs , 2 . 0 ) ,
s i m u l a t i o n >domain [ i ] [ j ] . u u_old , s i m u l a t i o n >domain [ i
] [ j ] . v v_old , s i m u l a t i o n >domain [ i ] [ j ] . rho
rho_old ,
s i m u l a t i o n >t o t a l _ d e n s i t y , s i m u l a t i o n >t o t a l _ d e n s i t y _ u ,
s i m u l a t i o n >t o t a l _ d e n s i t y _ v ) ;
u_old = s i m u l a t i o n >domain [ i ] [ j ] . u ;
v_old = s i m u l a t i o n >domain [ i ] [ j ] . v ;
rho_old = s i m u l a t i o n >domain [ i ] [ j ] . rho ;
T_old = s i m u l a t i o n >domain [ i ] [ j ] . T ;
i f ( ( s i m u l a t i o n >time % i t _ o u t p u t ) == 0 ) {
output_u = f o p e n ( "u . t x t " , "w" ) ;
output_v = f o p e n ( "v . t x t " , "w" ) ;
output_T = f o p e n ( "T . t x t " , "w" ) ;
o u t p u t _ v e l o c i t y = f o p e n ( " v e l o c i t y . t x t " , "w" ) ;
output_rho = f o p e n ( " rho . t x t " , "w" ) ;
o u t p u t _ p r e s s u r e = f o p e n ( " p r e s s u r e . t x t " , "w" ) ;
f o r ( j = 0 ; j < Ny ; j++ ) {
f o r ( i = 0 ; i < Nx ; i++ ) {
f p r i n t f ( output_u , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . u /
U_adimensionalizacion ) ;
f p r i n t f ( output_v , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . v /
U_adimensionalizacion ) ;
f p r i n t f ( output_T , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . T) ;
f p r i n t f ( o u t p u t _ v e l o c i t y , " %f " , s q r t ( s i m u l a t i o n >domain [ i
] [ j ] . u s i m u l a t i o n >domain [ i ] [ j ] . u+s i m u l a t i o n >
domain [ i ] [ j ] . v s i m u l a t i o n >domain [ i ] [ j ] . v ) /
U_adimensionalizacion ) ;
f p r i n t f ( output_rho , " %f " , s i m u l a t i o n >domain [ i ] [ j ] .
rho ) ;
f p r i n t f ( o u t p u t _ p r e s s u r e , " %f " , s i m u l a t i o n >domain [ i ] [ j
] . rho / 3 . 0 ) ;
}
f p r i n t f ( output_u , " \n" ) ;
f p r i n t f ( output_v , " \n" ) ;
f p r i n t f ( output_T , " \n" ) ;
f p r i n t f ( o u t p u t _ v e l o c i t y , " \n" ) ;
f p r i n t f ( output_rho , " \n" ) ;
f p r i n t f ( o u t p u t _ p r e s s u r e , " \n" ) ;
}
f c l o s e ( output_u ) ;
f c l o s e ( output_v ) ;
f c l o s e ( output_T ) ;
f c l o s e ( output_velocity ) ;
f c l o s e ( output_rho ) ;
f c l o s e ( output_pressure ) ;
p r i n t f ( " A r c h i v o s de s a l i d a g e n e r a d o s . \ n . 1 . P u l s e Enter para
c o n t i n u a r . \ n 2 . P u l s e E para s a l i r . \ n 3 . P u l s e C para
cambiar e l i n t e r v a l o de tiempo de m u e s t r e o . \ n :> " ) ;

155

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

164
165
166
167
168
169
170

do {

keyboard = g e t c h a r ( ) ;
s w i t c h ( keyboard ) {
c a s e E :
f c l o s e ( output_data ) ;
return 0;
c a s e C :
p r i n t f ( " \ nEl i n t e r v a l o a c t u a l de m u e s t r e o e s %d , por
f a v o r i n t r o d u z c a e l nuevo : " , i t _ o u t p u t ) ;
s c a n f ( " %d" , &i t _ o u t p u t ) ;
break ;
}
} w h i l e ( keyboard != \n && keyboard != C ) ;

}
i f ( ( s i m u l a t i o n >time % it_movie_output ) == 0 ) {
s p r i n t f ( output_file_name , " movie //u %d . t x t " , s i m u l a t i o n >time ) ;
output_u = f o p e n ( output_file_name , "w" ) ;
s p r i n t f ( output_file_name , " movie // v %d . t x t " , s i m u l a t i o n >time ) ;
output_v = f o p e n ( output_file_name , "w" ) ;
s p r i n t f ( output_file_name , " movie // rho %d . t x t " , s i m u l a t i o n >time ) ;
output_rho = f o p e n ( output_file_name , "w" ) ;
s p r i n t f ( output_file_name , " movie //T %d . t x t " , s i m u l a t i o n >time ) ;
output_T = f o p e n ( output_file_name , "w" ) ;
f o r ( j = 0 ; j < Ny ; j++ ) {
f o r ( i = 0 ; i < Nx ; i++ ) {
f p r i n t f ( output_u , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . u /
U_adimensionalizacion ) ;
f p r i n t f ( output_v , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . v /
U_adimensionalizacion ) ;
f p r i n t f ( output_rho , " %f " , s i m u l a t i o n >domain [ i ] [ j ] .
rho ) ;
f p r i n t f ( output_T , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . T ) ;
}
f p r i n t f ( output_u , " \n" ) ;
f p r i n t f ( output_v , " \n" ) ;
f p r i n t f ( output_rho , " \n" ) ;
f p r i n t f ( output_T , " \n" ) ;
}
f c l o s e ( output_u ) ;
f c l o s e ( output_v ) ;
f c l o s e ( output_rho ) ;
f c l o s e ( output_T ) ;
}
i f ( s i m u l a t i o n >time >= 3H && s i m u l a t i o n >convergence_u <= e p s i l o n &&
s i m u l a t i o n >convergence_v <= e p s i l o n ) {
p r i n t f ( " C o n v e r g e n c i a a l a c a n z a d a . \ n" ) ;
p r i n t f ( "Ra : %f \ nPr : %f \nNx : %d\nNy : %d\n" , Ra , Pr , Nx , Ny) ;
p r i n t f ( " E r r o r en e s t a c i o n a r i o : %e \n" , e p s i l o n ) ;
p r i n t f ( "U c a r a c t e r i s t i c a : %f \nU a d i m e n s i o n a l i z a c i o n : %f \nMa : %f \
nnu : %f \ na : %f \nomega momentum : %f \nomega e n e r g y : %f \n" ,
U _ c a r a c t e r i s t i c a , U _ a d i m e n s i o n a l i z a c i o n , Ma, nu , a ,
omega_momentum , omega_energy ) ;
p r i n t f ( "Tiempo de computacion maximo por c i c l o [ ms ] : %f \n" , ct_max )
;
p r i n t f ( "Tiempo de computacion minimo por c i c l o [ ms ] : %f \n" , ct_min )
;
p r i n t f ( "Tiempo de computacion t o t a l [ ms ] : %f \n" , c t _ t o t a l ) ;
p r i n t f ( "Tiempo de computacion promedio por c i c l o [ ms ] : %f \n" ,
c t _ t o t a l / ( d o u b l e ) s i m u l a t i o n >time ) ;
p r i n t f ( "Numero de c i c l o s : %d\n" , s i m u l a t i o n >time ) ;
p r i n t f ( "Tiempo de s i m u l a c i o n : %f \n" , ( d o u b l e ) ( s i m u l a t i o n >time ) /
( pow (Ny , 2 . 0 ) / a ) ) ;
output_u = f o p e n ( "u . t x t " , "w" ) ;

156

171
172
173
174
175
176
177
178
179
180
181
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218

219
220
221

output_v = f o p e n ( "v . t x t " , "w" ) ;


output_T = f o p e n ( "T . t x t " , "w" ) ;
o u t p u t _ v e l o c i t y = f o p e n ( " v e l o c i t y . t x t " , "w" ) ;
output_rho = f o p e n ( " rho . t x t " , "w" ) ;
o u t p u t _ p r e s s u r e = f o p e n ( " p r e s s u r e . t x t " , "w" ) ;
output_Nu = f o p e n ( "Nu . t x t " , "w" ) ;
f o r ( j = 0 ; j < Ny ; j++ ) {
f o r ( i = 0 ; i < Nx ; i++ ) {
f p r i n t f ( output_u , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . u /
U_adimensionalizacion ) ;
f p r i n t f ( output_v , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . v /
U_adimensionalizacion ) ;
f p r i n t f ( output_T , " %f " , s i m u l a t i o n >domain [ i ] [ j ] . T ) ;
f p r i n t f ( o u t p u t _ v e l o c i t y , " %f " , s q r t ( s i m u l a t i o n >domain [ i
] [ j ] . u s i m u l a t i o n >domain [ i ] [ j ] . u+s i m u l a t i o n >
domain [ i ] [ j ] . v s i m u l a t i o n >domain [ i ] [ j ] . v ) /
U_adimensionalizacion ) ;
f p r i n t f ( output_rho , " %f " , s i m u l a t i o n >domain [ i ] [ j ] .
rho ) ;
f p r i n t f ( o u t p u t _ p r e s s u r e , " %f " , s i m u l a t i o n >domain [ i ] [ j
] . rho / 3 . 0 ) ;
}
f p r i n t f ( output_u , " \n" ) ;
f p r i n t f ( output_v , " \n" ) ;
f p r i n t f ( output_T , " \n" ) ;
f p r i n t f ( o u t p u t _ v e l o c i t y , " \n" ) ;
f p r i n t f ( output_rho , " \n" ) ;
f p r i n t f ( o u t p u t _ p r e s s u r e , " \n" ) ;
}
f c l o s e ( output_u ) ;
f c l o s e ( output_v ) ;
f c l o s e ( output_T ) ;
f c l o s e ( output_velocity ) ;
f c l o s e ( output_rho ) ;
f c l o s e ( output_pressure ) ;
f c l o s e ( output_data ) ;
d o u b l e Nu_medio = 0 . 0 ;
d o u b l e Nu_i ;
d o u b l e Nu_min_hot , Nu_min_cold ;
d o u b l e Nu_min_hot_y , Nu_min_cold_y ;
d o u b l e Nu_max_hot , Nu_max_cold ;
d o u b l e Nu_max_hot_y , Nu_max_cold_y ;
double p o s i t i o n ;
d o u b l e Nu_local ;
d o u b l e Dx , Dy ;
Dx = 1 . 0 / ( ( d o u b l e )Nx1.0) ;
Dy = 1 . 0 / ( ( d o u b l e )Ny1.0) ;
f o r ( i = 1 ; i <= Nx3; i++ ) {
Nu_i = 0 . 0 ;
i f ( i == 1 ) {
Nu_min_hot = 1 0 0 0 ;
Nu_max_hot = 1000;
position = 0.0;
f o r ( j = 0 ; j <= Ny1; j++ ) {
Nu_local = ( 1) ( s i m u l a t i o n >domain [ i +1 ] [ j ] . T
s i m u l a t i o n >domain [ i ] [ j ] . T) ( ( d o u b l e )Nx1.0) +
0 . 5 ( s i m u l a t i o n >domain [ i +1 ] [ j ] . u+s i m u l a t i o n
>domain [ i ] [ j ] . u ) 0 . 5 ( s i m u l a t i o n >domain [ i +1
] [ j ] . T+s i m u l a t i o n >domain [ i ] [ j ] . T) /
U_adimensionalizacion ;
i f ( Nu_local > Nu_max_hot) {
Nu_max_hot = Nu_local ;
Nu_max_hot_y = p o s i t i o n ;

157

222
223
224
225
226
227
228
229
230
231
232
233
234
235

236
237
238
239
240
241
242
243
244
245
246
247
248
249

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272

}
i f ( Nu_local < Nu_min_hot ) {
Nu_min_hot = Nu_local ;
Nu_min_hot_y = p o s i t i o n ;
}
p o s i t i o n += Dy ;
Nu_i += Nu_local ;

}
} e l s e i f ( i == (Nx3) ) {
Nu_min_cold = 1 0 0 0 ;
Nu_max_cold = 1000;
position = 0.0;
f o r ( j = 0 ; j <= Ny1; j++ ) {
Nu_local = ( 1) ( s i m u l a t i o n >domain [ i +1 ] [ j ] . T
s i m u l a t i o n >domain [ i ] [ j ] . T) ( ( d o u b l e )Nx1.0) +
0 . 5 ( s i m u l a t i o n >domain [ i +1 ] [ j ] . u+s i m u l a t i o n
>domain [ i ] [ j ] . u ) 0 . 5 ( s i m u l a t i o n >domain [ i +1
] [ j ] . T+s i m u l a t i o n >domain [ i ] [ j ] . T) /
U_adimensionalizacion ;
i f ( Nu_local > Nu_max_cold ) {
Nu_max_cold = Nu_local ;
Nu_max_cold_y = p o s i t i o n ;
}
i f ( Nu_local < Nu_min_cold ) {
Nu_min_cold = Nu_local ;
Nu_min_cold_y = p o s i t i o n ;
}
p o s i t i o n += Dy ;
Nu_i += Nu_local ;
}
}else {
f o r ( j = 0 ; j <= Ny1; j++ ) {
Nu_local = ( 1) ( s i m u l a t i o n >domain [ i +1 ] [ j ] . T
s i m u l a t i o n >domain [ i ] [ j ] . T) ( ( d o u b l e )Nx1.0) +
0 . 5 ( s i m u l a t i o n >domain [ i +1 ] [ j ] . u+s i m u l a t i o n
>domain [ i ] [ j ] . u ) 0 . 5 ( s i m u l a t i o n >domain [ i +1
] [ j ] . T+s i m u l a t i o n >domain [ i ] [ j ] . T) /
U_adimensionalizacion ;
Nu_i += Nu_local ;
}
}
Nu_i /= ( d o u b l e )Ny ;
Nu_medio += Nu_i ;
p r i n t f ( "Nu( %d )= %.6 f \n" , i , Nu_i ) ;
f p r i n t f ( output_Nu , " %.9 f \n" , Nu_i ) ;

}
p r i n t f ( "Nu medio= %.6 f \n" , Nu_medio / (Nx3) ) ;
p r i n t f ( " Para l a pared c a l i e n t e : \n" ) ;
p r i n t f ( "Nu max = %.6 f ( y= %f ) \n" , Nu_max_hot , Nu_max_hot_y) ;
p r i n t f ( "Nu min = %.6 f ( y= %f ) \n" , Nu_min_hot , Nu_min_hot_y ) ;
p r i n t f ( " Para l a pared f r i a : \n" ) ;
p r i n t f ( "Nu max = %.6 f ( y= %f ) \n" , Nu_max_cold , Nu_max_cold_y ) ;
p r i n t f ( "Nu min = %.6 f ( y= %f ) \n" , Nu_min_cold , Nu_min_cold_y ) ;
d o u b l e max_u = 1000 , max_v = 1000 , max_u_y , max_v_x ;
position = 0.0;
f o r ( j = 0 ; j < Ny ; j++ ) {
f o r ( i = 0 ; i < Nx ; i++ ) {
i f ( ( s i m u l a t i o n >domain [ i ] [ j ] . u /
U _ a d i m e n s i o n a l i z a c i o n ) > max_u ) {
max_u = s i m u l a t i o n >domain [ i ] [ j ] . u /
U_adimensionalizacion ;
max_u_y = p o s i t i o n ;
}

158

}
p o s i t i o n += Dx ;

273
274

}
position = 0.0;
f o r ( i = 0 ; i < Nx ; i++ ) {
f o r ( j = 0 ; j < Ny ; j++ ) {
i f ( ( s i m u l a t i o n >domain [ i ] [ j ] . v /
U _ a d i m e n s i o n a l i z a c i o n ) > max_v ) {
max_v = s i m u l a t i o n >domain [ i ] [ j ] . v /
U_adimensionalizacion ;
max_v_x = p o s i t i o n ;
}
}
p o s i t i o n += Dx ;
}
p r i n t f ( " \nu max = %.6 f ( y= %f ) \n" , max_u , max_u_y) ;
p r i n t f ( "v max = %.6 f ( x= %f ) \n" , max_v , max_v_x) ;
f c l o s e ( output_Nu ) ;
return 1;

275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

}
}
return 0;

main_2_lbm.cpp
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

#i n c l u d e <c s t d l i b >
#i n c l u d e <math . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e <i o s t r e a m >
#i n c l u d e <iomanip>
#i n c l u d e <time . h>
#i n c l u d e " //FVM. h"
u s i n g namespace s t d ;
c l a s s ComputationTime {
clock_t s t a r t ;
public :
void Start ( ) {
start = clock () ;
}
d o u b l e Stop ( ) {
r e t u r n ( ( ( d o u b l e ) ( c l o c k ( ) s t a r t ) ) / CLOCKS_PER_SEC) ;
}
};
enum SOLVER {GAUSS_SHEIDEL = 1 , CONJUGATE_GRADIENT} ;
i n t main ( i n t a r g c , c h a r a r g v ) {
SOLVER s o l v e r _ t y p e = CONJUGATE_GRADIENT;
MESH mesh_type = UNIFORM;
const double C = 0 . 0 6 ;
c o n s t d o u b l e Lx = 1 . 0 , Ly = 1 . 0 ;
c o n s t i n t Nx = 4 0 , Ny = 4 0 ;
c o n s t d o u b l e Pr = 0 . 7 1 ;
c o n s t d o u b l e Ra = 1E3 ;
c o n s t d o u b l e T_H = 1 ;
c o n s t d o u b l e T_C = 0 ;
d o u b l e time = 0 . 0 ;
int ciclos = 0;
double delta_t = 0 ;
int iteraciones = 0;
d o u b l e Nu_i , Nu_medio ;
V e l o c i t y F i e l d un (Nx , Ny) ;
V e l o c i t y F i e l d un1 (Nx , Ny) ;
V e l o c i t y F i e l d up (Nx , Ny) ;

159

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

V e l o c i t y F i e l d temp (Nx , Ny) ;


S c a l a r F i e l d p (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d p_supuesta (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Rxn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Ryn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Qn(Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Qn1 (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d Tn(Nx+2 , Ny+2 , ZERO_TO_MINUS_ONE_N) ;
S c a l a r F i e l d Tn1 (Nx+2 , Ny+2 , ZERO_TO_MINUS_ONE_N) ;
S c a l a r F i e l d tmp_r (Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_p(Nx , Ny , ONE_TO_N) ;
S c a l a r F i e l d tmp_Ap(Nx , Ny , ONE_TO_N) ;
Mesh mesh ;
FILE f i l e _ o u t _ d a t a = f o p e n ( " Data . t x t " , "w" ) ;
int i , j ;
d o u b l e convergence_u , convergence_v , convergence_T ;
const double f a c t o r _ r e l a j a c i o n _ s o l v e r = 1 . 1 ;
c o n s t d o u b l e e p s i l o n _ s o l v e r = 1E8;
c o n s t d o u b l e e p s i l o n = 1E4;
c o n s t d o u b l e tiempo_max_simulacion = 1 0 ;
c o n s t d o u b l e tiempo_min_simulacion = 0 . 0 1 ;
ComputationTime computation_time ;
d o u b l e ct_max = 0 . 0 , ct_min = 1 , c t _ t o t a l = 0 . 0 ;
d o u b l e ct_temporal = 0 . 0 ;
mesh = new Mesh ( Lx , Ly , Nx , Ny , mesh_type ) ;
mesh>C = C ;
mesh>CalcMesh ( ) ;
f o r ( i = 1 ; i <= Nx1; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
( un1 . u ) ( i , j ) = 0 . 0 ;
( un . u ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny1; j++ ) {
( un1 . v ) ( i , j ) = 0 . 0 ;
( un . v ) ( i , j ) = 0 . 0 ;
}
}
f o r ( i = 1 ; i <= Nx ; i++ ) {
f o r ( j = 1 ; j <= Ny ; j++ ) {
p( i , j ) = 1 . 0 ;
p_supuesta ( i , j ) = 1 . 0 ;
}
}
f o r ( i = 0 ; i <= Nx+1; i++ ) {
f o r ( j = 0 ; j <= Ny+1; j++ ) {
Tn( i , j ) = 0 . 5 ;
Tn1 ( i , j ) = 0 . 5 ;
}
}
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
Tn( i , 0 ) = Tn( i , 1 ) ;
Tn1 ( i , 0 ) = Tn1 ( i , 1 ) ;
Tn( i , mesh>Ny+1) = Tn( i , mesh>Ny) ;
Tn1 ( i , mesh>Ny+1) = Tn1 ( i , mesh>Ny) ;
}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
Tn ( 0 , j ) = T_H;
Tn1 ( 0 , j ) = T_H;
Tn(Nx+1 , j ) = T_C;

160

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

}
do {

Tn1 (Nx+1 , j ) = T_C;


computation_time . S t a r t ( ) ;
d e l t a _ t = C a l c T i m e I n t e r v a l ( mesh , un , Pr , . 3 5 0 . 4 , . 2 0 . 4 ) ;
CalcMomentumConvectiveDifusiveTerm_NaturalConvection ( mesh , un , Tn ,
Pr , Ra , Rxn , Ryn ) ;
CalcMomentumConvectiveDifusiveTerm_NaturalConvection ( mesh , un1 , Tn1 ,
Pr , Ra , Rxn1 , Ryn1 ) ;
C a l c E n e r g y C o n v e c t i v e D i f u s i v e T e r m _ N a t u r a l C o n v e c t i o n ( mesh , un , Tn , Qn
);
C a l c E n e r g y C o n v e c t i v e D i f u s i v e T e r m _ N a t u r a l C o n v e c t i o n ( mesh , un1 , Tn1 ,
Qn1 ) ;
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
i f ( i < mesh>Nx ) {
( up . u ) ( i , j ) = ( un . u ) ( i , j ) + d e l t a _ t ( 1 . 5 Rxn ( i , j )
0 . 5 Rxn1 ( i , j ) ) ;
}
i f ( j < mesh>Ny ) {
( up . v ) ( i , j ) = ( un . v ) ( i , j ) + d e l t a _ t ( 1 . 5 Ryn ( i , j )
0 . 5 Ryn1 ( i , j ) ) ;
}
}
}
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( i <= mesh>Nx ) {
( un1 . u ) ( i , j ) = ( un . u ) ( i , j ) ;
}
i f ( j <= mesh>Ny ) {
( un1 . v ) ( i , j ) = ( un . v ) ( i , j ) ;
}
}
}
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
Tn1 ( i , j ) = Tn( i , j ) ;
}
}
i f ( s o l v e r _ t y p e == GAUSS_SHEIDEL ) {
i t e r a c i o n e s = C a l c I n c o m p r e s s i b l e V e l o c i t y F i e l d _ G a u s s S h e i d e l ( mesh ,
up , un , p , p_supuesta , e p s i l o n _ s o l v e r ,
factor_relajacion_solver ) ;
} e l s e i f ( s o l v e r _ t y p e == CONJUGATE_GRADIENT ) {
i t e r a c i o n e s = CalcIncompressibleVelocityField_ConjugateGradient (
mesh , up , un , p , e p s i l o n _ s o l v e r , tmp_r , tmp_p , tmp_Ap) ;
}
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
Tn( i , j ) = Tn1 ( i , j ) + d e l t a _ t ( 1 . 5 Qn( i , j ) 0 . 5 Qn1 ( i , j
) );
}
}
f o r ( i = 1 ; i <= mesh>Nx ; i++ ) {
Tn( i , 0 ) = Tn( i , 1 ) ;
Tn( i , mesh>Ny+1) = Tn( i , mesh>Ny) ;
}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
Tn ( 0 , j ) = T_H;
Tn(Nx+1 , j ) = T_C;
}
ct_temporal = computation_time . Stop ( ) ;

161

154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210

i f ( ct_max < ct_temporal ) ct_max = ct_temporal ;


i f ( ct_min > ct_temporal ) ct_min = ct_temporal ;
c t _ t o t a l += ct_temporal ;
p r i n t f ( "Tiempo = %f ( %d, %f , % f ) " , time , i t e r a c i o n e s , d e l t a _ t ,
ct_temporal ) ;
convergence_u = C a l c M a x D e r i v a t i v e ( ( un . u ) , ( un1 . u ) , d e l t a _ t ) ;
convergence_v = C a l c M a x D e r i v a t i v e ( ( un . v ) , ( un1 . v ) , d e l t a _ t ) ;
convergence_T = C a l c M a x D e r i v a t i v e (Tn , Tn1 , d e l t a _ t ) ;
i = j = Nx / 2 ;
f p r i n t f ( f i l e _ o u t _ d a t a , " %d %.9 f %.9 f %.9 f %d %.9 f %.9 f %.9 f %.9 f %.9 f
%.9 f \n" ,
c i c l o s , time , d e l t a _ t , ct_temporal , i t e r a c i o n e s , convergence_u
,
convergence_v , convergence_T , ( un . u ) ( i , j ) , ( un . v ) ( i , j ) , p ( i ,
j ) / delta_t ) ;
p r i n t f ( " { %f , %f , %f }\n" , convergence_u , convergence_v , convergence_T )
;
time += d e l t a _ t ;
c i c l o s ++;
i f ( convergence_u <= e p s i l o n && convergence_v <= e p s i l o n && time >
tiempo_min_simulacion | | time >= tiempo_max_simulacion ) {
FILE f i l e _ o u t _ u ;
FILE f i l e _ o u t _ v ;
FILE f i l e _ o u t _ p ;
FILE file_out_T ;
FILE file_out_Nu ;
FILE f i l e _ o u t _ f i ;
FILE f i l e _ o u t _ x m e s h f a c e , file_out_xmeshnode ,
f i l e _ o u t _ y m e s h f a c e , file_out_ymeshnode ;
f i l e _ o u t _ u = f o p e n ( "u . t x t " , "w" ) ;
f i l e _ o u t _ v = f o p e n ( "v . t x t " , "w" ) ;
f i l e _ o u t _ p = f o p e n ( "p . t x t " , "w" ) ;
file_out_T = f o p e n ( "T . t x t " , "w" ) ;
file_out_Nu = f o p e n ( "Nu . t x t " , "w" ) ;
f i l e _ o u t _ f i = f o p e n ( " f i . t x t " , "w" ) ;
f i l e _ o u t _ x m e s h f a c e = f o p e n ( " x_mesh_face . t x t " , "w" ) ;
file_out_xmeshnode = f o p e n ( "x_mesh_node . t x t " , "w" ) ;
f i l e _ o u t _ y m e s h f a c e = f o p e n ( " y_mesh_face . t x t " , "w" ) ;
file_out_ymeshnode = f o p e n ( "y_mesh_node . t x t " , "w" ) ;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ u , " %.9 f " , ( un . u ) ( i , j ) ) ;
}
f p r i n t f ( f i l e _ o u t _ u , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f p r i n t f ( f i l e _ o u t _ v , " %.9 f " , ( un . v ) ( i , j ) ) ;
}
f p r i n t f ( f i l e _ o u t _ v , " \n" ) ;
}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i +1 , j ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j != 0 && j != mesh>Ny+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i 1 , j ) / d e l t a _ t ) ;
} e l s e i f ( j == 0 && i != 0 && i != mesh>Nx+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j +1) / d e l t a _ t ) ;
} e l s e i f ( j == mesh>Ny+1 && i != 0 && i != mesh>Nx+1){
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j 1) / d e l t a _ t ) ;
} e l s e i f ( i == 0 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , 1 ) / d e l t a _ t ) ;

162

211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272

} e l s e i f ( i == mesh>Nx+1 && j == 0 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , 1 ) / d e l t a _ t ) ;
} e l s e i f ( i == mesh>Nx+1 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( mesh>Nx , mesh>Ny) /
delta_t ) ;
} e l s e i f ( i == 0 && j == mesh>Ny+1 ) {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( 1 , mesh>Ny) / d e l t a _ t ) ;
} else {
f p r i n t f ( f i l e _ o u t _ p , " %.9 f " , p ( i , j ) / d e l t a _ t ) ;
}

}
f p r i n t f ( f i l e _ o u t _ p , " \n" ) ;

}
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f p r i n t f ( file_out_T , " %.9 f " , Tn( i , j ) ) ;
}
f p r i n t f ( file_out_T , " \n" ) ;
}
S c a l a r F i e l d f i (Nx+1 , Ny+1 , ZERO_TO_MINUS_ONE_N) ;
C a l c S t r e a m F u n c t i o n ( mesh , un , f i ) ;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
f p r i n t f ( f i l e _ o u t _ f i , " %.9 f " , f i ( i , j ) ) ;
}
f p r i n t f ( f i l e _ o u t _ f i , " \n" ) ;
}
double p o s i t i o n ;
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
i f ( i == 0 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx+1 ) {
f p r i n t f ( file_out_xmeshnode , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>d_WP) ( i , 1 ) ;
f p r i n t f ( file_out_xmeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
i f ( i == 0 ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( i == mesh>Nx ) {
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f \n" , Lx ) ;
}else{
p o s i t i o n += ( mesh>delta_xP ) ( i , 1 ) ;
f p r i n t f ( f i l e _ o u t _ x m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
i f ( j == 0 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny+1 ) {
f p r i n t f ( file_out_ymeshnode , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>d_SP) ( 1 , j ) ;
f p r i n t f ( file_out_ymeshnode , " %.9 f " , p o s i t i o n ) ;
}
}
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {

163

273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332

i f ( j == 0 ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , 0 . 0 ) ;
} e l s e i f ( j == mesh>Ny ) {
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f \n" , Ly ) ;
}else{
p o s i t i o n += ( mesh>delta_yP ) ( 1 , j ) ;
f p r i n t f ( f i l e _ o u t _ y m e s h f a c e , " %.9 f " , p o s i t i o n ) ;
}

}
Nu_medio = 0 . 0 ;
d o u b l e Nu_min_hot , Nu_min_cold ;
d o u b l e Nu_min_hot_y , Nu_min_cold_y ;
d o u b l e Nu_max_hot , Nu_max_cold ;
d o u b l e Nu_max_hot_y , Nu_max_cold_y ;
d o u b l e Nu_local ;
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
Nu_i = 0 . 0 ;
i f ( i == 0 ) {
Nu_min_hot = 1 0 0 0 ;
Nu_max_hot = 1000;
p o s i t i o n = 0 . 5 ( mesh>delta_yP ) ( 1 , 1 ) ;
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
Nu_local = ( 1) (Tn( i +1 , j )Tn( i , j ) ) / ( 0 . 5 ( mesh>
delta_xP ) ( 1 , j ) ) ;
i f ( Nu_local > Nu_max_hot) {
Nu_max_hot = Nu_local ;
Nu_max_hot_y = p o s i t i o n ;
}
i f ( Nu_local < Nu_min_hot ) {
Nu_min_hot = Nu_local ;
Nu_min_hot_y = p o s i t i o n ;
}
p o s i t i o n += ( mesh>d_PN) ( 1 , j ) ;
Nu_i += ( mesh>delta_yP ) ( 1 , j ) Nu_local ;
}
Nu_medio += Nu_i 0 . 5 ( mesh>delta_xP ) ( 1 , 1 ) ;
} e l s e i f ( i == mesh>Nx ) {
Nu_min_cold = 1 0 0 0 ;
Nu_max_cold = 1000;
p o s i t i o n = 0 . 5 ( mesh>delta_yP ) ( mesh>Nx , 1 ) ;
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
Nu_local = ( 1) (Tn( i +1 , j )Tn( i , j ) ) / ( 0 . 5 ( mesh>
delta_xP ) ( mesh>Nx , j ) ) ;
i f ( Nu_local > Nu_max_cold ) {
Nu_max_cold = Nu_local ;
Nu_max_cold_y = p o s i t i o n ;
}
i f ( Nu_local < Nu_min_cold ) {
Nu_min_cold = Nu_local ;
Nu_min_cold_y = p o s i t i o n ;
}
p o s i t i o n += ( mesh>d_PN) ( mesh>Nx , j ) ;
Nu_i += ( mesh>delta_yP ) ( mesh>Nx , j ) Nu_local ;
}
Nu_medio += Nu_i 0 . 5 ( mesh>delta_xP ) ( mesh>Nx , 1 ) ;
}else {
f o r ( j = 1 ; j <= mesh>Ny ; j++ ) {
Nu_local = ( 1) ( ( Tn( i +1 , j )Tn( i , j ) ) / ( mesh>d_PE) ( i
, j ) ) + ( un . u ) ( i , j ) (Tn( i +1 , j )+Tn( i , j ) ) 0 . 5 ;
Nu_i += Nu_local ( mesh>delta_yP ) ( i , j ) ;
}
Nu_medio += Nu_i ( mesh>d_PE) ( i , 1 ) ;
}

164

333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392

p r i n t f ( "Nu( %d )= %.6 f \n" , i , Nu_i ) ;


f p r i n t f ( file_out_Nu , " %.9 f \n" , Nu_i ) ;

}
p r i n t f ( "Nu medio= %.6 f \n" , Nu_medio ) ;
p r i n t f ( " Para l a pared c a l i e n t e : \n" ) ;
p r i n t f ( "Nu max = %.6 f ( y= %f ) \n" , Nu_max_hot , Nu_max_hot_y) ;
p r i n t f ( "Nu min = %.6 f ( y= %f ) \n" , Nu_min_hot , Nu_min_hot_y ) ;
p r i n t f ( " Para l a pared f r i a : \n" ) ;
p r i n t f ( "Nu max = %.6 f ( y= %f ) \n" , Nu_max_cold , Nu_max_cold_y ) ;
p r i n t f ( "Nu min = %.6 f ( y= %f ) \n" , Nu_min_cold , Nu_min_cold_y ) ;
d o u b l e max_u = 1000 , max_v = 1000 , max_u_y , max_v_x ;
position = 0.0;
f o r ( j = 0 ; j <= mesh>Ny+1; j++ ) {
f o r ( i = 0 ; i <= mesh>Nx ; i++ ) {
i f ( ( un . u ) ( i , j ) > max_u ) {
max_u = ( un . u ) ( i , j ) ;
max_u_y = p o s i t i o n ;
}
}
i f ( j == 0 ) {
p o s i t i o n += 0 . 5 ( mesh>delta_yP ) ( 1 , 1 ) ;
} e l s e i f ( j == mesh>Ny+1 ) {
p o s i t i o n += 0 . 5 ( mesh>delta_yP ) ( 1 , mesh>Ny) ;
} else {
p o s i t i o n += ( mesh>d_PN) ( 1 , j ) ;
}
}
position = 0.0;
f o r ( i = 0 ; i <= mesh>Nx+1; i++ ) {
f o r ( j = 0 ; j <= mesh>Ny ; j++ ) {
i f ( ( un . v ) ( i , j ) > max_v ) {
max_v = ( un . v ) ( i , j ) ;
max_v_x = p o s i t i o n ;
}
}
i f ( i == 0 ) {
p o s i t i o n += 0 . 5 ( mesh>delta_xP ) ( 1 , 1 ) ;
} e l s e i f ( i == mesh>Nx+1 ) {
p o s i t i o n += 0 . 5 ( mesh>delta_xP ) ( mesh>Nx , 1 ) ;
} else {
p o s i t i o n += ( mesh>d_PE) ( i , 1 ) ;
}
}
p r i n t f ( " \nu max = %.6 f ( y= %f ) \n" , max_u , max_u_y) ;
p r i n t f ( "v max = %.6 f ( x= %f ) \n" , max_v , max_v_x) ;
f c l o s e ( file_out_Nu ) ;
f c l o s e ( file_out_u ) ;
f c l o s e ( file_out_v ) ;
f c l o s e ( file_out_p ) ;
f c l o s e ( file_out_T ) ;
f c l o s e ( file_out_data ) ;
fclose ( file_out_fi ) ;
f c l o s e ( file_out_data ) ;
f c l o s e ( file_out_xmeshface ) ;
f c l o s e ( file_out_xmeshnode ) ;
f c l o s e ( file_out_ymeshface ) ;
f c l o s e ( file_out_ymeshnode ) ;
p r i n t f ( " C o n v e r g e n c i a a l a c a n z a d a o tiempo maximo de s i m u l a c i o n
a l c a n z a d o . \ n" ) ;
p r i n t f ( " Pr : %f \nRa : %f \nNx : %d\nNy : %d\n" , Pr , Ra , Nx , Ny) ;
p r i n t f ( " E r r o r d e l s o l v e r : %e \ n E r r o r en e s t a c i o n a r i o : %e \n" ,
epsilon_solver , epsilon ) ;

165

p r i n t f ( "Tiempo de computacion maximo por c i c l o [ ms ] : %f \n" , ct_max )


;
p r i n t f ( "Tiempo de computacion minimo por c i c l o [ ms ] : %f \n" , ct_min )
;
p r i n t f ( "Tiempo de computacion t o t a l [ ms ] : %f \n" , c t _ t o t a l ) ;
p r i n t f ( "Tiempo de computacion promedio por c i c l o [ ms ] : %f \n" ,
ct_total /( double ) c i c l o s ) ;
p r i n t f ( "Numero de c i c l o s : %d\n" , c i c l o s ) ;
p r i n t f ( "Tiempo t o t a l de s i m u l a c i o n : %f \n" , time ) ;
return 1;

393
394
395
396
397
398
399
400
401
402
403

}
} while ( 1 ) ;
return 0;

main_2_fvm.cpp

166

S-ar putea să vă placă și