Documente Academic
Documente Profesional
Documente Cultură
AERONUTICA DE TERRASSA
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
19
21
24
24
35
. . . . . . . . . . . . . . . . .
35
44
46
51
58
2.3.3. Adimensionalizacin . . . . . . . . . . . . . . . . . . . . . . .
59
59
61
4. Casos prcticos
78
78
88
5. Conclusiones
99
1
6. Impacto medioambiental
100
7. Presupuesto
101
8. Futuros estudios
102
106
133
144
153
ndice de figuras
1.1. Hiptesis del medio continuo
. . . . . . . . . . . . . . . . . . . . . .
10
12
13
16
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
25
38
47
48
48
49
49
52
54
63
65
66
66
67
69
69
71
71
72
73
75
76
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
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
. . . . . . . . . . . . . . . . . .
87
88
103 ,
Ra =
104 ,
Ra =
105 y Ra = 106 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
91
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
98
ndice de tablas
2.1. Cuadratura de Hermite de orden 3 . . . . . . . . . . . . . . . . . . .
37
38
59
4.1. Combinaciones del error del solver y del error estacionario para Re =
100 y N = 40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
82
93
. . . . . . . . . . . . .
94
95
96
104
106
. . . . . . . . . . . . .
0.1.
Objetivo
0.2.
Justificacin
0.3.
Alcance
Captulo 1
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
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
D
Dt
(1.1a)
(1.1b)
(1.1c)
(1.1d)
(1.1e)
Z
sdV =
Vm (t)
Sm (t)
q n
dS + S gen 0
T
(1.2e)
13
(1.3)
V (t)
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)
(1.5a)
a = +
a a
(1.5b)
(1.6)
(1.7)
t0
m
a
s e
= lm
+ lm
t0 t
t0
t
t
14
(1.8)
Z
dV =
Vm (t)
d
dt
Z
(u ub ) ndS
dV +
Va (t)
(1.9)
Sa (t)
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)
La notacin
D
Dt
d
dt
hace
15
Figura 1.5: Representacin de un volumen de control diferencial bidimensional con los flujos
de masa.
m
y
y dy.
m
x
x dx
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)
(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)
D2
( u) + v ( u)
D
(1.19)
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)
(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)
(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)
1.2.1.
Conveccin forzada
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)
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
u
U0 ,
t
t0 ,
pp0
p1 p0 ,
T T0
T1 T0 ,
r
L0
siendo p0 y p1 dos
siendo T0 y T1 dos
(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)
gL0
U02
U0
gL0
y es la
U0 L0 0
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
20
p0 pv
.
U02
El trmino
a
U0 L0
U0 L0
a
que, a su vez,
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)
1.2.2.
Conveccin natural
1
T
!
(1.31)
p=cte.
1
0
T T0
(1.32)
= = 0 (1 (T T0 ))
(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)
gL0 (T T0 )
U02
es el
gL30 (T1 T0 )
,
2
22
(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
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.
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)
t
F + O t2
(2.7)
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
(2.9)
+ r +
f (r, , t) =
t
m
t c
(2.10)
(2.11)
=
Q
t c
t c
t c
siendo
i+
f
t c
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)
(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)
(2.17)
y=
t
,
como:
f
Q(f )
t
c
1
= (f g)
(2.18)
Z
ZZ
(r, , t)Q(f, f )d =
1
d =
4
c
Z
ZZ
(2 +1 20 10 )
f
t
d3
c
(2.19)
Z
ZZ
(r, , t) = A + B + C || =
(2.20)
cual:
(r, , t) = A + B + C ||2
Z
ZZ
)
=
Z
ZZ
gd =
f d3
(2.21)
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)
kg
m3
m 2
s
1
(r, t)e(r, t) =
2
Z
ZZ
(2.24)
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
Z
ZZ
1
m |C|2 f (r, , t)d3 + |u|2
2
(2.25)
(2.26)
Tensor de presin
Z
ZZ
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
(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)
2m
(r, t)
3 kB
(2.31)
mi j f (r, , t)d3
31
(2.32)
ij = ij + ui uj
Flujo de calor
1
qi (r, t) =
2
Z
ZZ
(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)
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)
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)
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
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)
+ r (u + ) = S + P
(2.41)
t
Escogiendo de forma apropiada la funcin se pueden obtener las leyes de con-
servacin macroscpicas:
4
Z
a=
(a n) dS
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)
(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)
1 2
1 2
+ |u|
+ r + |u| u + q + pu = F u
t
2
2
(2.45)
34
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
1
2RT ,
kB
m.
g=
m (2RT )
2.2.
e
D/2
|u|2
2RT
(2.47)
Modelos de LBM
2.2.1.
,
zar los siguientes resultados para las integrales impropias:
e
dx =
xe
dx = 0 y
2 x
x e
dx =
1
2
.
3
35
d
dt
+ .
1
1
df
+ f= g
dt
(2.48)
(2.49)
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
36
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
=0
q1
X
(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
=
2RT
ZZ
||2
2RT
xm yn e
( u)2
|u|2
u
+
1+
RT
2 (RT )2 2RT
,
2RT
y definiendo Im =
(2.52)
d2
R
m e d, la
Z
Im =
m e d =
3
X
k km
(2.54)
k=1
k
k
2
3
6
q
32
q6
3
2
37
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
|u|2
( u) ( u)2
Im,n =
m,n; w 1
+
+
2RT
RT
2 (RT )2
=0
(2.56)
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.
Figura 2.2: Representacin del modelo de discretizacin D2Q9 del espacio de velocidades.
Se representan los vectores de velocidad discretos.
38
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
p
= RT , mientras que si se supone que el gas es
39
=
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
(eq)
y, como
= (1) + 2 (2)
t
t
t
= (1)
rj
r
(2.63)
(2.64)
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)
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)
f
1
1 (2)
(1)
2
+
1
+
e
f
=
f
+
O
t
(1)
r
2
t
t(2)
t(1)
(2.69)
8
X
=0
f =
8 X
n f(n) = f(0) +
=0 n=0
8
X
n f(n)
(2.70)
=0 n=1
8 X
(0)
f
(eq)
= f , se obtiene el siguiente
f(n) = 0 n 1
(2.71)
=0
+ 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
(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
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
a la funcin de equilibrio f :
F = w F e
1
c2s
(2.78)
43
+ 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)
2.2.2.
f0 (r + e0 t, t + t) f0 (r, t)
f1 (r + e1 t, t + t) f1 (r, t)
..
.
(2.81)
(eq)
f0 (r, t) f0 (r, t)
S11 S1q
.
.
.
..
Sq1 Sqq
(eq)
f
q1 (r, t) fq1 (r, t)
(2.82)
(2.83)
(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
(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)
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
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.
(2.88)
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)
(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)
(r, t)
(2.96)
(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.
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
(2.98)
f (r, t + t) = f (r, t)
para todos los valores de .
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)
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
(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)
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.
f2
(neq)
f1
(neq)
(2.106a)
(neq)
f3
(2.106b)
= f4
=
54
(2.107a)
(2.107b)
(2.107c)
1
[ (f0 + f1 + f2 + f3 + f4 + f5 + f7 )]
2
(2.108)
(2.109)
(2.110a)
f7 = f7 w7 (Qx + Qy )
(2.110b)
f8 = f8 + w8 (Qx Qy )
(2.110c)
(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)
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)
(2.115a)
f6 (N x, j) = f6 (N x 1, j)
(2.115b)
f7 (N x, j) = f7 (N x 1, j)
(2.115c)
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)
(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
2.3.3.
Adimensionalizacin
Conveccin natural
Distancia
Velocidad
U0
Tiempo
N
U0
a
N
N2
a
2.3.4.
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
(3.1a)
(3.1b)
(3.1c)
(3.2a)
(3.2b)
(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)
(3.6)
(3.7)
u
t ,
63
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)
(3.9)
(3.10)
(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
(n)
= t
(0)
(n)
n10
64
(3.13a)
(3.13b)
(3.14)
L/2
y C un parmetro de ajuste. En la Figura (3.3) se representa
siendo A = tanh(CN/2)
continuacin se presentan las expresiones que sirven para calcular los parmetros
geomtricos de la malla representada en la Figura (3.4).
xWi,j = xi xi1
dW P i,j =
dP E i,j =
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
u0,0
u1,0
uNx ,0
u0,1
u
1,1
N
,1
x
U = .
..
..
..
..
.
.
.
(3.16)
v0,0
v1,0
vNx +1,0
V =
v0,1
..
.
v1,1
..
.
..
.
vNx +1,1
..
.
p1,1
p2,1 pNx ,1
p1,2
p
2,2
N
,2
x
P = .
..
..
..
..
.
.
.
(3.17)
(3.18)
(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
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)
(3.22)
(3.24a)
aE (i, j) =
(3.24b)
(3.24c)
(3.24d)
(3.24e)
(3.24f)
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
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
(3.27a)
(3.27b)
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)
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)
u=0
u
+ (u ) u = p + Pru + Ra PrT ey
t
T
+ (u ) T = T
t
(3.32b)
(3.32c)
(3.33a)
(3.33b)
75
v=
x
u=
(3.34a)
(3.34b)
(3.35)
77
Captulo 4
Casos prcticos
4.1.
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) ).
v
2
uP
u q
ref
u n=1 un un
eu = u
t Pq ref 2
n=1 un
(4.1)
)
(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
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 .
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
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
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
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.
T
+ u T
x
(4.3)
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,
U = U0 PrRaT
89
(4.6)
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
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
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
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
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
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
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
[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
#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
};
#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
}
}
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 ] ,
}
}
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
#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
}
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
}
}
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
#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
}
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
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
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
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
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
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
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
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 {
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
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 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
393
394
395
396
397
398
399
400
401
402
403
}
} while ( 1 ) ;
return 0;
main_2_fvm.cpp
166