Upload
coco
View
15
Download
0
Embed Size (px)
DESCRIPTION
Simulacion de yacimiento
Citation preview
SIMULACIÓN DE FLUJO LINEAL 2D AGUA-PETRÓLEO MEDIANTE ESQUEMA IMPIS SIMULTÁNEO,
POR EL MÉTODO DE SOLUCIÓN IADIP
José Alejandro Lozano Arias1
Haiver Jeison Morales Goyes2
Juan David Vallejo Restrepo3
Simulación de Yacimientos
UNIVERSIDAD NACIONAL DE COLOMBIA Facultad de Minas
Medellín Junio 4 de 2015
1 Estudiante de Ingeniería de petróleos, Universidad Nacional de Colombia, Colombia. - [email protected]
2 Estudiante de Ingeniería de petróleos, Universidad Nacional de Colombia, Colombia. - [email protected]
3 Estudiante de
Ingeniería de petróleos, Universidad Nacional de Colombia, Colombia.
1
Contenido Resumen ............................................................................................................................................. 2
Introducción ........................................................................................................................................ 2
1. Modelo Físico. ................................................................................................................................. 2
2. Modelo matemático. ...................................................................................................................... 6
2.1 Expresiones para las condiciones de límite [2]. ....................................................................... 7
2.2 Relaciones usadas para permeabilidad relativa. ..................................................................... 7
2.3 Relaciones usadas para presión capilar. .................................................................................. 8
2.4 Cálculo de las Propiedades PVT. .............................................................................................. 8
2.4.1 Factor volumétrico del petróleo. ...................................................................................... 9
2.4.2 Factor volumétrico del agua. ............................................................................................ 9
2.4.3 Viscosidad del agua ......................................................................................................... 10
2.4.4 Viscosidad del petróleo ................................................................................................... 10
3. Modelo numérico. ........................................................................................................................ 11
3.1 IMPIS simultáneo .................................................................................................................... 11
3.2 Método IADIP ......................................................................................................................... 16
3.3 Balance de materiales ............................................................................................................ 22
5. Modelo computacional. ............................................................................................................... 22
5.1 Diagrama de flujo. .................................................................................................................. 23
6. Resultados. ................................................................................................................................... 24
6.1 ¿Por qué no corrió el simulador? ........................................................................................... 24
Referencias ....................................................................................................................................... 24
Anexos ............................................................................................................................................... 24
2
Resumen
Éste trabajo muestra la simulación numérica y computacional del flujo de petróleo y agua a través
de un medio poroso 2D, con el fin de mostrar la distribución de presiones y saturaciones en un
esquema de yacimiento a lo largo de un año. Se utilizó el esquema IMPIS simultáneo (Implicit
Pressure Implicit Saturation) y se le dio solución al sistema usando el método IADIP (Iterative
Alternating Directions Implicit Pressure).
Introducción
Mirar la respuesta de un yacimiento a estimulaciones de producción, cambios en saturación,
puesta en marcha de nuevos pozos, etc; siempre ha sido tema de especial preocupación para los
ingenieros de casi todas las compañías petroleras. La simulación de yacimientos, ha pasado de ser
un proceso tedioso y complejo, a ser la mejor herramienta para estimar el comportamiento de los
yacimientos. Actualmente no es posible contemplar la producción a gran escala de un campo sin
antes prever su capacidad de flujo, empuje hidráulico, etc.
La simulación de yacimientos adquiere especial relevancia en este siglo de los computadores y la
tecnología, cuando se descubre que casi todas las propiedades están ligadas unas con otras, es
decir, es inconcebible pensar en la compresibilidad de un fluido sin mencionar la presión, la
viscosidad sin temperatura, etc. La simulación de yacimientos, de la mano con las matemáticas
especiales y los métodos numéricos, son los que permiten actualmente evaluar y analizar las
múltiples respuestas de un yacimiento al comportamiento de las variables mediante diferentes
técnicas, en este caso IMPIS simultáneo, método de solución IADIP.
1. Modelo Físico.
Para el modelo físico del yacimiento, es importante hacer un esquema que represente
adecuadamente todos los datos y posibles incógnitas del problema. A continuación se muestra
una imagen con las dimensiones del yacimiento:
3
LON
GIT
UD
Y
15
00
0 f
t
LONGITUD X 15000 ft
Figura 1. Dimensiones del yacimiento en X-Y
El yacimiento tiene forma cuadrada, con 30 bloques en la dirección x y 30 bloques en la dirección
y. En la dirección z sólo se contempla la altura de una fila de bloques que es de 150 ft.
Ahora, se puede calcular el valor de y de teniendo en cuenta las longitudes en i y j, además
del hecho de que son 30 bloques tanto en la dirección x como en la dirección y.
Luego, el largo y el ancho de cada bloque se calcula como:
4
…
…
…
… … …
Figura 2. Esquema de distribución de bloques en la malla.
5
La siguiente imagen muestra un esquema del modelo físico tridimensional de los bloques:
Figura 3. Esquema tridimensional de los bloques de la malla.
Donde:
Y con respecto a las permeabilidades tanto en la dirección X como en la dirección Y
Los datos de porosidad son:
El espesor:
h = 150 ft
Y el ángulo de inclinación:
6
Tener en cuenta que aunque la figura 3 muestra un esquema 3D (en tres dimensiones), la
simulación realizada es en 2D de acuerdo a lo planteado por el equipo de profesores.
2. Modelo matemático.
Partiendo de las siguientes ecuaciones diferenciales parciales de flujo, para flujo en las direcciones
X, Y y Z; tanto para el aceite como para el agua, se tiene [1]:
Para el agua
[
(
)]
[
(
)]
*
(
)+
(
) (1)
Análogamente para el agua se tienen las ecuaciones:
[
(
)]
[
(
)]
*
(
)+
(
) (2)
Donde:
Constante de conversión de unidades
Constante de conversión de unidades
Permeabilidades en la dirección x, y, z respectivamente, mD.
Viscosidad del agua, cP
Viscosidad del petróleo, cP
Permeabilidad relativa al agua, mD
Permeabilidad relativa al aceite, mD
Luego, es necesario tener en cuenta las siguientes suposiciones:
Sólo se tiene flujo en las direcciones X y Y (flujo bidimensional), es decir el flujo en la
dirección Z se hace cero.
La porosidad es constante, luego sale de la expresión de derivada.
Para este caso, es h, que es el espesor del yacimiento que se está modelando.
7
Así, para la fase petróleo se obtiene:
*
(
)+
*
(
)+
(
) (3)
Similarmente para la fase agua:
*
(
)+
*
(
)+
(
) (4)
2.1 Expresiones para las condiciones de límite [2].
Existen dos tipos de condiciones de límite, que pueden ser de límite interno o limite externo, las
condiciones de límite interno están dadas para la interacción del yacimiento con los pozos y las de
limite externo para el contacto del yacimiento con el exterior; para este caso por escases de datos
en el contacto pozo-yacimiento, solo trabajaremos con las condiciones de limite externo.
Condiciones de límite externo
Suele manejarse dos tipos de condiciones de límite externo, las condiciones tipo Dirichlet y las
condiciones tipo Newman, las cuales establecen los valores de presión de poro y de flujo
respectivamente en las fronteras del sistema.
Para este caso se considerará un sistema cerrado (tiene fronteras de no flujo) y se establecerán las
condiciones de límite tipo Newman, así las fronteras x=0, x=15000 ft, y=0 y y= 15000 ft el flujo será
de . A continuación se muestran las expresiones matemáticas:
( ) *
+
(5)
( ) *
+
(6)
( ) *
+
(7)
( ) *
+
(8)
2.2 Relaciones usadas para permeabilidad relativa.
A lo largo del desarrollo del simulador, será necesario calcular las permeabilidades relativas al
agua y al aceite ( ), para un determinado valor de saturación de agua ( ); es así como
8
basados en el archivo de texto suministrado por el equipo de profesores se construye una
ecuación general para interpolar valores de permeabilidades relativas correspondientes a datos de
saturación que no sean puntuales.
(9)
Donde los valores de son conocidos. La ecuación despejada para
es:
*( ) ( )
+ (10)
En primera instancia se encontró por medio de la herramienta Excel una función polinómica de
grado 6 que modelaba el comportamiento de las permeabilidades relativas del agua y del aceite
en función de la saturación de agua, que entre otras cosas proporcionaba valores mucho más
precisos que los obtenidos por una interpolación; pero teniendo en cuenta que el archivo de texto
puede variar a la hora de correr el simulador se llegó a la conclusión que era preferible hacer una
ecuación de interpolación.
Nota: los valores de las permeabilidades relativas del agua y el petróleo se calculan bloque a
bloque.
2.3 Relaciones usadas para presión capilar.
Análogamente, para obtener las presiones capilares de diferentes valores de saturación de agua,
se hace necesario realizar una interpolación de la siguiente manera.
(11)
Donde los valores de son conocidos. La ecuación despejada para es:
*( ) ( )
+ (12)
Nota: los valores de presión capilar se calculan bloque a bloque.
2.4 Cálculo de las Propiedades PVT.
De acuerdo a los datos suministrados, se tiene una presión de saturación de 150 psi; este valor es
muy bajo respecto al valor que tenemos asignado para la presión inicial (2000 psia), por lo que se
puede decir que hay escasa o nula cantidad de gas en el yacimiento, luego el valor del gas disuelto
en el crudo es aproximadamente cero .
9
2.4.1 Factor volumétrico del petróleo.
Se escoge para el cálculo del Factor Volumétrico del Petróleo a la presión de burbuja, la
correlación de Glaso [3]
[ ( ) ] (13)
Donde:
(
)
(14)
Factor volumétrico del petróleo a , ⁄
Razón gas disuelto- petróleo a , ⁄ (Para nuestro caso es cero)
T Temperatura del yacimiento, °F
Gravedad específica del gas (Para nuestro caso es cero)
Gravedad específica del petróleo
Ahora, conociendo los valores de es posible calcular el Factor volumétrico , para ello se
hace uso de la ecuación:
[ ( )] [3] (15)
Donde:
Presión de burbuja, psi
Presión de interés, psi
Compresibilidad del petróleo,
Se supone un factor de compresibilidad del petróleo constante de .
2.4.2 Factor volumétrico del agua.
Para el cálculo del Factor volumétrico del agua se usó la correlación de McCain [3], donde el
cambio de volumen durante la reducción de presión es representado por y el cambio en
volumen debido a la reducción en temperatura es representado por como función de
presión y temperatura.
El factor volumétrico del agua puede determinarse utilizando estos valores mediante la siguiente
ecuación:
( )( ) (16)
10
Donde:
(17)
(18)
P, psi T, °F
A continuación se muestran las expresiones para calcular tanto la viscosidad del agua como del
petróleo:
2.4.3 Viscosidad del agua
Para la viscosidad del agua se hará uso de la correlación de Van Wingen [3].
( ) (19)
2.4.4 Viscosidad del petróleo
La viscosidad del crudo se puede calcular mediante la Correlación de Glaso. Primero se calcula
que es la viscosidad del petróleo libre de gas a 1 atm
( )( ) (20)
Donde
Viscosidad del petróleo libre de gas a 1 atm y T, cP
Gravedad del petróleo, API
Temperatura del yacimiento, °F
Ahora se calcula la viscosidad del petróleo a presión de burbuja, usando la correlación de Beggs,
H.D y Robinson, J.R
La correlación es la siguiente:
( ) (21)
Donde:
( ) (22)
( ) (23)
Finalmente, con el valor de calculado, se puede proceder a calcular la viscosidad del petróleo a
cualquier presión, mediante la ecuación de Vázquez, ME y Beggs, H.D [3]
11
(
)
(24)
Donde:
( ) (25)
3. Modelo numérico.
3.1 IMPIS simultáneo
Para el desarrollo del modelo numérico, partimos de la ecuación discretizada para cada una de las
fases, petróleo y agua (o, w). Así las ecuaciones estarán dadas por las expresiones:
Para el petróleo
( )
( ) (26)
Para el agua
( )
( ) (27)
Donde:
Transmisibilidades del petróleo, transmisibilidad del agua.
Potencial del petróleo, potencial del agua.
Presión del petróleo, presión del agua.
Gravedad especifica del petróleo, gravedad específica del agua.
Caudal del petróleo a condiciones normales, caudal del agua a condiciones
normales.
Volumen del bloque.
Paso en el tiempo.
Expansión en el tiempo.
Porosidad.
Saturación del petróleo, saturación del agua.
Inverso del factor volumétrico del petróleo, Inverso del factor volumétrico del
agua
Se sabe también que,
(28)
Donde Z es la altura
12
Reemplazando y desarrollando las expresiones 26 y 27 se tiene,
Para el Petróleo:
( ( ))
( )
( )
( ) ( ( )) (29)
Similarmente para el agua:
( ( ))
( )
( )
( ) ( ( )) (30)
Ahora, haciendo la expansión de los términos ( ) y ( ) teniendo en cuenta
además que la porosidad es constante se tiene:
Para el Petróleo:
( ) ( )
[
]
[
]
[
] (31)
Recordar que
Y adicionalmente, mediante una expansión progresiva se define a como:
Para el agua:
( ) ( )
[
]
[
] (32)
Recordar que
Donde, mediante una expansión progresiva definimos a como:
13
Además, por definición
Luego,
Además, tener en cuenta que se asumió que el yacimiento es humectable al aceite, por lo tanto,
Entonces
Reemplazando estas expresiones para la presión del aceite y la expansión en el tiempo de la
saturación de agua en la ecuación 32, tenemos finalmente que:
( ) [ ( )
( )]
[
] (33)
Introduciendo los resultados de las expansiones en el tiempo correspondientes a cada fase en (29)
y (30), se obtiene.
Para el petróleo: ecuación 31 en 29
( )
[
] ( ( ))
( ( )) (34)
Para el agua: ecuación 33 en 30,
( )
[
] ( ( ))
( ( )) (35)
Ahora, vemos que ya es posible nombrar como constantes ciertas expresiones que no varían, lo
cual permitirá simplificar las ecuaciones. A continuación se definen las constantes
, y sus respectivas expresiones:
(34)
(35)
(36)
(37)
Así, al reemplazarlas en la ecuación general para cada fase se tendría que,
14
Para el petróleo:
( ) ( ( )) (38)
Para el agua:
( ) ( ( )) (39)
Con el objetivo de eliminar el término de saturación de aceite, se opera el término de la
siguiente manera.
(
) (
)
(
) (
)
( )
(40)
Reemplazando la ecuación 40 en las expresiones para cada fase, se tendrá,
Para el petróleo: ecuación 40 en 38
( ) (
) ( ( ))
( ( ))
( )
( ( )) (41)
Para el agua: Ecuación 40 en 39,
( ) (
) ( ( ))
( ( ))
( )
( ( )) (42)
Expandiendo los términos de y , tenemos que:
(43)
(44)
Después de reemplazar las expansiones en el tiempo correspondientes a las presiones del petróleo
y del agua, y resolviendo las operaciones matemáticas, las ecuaciones para cada fase quedarían de
la siguiente manera.
15
Para el petróleo: Ecuaciones 43 y 44 en 41:
( ) (
) ( )
(
) ( ( ))
( ( )) (45)
Dejamos las presiones desconocidas al tiempo n+1 en un lado y las conocidas al tiempo n en el
otro, así,
( )
( ( ))
( ) ( )
( ( )) (46)
Para el agua: ecuaciones 43 y 44 en 42,
( ) (
)( )
(
)
( ( ))
( ( )) (47)
Al igual que con el petróleo, se dejan las presiones desconocidas al tiempo n+1 en un lado y las
conocidas al tiempo n en el otro, así,
( )
( ( ))
( ) ( )
( ( )) (48)
Ahora, como se tiene información de todas las propiedades al tiempo n, al igual que los caudales
de petróleo y agua a condiciones normales, podemos decir que el lado derecho de las ecuaciones
46 y 48 permanece constante en esa iteración, lo cual permite introducir y para
simplificar las expresiones; a continuación se definen las constantes:
( (
)) (49)
( ( )) (50)
16
Expresando los términos ( ) y ( ) correspondientes a las transmisibilidades del
petróleo y el agua en las direcciones de x y de y se tiene,
Para el petróleo
( ) ( ) ( )
(50)
Para el agua
( ) ( ) ( )
(51)
3.2 Método IADIP
Para resolver estas ecuaciones se utilizará el método IADIP, el cual es el método ADIP, con la
excepción que para pasar del tiempo n al tiempo n+1, se debe aplicar un proceso iterativo y se le
adiciona el parámetro h(k) el cual acelera la convergencia. Para pasar de una iteración a otra se
hace en dos etapas: en la primera etapa se calcula una presión intermedia P* haciendo el barrido
por filas, en la segunda etapa ya con los P* calculados se hace un barrido por columnas
encontrando el valor de . Luego se chequea convergencia entre y . Cuando hay
convergencia se convierte en P al tiempo n+1 ( )
Las ecuaciones aplicadas en este método se definen como sigue:
PARA EL PETRÓLEO:
ETAPA 1:
( ) (
) ( )
(
) (52)
ETAPA 2:
( ) (
) ( )
(
) (53)
PARA EL AGUA:
ETAPA 1: (
) ( ) (
)
(
) (54)
ETAPA 2:
( ) (
) ( )
(
) (55)
Ahora se procede a hacer las expansiones en el espacio de los términos de , analizando el
comportamiento de cada bloque i, j y su interacción con los bloques i+1, j _ i-1, j _ i, j+1 _ i, j-1
que lo rodean, como se puede ver en la figura 4.
17
Figura 4. Esquema para obtención de transmisibilidades.
Para el petróleo:
Etapa uno.
(
)
(
)
(
)
(
)
(
)
(
)
(56)
El término
viene de una fila anterior, por ende es conocido.
Etapa dos.
(
)
(
)
(
)
(
)
(
)
(
)
(57)
El término
viene de una fila anterior, por ende es conocido.
18
Para el agua:
Etapa uno.
(
)
(
)
(
)
(
) |
(
)
(
)
(58)
El término viene de una fila anterior, por ende es conocido.
Etapa dos.
(
)
(
)
(
)
(
)
(59)
(
)
(
)
(60)
El término viene de una fila anterior, por ende es conocido.
Como se está trabajando con condiciones de límite adsorbidas, las ecuaciones de los bloques en el
borde del yacimiento varían con respecto a las de del interior, así:
Para petróleo:
Bloque Esquina Superior Izquierda:
(
)
( )
( )
( )
( ) (61)
Bloque Esquina Inferior Izquierda:
(
)
( )
( )
( )
( ) (62)
19
Bloque Esquina Superior Derecha:
(
)
( )
( )
( )
( ) (63)
Bloque Esquina Inferior Derecha:
(
)
( )
( )
( )
( ) (64)
Bloques (i,j) Bordes Externos Superiores:
(
)
( )
(
) ( )
( )
( )
( ) (65)
Bloques (i,j) Bordes Externos Inferiores:
(
)
( )
(
) ( )
( )
( )
( ) (66)
Bloques (i,j) Bordes Externos Izquierdos:
(
)
(
)
( )
( )
( ) (
) ( )
( ) (67)
Bloques (i,j) Bordes Externos Derechos:
(
)
(
)
( )
( )
( ) (
) ( )
( ) (68)
Para agua:
Bloque Esquina Superior Izquierda:
(
)
( )
( )
( )
( ) (69)
20
Bloque Esquina Inferior Izquierda:
(
)
( )
( )
( )
( ) (70)
Bloque Esquina Superior Derecha:
(
)
( )
( )
( )
( ) (71)
Bloque Esquina Inferior Derecha:
(
)
( )
( )
( )
( ) (72)
Bloques (i,j) Bordes Externos Superiores:
(
)
( )
(
) ( )
( )
( )
( ) (73)
Bloques (i,j) Bordes Externos Inferiores:
(
)
( )
(
) ( )
( )
( )
( ) (74)
Bloques (i,j) Bordes Externos Izquierdos:
(
)
(
)
( )
( )
( ) (
) ( )
( ) (75)
Bloques (i,j) Bordes Externos Derechos:
(
)
(
)
( )
( )
( ) (
) ( )
( ) (76)
21
Recordemos que las transmisibilidades vienen dadas por:
Transmisibilidades en X:
Para el petróleo.
(
)
(77)
(
)
(78)
Para el Agua.
(
)
(79)
(
)
(80)
Transmisibilidades en Y:
Para el petróleo.
(
)
(81)
(
)
(82)
Para el Agua.
(
)
(83)
(
)
(84)
Aplicando estas transmisibilidades a nuestro problema de simulación podemos resumir mucho
más estas expresiones ya que tenemos que los espesores ( ), permeabilidades ( ), longitudes
verticales ( ) y horizontales ( ) de cada bloque son los mismos en todo el yacimiento,
además:
a continuación se resumen estas ecuaciones:
22
Transmisibilidades en X:
Para el petróleo.
(
)
(86)
(
)
(87)
Para el Agua.
(
)
(89)
(
)
(90)
Transmisibilidades en Y:
Para el Petróleo.
(
)
(91)
(
)
(92)
Para el Agua.
(
)
(93)
(
)
(94)
3.3 Balance de materiales
Las aproximaciones numéricas deben satisfacer el balance de materiales, este plantea que:
[Producción neta acumulada] = [Contenido de fluido inicial en el yacimiento]-[Contenido actual]
Y matemáticamente obedece a que se cumpla la siguiente igualdad
∑∑ (
) ∑∑
5. Modelo computacional.
23
5.1 Diagrama de flujo.
24
6. Resultados.
6.1 ¿Por qué no corrió el simulador?
Pudieron ocurrir varias cosas por las cuales el simulador no corrió, a nuestro criterio se pudo deber
a:
Error transcribiendo las ecuaciones al código de programación.
Inconsistencia con el parámetro de aceleración Hk.
El sistema de ecuaciones obtenido por el método IMPIS simultáneo y método de solución
IADIP pudo resultar insoluble.
A ser un algoritmo tan extenso es probable que se haya asignado una tarea equivocada y
después encontrar este error era difícil.
Complejidad y error humano al manejar tantos ciclos iterativos vinculados entre sí.
Referencias
[1] T. Ertekin, J. H. Abou-Kassem y G. R. King, Basic Applied Reservoir Simulation, Texas: Society of
Petroleum Engineers, 2001.
[2] G. Osorio, Simulación Numérica de Yacimientos, Medellin: Universidad Nacional de Colombia,
2005.
[3] C. Bánzer, Correlaciones numéricas P.V.T, Maracaibo: Universidad del Zulia, 1996.
Anexos
Código del simulador en lenguaje Fortran.
Program simulador2 implicit none Real :: lx, ly, grado, T, h, Kx, Ky, phi, Pinicial, API, gammaw, Pb, swi !Datos leidos del .txt cuidado con swi Real:: deltax, deltay, pcinicial, uw, uod, A_miu, B_miu, uob, m, F, aux3, Bob, deltavwt, deltavwp Real :: krwa, Krwb, Swa, Swb, Krob, Kroa, Pcb,Pca, Vp, deltat, aux4, z, rhosc, beta, aux5, suma, norma, aux6, aux7 real :: lamdax, lamday, aux8, aux9, wmin, wmax, Hki, alpha real :: maxerror, expp, expg, aux10, aux11 integer :: i, aux, j, nw, puntos, aux2, Nx, Ny, posx, posy, k, l, contador, nk, contadorHk character*100 datos(500)
25
real, parameter :: bc = 1.127e-3 real, parameter :: co = 1.2e-5 real, parameter :: pi = 3.141592 real, parameter :: ac = 5.614583 real, dimension (:,:), allocatable :: well real, dimension (:,:), allocatable :: tablapuntos Real, dimension(:,:), allocatable :: Po Real, dimension(:,:), allocatable :: Pw Real, dimension(:,:), allocatable :: Pc Real, dimension(:,:), allocatable :: Tox Real, dimension(:,:), allocatable :: Toy Real, dimension(:,:), allocatable :: Twx Real, dimension(:,:), allocatable :: Twy Real, dimension(:,:), allocatable :: Sw Real, dimension(:,:), allocatable :: So Real, dimension(:,:), allocatable :: Kro Real, dimension(:,:), allocatable :: Krw Real, dimension(:,:), allocatable :: uo Real, dimension(:,:), allocatable :: Bo Real, dimension(:,:), allocatable :: Bw Real, dimension(:,:), allocatable :: Q Real, dimension(:,:), allocatable :: ifila Real, dimension(:,:), allocatable :: icolumna Real, dimension(:,:), allocatable :: Pon !al tiempo n Real, dimension(:,:), allocatable :: Pwn !al tiempo n Real, dimension(:,:), allocatable :: Bon !al tiempo n Real, dimension(:,:), allocatable :: Bwn !al tiempo n Real, dimension(:,:), allocatable :: Son !al tiempo n Real, dimension(:,:), allocatable :: Swn !al tiempo n Real, dimension(:,:), allocatable :: Pcn !al tiempo n Real, dimension(:,:), allocatable :: Co1 Real, dimension(:,:), allocatable :: Co2 Real, dimension(:,:), allocatable :: Cw1 Real, dimension(:,:), allocatable :: Cw2 Real, dimension(:,:), allocatable :: Cw3 Real, dimension(:,:), allocatable :: gammaoz Real, dimension(:,:), allocatable :: gammawz Real, dimension(:,:), allocatable :: fo Real, dimension(:,:), allocatable :: fw Real, dimension(:,:), allocatable :: Pko Real, dimension(:,:), allocatable :: Pk1o Real, dimension(:,:), allocatable :: Pkw Real, dimension(:,:), allocatable :: Pk1w Real, dimension(:,:), allocatable :: errorIADIP Real, dimension(:,:), allocatable :: errorPo Real, dimension(:,:), allocatable :: errorSo Real, dimension(:,:), allocatable :: Soc Real, dimension (:), allocatable :: Hk Real, dimension (:), allocatable :: vectorx
26
Real, dimension (:), allocatable :: vectory Real, dimension (:), allocatable :: Pasteriscox Real, dimension (:), allocatable :: Pasteriscoy Real, dimension (:), allocatable :: Vinix Real, dimension (:), allocatable :: Viniy !Lectura de los datos open(unit=1, file= 'datos_o-w.txt') read(1,*) (datos(i), i = 1, 43) read(datos(6)(index(datos(6),', ')+1:len(datos(6))),*) lx read(datos(8)(index(datos(8),', ')+1:len(datos(8))),*) ly read(datos(10)(index(datos(10),', ')+1:len(datos(10))),*) grado read(datos(12)(index(datos(12),', ')+1:len(datos(12))),*) T read(datos(14)(index(datos(14),', ')+1:len(datos(14))),*) h read(datos(16)(index(datos(16),', ')+1:len(datos(16))),*) Kx read(datos(18)(index(datos(18),', ')+1:len(datos(18))),*) Ky read(datos(22)(index(datos(22),', ')+1:len(datos(22))),*) phi read(datos(24)(index(datos(24),', ')+1:len(datos(24))),*) Pinicial read(datos(32)(index(datos(32),', ')+1:len(datos(32))),*) API read(datos(34)(index(datos(34),', ')+1:len(datos(34))),*) gammaw read(datos(36)(index(datos(36),', ')+1:len(datos(36))),*) pb read(datos(43)(index(datos(43),', ')+1:len(datos(43))),*) nw allocate (well(nw,3)) aux = 43+(6*nw)+14 read(1,*) (datos(i), i =44, aux) Do i = 1, nw !En la primera columna se guarda el caudal, en la segunda posicion en x, en la tercera posicion en y Do j = 1, 3 read(datos((6*(i-1))+43+(2*j))(index(datos((6*(i-1))+43+(2*j)),', ')+1:len(datos((6*(i-1))+43+(2*j)))),*) well(i,j) end do end do read(datos(43+(6*nw)+6)(index(datos(43+(6*nw)+6),', ')+1:len(datos(43+(6*nw)+6))),*) Nx read(datos(43+(6*nw)+8)(index(datos(43+(6*nw)+8),', ')+1:len(datos(43+(6*nw)+8))),*) Ny read(datos(aux)(index(datos(aux),', ')+1:len(datos(aux))),*) puntos aux2 = (aux+1+(puntos*4)) read(1,*) (datos(i), i = aux+1, aux2) allocate (tablapuntos(puntos,4)) Do i = 1, puntos !Lectura tabla de sw, kro, krw, pc Do j = 1, 4 read(datos((4*(i-1))+aux+1+j)(index(datos((4*(i-1))+aux+1+j),', ')+1:len(datos((4*(i-1))+aux+1+j))),*) tablapuntos(i,j) end do end do close(1) !Termina de leer datos del .txt deltax = lx/Nx !Calculo del tamaño de paso en x deltay = ly/Ny !Calculo del tamaño de paso en y allocate (Po(nx,ny)) allocate (Pw(nx,ny)) allocate (Pc(nx,ny))
27
allocate (Sw(nx,ny)) allocate (So(nx,ny)) allocate (Kro(nx,ny)) allocate (Krw(nx,ny)) allocate (Tox(ny,nx-1)) allocate (Twx(ny,nx-1)) allocate (Toy(ny-1,nx)) allocate (Twy(ny-1,nx)) allocate (uo(nx,ny)) allocate (Bo(nx,ny)) allocate (Bw(nx,ny)) allocate (Pon(nx,ny)) allocate (Pwn(nx,ny)) allocate (Bon(nx,ny)) allocate (Bwn(nx,ny)) allocate (Pcn(nx,ny)) allocate (Son(nx,ny)) allocate (Swn(nx,ny)) allocate (Q(nx,ny)) allocate (Co1(nx,ny)) allocate (Co2(nx,ny)) allocate (Cw1(nx,ny)) allocate (Cw2(nx,ny)) allocate (Cw3(nx,ny)) allocate (gammaoz(nx,ny)) allocate (gammawz(nx,ny)) allocate (fo(nx,ny)) allocate (fw(nx,ny)) allocate (Pko(nx,ny)) allocate (Pk1o(nx,ny)) allocate (Pkw(nx,ny)) allocate (Pk1w(nx,ny)) allocate (errorIADIP(nx,ny)) allocate (errorPo(nx,ny)) allocate (errorSo(nx,ny)) allocate (Soc(nx,ny)) allocate (ifila(2*nx,2*nx)) allocate (icolumna(2*ny,2*ny)) allocate (vectorx(2*nx)) allocate (vectory(2*ny)) allocate (Pasteriscox(2*nx)) allocate (Pasteriscoy(2*ny)) allocate (Vinix(2*nx)) allocate (Viniy(2*ny)) allocate (Hk(100)) Q = 0 !Posicionamiento de los pozos productores e inyectores Do i = 1, nw posx = well(i, 2)/deltax
28
posy = well(i, 3)/deltay Q(posx,posy) = well(i,1) end do rhosc = 141.5/(131.5+API) !Densidad del petróleo condiciones estandar uw = exp(1.003-((1.479e-2)*T)+((1.982e-5)*T**2)) !Viscosidad del agua, NO VARIA CON PRESION Vp = phi*deltax*deltay*h !Volumen poroso write (*,*) 'Escribe el delta t' !Asignación de valor del paso en el tiempo read *, deltat !Asignacion de valores iniciales swi = tablapuntos(1,1) Swn = swi !Asinnamos la saturación inicial a cada bloque Son = 1-tablapuntos(1,1) Pon = Pinicial !Asignamos P petroleo inicial Pcn = tablapuntos(1,4) Pwn = Pcn + Pon ! Asignamos valores iniciales a P del agua Do i = 1, ny !Calculo de Bon Do j = 1, nx F = 0.968*T aux3 = alog10(F) Bob = 1+10**(-6.58511+(2.91329*aux3)-(0.27683*(aux3**2))) Bon(i,j) = 1/(Bob*exp(co*(pb-pon(i,j)))) end do end do Do i = 1, ny !Calculo de Bwn Do j = 1, nx deltavwt = (-1.0001e-2)+((1.33391e-4)*T)+((5.550654e-7)*(T**2)) deltavwp = ((-1.95301e-9)*pwn(i,j)*T)-((1.72834e-13)*(pwn(i,j)**2)*T)-((3.58922e-7)*pwn(i,j))-((2.25341e-10)*(pwn(i,j)**2)) Bwn(i,j) = 1/((1+deltavwp)*(1+deltavwt)) end do end do contador = 1 ciclo: Do while (contador*deltat < 365) So = 0.99*Son cicloSo: Do Sw = 1 - So Do i = 1 , ny !Asignación de valores de Kr a cada bloque Do j = 1, nx
29
Do k = 1, puntos if (sw(i,j)>tablapuntos(k,1) .and. sw(i,j)<tablapuntos(k+1,1))then Swb = tablapuntos(k,1) Swa = tablapuntos(k+1,1) Krob = tablapuntos(k,3) Kroa = tablapuntos(k+1,3) Krwb = tablapuntos(k,2) Krwa = tablapuntos(k+1,2) Krw(i,j) = (((Krwa-Krwb)/(Swa-Swb))*(Sw(i,j)-Swb))+Krwb Kro(i,j) = (((Kroa-Krob)/(Swa-Swb))*(Sw(i,j)-Swb))+Krob else if (sw(i,j) .EQ. tablapuntos(k,1))then Kro(i,j) = tablapuntos(k,3) Krw(i,j) = tablapuntos(k,2) end if end do end do end do Do i = 1 , ny !Asignación de valores de Pc a cada bloque Do j = 1, nx Do k = 1, puntos if (sw(i,j)>tablapuntos(k,1) .and. sw(i,j)<tablapuntos(k+1,1))then Swb = tablapuntos(k,1) Swa = tablapuntos(k+1,1) Pcb = tablapuntos(k,4) Pca = tablapuntos(k+1,4) Pc(i,j) = (((Pca-Pcb)/(Swa-Swb))*(Sw(i,j)-Swb))+Pcb else if (sw(i,j) .EQ. tablapuntos(k,1))then Pc(i,j) = tablapuntos(k,4) end if end do end do end do Po = 0.99*Pon !Presion suspuesta cicloPo: Do Pw = Po + Pc Do i = 1, ny !Calculo de Bo Do j = 1, nx F = 0.968*T aux3 = alog10(F) Bob = 1+10**(-6.58511+(2.91329*aux3)-(0.27683*(aux3**2))) Bo(i,j) = 1/(Bob*exp(co*(pb-po(i,j)))) end do end do Do i = 1, ny !Calculo de Bw Do j = 1, nx deltavwt = (-1.0001e-2)+((1.33391e-4)*T)+((5.550654e-7)*(T**2))
30
deltavwp = ((-1.95301e-9)*pw(i,j)*T)-((1.72834e-13)*(pw(i,j)**2)*T)-((3.58922e-7)*pw(i,j))-((2.25341e-10)*(pw(i,j)**2)) Bw(i,j) = 1/((1+deltavwp)*(1+deltavwt)) end do end do Do i = 1, ny !Calculo de Viscosidad del petroleo do j = 1, nx uod = (3.141e10)*(T**(-3.444))*((alog10(API))**((10.313*alog10(T))-36.447)) A_miu = 10.715*(100**(-0.515)) B_miu = 5.44*(150**(-0.338)) uob = A_miu*((uod)**B_miu) m = 2.6*(po(i,j)**1.187)*exp(-11.513-((8.98e-5)*po(i,j))) uo(i,j) = uob*((po(i,j)/pb)**m) end do end do Do i = 1, ny !calculo de cortes de agua y aceite Do j = 1, nx fw(i,j) = (Krw(i,j)/uw)/((kro(i,j)/uo(i,j))+(krw(i,j)/uw)) fo(i,j) = 1-fw(i,j) end do end do Do i = 1, ny !Calculo de trasmisibilidades Do j = 1, nx-1 Tox(i,j)= bc*(h*kx*deltay*Bo(i,j)/(deltax))*(2*kro(i,j)/(uo(i,j)+uo(i+1,j))) Twx(i,j)= bc*(h*kx*deltay*Bw(i,j)/(deltax))*(krw(i,j)/uw) end do end do Do j = 1, nx Do i = 1, ny-1 Toy(i,j)= bc*(h*ky*deltax*Bo(i,j)/(deltay))*(2*kro(i,j)/(uo(i, j)+uo(i+1, j))) !Revisar lo de los deltas Twy(i,j)= bc*(h*ky*deltax*Bw(i,j)/(deltay))*(krw(i,j)/uw) end do end do Do i = 1, ny !Calculo gamma z del aceite y del agua z = (((deltay*i)-(deltay/2)))*sin(grado*pi/180) Do j = 1, nx gammaoz(i,j) = 0.433*Bo(i,j)*rhosc*z gammawz(i,j) = 0.433*Bw(i,j)*1*z end do end do Do i = 1, ny !Calculo de las constantes Do j = 1, nx aux4 = ((Vp*Son(i,j)*(Bo(i,j)-Bon(i,j)))/(ac*deltat*(Po(i,j)-Pon(i,j)))) Co1(i,j) = aux4 -((Vp*bo(i,j)*(So(i,j)-Son(i,j)))/(ac*deltat*(pc(i,j)-Pcn(i,j)))) Co2 = (Vp*Bo(i,j)*(So(i,j)-Son(i,j)))/(ac*deltat*(pc(i,j)-Pcn(i,j))) aux4 = (Vp*Swn(i,j)*(Bw(i,j)-Bwn(i,j)))/(ac*deltat*(Po(i,j)-Pon(i,j)))
31
Cw1(i,j) = aux4 -((Vp*bw(i,j)*(So(i,j)-Son(i,j)))/(ac*deltat*(pc(i,j)-Pcn(i,j)))) Cw2 = (Vp*Bw(i,j)*(So(i,j)-Son(i,j)))/(ac*deltat*(pc(i,j)-Pcn(i,j))) Cw3 = -(Vp*Swn(i,j)*(bw(i,j)-bwn(i,j)))/(ac*deltat*(Po(i,j)-Pon(i,j))) end do end do lamdax = 0 lamday = 0 Do i = 1, ny-1 !Calculo de parametros Hk Do j = 1, nx-1 aux8 = Toy(i,j)/Tox(i,j) if (aux8 > lamdax) then lamdax = aux8 end if aux9 = Tox(i,j)/Toy(i,j) if (aux9 > lamday) then lamday = aux9 end if end do end do aux8 = (pi**2)/(2*(nx**2)*(1+lamdax)) aux9 = (pi**2)/(2*(ny**2)*(1+lamday)) wmin = MIN(aux8,aux9) nk = 1 Do if ((0.172)**(nk-1) .LE. (wmin/1)) exit nk = nk + 1 end do Hk(1) = wmin alpha = ((1/wmin)**(1.0/(nk-1))) Do i = 2, nk Hk(i) = alpha*Hk(i-1) end do contadorHk = 1 Pko = Pon Pk1o = Pon Pkw = Pwn Pk1w = Pwn cicloIADIP: Do !Aca empieza el ciclo para el IADIP if (MOD(contadorHk,nk) .EQ. 0)then Hki = Hk(nk) else Hki = Hk(MOD(contadorHk,nk)) end if !creacion de la matriz ifila para hallar P* !Adición de los ecuaciones obtenias de la ecuación para petróleo del primera fila ifila(1,1) = -Tox(1,1)-Co1(1,1)-Hki ifila(1,2) = Tox(1,1) ifila(1, nx+1) = -Co2(1,1) aux5 = Q(1,1)*fo(1,1)-Co1(1,1)*Pon(1,1)-Co2(1,1)*Pwn(1,1) beta = aux5 + Tox(1,1)*gammaoz(1,2)+Toy(1,1)*gammaoz(2,1)-(Tox(1,1)+Toy(1,1))*gammaoz(1,1)
32
vectorx(1) = Toy(1,1)*Pk1o(1,1)-Toy(1,1)*Pk1o(2,1)-Pk1o(1,1)*Hki+beta Do i = 2, nx-1 ifila(i,i-1) = Tox(1,i-1) ifila(i,i) = -(Tox(1,i-1)+Tox(1,i)+Co1(1,i)+Hki) ifila(i,i+1) = Tox(1,i) ifila(i,nx+i) = -Co2(1,i) aux5 = Q(1,i)*fo(1,i)-Co1(1,i)*Pon(1,i)-Co2(1,i)*Pwn(1,i) beta=aux5+Tox(1,i-1)*gammaoz(1,i-1)+Tox(1,i)*gammaoz(1,i+1)+Toy(1,i)*gammaoz(2,i)-(Tox(1,i-1)+Tox(1,i)+Toy(1,i))*gammaoz(1,i) vectorx(i) = Toy(1,i)*Pk1o(1,i)-Toy(1,i)*Pk1o(2,i)-Hki*Pk1o(1,i)+beta end do ifila(nx,nx-1) = Tox(1,nx-1) ifila(nx,nx) = -Tox(1,nx-1)-Co1(1,nx)-Hki ifila(nx,nx+nx) = -Co2(1,nx) aux5 = Q(1,nx)*fo(1,nx)-Co1(1,nx)*Pon(1,nx)-Co2(1,nx)*Pwn(1,nx) beta = aux5 + Tox(1,nx-1)*gammaoz(1,nx-1)+Toy(1,nx)*gammaoz(2,nx)-(Tox(1,nx-1)+Toy(1,nx))*gammaoz(1,nx) vectorx(nx) = Toy(1,nx)*Pk1o(1,nx)-Toy(1,nx)*Pk1o(2,nx)-Hki*Pk1o(1,nx)+beta !Adición de los ecuaciones obtenias de la ecuación para agua primera fila ifila(nx+1,nx+1) = -Twx(1,1)-Cw1(1,1)-Hki ifila(nx+1,nx+2) = Twx(1,1) ifila(nx+1,1) = -Cw2(1,1) aux5 = Q(1,1)*fw(1,1)-Cw1(1,1)*Pwn(1,1)-Cw2(1,1)*Pon(1,1)+Cw3(1,1)*Pc(1,1)-Cw3(1,1)*Pcn(1,1) beta = aux5 + Twx(1,1)*gammawz(1,2)+Twy(1,1)*gammawz(2,1)-(Twx(1,1)+Twy(1,1))*gammawz(1,1) vectorx(nx+1) = Twy(1,1)*Pk1w(1,1)-Twy(1,1)*Pk1w(2,1)-Hki*Pk1w(1,1)+beta Do i = 2, nx-1 ifila(i+nx,i+nx-1) = Twx(1,i-1) ifila(i+nx,i+nx) = -(Twx(1,i-1)+Twx(1,i)+Cw1(1,i)+Hki) ifila(i+nx,i+nx+1) = Twx(1,i) ifila(i+nx,i) = -Cw2(1,i) aux5 = Q(1,i)*fw(1,i)-Cw1(1,i)*Pwn(1,i)-Cw2(1,i)*Pon(1,i)+Cw3(1,i)*Pc(1,i)-Cw3(1,i)*Pcn(1,i) beta=aux5+Twx(1,i-1)*gammawz(1,i-1)+Twx(1,i)*gammawz(1,i+1)+Twy(1,i)*gammawz(2,i)-(Twx(1,i-1)+Twx(1,i)+Twy(1,i))*gammawz(1,i) vectorx(i+nx) = Twy(1,i)*Pk1w(1,i)-Twy(1,i)*Pk1w(2,i)-Hki*Pk1w(1,i)+beta end do ifila(nx+nx,nx+nx-1) = Twx(1,nx-1) ifila(nx+nx,nx+nx) = -Twx(1,nx-1)-Cw1(1,nx)-Hki ifila(nx+nx,nx) = -Cw2(1,nx) aux5 = Q(1,nx)*fw(1,nx)-Cw1(1,nx)*Pwn(1,nx)-Cw2(1,nx)*Pon(1,nx)+Cw3(1,nx)*Pc(1,nx)-Cw3(1,i)*Pcn(1,nx) beta = aux5 + Twx(1,nx-1)*gammawz(1,nx-1)+Twy(1,nx)*gammawz(2,nx)-(Twx(1,nx-1)+Twy(1,nx))*gammawz(1,nx) vectorx(nx+nx) = Twy(1,nx)*Pk1w(1,nx)-Twy(1,nx)*Pk1w(2,nx)-Hki*Pk1w(1,nx)+beta !Solución de la primera fila por metodo de jacobi !Vector de condiciones iniciales Do i = 1, nx
33
vinix(i) = Po(1,i) vinix(i+nx) = Pw(1,i) end do print *, vinix !Calculo de las P* l=0 ciclojacobi: Do while(l<100) Do i = 1, 2*nx suma = 0 Do j = 1, 2*nx if (j .NE. i) then suma = suma + (ifila(i,j)*vinix(j)) end if end do Pasteriscox(i) = (Vectorx(i)-suma)/ifila(i,i) end do norma = abs(vinix(1)-Pasteriscox(1)) ! Calculo error Do i = 2, 2*nx if (abs(vinix(i)-Pasteriscox(i)) > norma) then norma = abs(vinix(i)-Pasteriscox(i)) end if end do if (norma < 0.1) exit ciclojacobi Vinix = Pasteriscox l = l+1 end do ciclojacobi Do i = 1, nx !Asiganacion de los valores P* a la primera fila de la matriz Pk1o(1,i) = Pasteriscox(i) Pk1w(1,i) = Pasteriscox(i+nx) end do !Ciclo para calcular P* filas restantes (menos la ultima fila) Do k = 2, ny-1 !Adición de los ecuaciones obtenias de la ecuación para petróleo ifila(1,1) = -Tox(k,1)-Co1(k,1)-Hki ifila(1,2) = Tox(k,1) ifila(1, nx+1) = -Co2(k,1) aux5 = Q(k,1)*fo(k,1)-Co1(k,1)*Pon(k,1)-Co2(k,1)*Pwn(k,1) aux6 = Toy(k-1,1)*gammaoz(k-1,1) + Tox(k,1)*gammaoz(k,2)+Toy(k,1)*gammaoz(k+1,1)-(Toy(k-1,1)+Tox(k,1)+Toy(k,1))*gammaoz(k,1) beta = aux5 + aux6 vectorx(1) = -Toy(k-1,1)*Pk1o(k-1,1) + (Toy(k-1,1)+Toy(k,1))*Pk1o(k,1)-Toy(k,1)*Pk1o(k+1,1)-Hki*Pk1o(k,1)+beta Do i = 2, nx-1 ifila(i,i-1) = Tox(k,i-1) ifila(i,i) = -(Tox(k,i-1)+Tox(k,i)+Co1(k,i)+Hki) ifila(i, i+1) = Tox(k,i) ifila(i,nx+i) = -Co2(k,i) aux5 = Q(k,i)*fo(k,i)-Co1(k,i)*Pon(k,i)-Co2(k,i)*Pwn(k,i) aux6 = Tox(k,i-1)*gammaoz(k,i-1)+ Toy(k-1,i)*gammaoz(k-1,i) + Tox(k,i)*gammaoz(k,i+1) aux7 = Toy(k,i)*gammaoz(k+1,i)-(Tox(k,i-1)+ Toy(k-1,i) +Tox(k,i)+Toy(k,i))*gammaoz(k,i)
34
beta = aux5+ aux6 + aux7 vectorx(i) = -Toy(k-1,i)*Pk1o(k-1,i) + (Toy(k-1,i) + Toy(k,i))*Pk1o(k,i)-Toy(k,i)*Pk1o(k+1,i)-Hki*Pk1o(k,i) + beta end do ifila(nx,nx-1) = Tox(k,nx-1) ifila(nx,nx) = -Tox(k,nx-1)-Co1(k,nx)-Hki ifila(nx,nx+nx) = -Co2(k,nx) aux5 = Q(k,nx)*fo(k,nx)-Co1(k,nx)*Pon(k,nx)-Co2(k,nx)*Pwn(k,nx) aux6 = Tox(k,nx-1)*gammaoz(k,nx-1)+ Toy(k-1,nx)*gammaoz(k-1,nx) aux7 = Toy(k,nx)*gammaoz(k+1,nx)-(Tox(k,nx-1)+Toy(k-1,nx) +Toy(k,nx))*gammaoz(k,nx) beta = aux5 + aux6 + aux7 vectorx(nx) = -Toy(k-1,nx)*Pk1o(k-1,nx) + (Toy(k-1,nx)+Toy(k,nx))*Pk1o(k,nx)-Toy(k,nx)*Pk1o(k+1,nx)-Hki*Pk1o(k,nx)+beta !Adición de los ecuaciones obtenias de la ecuación para agua ifila(nx+1,nx+1) = -Twx(k,1)-Cw1(k,1)-Hki ifila(nx+1,nx+2) = Twx(k,1) ifila(nx+1,1) = -Cw2(k,1) aux5 = Q(k,1)*fw(k,1)-Cw1(k,1)*Pwn(k,1)-Cw2(k,1)*Pon(k,1)+Cw3(k,1)*Pc(k,1)-Cw3(k,1)*Pcn(k,1) aux6 = Twx(k,1)*gammawz(k,2)+Twy(k,1)*gammawz(k+1,1)+Twy(k-1,1)*gammawz(k-1,1)-(Twx(k,1)+Twy(k,1)+Twy(k-1,1))*gammawz(k,1) beta = aux5 + aux6 vectorx(nx+1) = (Twy(k,1)+Twy(k-1,1))*Pk1w(k,1)-Twy(k,1)*Pk1w(k+1,1)-Twy(k-1,1)*Pk1w(k-1,1)+beta-Hki*Pk1w(k,1) Do i = 2, nx-1 ifila(i+nx,i+nx-1) = Twx(k,i-1) ifila(i+nx,i+nx) = -(Twx(k,i-1)+Twx(k,i)+Cw1(k,i)+Hki) ifila(i+nx,i+nx+1) = Twx(k,i) ifila(i+nx,i) = -Cw2(k,i) aux5 = Q(k,i)*fw(k,i)-Cw1(k,i)*Pwn(k,i)-Cw2(k,i)*Pon(k,i)+Cw3(k,i)*Pc(k,i)-Cw3(k,i)*Pcn(k,i) aux6 = Twx(k,i-1)*gammawz(k,i-1)+Twy(k-1,i)*gammawz(k-1,i)+Twx(k,i)*gammawz(k,i+1)+Twy(k,i)*gammawz(k+1,i) aux7 = (Twx(k,i-1)+Twy(k-1,i)+Twx(k,i)+Twy(k,i))*gammawz(k,i) beta=aux5+aux6+aux7 vectorx(i+nx) = (Twy(k,i)+Twy(k-1,i))*Pk1w(k,i)-Twy(k,i)*Pk1w(k+1,i)-Twy(k-1,i)*Pk1w(k-1,i)-Hki*Pk1w(k,i)+beta end do ifila(nx+nx,nx+nx-1) = Twx(k,nx-1) ifila(nx+nx,nx+nx) = -Twx(k,nx-1)-Cw1(k,nx)-Hki ifila(nx+nx,nx) = -Cw2(k,nx) aux5 = Q(k,nx)*fw(k,nx)-Cw1(k,nx)*Pwn(k,nx)-Cw2(k,nx)*Pon(k,nx)+Cw3(k,nx)*Pc(k,nx)-Cw3(k,nx)*Pcn(k,nx) aux6 = Twx(k,nx-1)*gammawz(k,nx-1)+Twy(k,nx)*gammawz(k+1,nx)-(Twx(k,nx-1)+Twy(k,nx)+Twy(k-1,nx))*gammawz(k,nx) aux7 = Twy(k-1,nx)*gammawz(k-1,nx) beta = aux5 + aux6 + aux7 vectorx(nx+nx) = (Twy(k-1,nx)+Twy(k,nx))*Pk1w(k,nx)-Twy(k,nx)*Pk1w(k+1,nx)-Twy(k-1,nx)*Pk1w(k-1,nx)-Hki*Pk1w(k,nx)+beta !Vector de condiciones iniciales
35
Do i = 1, nx vinix(i) = Po(k,i) vinix(i+nx) = Pw(k,i) end do !Calculo de las P* l=0 ciclojacobi1: Do while(l<100) Do i = 1, 2*nx suma = 0 Do j = 1, 2*nx if (j .NE. i) then suma = suma + (ifila(i,j)*vinix(j)) end if end do Pasteriscox(i) = (Vectorx(i)-suma)/ifila(i,i) end do norma = abs(vinix(1)-Pasteriscox(1)) ! Calculo error Do i = 2, 2*nx if (abs(vinix(i)-Pasteriscox(i)) > norma) then norma = abs(vinix(i)-Pasteriscox(i)) end if end do if (norma < 0.1) exit ciclojacobi1 l = l+1 Vinix = Pasteriscox end do ciclojacobi1 Do i = 1, nx !Asignacion del valor P* a la fila k Pk1o(k,i) = Pasteriscox(i) Pk1w(k,i) = Pasteriscox(i+nx) end do END DO !Este cierra el ciclo que calcula P* para cada fila !Creacion de la amtriz ifila para la ultima fila !Adicion de las ecuaciones para el petroleo ifila(1,1) = -Tox(ny,1)-Co1(ny,1)-Hki ifila(1,2) = Tox(ny,1) ifila(1, nx+1) = -Co2(ny,1) aux5 = Q(ny,1)*fo(ny,1)-Co1(ny,1)*Pon(ny,1)-Co2(ny,1)*Pwn(ny,1) aux6 = Toy(ny-1,1)*gammaoz(ny-1,1) + Tox(ny,1)*gammaoz(ny,2)-(Toy(ny-1,1)+Tox(ny,1))*gammaoz(ny,1) beta = aux5 + aux6 vectorx(1) = -Toy(ny-1,1)*Pk1o(ny-1,1) + (Toy(ny-1,1))*Pk1o(ny,1)-Hki*Pk1o(ny,1)+beta Do i = 2, nx-1 ifila(i,i-1) = Tox(ny,i-1) ifila(i,i) = -(Tox(ny,i-1)+Tox(ny,i)+Co1(ny,i)+Hki) ifila(i, i+1) = Tox(ny,i) ifila(i,nx+i) = -Co2(ny,i) aux5 = Q(ny,i)*fo(ny,i)-Co1(ny,i)*Pon(ny,i)-Co2(ny,i)*Pwn(ny,i) aux6 = Tox(ny,i-1)*gammaoz(ny,i-1)+ Toy(ny-1,i)*gammaoz(ny-1,i) + Tox(ny,i)*gammaoz(ny,i+1) aux7 = -(Tox(ny,i-1)+ Toy(ny-1,i) +Tox(ny,i))*gammaoz(ny,i)
36
beta = aux5+ aux6 + aux7 vectorx(i) = -Toy(ny-1,i)*Pk1o(ny-1,i) + (Toy(ny-1,i))*Pk1o(ny,i)-Hki*Pk1o(ny,i) + beta end do ifila(nx,nx-1) = Tox(ny,nx-1) ifila(nx,nx) = -Tox(ny,nx-1)-Co1(ny,nx)-Hki ifila(nx,nx+nx) = -Co2(ny,nx) aux5 = Q(ny,nx)*fo(ny,nx)-Co1(ny,nx)*Pon(ny,nx)-Co2(ny,nx)*Pwn(ny,nx) aux6 = Tox(ny,nx-1)*gammaoz(ny,nx-1)+ Toy(ny-1,nx)*gammaoz(ny-1,nx) aux7 = -(Tox(ny,nx-1)+Toy(ny-1,nx))*gammaoz(ny,nx) beta = aux5 + aux6 + aux7 vectorx(nx) = -Toy(ny-1,nx)*Pk1o(ny-1,nx) + (Toy(ny-1,nx))*Pk1o(ny,nx)-Hki*Pk1o(ny,nx)+beta !Adición de los ecuaciones obtenias para agua ifila(nx+1,nx+1) = -Twx(ny,1)-Cw1(ny,1)-Hki ifila(nx+1,nx+2) = Twx(ny,1) ifila(nx+1,1) = -Cw2(ny,1) aux5 = Q(ny,1)*fw(ny,1)-Cw1(ny,1)*Pwn(ny,1)-Cw2(ny,1)*Pon(ny,1)+Cw3(ny,1)*Pc(ny,1)-Cw3(ny,1)*Pcn(ny,1) aux6 = Twx(ny,1)*gammawz(ny,2)+Twy(ny-1,1)*gammawz(ny-1,1)-(Twx(ny,1)+Twy(ny-1,1))*gammawz(ny,1) beta = aux5 + aux6 vectorx(nx+1) = (Twy(ny-1,1))*Pk1w(ny,1)-Twy(ny-1,1)*Pk1w(ny-1,1)+beta-Hki*Pk1w(ny,1) Do i = 2, nx-1 ifila(i+nx,i+nx-1) = Twx(ny,i-1) ifila(i+nx,i+nx) = -(Twx(ny,i-1)+Twx(ny,i)+Cw1(ny,i)+Hki) ifila(i+nx,i+nx+1) = Twx(ny,i) ifila(i+nx,i) = -Cw2(ny,i) aux5 = Q(ny,i)*fw(ny,i)-Cw1(ny,i)*Pwn(ny,i)-Cw2(ny,i)*Pon(ny,i)+Cw3(ny,i)*Pc(ny,i)-Cw3(ny,i)*Pcn(ny,i) aux6 = Twx(ny,i-1)*gammawz(ny,i-1)+Twy(ny-1,i)*gammawz(ny-1,i)+Twx(ny,i)*gammawz(ny,i+1) aux7 = (Twx(ny,i-1)+Twy(ny-1,i)+Twx(ny,i))*gammawz(ny,i) beta=aux5+aux6+aux7 vectorx(i+nx) = (Twy(ny-1,i))*Pk1w(ny,i)-Twy(ny-1,i)*Pk1w(ny-1,i)-Hki*Pk1w(ny,i)+beta end do ifila(nx+nx,nx+nx-1) = Twx(ny,nx-1) ifila(nx+nx,nx+nx) = -Twx(ny,nx-1)-Cw1(ny,nx)-Hki ifila(nx+nx,nx) = -Cw2(ny,nx) aux5 = Q(ny,nx)*fw(ny,nx)-Cw1(ny,nx)*Pwn(ny,nx)-Cw2(ny,nx)*Pon(ny,nx)+Cw3(ny,nx)*Pc(ny,nx)-Cw3(ny,nx)*Pcn(ny,nx) aux6 = Twx(ny,nx-1)*gammawz(ny,nx-1)+Twy(ny-1,nx)*gammawz(ny-1,nx)-(Twx(ny,nx-1)+Twy(ny-1,nx))*gammawz(ny,nx) beta = aux5 + aux6 vectorx(nx+nx) = (Twy(ny-1,nx))*Pk1w(ny,nx)-Twy(ny-1,nx)*Pk1w(ny-1,nx)-Hki*Pk1w(ny,nx)+beta !Vector de condiciones iniciales Do i = 1, nx vinix(i) = Po(ny,i) vinix(i+nx) = Pw(ny,i) end do !Calculo de las P*
37
l=0 ciclojacobi2: Do while(l<100) Do i = 1, 2*nx suma = 0 Do j = 1, 2*nx if (j .NE. i) then suma = suma + (ifila(i,j)*vinix(j)) end if end do Pasteriscox(i) = (Vectorx(i)-suma)/ifila(i,i) end do norma = abs(vinix(1)-Pasteriscox(1)) ! Calculo error Do i = 2, 2*nx if (abs(vinix(i)-Pasteriscox(i)) > norma) then norma = abs(vinix(i)-Pasteriscox(i)) end if end do if (norma < 0.1) exit ciclojacobi2 l = l+1 Vinix = Pasteriscox end do ciclojacobi2 Do i = 1, nx Pk1o(ny,i) = Pasteriscox(i) Pk1w(ny,i) = Pasteriscox(i+nx) end do !Calculo de las presiones k+1 !Creacion de la matriz icolumna para la primera columna !Adición de los ecuaciones obtenias de la ecuación para petróleo icolumna(1,1) = -Toy(1,1)-Co1(1,1)-Hki icolumna(1,2) = Toy(1,1) icolumna(1, ny+1) = -Co2(1,1) aux5 = Q(1,1)*fo(1,1)-Co1(1,1)*Pon(1,1)-Co2(1,1)*Pwn(1,1) beta = aux5 + Tox(1,1)*gammaoz(1,2)+Toy(1,1)*gammaoz(2,1)-(Tox(1,1)+Toy(1,1))*gammaoz(1,1) vectory(1) = Tox(1,1)*Pk1o(1,1)-Tox(1,1)*Pk1o(1,2)-Pk1o(1,1)*Hki+beta Do i = 2, ny-1 icolumna(i,i-1) = Toy(i-1,1) icolumna(i,i) = -(Toy(i-1,1)+Toy(i,1)+Co1(1,i)-Hki) icolumna(i, i+1) = Toy(i,1) icolumna(i,ny+i) = -Co2(i,1) aux5 = Q(i,1)*fo(i,1)-Co1(i,1)*Pon(i,1)-Co2(i,1)*Pwn(i,1) beta=aux5+Toy(i-1,1)*gammaoz(i-1,1)+Toy(i,1)*gammaoz(i+1,1)+Tox(i,1)*gammaoz(i,2)-(Toy(i-1,1)+Toy(i,1)+Tox(i,1))*gammaoz(i,1) vectory(i) = Tox(i,1)*Pk1o(i,1)-Tox(i,1)*Pk1o(i,2)-Hki*Pk1o(i,1)+beta end do icolumna(ny,ny-1) = Toy(ny-1,1) icolumna(ny,ny) = -Toy(ny-1,1)-Co1(ny,1)-Hki icolumna(ny,ny+ny) = -Co2(ny,1) aux5 = Q(ny,1)*fo(ny,1)-Co1(ny,1)*Pon(ny,1)-Co2(ny,1)*Pwn(ny,1)
38
beta = aux5 + Toy(ny-1,1)*gammaoz(ny-1,1)+Tox(ny,1)*gammaoz(ny,2)-(Toy(ny-1,1)+Tox(ny,1))*gammaoz(ny,1) vectory(ny) = Tox(ny,1)*Pk1o(ny,1)-Tox(ny,1)*Pk1o(ny,2)-Hki*Pk1o(ny,1)+beta !Adición de los ecuaciones obtenias de la ecuación para agua icolumna(ny+1,ny+1) = -Twy(1,1)-Cw1(1,1)-Hki icolumna(ny+1,ny+2) = Twy(1,1) icolumna(ny+1,1) = -Cw2(1,1) aux5 = Q(1,1)*fw(1,1)-Cw1(1,1)*Pwn(1,1)-Cw2(1,1)*Pon(1,1)+Cw3(1,1)*Pc(1,1)-Cw3(1,1)*Pcn(1,1) beta = aux5 + Twy(1,1)*gammawz(2,1)+Twx(1,1)*gammawz(1,2)-(Twy(1,1)+Twx(1,1))*gammawz(1,1) vectory(nx+1) = Twx(1,1)*Pk1w(1,1)-Twx(1,1)*Pk1w(1,2)-Hki*Pk1w(1,1)+beta Do i = 2, ny-1 icolumna(i+ny,i+ny-1) = Twy(i-1,1) icolumna(i+ny,i+ny) = -(Twy(i-1,1)+Twy(i,1)+Cw1(i,1)+Hki) icolumna(i+ny,i+ny+1) = Twy(i,1) icolumna(i+ny,i) = -Cw2(i,1) aux5 = Q(i,1)*fw(i,1)-Cw1(i,1)*Pw(i,1)-Cw2(i,1)*Po(i,1)+Cw3(i,1)*Pc(i,1)-Cw3(i,1)*Pcn(i,1) beta=aux5+Twy(i-1,1)*gammawz(i-1,1)+Twy(i,1)*gammawz(i+1,1)+Twx(i,1)*gammawz(i,2)-(Twy(i-1,1)+Twy(i,1)+Twx(i,1))*gammawz(i,1) vectory(i+ny) = Twx(i,1)*Pk1w(i,1)-Twx(i,1)*Pk1w(i,2)-Hki*Pk1w(i,1)+beta end do icolumna(ny+ny,ny+ny-1) = Twy(ny-1,1) icolumna(ny+ny,ny+ny) = -Twy(ny-1,1)-Cw1(ny,1)-Hki icolumna(ny+ny,ny) = -Cw2(ny,1) aux5 = Q(ny,1)*fw(ny,1)-Cw1(ny,1)*Pwn(ny,1)-Cw2(ny,1)*Pon(ny,1)+Cw3(ny,1)*Pc(ny,1)-Cw3(ny,1)*Pcn(ny,1) beta = aux5 + Twy(ny-1,1)*gammawz(ny-1,1)+Twx(ny,1)*gammawz(ny,2)-(Twy(ny-1,1)+Twx(ny,1))*gammawz(ny,1) vectory(ny+ny) = Twx(ny,1)*Pk1w(ny,1)-Twx(ny,1)*Pk1w(ny,2)-Hki*Pk1w(ny,1)+beta !Solución de la primera columna por metodo de jacobi !Vector de condiciones iniciales Do i = 1, ny viniy(i) = Po(i,1) viniy(i+ny) = Pw(i,1) end do !Calculo de las Pk+1 l=0 ciclojacobi3: Do while(l<100) Do i = 1, 2*ny suma = 0 Do j = 1, 2*ny if (j .NE. i) then suma = suma + (icolumna(i,j)*viniy(j)) end if end do Pasteriscoy(i) = (Vectory(i)-suma)/icolumna(i,i) end do norma = abs(viniy(1)-Pasteriscoy(1)) ! Calculo error Do i = 2, 2*ny
39
if (abs(viniy(i)-Pasteriscoy(i)) > norma) then norma = abs(viniy(i)-Pasteriscoy(i)) end if end do if (norma < 0.1) exit ciclojacobi3 l = l+1 Viniy = Pasteriscoy end do ciclojacobi3 Do i = 1, ny !Asiganacion de los valores Pk+1 a la primera columna de la matriz Pk1o(i,1) = Pasteriscoy(i) Pk1w(i,1) = Pasteriscoy(i+ny) end do !Ciclo para calcular Pk+1 restantes (menos la ultima columna) Do k = 2, ny-1 !Adición de los ecuaciones obtenias de la ecuación para petróleo icolumna(1,1) = -Toy(1,k)-Co1(1,k)-Hki icolumna(1,2) = Toy(1,k) icolumna(1, ny+1) = -Co2(1,k) aux5 = Q(1,k)*fo(1,k)-Co1(1,k)*Pon(1,k)-Co2(1,k)*Pwn(1,k) aux6 = Tox(1,k-1)*gammaoz(1,k-1) + Toy(1,k)*gammaoz(2,k)+Tox(1,k)*gammaoz(1,k+1)-(Tox(1,k-1)+Toy(1,k)+Tox(1,k))*gammaoz(1,k) beta = aux5 + aux6 vectory(1) = -Tox(1,k-1)*Pk1o(1,k-1) + (Tox(1,k-1)+Tox(1,k))*Pk1o(1,k)-Tox(1,k)*Pk1o(1,k+1)-Hki*Pk1o(1,k)+beta Do i = 2, ny-1 icolumna(i,i-1) = Toy(i-1,k) icolumna(i,i) = -(Toy(i-1,k)+Toy(i,k)+Co1(i,k)+Hki) icolumna(i, i+1) = Toy(i,k) icolumna(i,nx+i) = -Co2(i,k) aux5 = Q(i,k)*fo(i,k)-Co1(i,k)*Pon(i,k)-Co2(i,k)*Pwn(i,k) aux6 = Toy(i-1,k)*gammaoz(i-1,k)+ Tox(i,k-1)*gammaoz(i,k-1) + Toy(i,k)*gammaoz(i+1,k) aux7 = Tox(i,k)*gammaoz(i,k+1)-(Toy(i-1,k)+ Tox(i,k-1) +Toy(i,k)+Tox(i,k))*gammaoz(i,k) beta = aux5+ aux6 + aux7 vectory(i) = -Tox(i,k-1)*Pk1o(i,k-1) + (Tox(i,k-1) + Tox(i,k))*Pk1o(i,k)-Tox(i,k)*Pk1o(i,k+1)-Hki*Pk1o(i,k) + beta end do icolumna(ny,ny-1) = Toy(ny-1,k) icolumna(ny,ny) = -Toy(ny-1,k)-Co1(ny,k)-Hki icolumna(ny,ny+ny) = -Co2(ny,k) aux5 = Q(ny,k)*fo(ny,k)-Co1(ny,k)*Pon(ny,k)-Co2(ny,k)*Pwn(ny,k) aux6 = Toy(ny-1,k)*gammaoz(ny-1,k)+ Tox(ny,k-1)*gammaoz(ny,k-1) aux7 = Tox(ny,k)*gammaoz(ny,k+1)-(Toy(ny-1,k)+Tox(ny,k-1) +Tox(ny,k))*gammaoz(ny,k) beta = aux5 + aux6 + aux7 vectory(ny) = -Tox(ny,k-1)*Pk1o(ny,k-1) + (Tox(ny,k-1)+Tox(ny,k))*Pk1o(ny,k)-Tox(ny,k)*Pk1o(ny,k+1)-Hki*Pk1o(ny,k)+beta !Adición de los ecuaciones obtenias para agua icolumna(ny+1,ny+1) = -Twy(1,k)-Cw1(1,k)-Hki
40
icolumna(ny+1,ny+2) = Twy(1,k) icolumna(ny+1,1) = -Cw2(1,k) aux5 = Q(1,k)*fw(1,k)-Cw1(1,k)*Pwn(1,k)-Cw2(1,k)*Pon(1,k)+Cw3(1,k)*Pc(1,k)-Cw3(1,k)*Pcn(1,k) aux6 = Twy(1,k)*gammawz(2,k)+Twx(1,k)*gammawz(1,k+1)+Twx(1,k-1)*gammawz(1,k-1)-(Twy(1,k)+Twx(1,k)+Twx(1,k-1))*gammawz(1,k) beta = aux5 + aux6 vectory(ny+1) = (Twx(1,k)+Twx(1,k-1))*Pk1w(1,k)-Twx(1,k)*Pk1w(1,k+1)-Twx(1,k-1)*Pk1w(1,k-1)+beta-Hki*Pk1w(1,k) Do i = 2, ny-1 icolumna(i+ny,i+ny-1) = Twy(i-1,k) icolumna(i+ny,i+ny) = -(Twy(i-1,k)+Twy(i,k)+Cw1(i,k)+Hki) icolumna(i+ny,i+ny+1) = Twy(i,k) icolumna(i+ny,i) = -Cw2(i,k) aux5 = Q(i,k)*fw(i,k)-Cw1(i,k)*Pwn(i,k)-Cw2(i,k)*Pon(i,k)+Cw3(i,k)*Pc(i,k)-Cw3(i,k)*Pcn(i,k) aux6 = Twy(i-1,k)*gammawz(i-1,k)+Twx(i,k-1)*gammawz(i,k-1)+Twy(i,k)*gammawz(i+1,k)+Twx(i,k)*gammawz(i,k+1) aux7 = (Twy(i-1,k)+Twx(i,k-1)+Twy(i,k)+Twx(i,k))*gammawz(i,k) beta=aux5+aux6+aux7 vectory(i+ny) = (Twx(i,k)+Twx(i,k-1))*Pk1w(i,k)-Twx(i,k)*Pk1w(i,k+1)-Twx(i,k-1)*Pk1w(i,k-1)-Hki*Pk1w(i,k)+beta end do icolumna(ny+ny,ny+ny-1) = Twy(ny-1,k) icolumna(ny+ny,ny+ny) = -Twy(ny-1,k)-Cw1(ny,k)-Hki icolumna(ny+ny,ny) = -Cw2(ny,k) aux5 = Q(ny,k)*fw(ny,k)-Cw1(ny,k)*Pwn(ny,k)-Cw2(ny,k)*Pon(ny,k)+Cw3(ny,k)*Pc(ny,k)-Cw3(ny,k)*Pcn(ny,k) aux6 = Twy(ny-1,k)*gammawz(ny-1,k)+Twx(ny,k)*gammawz(ny,k+1)-(Twy(ny-1,k)+Twx(ny,k)+Twx(ny,k-1))*gammawz(ny,k) aux7 = Twx(ny,k-1)*gammawz(ny,k-1) beta = aux5 + aux6 + aux7 vectory(ny+ny) = (Twx(ny,k-1)+Twx(ny,k))*Pk1w(ny,k)-Twx(ny,k)*Pk1w(ny,k+1)-Twx(ny,k-1)*Pk1w(ny,k-1)-Hki*Pk1w(ny,k)+beta !Vector de condiciones iniciales Do i = 1, ny viniy(i) = Po(i,k) viniy(i+ny) = Pw(i,k) end do !Calculo de las Pk+1 l=0 ciclojacobi4: Do while(l<100) Do i = 1, 2*ny suma = 0 Do j = 1, 2*ny if (j .NE. i) then suma = suma + (icolumna(i,j)*viniy(j)) end if end do Pasteriscoy(i) = (Vectory(i)-suma)/icolumna(i,i) end do
41
norma = abs(viniy(1)-Pasteriscoy(1)) ! Calculo error Do i = 2, 2*ny if (abs(viniy(i)-Pasteriscoy(i)) > norma) then norma = abs(viniy(i)-Pasteriscoy(i)) end if end do if (norma < 0.1) exit ciclojacobi4 l = l+1 Viniy = Pasteriscoy end do ciclojacobi4 Do i = 1, ny Pk1o(i,k) = Pasteriscoy(i) Pk1w(i,k) = Pasteriscoy(i+ny) end do END DO !Este cierra el ciclo que calcula Pk+1 para cada columna interior !Calculo de Pk+1 para ultima columna !Ecuaciones de petroleo icolumna(1,1) = -Toy(1,nx)-Co1(1,nx)-Hki icolumna(1,2) = Toy(1,nx) icolumna(1, ny+1) = -Co2(1,nx) aux5 = Q(1,nx)*fo(1,nx)-Co1(1,nx)*Pon(1,nx)-Co2(1,nx)*Pwn(1,nx) aux6 = Tox(1,nx-1)*gammaoz(1,nx-1) + Toy(1,nx)*gammaoz(2,nx)-(Tox(1,nx-1)+Toy(1,nx))*gammaoz(1,nx) beta = aux5 + aux6 vectory(1) = -Tox(1,nx-1)*Pk1o(1,nx-1) + (Tox(1,nx-1))*Pk1o(1,nx)-Hki*Pk1o(1,nx)+beta Do i = 2, ny-1 icolumna(i,i-1) = Toy(i-1,nx) icolumna(i,i) = -(Toy(i-1,nx)+Toy(i,nx)+Co1(i,nx)+Hki) icolumna(i, i+1) = Toy(i,nx) icolumna(i,ny+i) = -Co2(i,nx) aux5 = Q(i,nx)*fo(i,nx)-Co1(i,nx)*Pon(i,nx)-Co2(i,nx)*Pwn(i,nx) aux6 = Toy(i-1,nx)*gammaoz(i-1,nx)+ Tox(i,nx-1)*gammaoz(i,nx-1) + Toy(i,nx)*gammaoz(i+1,nx) aux7 = -(Toy(i-1,nx)+ Tox(i,nx-1) +Toy(i,nx))*gammaoz(i,nx) beta = aux5+ aux6 + aux7 vectory(i) = -Tox(i,nx-1)*Pk1o(i,nx-1) + (Tox(i,nx-1))*Pk1o(i,nx)-Hki*Pk1o(i,nx) + beta end do icolumna(ny,ny-1) = Toy(ny-1,nx) icolumna(ny,ny) = -Toy(ny-1,nx)-Co1(ny,nx)-Hki icolumna(ny,ny+ny) = -Co2(ny,nx) aux5 = Q(ny,nx)*fo(ny,nx)-Co1(ny,nx)*Pon(ny,nx)-Co2(ny,nx)*Pwn(ny,nx) aux6 = Tox(ny,nx-1)*gammaoz(ny,nx-1)+ Toy(ny-1,nx)*gammaoz(ny-1,nx) aux7 = -(Tox(ny,nx-1)+Toy(ny-1,nx))*gammaoz(ny,nx) beta = aux5 + aux6 + aux7 vectory(ny) = -Tox(ny,nx-1)*Pk1o(ny,nx-1) + (Tox(ny,nx-1))*Pk1o(ny,nx)-Hki*Pk1o(ny,nx)+beta !Adición de los ecuaciones para agua icolumna(ny+1,ny+1) = -Twy(1,nx)-Cw1(1,nx)-Hki icolumna(ny+1,ny+2) = Twy(1,nx)
42
icolumna(ny+1,1) = -Cw2(1,nx) aux5 = Q(1,nx)*fw(1,nx)-Cw1(1,nx)*Pwn(1,nx)-Cw2(1,nx)*Pon(1,nx)+Cw3(1,nx)*Pc(1,nx)-Cw3(1,nx)*Pcn(1,nx) aux6 = Twy(1,nx)*gammawz(2,nx)+Twx(1,nx-1)*gammawz(1,nx-1)-(Twy(1,nx)+Twx(1,nx-1))*gammawz(1,nx) beta = aux5 + aux6 vectory(ny+1) = (Twx(1,nx-1))*Pk1w(1,nx)-Twx(1,nx-1)*Pk1w(1,nx-1)+beta-Hki*Pk1w(1,nx) Do i = 2, ny-1 icolumna(i+ny,i+ny-1) = Twy(i-1,nx) icolumna(i+ny,i+ny) = -(Twy(i-1,nx)+Twy(i,nx)+Cw1(i,nx)+Hki) icolumna(i+ny,i+ny+1) = Twy(i,nx) icolumna(i+ny,i) = -Cw2(i,nx) aux5 = Q(i,nx)*fw(i,nx)-Cw1(i,nx)*Pwn(i,nx)-Cw2(i,nx)*Pon(i,nx)+Cw3(i,nx)*Pc(i,nx)-Cw3(i,nx)*Pcn(i,nx) aux6 = Twy(i-1,nx)*gammawz(i-1,nx)+Twx(i,nx-1)*gammawz(i,nx-1)+Twy(i,nx)*gammawz(i+1,nx) aux7 = (Twy(i-1,nx)+Twx(i,nx-1)+Twy(i,nx))*gammawz(i,nx) beta=aux5+aux6+aux7 vectory(i+ny) = (Twx(i,nx-1))*Pk1w(i,nx)-Twx(i,nx-1)*Pk1w(i,nx-1)-Hki*Pk1w(i,nx)+beta end do icolumna(ny+ny,ny+ny-1) = Twy(ny-1,nx) icolumna(ny+ny,ny+ny) = -Twy(ny-1,nx)-Cw1(ny,nx)-Hki icolumna(ny+ny,ny) = -Cw2(ny,nx) aux5 = Q(ny,nx)*fw(ny,nx)-Cw1(ny,nx)*Pwn(ny,nx)-Cw2(ny,nx)*Pon(ny,nx)+Cw3(ny,nx)*Pc(ny,nx)-Cw3(ny,nx)*Pcn(ny,nx) aux6 = Twx(ny,nx-1)*gammawz(ny,nx-1)+Twy(ny-1,nx)*gammawz(ny-1,nx)-(Twx(ny,nx-1)+Twy(ny-1,nx))*gammawz(ny,nx) beta = aux5 + aux6 vectory(ny+ny) = (Twx(ny,nx-1))*Pk1w(ny,nx)-Twx(ny,nx-1)*Pk1w(ny,nx-1)-Hki*Pk1w(ny,nx)+beta !Vector de condiciones iniciales Do i = 1, ny viniy(i) = Po(i,nx) viniy(i+ny) = Pw(i,nx) end do !Calculo de las Pk+1 l=0 ciclojacobi5: Do while(l<100) Do i = 1, 2*ny suma = 0 Do j = 1, 2*ny if (j .NE. i) then suma = suma + (icolumna(i,j)*viniy(j)) end if end dooy(i) = (Vectory(i)-suma)/icolumna(i,i) end do norma = abs(viniy(1)-Pasteriscoy(1)) ! Calculo error Do i = 2, 2*ny if (abs(viniy(i)-Pasteriscoy(i)) > norma) then norma = abs(viniy(i)-Pasteriscoy(i)) end if end do
43
if (norma < 0.1) exit ciclojacobi5 l = l+1 Viniy = Pasteriscoy end do ciclojacobi5 Do i = 1, ny Pk1o(i,nx) = Pasteriscoy(i) Pk1w(i,nx) = Pasteriscoy(i+ny) end do errorIADIP = Pk1o - Pko maxerror = abs(errorIADIP(1,1)) Do i = 1, ny Do j = 1, nx if (abs(errorIADIP(i,j)) > maxerror) then maxerror = abs(errorIADIP(i,j)) end if end do end do if (maxerror < 0.1) exit cicloIADIP Pko = Pk1o Pkw = pk1w contadorHK = contadorHk + 1 end do cicloIADIP errorPo = Pk1o - Po maxerror = abs(errorPo(1,1)) Do i = 1, ny Do j = 1, nx if (abs(errorPo(i,j)) > maxerror) then maxerror = abs(errorPo(i,j)) end if end do end do if (maxerror < 0.1) exit cicloPo Po = Pk1o end do cicloPo !Calculo de la saturacion al tiempo n+1 !Primer bloque expp = Tox(1,1)*Po(1,2)-(Tox(1,1)+Toy(1,1))*Po(1,1)+Toy(1,1)*Po(2,1) expg = Tox(1,1)*gammaoz(1,2)-(Tox(1,1)+Toy(1,1))*gammaoz(1,1)+Toy(1,1)*gammaoz(2,1) Soc(1,1) = ((((expp-expg-Q(1,1)*fo(1,1))*(deltat/Vp))+(Son(1,1)*(bo(1,1)-bon(1,1))))*(1/bo(1,1))) + Son(1,1) !Bloques internos de la primera columna Do i = 2, ny-1 expp = Toy(i-1,1)*Po(i-1,1)+Tox(i,1)*Po(i,2)+Toy(i,1)*Po(i+1,1)-(Toy(i-1,1)+Tox(i,1)+Toy(i,1))*Po(i,1)
44
expg = Toy(i-1,1)*gammaoz(i-1,1)+Tox(i,1)*gammaoz(i,2)+Toy(i,1)*gammaoz(i+1,1)-(Toy(i-1,1)+Tox(i,1)+Toy(i,1))*gammaoz(i,1) Soc(i,1) = ((((expp-expg-Q(i,1)*fo(i,1))*(deltat/Vp))+(Son(i,1)*(bo(i,1)-bon(i,1))))*(1/bo(i,1))) + Son(i,1) end do !Ultimo bloque primera columna expp = Tox(ny,1)*Po(ny,2)-(Tox(ny,1)+Toy(ny-1,1))*Po(ny,1)+Toy(ny-1,1)*Po(ny-1,1) expg = Tox(ny,1)*gammaoz(ny,2)-(Tox(ny,1)+Toy(ny-1,1))*gammaoz(ny,1)+Toy(ny-1,1)*gammaoz(ny-1,1) Soc(ny,1) = ((((expp-expg-Q(ny,1)*fo(ny,1))*(deltat/Vp))+(Son(ny,1)*(bo(ny,1)-bon(ny,1))))*(1/bo(ny,1))) + Son(ny,1) !Iteracion para todas las columnas centrales !Primer bloque do k = 2, nx-1 expp = Tox(1,k-1)*Po(1,k-1)+Toy(1,k)*Po(2,k)+Tox(1,k)*Po(1,k+1)-(Tox(1,k-1)+Toy(1,k)+Tox(1,k))*Po(1,k) expg = Tox(1,k-1)*gammaoz(1,k-1)+Toy(1,k)*gammaoz(2,k)+Tox(1,k)*gammaoz(1,k+1)-(Tox(1,k-1)+Toy(1,k)+Tox(1,k))*gammaoz(1,k) Soc(1,k) = ((((expp-expg-Q(1,k)*fo(1,k))*(deltat/Vp))+(Son(1,k)*(bo(1,k)-bon(1,k))))*(1/bo(1,k))) + Son(1,k) !Bloques internos Do i = 2, ny-1 aux10 = Tox(i,k-1)*Po(i,k-1)+Toy(i,k)*Po(i+1,k)+Tox(i,k)*Po(i,k+1)+Toy(i-1,k)*Po(i-1,k) expp = aux10 - (Tox(i,k-1)+Toy(i,k)+Tox(i,k)+Toy(i-1,k))*Po(i,k) aux11 = Tox(i,k-1)*gammaoz(i,k-1)+Toy(i,k)*gammaoz(i+1,k)+Tox(i,k)*gammaoz(i,k+1)+Toy(i-1,k)*gammaoz(i-1,k) expg = aux11 - (Tox(i,k-1)+Toy(i,k)+Tox(i,k)+Toy(i-1,k))*gammaoz(i,k) Soc(i,k) = ((((expp-expg-Q(i,k)*fo(i,k))*(deltat/Vp))+(Son(i,k)*(bo(i,k)-bon(i,k))))*(1/bo(i,k))) + Son(i,k) end do !Ultimo bloque expp = Tox(ny,k-1)*Po(ny,k-1)+Toy(ny-1,k)*Po(ny-1,k)+Tox(ny,k)*Po(ny,k+1)-(Tox(ny,k-1)+Toy(ny-1,k)+Tox(ny,k))*Po(ny,k) aux10 = Tox(ny,k-1)*gammaoz(ny,k-1)+Toy(ny-1,k)*gammaoz(ny-1,k)+Tox(ny,k)*gammaoz(ny,k+1) expg = aux10 -(Tox(ny,k-1)+Toy(ny-1,k)+Tox(ny,k))*gammaoz(ny,k) Soc(ny,k) = ((((expp-expg-Q(ny,k)*fo(ny,k))*(deltat/Vp))+(Son(ny,k)*(bo(ny,k)-bon(ny,k))))*(1/bo(ny,k))) + Son(ny,k) end do !Ultima columna !Primer bloque expp = Tox(1,nx-1)*Po(1,nx-1)+Toy(1,nx)*Po(2,nx)-(Tox(1,nx-1)+Toy(1,nx))*Po(1,nx) expg = Tox(1,nx-1)*gammaoz(1,nx-1)+Toy(1,nx)*gammaoz(2,nx)-(Tox(1,nx-1)+Toy(1,nx))*gammaoz(1,nx) Soc(1,nx) = ((((expp-expg-Q(1,nx)*fo(1,nx))*(deltat/Vp))+(Son(1,nx)*(bo(1,nx)-bon(1,nx))))*(1/bo(1,nx))) + Son(1,nx) !Bloques internos Do i = 2, ny-1 expp = Toy(i-1,nx)*Po(i-1,nx)+Tox(i,nx-1)*Po(i,nx-1)+Toy(i,nx)*Po(i+1,nx)-(Toy(i-1,nx)+Tox(i,nx-1)+Toy(i,nx))*Po(i,nx) aux10 = Toy(i-1,nx)*gammaoz(i-1,nx)+Tox(i,nx-1)*gammaoz(i,nx-1)+Toy(i,nx)*gammaoz(i+1,nx)
45
expg = aux10 -(Toy(i-1,nx)+Tox(i,nx-1)+Toy(i,nx))*gammaoz(i,nx) Soc(i,nx) = ((((expp-expg-Q(i,nx)*fo(i,nx))*(deltat/Vp))+(Son(i,nx)*(bo(i,nx)-bon(i,nx))))*(1/bo(i,nx))) + Son(i,nx) end do !Ultimo bloque expp = Tox(ny,nx-1)*Po(ny,nx-1)+Toy(ny-1,nx)*Po(ny-1,nx)-(Tox(ny,nx-1)+Toy(ny-1,nx))*Po(ny,nx) expg = Tox(ny,nx-1)*gammaoz(ny,nx-1)+Toy(ny-1,nx)*gammaoz(ny-1,nx)-(Tox(ny,nx-1)+Toy(ny-1,nx))*gammaoz(ny,nx) Soc(ny,nx) = ((((expp-expg-Q(ny,nx)*fo(ny,nx))*(deltat/Vp))+(Son(ny,nx)*(bo(ny,nx)-bon(ny,nx))))*(1/bo(ny,nx))) + Son(ny,nx) !Fin del calculo de la saturacion al tiempo n+1 errorSo = Soc - So maxerror = abs(errorSo(1,1)) Do i = 1, ny Do j = 1, nx if (abs(errorSo(i,j)) > maxerror) then maxerror = abs(errorSo(i,j)) end if end do end do if (maxerror < 0.01) exit cicloSo So = Soc end do cicloSo Son = So Swn = 1-So Pon = Po Pcn = Pc Pwn = Pon + Pcn Bon = Bo Bwn = Bw contador = contador + 1 print *, Po end do ciclo end program