Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aplicacion Simulacion Numerica Yacimientos
Aplicacion Simulacion Numerica Yacimientos
Yacimientos Petroleros
Antonio Carrillo Ledesma
p
p
1
r
+
=
(1)
r r
r
z
z
z
t B
p(r, z, 0) = p0 en
para rw < r < re ; 0 < D < H; t > 0, con condiciones
iniciales
p
qw
rw < r < re ; 0 < D < H y condiciones de frontera r r
= 2h
,
rw y j=9,10,11
rw
p
p
p
pwf = pwf,min y r r
= 0 y z z = 0 para r = rw , r = re y D = 0 y
re
D = H, t > 0 y donde =
k
B .
n+1
p
D
2 2 r
(2)
+
=
r
r
z
z
z
t B
i,j
si hacemos u = r
p
r
u
r2
n+1
i,j
n+1
un+1
i+1/2,j ui1/2,j
2
2
ri+1/2,j
ri1/2,j
(
)n+1
1
p
p
=
r
r
ri2
r
r
i+1/2,j
i1/2,j
n+1
1
(pi+1,j pi,j )
(pi,j pi1,j )
(r)i+1/2,j
=
(r)i1/2,j
ri2
ri+1/2,j
ri1/2,j
factorizando
(
)n+1
r
r
1
(pi+1,j pi,j )
(pi,j pi1,j )
ri2
r i+1/2,j
r i1/2,j
1
(3)
de forma similar
(
n+1
p
D
'
pi,j+1 pi,j (D)i,j+1/2
z
z
z
zj
z i,j+1/2
i,j
r
r
i,j1/2
)
n+1
(4)
t B
t
B i,j
B i,j
i,j
(5)
A
r
i+1/2,j
"
A
r
(pi+1,j pi,j )
A
z
i,j+1/2
A
r
i1/2,j
(pi,j pi1,j )
#n+1
(6)
#
"
n #
n+1
n+1 V
ri,j
=
.
pi,j pi,j1 (D)i,j1/2
t
B i,j
B i,j
i,j1/2
A
A
T ri1/2,j =
y
T zi,j1/2 =
r i1/2,j
z i,j1/2
entonces tenemos que (6) se escribe como
n+1
n+1
[pi+1,j pi,j ]n+1 T ri1/2,j
[pi,j pi1,j ]n+1 +
T ri+1/2,j
h
n+1
pi,j
T zi,j1/2
donde
h
in+1
n+1
pi,j+1 pi,j (D)i,j+1/2
(7)
T zi,j+1/2
#
"
n
n+1
in+1 V
ri,j
pi,j1 (D)i,j1/2
=
t
B i,j
B i,j
2
2
zj
ri1/2
Vri,j = ri+1/2
n+1
T ri+1/2,j
n+1
T zi,j+1/2
A
r
A
z
n+1
T ri1/2,j
=
i+1/2,j
n+1
T zi,j1/2
i,j+1/2
A
r
A
z
(8)
i1/2,j
i,j1/2
considerando
ri+1/2 =
r2 + ri2
i+1
r2 , ri1/2
ln i+1
ri2
r2
i
+ r2
2i1
r
ln r2i
i1
z
r
j
k
i+1/2
n+1
T ri+1/2,j = 4
(9)
2
ri+1
ri2
B i+1/2,j
2
!
ri1/2 zj
k
n+1
T ri1/2,j = 4
2
ri2 ri1
B i1/2,j
!
2
2
ri+1/2 ri1/2
k
n+1
T zi,j+1/2 =
zj+1/2
B i,j+1/2
2
!
2
ri+1/2 ri1/2
k
n+1
T zi,j1/2 =
.
zj1/2
B i,j1/2
Tomando en cuenta el sentido del flujo en i + 1/2, j se tiene que
= pi+1,j pi,j si 0 el flujo es de i i + 1
= pi+1,j pi,j si < 0 el flujo es de i + 1 i
entonces
1
B
i+1/2,j
(1/B)i+1,j si i+1/2,j 0
(1/B)i,j si i+1/2,j < 0
1
B
i1/2,j
(1/B)i1,j si i1/2,j 0
=
(1/B)i,j si i1/2,j < 0.
n+1 = n 1 + Cr pn+1 pn
3
donde Cr =
Z
1 d
dp ,
entonces integrando
Crdp =
pref
ref
d ln = Cr (p pref ) = ln
ref
n+1 = n eCr(p
pn )
n #
n+1
Vri,j ni,j 1 + Cr pn+1 pn
Vri,j
n
=
t
B i,j
B i,j
t
B n+1
B
i,j
1 + Cr pn+1 pn dB
BCr
1 + Cr (p pn )
d
=
dpi,j
B
B2
B2
dp
i,j
(10)
i,j
Ahora, partiendo de (7) acoplaremos las condiciones de frontera que son impermeables, para i = 1, j = 1, 2, 3, ..., J; i = I, J = 1, 2, 3, ..., J, i = 1, 2, 3..., I, j =
1 y i = 1, 2, 3, ..., I, j = J excepto para i = 1, j = 9, 10, 11 que son celdas abiertas
al flujo.
Si
j = 1 1 = 0
i = 1 2 = 0
i = I 3 = 0
j = J 4 = 0
en caso contrario 1 = 2 = 3 = 4 = 1 en
n+1
[pi+1,j pi,j ]
3 T ri+1/2,j
n+1
n+1
2 T ri1/2,j
[pi,j pi1,j ]
n+1
h
in+1
n+1
(11)
pi,j+1 pi,j (D)i,j+1/2
4 T zi,j+1/2
"
n #
n+1
h
in+1 V
r
n+1
= i,j
1 T zi,j1/2
pi,j pi,j1 (D)i,j1/2
t
B i,j
B i,j
Para las celdas abiertas al flujo i = 1, j = 9, 10, 11, tenemos
n+1
n+1
[pi+1,j pi,j ]n+1 qi,j
+
T ri+1/2,j
h
n+1
T zi,j1/2
pi,j
h
in+1
n+1
(12)
pi,j+1 pi,j (D)i,j+1/2
T zi,j+1/2
"
n #
n+1
in+1 V
ri,j
pi,j1 (D)i,j1/2
=
t
B i,j
B i,j
4
donde
n+1
qi,j
"
#
n+1
T r1,j
= P11
qon+1
T
1,j
j=9
i = 1, j = 9, 10, 11
n+1
[pi,j pi1,j ]
+
T ri1/2,j
h
in+1
n+1
T zi,j+1/2
pi,j+1 pi,j (D)i,j+1/2
(13)
h
in+1
n+1
T zi,j1/2
=0
t
B i,j
B i,j
para i = 1, 2, 3, ..., I, j = 1, 2, 3, ..., J y n = 0, 1, 2, ... Expandiendo (13) mediante
una serie de Taylor truncada alrededor del nivel de iteracin (), de la que slo
se conservan los terminos de menor orden tenemos
()
Fi,j
()
(+1)
n+1
Fi,j (pi,j1 , pi1,j , pi,j , pi+1,j , pi,j+1 )
Fi,j +
pi,j1 +
pi,j1
()
()
Fi,j
Fi,j
(+1)
(+1)
pi1,j +
pi,j +
pi1,j
pi,j
()
()
Fi,j
Fi,j
(+1)
(+1)
pi+1,j +
pi,j+1 = 0
pi+1,j
pi,j+1
por lo tanto
Fi,j
pi,j1
donde
()
(+1)
pi,j1 +
Fi,j
pi+1,j
()
Fi,j
pi1,j
(+1)
pi+1,j
(+1)
pi,j
()
(+1)
pi1,j +
Fi,j
pi,j+1
(+1)
= pi,j
()
Fi,j
pi,j
(+1)
()
()
pi,j+1 = Fi,j
()
pi,j .
(+1)
pi,j
(14)
Fi
pi,j
Fi
pi+1,j
Fi
pi1,j
T ri+1/2,j
pi,j
T ri1/2,j
T ri1/2,j [pi,j pi1,j ]
pi,j
i,j+1/2
+
T zi,j+1/2 1 + Di,j+1/2
pi,j
i T z
h
i,j+1/2
i,j1/2
T zi,j1/2 1 Di,j1/2
pi,j
h
i T z
i,j1/2
V ri,j
t pi,j B
= bi,j = T ri+1/2,j + [pi+1,j pi,j ]
T ri+1/2,j
pi+1,j
T ri1/2,j
pi1,j
Fi
pi,j+1
i,j+1/2
= ei,j = T zi,j+1/2 1 Di,j+1/2
+
pi,j+1
h
i T z
i+1/2,j
pi,j+1 pi,j (D)i,j+1/2
pi,j+1
Fi
pi,j1
i,j1/2
= fi,j = T zi,j1/2 1 + Di,j1/2
pi,j1
h
i T z
i1/2,j
pi,j pi,j1 (D)i,j1/2
pi,j1
(15)
T
p
A k
Para calcular T
obtenemos
p en forma generica a partir de T = r
B
A 1
1
= r k p B , primeramente calculamos p B de donde se obtiene
1
B
d
dp
B
P
2
d
dB
dp + B dp
2
(B)
(B)
1
1 dB
1 d
=
+
B B dp
dp
T ri+1/2,j
= T ri+1/2,j
pi,j
T ri1/2,j
= T ri1/2,j
pi,j
T zi,j+1/2
= T zi,j+1/2
pi,j
1 d
1 dB
+
B dpi,j
dpi,j
1 d
1 dB
+
B dpi,j
dpi,j
1 d
1 dB
+
B dpi,j
dpi,j
i+1/2,j
i1/2,j
i,j+1/2
T zi,j1/2
1 d
1 dB
= T zi,j1/2
+
pi,j
B dpi,j
dpi,j i,j1/2
T ri+1/2,j
1 dB
1 d
= T ri+1/2,j
+
pi+1,j
B dpi+1,j
dpi+1,j i+1/2,j
T ri1/2,j
1 dB
1 d
= T ri1/2,j
+
pi1,j
B dpi1,j
dpi1,j i1/2,j
T zi,j+1/2
1 d
1 dB
= T zi,j+1/2
+
pi,j+1
B dpi,j+1
dpi,j+1 i,j+1/2
T zi,j1/2
1 d
1 dB
= T zi,j1/2
+
.
pi,j1
B dpi,j1
dpi,j1 i,j1/2
(16)
Fi
pi,j
(17)
= ai,j = T ri+1/2,j T ri1/2,j
1 dB
1 d
+
+
T ri+1/2,j [pi+1,j pi,j ]
B dpi,j
dpi,j i+1/2,j
1 dB
1 d
T ri1/2,j [pi,j pi1,j ]
+
B dpi,j
dpi,j i1/2,j
i,j+1/2
T zi,j+1/2 1 + Di,j+1/2
pi,j
h
i 1 dB
1 d
+
i,j1/2
T zi,j1/2 1 Di,j1/2
+
pi,j
h
i 1 dB
1 d
+
1 + Cr pn+1 pn dB
V ri,j BCr
t
B2
B2
dp
i,j
Fi
pi+1,j
1 dB
1 d
+
B dpi+1,j
dpi+1,j
i+1/2,j
Fi
pi1,j
Fi
pi,j+1
i,j+1/2
= ei,j = T zi,j+1/2 1 Di,j+1/2
pi,j+1
h
i 1 dB
1 d
+
T zi,j+1/2 pi,j+1 pi,j (D)i,j+1/2
B dpi,j+1
dpi,j+1 i,j+1/2
Fi
pi,j1
i,j1/2
= fi,j = T zi,j1/2 1 + Di,j1/2
+
pi,j1
h
i 1 dB
1 d
+
T zi,j1/2 pi,j pi,j1 (D)i,j1/2
B dpi,j1
dpi,j1 i,j1/2
Definimos a como =
i,j+1/2
pi,j+1
i,j1/2
pi,j1
g
gc
1 dB
1 d
+
B dpi1,j
dpi1,j
i,j+1/2
pi,j
i,j1/2
pi,j
i1/2,j
A partir de las ecuaciones (17) se construyen los algoritmos para controlar los
dos problemas de condiciones iniciales dados, en cada una de las formulaciones
de los mtodos generales de linealizacin Totalmente Implcita, Simi-Implcita
Linelizada y Linealizacin Directa, primeramente se trabaja con la formulacin
general Totalmente Implcita.
El primer problema (gasto constante y presin variable) se resuelve generando
la matriz jacobiana donde se considera frontera impermeable para i = 1 y
j = 1, 2, ..., 8, 12, 13, ..., J, i = I y j = 1, 2, 3, ..., J, j = 1 y i = 1, 2, 3, ..., I y
j = J y i = 1, 2, 3, ..., I. Las celdas i = 1 y j = 9, 10, 11 se consideran celdas
productoras.
Acoplando las condiciones iniciales (dependiente del D) y de frontera a
(17) se genera la matriz [J] y tomando (13) se genera el vector F () , para
generar el sistema [J] p(+1) = F () . Usando el algoritmo para matrices
dispersas NSPIV se calculan las presiones en la iteracin + 1 por
medio de
(+1)
(+1)
()
(+1)
pi,j
= pi,j + pi,j
y se verifica la convergencia usando pi,j < p . Si es
menor que la tolerancia dada se actualiza la presin y se incrementa el tiempo,
para nuevamente llenar las matrices [J] y F () y continuar con el ciclo hasta
alcanzar la presin de fondo igual a pwf,min .
El segundo problema (presin constante y gasto variable) se resuelve generando
la matriz jacobiana donde se considera frontera impermeable para i = 0 y
j = 1, 2, ..., 8, 12, 13, ..., J, i = I y j = 1, 2, 3, ..., J, j = 1 y i = 1, 2, 3, ..., I y
j = J y i = 1, 2, 3, ..., I. Las celdas i = 1 y j = 9, 10, 11 se consideran celdas
productoras.
Acoplando las condiciones iniciales y de frontera a (17) se genera la matriz [J] y tomando (13) se genera el vector F () , para generar el sistema
[J] p(+1) = F () . Usando el algoritmo para matrices dispersas NSPIV se
(+1)
()
(+1)
calcula el gasto en la iteracin + 1 por medio de qwi,i = qwi,i + qi,i
y
(+1)
se verifica la convergencia usando qi,j < p . Si es menor que la tolerancia
dada se actualiza el gasto y se incrementa el tiempo, para nuevamente llenar las
matrices [J] y F () y continuar con el ciclo hasta alcanzar gasto igual a qw,min .
Partiendo de la formulacin Totalmente Implcita, se resuelve la formulacin
de Simi-implcita Linelizada, en donde se toma la salida de la primera iteracin
del mtodo NR de la formulacin Totalmente Implcita.
Del mismo modo, partiendo de la formulacin Totalmente Implcita, se resuelve la formulacin de Linealizacin Directa, usando la aproximacin T n+1
T n en la cual la derivada de la transmisibilidad es cero, simplificando notablemete las ecuaciones.
Resultados Obtenidos
Los resultados que se generan para una malla de 20 x 19, una tolerancia de
1e-1 (para el algoritmo de N-R), con una distribucn de presion inicial (slo
se muestran los primeros 8 valores para que puedan ser visualizados en una
pgina):
+ 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0
+ 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0
+ 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0
+ 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0
+ 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0
+ 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0
+ 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0
+ 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0
+ 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0
+ 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0
+ 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0
+ 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0
+ 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0
+ 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0
+ 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0
+ 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0
+ 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0
+ 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0
+ 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0
Para los esquemas de los mtodos generales de linealizacin Totalmente Implcita, Simi-Implcita Linelizada y Linealizacin Directa se muestran a continuacin las matrices de presiones y el tiempo para alcanzar la presin pwf,min ,
as como el tiempo en que el gasto es igal a qw,min .
10
Para el esquema Totalmente Implcito se muestran a continuacin la distribucin de presiones al tiempo 29.5334 das cuando se alcanza la presin pwf,min
(el efecto del pozo sobre la frontera exterior del yacimiento no se aprecia):
+ 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0
+ 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0
+ 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0
+ 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0
+ 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0
+ 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0
+ 1 9 9 .4 1 1 9 7 5 + 1 9 9 .4 1 1 9 9 6 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0
+ 1 9 9 .5 4 9 7 8 4 + 1 9 9 .5 9 8 6 5 3 + 1 9 9 .6 0 7 5 9 6 + 1 9 9 .6 0 7 9 9 5 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0
+ 9 9 .8 1 8 1 2 7 + 1 8 6 .1 9 2 0 6 9 + 1 9 9 .2 0 9 3 4 1 + 1 9 9 .7 9 5 4 7 4 + 1 9 9 .8 0 3 9 5 8 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0
+ 9 9 .9 8 5 9 2 0 + 1 8 6 .3 8 7 1 8 0 + 1 9 9 .4 0 6 8 9 5 + 1 9 9 .9 9 1 8 8 3 + 1 9 9 .9 9 9 9 6 2 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0
+ 1 0 0 .3 1 4 9 4 9 + 1 8 6 .6 1 2 4 2 3 + 1 9 9 .6 1 2 1 3 8 + 2 0 0 .1 8 8 0 8 6 + 2 0 0 .1 9 5 9 6 3 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0
+ 2 0 0 .3 3 2 7 4 7 + 2 0 0 .3 8 2 9 5 7 + 2 0 0 .3 9 1 6 2 7 + 2 0 0 .3 9 1 9 9 5 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0
+ 2 0 0 .5 8 7 9 7 6 + 2 0 0 .5 8 7 9 9 6 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0
+ 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0
+ 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0
+ 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0
+ 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0
+ 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0
+ 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0
11
12
Para el esquema Linealizacin Directa se muestran a continuacin la distribucin de presiones al tiempo 31.4563 das cuando se alcanza la presin pwf,min (el
efecto del pozo sobre la frontera exterior del yacimiento no se aprecia):
+ 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0 + 1 9 8 .2 3 6 0 0 0
+ 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0 + 1 9 8 .4 3 2 0 0 0
+ 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0 + 1 9 8 .6 2 8 0 0 0
+ 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0 + 1 9 8 .8 2 4 0 0 0
+ 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0 + 1 9 9 .0 2 0 0 0 0
+ 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0 + 1 9 9 .2 1 6 0 0 0
+ 1 9 9 .4 1 1 9 7 5 + 1 9 9 .4 1 1 9 9 6 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0 + 1 9 9 .4 1 2 0 0 0
+ 1 9 9 .5 4 9 7 8 3 + 1 9 9 .5 9 8 6 5 3 + 1 9 9 .6 0 7 5 9 6 + 1 9 9 .6 0 7 9 9 5 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0 + 1 9 9 .6 0 8 0 0 0
+ 9 9 .8 0 9 7 7 9 + 1 8 6 .1 9 1 7 9 7 + 1 9 9 .2 0 9 3 3 4 + 1 9 9 .7 9 5 4 7 4 + 1 9 9 .8 0 3 9 5 8 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0 + 1 9 9 .8 0 4 0 0 0
+ 9 9 .9 7 7 5 6 8 + 1 8 6 .3 8 6 9 0 8 + 1 9 9 .4 0 6 8 8 8 + 1 9 9 .9 9 1 8 8 3 + 1 9 9 .9 9 9 9 6 2 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0 + 2 0 0 .0 0 0 0 0 0
+ 1 0 0 .3 0 6 6 2 5 + 1 8 6 .6 1 2 1 5 3 + 1 9 9 .6 1 2 1 3 1 + 2 0 0 .1 8 8 0 8 6 + 2 0 0 .1 9 5 9 6 3 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0 + 2 0 0 .1 9 6 0 0 0
+ 2 0 0 .3 3 2 7 4 6 + 2 0 0 .3 8 2 9 5 6 + 2 0 0 .3 9 1 6 2 7 + 2 0 0 .3 9 1 9 9 5 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0 + 2 0 0 .3 9 2 0 0 0
+ 2 0 0 .5 8 7 9 7 6 + 2 0 0 .5 8 7 9 9 6 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0 + 2 0 0 .5 8 8 0 0 0
+ 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0 + 2 0 0 .7 8 4 0 0 0
+ 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0 + 2 0 0 .9 8 0 0 0 0
+ 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0 + 2 0 1 .1 7 6 0 0 0
+ 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0 + 2 0 1 .3 7 2 0 0 0
+ 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0 + 2 0 1 .5 6 8 0 0 0
+ 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0 + 2 0 1 .7 6 4 0 0 0
Programa de Cmputo
13
struct Dimension_Ventana {
ldouble Xi;
ldouble Xf;
ldouble Yi;
ldouble Yf;
ldouble Zi;
ldouble Zf;
};
struct Definicion_Ventana {
int Xi;
int Xf;
int Yi;
int Yf;
};
struct C_2D {
ldouble X;
ldouble Y;
};
struct C_3D {
ldouble x;
ldouble y;
ldouble z;
};
// Coordenadas triples en formato entero
struct C_3I {
int x;
int y;
int z;
};
// Coordenadas dobles en formato entero
struct C_2I {
int x;
int y;
};
// Manejo de colores
#ifndef __PROGRAMACION_BORLAND__
typedef int TColor;
#else
extern TColor Colores_16[];
#endif
// Numeros complejos
#include <complex>
typedef std::complex <ldouble> cdouble;
#endif
class Interpolador
{
private:
ldouble *X;
ldouble *FX;
int N_elementos;
public:
// Constructor de la clase
Interpolador(ldouble *x, ldouble *fx, int i)
{
X = x;
FX = fx;
N_elementos = i;
}
// Calcula la interpolacin correspondiente al valor xi
ldouble Calcula(ldouble xi);
// Calcula la interpolacin inversa correspondiente al valor fxi
ldouble CalculaInverso(ldouble fxi);
// Calcula la derivada del correspondiente valor xi
ldouble Derivada(ldouble xi);
};
#endif
int i;
for(i = 0; i < N_elementos ; i++)
{
if (xi <= X[i] && xi >= X[i+1])
{
y = FX[i] * ((xi - X[i+1]) / (X[i] - X[i+1])) + FX[i+1] * ((xi - X[i]) / (X[i+1] - X[i]));
return y;
}
}
} else printf ("Valor solicitado fuera de rango (descendente Calcula) %lf ",xi);
}
return y;
}
// Clcula la interpolacin inversa correspondiente al valor fxi
ldouble Interpolador::CalculaInverso(ldouble fxi)
{
ldouble y = 0.0;
if (FX[0] < FX[N_elementos-1])
{
if (fxi >= FX[0] && fxi <= FX[N_elementos-1])
{
int i;
for(i = 0; i < N_elementos ; i++)
{
if (fxi >= FX[i] && fxi <= FX[i+1])
{
y = X[i] * ((fxi - FX[i+1]) / (FX[i] - FX[i+1])) + X[i+1] * ((fxi - FX[i]) / (FX[i+1] - FX[i]));
return y;
}
}
} else printf ("Valor solicitado fuera de rango (ascendente Inverso) %lf ",fxi);
} else {
if (fxi <= FX[0] && fxi >= FX[N_elementos-1])
{
int i;
for(i = 0; i < N_elementos ; i++)
{
if (fxi <= FX[i] && fxi >= FX[i+1])
{
y = X[i] * ((fxi - FX[i+1]) / (FX[i] - FX[i+1])) + X[i+1] * ((fxi - FX[i]) / (FX[i+1] - FX[i]));
return y;
}
}
} else printf ("Valor solicitado fuera de rango (descendente Inverso) %lf ",fxi);
}
return y;
}
} else printf ("Valor solicitado fuera de rango (ascendente Derivada) %lf ",xi);
} else {
if (xi <= X[0] && xi >= X[N_elementos-1])
{
int i;
for(i = 0; i < N_elementos ; i++)
{
if (xi <= X[i] && xi >= X[i+1])
{
y = (FX[i] - FX[i+1]) / (X[i] - X[i+1]);
//y = FX[i] * ((xi - X[i+1]) / (X[i] - X[i+1])) + FX[i+1] * ((xi - X[i]) / (X[i+1] - X[i]));
return y;
}
}
} else printf ("Valor solicitado fuera de rango (descendente Derivada) %lf ",xi);
}
return y;
}
class Malla_RC
{
private:
ldouble *FR;
ldouble *ND;
ldouble RE;
ldouble RW;
BMV bmv;
int N_elementos;
int Tipo_malla;
// Calcula los nodos y las fronteras
void Calcula(void);
public:
// Constructor de la clase
Malla_RC(ldouble rw, ldouble re, int n, int tp)
{
N_elementos = n;
Tipo_malla = tp;
RE = re;
RW = rw;
FR = bmv.SolicitaMemoria(N_elementos+1);
ND = bmv.SolicitaMemoria(N_elementos);
Calcula();
}
// Destructor de la clase
~Malla_RC()
{
bmv.LiberaMemoria(FR,N_elementos+1);
bmv.LiberaMemoria(ND,N_elementos);
}
// Regresa el valor de las fronteras del nodo i (i=1,2,..., N_elementos)
f2 = FR[i];
}
}
// Visualiza la malla
void Malla_RC::Visualiza(void)
{
for (int i = 0; i < N_elementos; i++)
{
printf("%lf %lf %lf\n",FR[i], ND[i], FR[i+1]);
}
printf("\n");
}
Malla 1D Malla1D.hpp:
#ifndef __Malla1D__
#define __Malla1D__
#include "Definiciones.hpp"
#include "BMV.hpp"
#define NODOS_DISTRIBUIDOS 0
#define BLOQUES_CENTRADOS 1
class Malla1D
{
private:
ldouble *FR;
ldouble *ND;
ldouble A;
ldouble B;
BMV bmv;
int N_elementos;
int Tipo_malla;
// Calcula los nodos y las fronteras
void Calcula(void);
public:
// Constructor de la clase
Malla1D(ldouble a, ldouble b, int n, int tp)
{
N_elementos = n;
Tipo_malla = tp;
A = a;
B = b;
FR = bmv.SolicitaMemoria(N_elementos+1);
ND = bmv.SolicitaMemoria(N_elementos);
Calcula();
}
// Destructor de la clase
~Malla1D()
{
bmv.LiberaMemoria(FR,N_elementos+1);
bmv.LiberaMemoria(ND,N_elementos);
}
// Regresa el valor de las fronteras del nodo i (i=1,2,..., N_elementos)
void Frontera(int i, ldouble &f1, ldouble &f2);
// Regresa el valor del nodo i (i=1,2,..., N_elementos)
void Nodo(int i, ldouble &nd);
// Regresa el valor de la frontera anterior, nodo y frontera siguiente del nodo i (i=1,2,..., N_elementos)
void Nodo(int i, ldouble &f1, ldouble &nd, ldouble &f2);
// Visualiza la malla
void Visualiza(void);
};
#endif
Malla 1D Malla1D.cpp:
#include <stdio.h>
#include "Malla1D.hpp"
// Visualiza la malla
void Malla1D::Visualiza(void)
{
for (int i = 0; i < N_elementos; i++)
{
printf("%lf %lf %lf\n",FR[i], ND[i], FR[i+1]);
}
printf("\n");
}
// Trasmicibilidad
void TrM(int i, int j)
{
rtiM = 0;
if (i >= DI-1) return;
ldouble rf1, rf2, rn, zf1, zf2, zn, n, p;
if (i < (DI - 1)) {
if ((xP[j][i+1] - xP[j][i]) >= 0.0) p = xP[j][i+1];
else p = xP[j][i];
} else p = xP[j][DI-1];
ldouble rmbM = DK / (Uo.Calcula(p) * Bo.Calcula(p));
mr.Nodo(i+1,rf1,rn,rf2);
mz.Nodo(j+1,zf1,zn,zf2);
mr.Nodo(i+2,n);
#ifdef AZIZ
rtiM = 4.0 * M_PI * (((rf2*rf2)*(zf2-zf1))/(n*n-rn*rn)) * rmbM * 8.364;
#else
rtiM = 2.0 * M_PI * rf2 * (zf2-zf1) / (rf2 - rf1) * rmbM * 8.364;
#endif
}
} else p = xP[j][0];
ldouble zmbm = DK / (Uo.Calcula(p) * Bo.Calcula(p));
#ifdef AZIZ
ztim = M_PI * ((rf2*rf2-rf1*rf1)/(zn-n)) * zmbm * 8.364;
#else
ztim = M_PI * ((rf2-rf1)/(zn-n)) * zmbm * 8.364;
#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Trasmicibilidad
void LDTrM(int i, int j)
{
rtiM = 0;
if (i >= DI-1) return;
ldouble rf1, rf2, rn, zf1, zf2, zn, n, p;
if (i < (DI - 1)) {
if ((P[j][i+1] - P[j][i]) >= 0.0) p = P[j][i+1];
else p = P[j][i];
} else p = P[j][DI-1];
ldouble rmbM = DK / (Uo.Calcula(p) * Bo.Calcula(p));
mr.Nodo(i+1,rf1,rn,rf2);
mz.Nodo(j+1,zf1,zn,zf2);
mr.Nodo(i+2,n);
#ifdef AZIZ
rtiM = 4.0 * M_PI * (((rf2*rf2)*(zf2-zf1))/(n*n-rn*rn)) * rmbM * 8.364;
#else
rtiM = 2.0 * M_PI * rf2 * (zf2-zf1) / (rf2 - rf1) * rmbM * 8.364;
#endif
}
int main(void)
{
printf ("\n\nMalla Radial Cilndrica\n");
mr.Visualiza();
printf ("\n\nMalla en Z\n");
mz.Visualiza();
BMV m;
Resuelve_Axb rs;
ldouble **A, **AA, *x, *b, **Re;
if (!(A = m.SolicitaMemoria(DI*DZ,DI*DZ))) return 1; // Solicita memoria para la matriz A
if (!(AA = m.SolicitaMemoria(DI*DZ,DI*DZ))) return 1; // Solicita memoria para la matriz AA
if (!(b = m.SolicitaMemoria(DI*DZ)))
return 1; // Solicita la memoria para el vector b
if (!(x = m.SolicitaMemoria(DI*DZ)))
return 1; // Solicita la memoria para el vector x
if (!(P = m.SolicitaMemoria(DZ,DI)))
return 1; // Solicita la memoria para el vector p
if (!(xP = m.SolicitaMemoria(DZ,DI)))
return 1; // Solicita la memoria para el vector xp
ldouble t, pwf=DPo, qw;
ldouble dij, diMj, dijM, a1, a2, a3, a4, xa, zf1, zf2, zn , xQw;
int i, j, k, sw, xsw, sv;
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
TrM(i,j);
Trm(i,j);
TzM(i,j);
Tzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]);
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ)));
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ)));
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#endif
b[i+DI*j] = -(a1 - a2 + a3 - a4 - vi);
}
}
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
for (j = 0; j < DZ; j++)
{
for (i = 0; i < DI; i++) xP[j][i] = P[j][i] + x[j*DI+i];
}
sw++;
if (sw >= 5) break;
}
////////////////////////////////////////////////////////////////////////////////////
// Presion aproximada
for (j = 0; j < DZ; j++)
{
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
TrM(i,j);
Trm(i,j);
TzM(i,j);
Tzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]);
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ)));
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ)));
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#endif
b[i+DI*j] = -(a1 - a2 + a3 - a4 - vi);
}
}
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
#ifndef TodosNodos
qw = xQw - fabs(x[9*DI]);
#else
qw = xQw - fabs(x[0]);
#endif
sw++;
if (sw >= 5) break;
}
// Actualizar las presiones
if (sw < 5) {
if (xQw == qw) qw -= 1e-10;
xQw = qw;
t += Dit;
if (sw <= 2) Dit *= 2.0;
if (Dit > 15.0) Dit = 15.0;
} else Dit /= 2.0;
} while (xQw > DQwm);
printf("\nTiempo %2.18e, incremento %2.18e\n",t,Dit);
printf("Gasto %2.18f\n",xQw);
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#endif
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]) * dij;
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dij;
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
A[i+DI*j][i+DI*j]
= -rtiM - rtim - a1 + a2 - ztiM - a3 - ztim + a4 - dvi;
// b
if (i < DI-1) A[i+DI*j][i+DI*j+1] = rtiM - rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// e
if (j < DZ-1) A[i+DI*j][i+DI*(j+1)] = ztiM - ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dijM;
}
}
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
TrM(i,j);
Trm(i,j);
TzM(i,j);
Tzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]);
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ)));
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ)));
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#endif
b[i+DI*j] = -(a1 - a2 + a3 - a4 - vi);
}
}
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
for (j = 0; j < DZ; j++)
{
for (i = 0; i < DI; i++) xP[j][i] = P[j][i] + x[j*DI+i];
}
sw++;
if (sw >= 5) break;
xsw = 0;
}
////////////////////////////////////////////////////////////////////////////////////
// Presion aproximada
for (j = 0; j < DZ; j++)
{
for (i = 0; i < DI; i++) xP[j][i] = P[j][i];
}
Dit = 1e-12;
do
{
qw = xQw;
sw = 0, xsw = 1;
while (xsw)
{
xsw = 0;
// Genera A
// Celdas interiores de la discretizacion
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
TrM(i,j);
Trm(i,j);
TzM(i,j);
Tzm(i,j);
Dvi(i,j);
diMj = dijM = 0.0;
dij= (1.0 / Bo.Calcula(xP[j][i])) * Bo.Derivada(xP[j][i]) + (1.0 / Uo.Calcula(xP[j][i])) * Uo.Derivada(xP[j][i]);
if (i <= DI-2) diMj = (1.0 / Bo.Calcula(xP[j][i+1])) * Bo.Derivada(xP[j][i+1]) + (1.0 / Uo.Calcula(xP[j][i+1])) *
Uo.Derivada(xP[j][i+1]);
if (j <= DZ-2) dijM = (1.0 / Bo.Calcula(xP[j+1][i])) * Bo.Derivada(xP[j+1][i]) + (1.0 / Uo.Calcula(xP[j+1][i])) *
Uo.Derivada(xP[j+1][i]);
// f
if (j > 0) A[i+DI*j][i+DI*(j-1)] = ztim + ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
// c
if (i > 0) A[i+DI*j][i+DI*j-1] = rtim + rtim * (xP[j][i] - xP[j][i-1]) * dij;
// a
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#endif
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]) * dij;
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dij;
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
A[i+DI*j][i+DI*j]
= -rtiM - rtim - a1 + a2 - ztiM - a3 - ztim + a4 - dvi;
// b
if (i < DI-1) A[i+DI*j][i+DI*j+1] = rtiM - rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// e
if (j < DZ-1) A[i+DI*j][i+DI*(j+1)] = ztiM - ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dijM;
}
}
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
TrM(i,j);
Trm(i,j);
TzM(i,j);
Tzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]);
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ)));
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ)));
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
TrM(i,k);
xa += rtiM;
}
TrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#endif
b[i+DI*j] = -(a1 - a2 + a3 - a4 - vi);
}
}
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
#ifndef TodosNodos
qw = xQw - fabs(x[9*DI]);
#else
qw = xQw - fabs(x[0]);
#endif
sw++;
if (sw >= 5) break;
}
// Actualizar las presiones
if (sw < 5) {
if (xQw == qw) qw -= 1e-10;
xQw = qw;
t += Dit;
if (sw <= 2) Dit *= 2.0;
if (Dit > 15.0) Dit = 15.0;
} else Dit /= 2.0;
} while (xQw > DQwm);
printf("\nTiempo %2.18e, incremento %2.18e\n",t,Dit);
printf("Gasto %2.18f\n",xQw);
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
LDTrM(i,k);
xa += rtiM;
}
LDTrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#endif
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]) * dij;
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dij;
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
A[i+DI*j][i+DI*j]
= -rtiM - rtim - a1 + a2 - ztiM - a3 - ztim + a4 - dvi;
// b
if (i < DI-1) A[i+DI*j][i+DI*j+1] = rtiM - rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// e
if (j < DZ-1) A[i+DI*j][i+DI*(j+1)] = ztiM - ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dijM;
}
}
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
LDTrM(i,j);
LDTrm(i,j);
LDTzM(i,j);
LDTzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]);
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ)));
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ)));
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
LDTrM(i,k);
xa += rtiM;
}
LDTrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
LDTrM(i,k);
xa += rtiM;
}
LDTrM(i,j);
a2 = (rtiM / xa) * (xQw * 8.364);
}
#endif
b[i+DI*j] = -(a1 - a2 + a3 - a4 - vi);
}
}
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
for (j = 0; j < DZ; j++)
{
for (i = 0; i < DI; i++) xP[j][i] = P[j][i] + x[j*DI+i];
}
sw++;
if (sw >= 5) break;
}
////////////////////////////////////////////////////////////////////////////////////
// Presion aproximada
for (j = 0; j < DZ; j++)
{
for (i = 0; i < DI; i++) xP[j][i] = P[j][i];
}
Dit = 1e-12;
do
{
qw = xQw;
sw = 0, xsw = 1;
while (xsw)
{
xsw = 0;
// Genera A
// Celdas interiores de la discretizacion
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
LDTrM(i,j);
LDTrm(i,j);
LDTzM(i,j);
LDTzm(i,j);
Dvi(i,j);
dij = diMj = dijM = 0.0;
//dij= (1.0 / Bo.Calcula(xP[j][i])) * Bo.Derivada(xP[j][i]) + (1.0 / Uo.Calcula(xP[j][i])) * Uo.Derivada(xP[j][i]);
//if (i <= DI-2) diMj = (1.0 / Bo.Calcula(xP[j][i+1])) * Bo.Derivada(xP[j][i+1]) + (1.0 / Uo.Calcula(xP[j][i+1])) *
Uo.Derivada(xP[j][i+1]);
//if (j <= DZ-2) dijM = (1.0 / Bo.Calcula(xP[j+1][i])) * Bo.Derivada(xP[j+1][i]) + (1.0 / Uo.Calcula(xP[j+1][i])) *
Uo.Derivada(xP[j+1][i]);
// f
if (j > 0) A[i+DI*j][i+DI*(j-1)] = ztim + ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
// c
if (i > 0) A[i+DI*j][i+DI*j-1] = rtim + rtim * (xP[j][i] - xP[j][i-1]) * dij;
// a
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// Celdas abiertas a produccion
#ifndef TodosNodos
if (i == 0 && (j == 8 || j == 9 || j == 10))
{
for (xa = 0.0,k = 8; k < 11; k++)
{
LDTrM(i,k);
xa += rtiM;
}
LDTrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#else
if (i == 0)
{
for (xa = 0.0,k = 0; k < DZ; k++)
{
LDTrM(i,k);
xa += rtiM;
}
LDTrM(i,j);
a2 = (rtiM / xa) * (-xQw * 8.364) * dij;
}
#endif
if (i > 0) a2 = rtim * (xP[j][i] - xP[j][i-1]) * dij;
if (j < DZ-1) a3 = ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dij;
if (j > 0) a4 = ztim * (xP[j][i] - xP[j-1][i] - (DR*(DH/(ldouble)DZ))) * dij;
A[i+DI*j][i+DI*j]
= -rtiM - rtim - a1 + a2 - ztiM - a3 - ztim + a4 - dvi;
// b
if (i < DI-1) A[i+DI*j][i+DI*j+1] = rtiM - rtiM * (xP[j][i+1] - xP[j][i]) * diMj;
// e
if (j < DZ-1) A[i+DI*j][i+DI*(j+1)] = ztiM - ztiM * (xP[j+1][i] - xP[j][i] - (DR*(DH/(ldouble)DZ))) * dijM;
}
}
// Genera b
for (j = 0; j < DZ; j++)
{
mz.Nodo(j+1,zf1,zn,zf2);
for (i = 0; i < DI; i++)
{
LDTrM(i,j);
LDTrm(i,j);
LDTzM(i,j);
LDTzm(i,j);
Vi(i,j);
a1 = a2 = a3 = a4 = 0.0;
if (i < DI-1) a1 = rtiM * (xP[j][i+1] - xP[j][i]);
// Resolver Ax=b
rs.Resuelve(A,x,b,DI*DZ,ITR);
// Revisar aproximacin
for (i = 0; i < DI*DZ; i++)
{
if (fabs(x[i]) > DE) xsw = 1;
}
// Actualiza las presiones calculadas
#ifndef TodosNodos
qw = xQw - fabs(x[9*DI]);
#else
qw = xQw - fabs(x[0]);
#endif
sw++;
if (sw >= 5) break;
}
// Actualizar las presiones
if (sw < 5) {
if (xQw == qw) qw -= 1e-10;
xQw = qw;
t += Dit;
if (sw <= 2) Dit *= 2.0;
if (Dit > 15.0) Dit = 15.0;
} else Dit /= 2.0;
} while (xQw > DQwm);
printf("\nTiempo %2.18e, incremento %2.18e\n",t,Dit);
printf("Gasto %2.18f\n",xQw);
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Libera la memoria
m.LiberaMemoria(A,DI*DZ,DI*DZ);
m.LiberaMemoria(AA,DI*DZ,DI*DZ);
m.LiberaMemoria(b,DI*DZ);
m.LiberaMemoria(x,DI*DZ);
m.LiberaMemoria(P,DZ,DI);
m.LiberaMemoria(xP,DZ,DI);
return 0;
}