Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Datos - 1

Dim R() As Double, DR() As Double, R1() As Double, DR1() As Double Dim f() As Double, VM(), TR As Double Dim Re As Double, PR As Double, H As Double, Qo As Double, Tiempo As Double Dim Por As Double, DT As Double, Ct As Double, LAMDA As Double, alfa As Double Dim k As Double, Rw As Double, UB As Double, G As Double, i As Integer, Numbertest As Integer Const Pi = 3.141592654 ' ' VARIABLES PARA DERIVAR POR SPLINE ' Dim AA() As Double, bb() As Double, CC() As Double, DD() As Double, Cell As Double Dim U() As Double, GG() As Double, QQ() As Double, W() As Double, j As Integer, v As Integer, ReD As D ouble Dim alpha() As Double, gama() As Double, CoefB() As Double, CoefC() As Double, CoefD() As Double Dim fi() As Double, d() As Double, C() As Double, vv() As Double, e() As Double

Dim YY() As Double Dim A() As Double 'Coeficiente B Dim HH() As Double Dim NNNN As Integer Dim Nmax As Long ' ' ' Private Sub Command1_Click() Dim DimTd As Double, dimPD As Double, Temp1 As Double, Temp2 As Double, AnaltP As Double, Desv As Double, TD() As Double, PD() As Double, PDP() As Double, Barra As Integer Re = Val(Text1) Ct = Val(Text2) PR = Val(Text4) H = Val(Text5) Qo = Val(Text6) Tiempo = Val(Text7) Por = Val(Text8) DT = Val(Text9) k = Val(Text10) Rw = Val(Text11) UB = Val(Text12) G = Val(Text13) Cell = Val(Text3) ReDim R(1 To Cell) As Double, DR(1 To Cell) As Double, R1(1 To Cell) As Double, DR1(1 To Cell - 1) As Double ReDim f(1 To Cell) As Double, VM(1 To Cell), AA(1 To Cell) As Double, bb(1 To Cell) As Double ReDim CC(1 To Cell) As Double, DD(1 To Cell) As Double, GG(1 To Cell) As Double, QQ(1 To Cell) As Double, W(1 To Cell) As Double ' ' DETERMINACION DE LAS CONSTANTES ADIMENSIONALES ' If Por * UB * Ct * Re <> 0 Then Temp1 = 0.0002637 * k / (Por * UB * Ct * Rw ^ 2) If k * H <> 0 Then Temp2 = 141.2 * Qo * UB / (k * H) If Rw <> 0 Then ReD = Re / Rw LAMDA = k / UB Numbertest = ((Tiempo * 24) / DT) alfa = (Re / Rw) ^ (1 / (Cell - 1)) ' ' ' Posicion de los Nodos R(1) = Rw For i = 2 To Cell R(i) = alfa * R(i - 1) Next i ' ' ' Distancia entre Nodos For i = 1 To Cell - 1 DR1(i) = R(i + 1) - R(i) Next i ' ' ' Posicion de las Fronteras

Datos - 2 For i = 1 To Cell If i = Cell Then R1(i) = Re Else R1(i) = ((alfa - 1) * R(i)) / (Log(alfa)) End If Next i ' ' ' Tamao de las celdas For i = 1 To Cell If i = 1 Then DR(i) = R1(i) - R(i) Else DR(i) = R1(i) - R1(i - 1) End If Next i ' ' ' ' ' ' Transmisibilidad TR = 0.00708 * H * LAMDA * 1 / Log(alfa) Volumen de las celdas For i = 1 To Cell If i = 1 Then VM(i) = Pi * (R1(i) ^ 2 - Rw ^ 2) * H / 5.615 ElseIf i = Cell Then VM(i) = Pi * (Re ^ 2 - R1(i - 1) ^ 2) * H / 5.615 Else VM(i) = Pi * (R1(i) ^ 2 - R1(i - 1) ^ 2) * H / 5.615 End If Next i ' ' ' Constante For i = 1 To Cell f(i) = 24 * VM(i) * Por * Ct / DT Next i ReDim U(Numbertest, 1 To Cell) ' ' ' CONDICION INICIAL For i = 1 To Cell U(0, i) = PR Next i ' ' ' ' ' ' ' ' ' ' ' 'PARA TODOS LOS NODOS 'PRESION ES P INICIAL AL TIEMPO CERO

CONDICIONES DE FRONTERA PARA PRIMER Y ULTIMO NODO APLICA CONDICIONES DE FRONTERA AL PRIMER NODO INTERIOR bb(1) = -TR - f(1) CC(1) = TR APLICA CONDICIONES DE FRONTERA AL ULTIMO NODO INTERIOR AA(Cell) = TR bb(Cell) = -TR - f(Cell) PARA TODOS LOS DEMAS NODOS INTERIORES For i = 2 AA(i) bb(i) CC(i) Next i To Cell - 1 = TR = -2 * TR - f(i) = TR INICIA LA SIMULACION ProgressBar1.Visible = True Label14.Visible = True

' ' '

Datos - 3 Label15.Visible = True Label16.Visible = True For v = 1 To Numbertest ProgressBar1 = v / Numbertest * 100 Label15.Caption = v / Numbertest * 100 Label15.Refresh For i = 1 To Cell ' ' ' APLICA CONDICIONES DE FRONTERA AL PRIMER NODO INTERIOR If i = 1 Then DD(i) = -f(i) * U(v - 1, i) + TR * G * DR1(i) + Qo End If ' ' ' PARA TODOS LOS DEMAS NODOS INTERIORES If i >= 2 And i <= Cell - 1 Then DD(i) = -f(i) * U(v - 1, i) + TR * G * (DR1(i) - DR1(i - 1)) End If ' ' ' APLICA CONDICIONES DE FRONTERA AL ULTIMO NODO INTERIOR If i = Cell Then DD(i) = -TR * G * DR1(i - 1) - f(i) * U(v - 1, i) End If Next i ' ' ' SOLUCION MATRICIAL MEDIANTE EL ALGORITMO DE THOMAS QQ(1) = CC(1) / bb(1) GG(1) = DD(1) / bb(1) For j = 2 To Cell - 1 W(j) = bb(j) - (AA(j) * QQ(j - 1)) QQ(j) = CC(j) / W(j) GG(j) = (DD(j) - (AA(j) * GG(j - 1))) / W(j) Next j W(Cell) = bb(Cell) - (AA(Cell) * QQ(Cell - 1)) U(v, Cell) = (DD(Cell) - (AA(Cell) * GG(Cell - 1))) / W(Cell) For j = Cell - 1 To 1 Step -1 U(v, j) = (GG(j) - (QQ(j) * U(v, j + 1))) Next j Next v ProgressBar2.Visible = True Label17.Visible = True Label18.Visible = True Label19.Visible = True ' ' DETERMINACION DE LA INVERSA LAPLACIANA ' Open "Datos.txt" For Output As #1 Print #1, "dT", , "P num.", , "P. Anlt." Dim summa1 As Double, B As Double, Z As Double Nmax = Numbertest ReDim Preserve TD(0 To Nmax), PD(0 To Nmax), PDP(0 To Nmax) For i = 1 To Numbertest If i * DT <> 0 Then DimTd = Temp1 * i * DT B = Log(2) / DimTd summa1 = 0 Desv = 0 ' ' DETERMINATION OF LAPLACE PARAMETERS ' For j = 1 To 8 Z = B * j term1 = Vi((j)) * L((Z)) summa1 = summa1 + term1 Next j dimPD = B * summa1 AnaltP = PR - Temp2 * dimPD End If

Datos - 4

TD(i) = i * DT PD(i) = PR - U(i, 1) Desv = Abs(AnaltP - U(i, 1)) / AnaltP * 100 Print #1, TD(i), U(i, 1), AnaltP, Desv Next i Close #1 ' ' DETERMINACION DE LA DERIVADA MEDIANTE SPLINE ' ReDim A(0 To Nmax) As Double For i = 0 To Nmax A(i) = PD(i) Next i ReDim CoefC(0 To Nmax) ReDim CoefD(0 To Nmax - 1) ReDim CoefB(0 To Nmax - 1) CoefC(0) = 0 ' Natural Spline CoefC(Nmax) = 0 ' Natural Spline ReDim HH(0 To Nmax - 1) For i = 0 To Nmax - 1 HH(i) = TD(i + 1) - TD(i) Next i ReDim d(1 To Nmax - 1) As Double ReDim fi(1 To Nmax - 1) As Double ReDim e(2 To Nmax - 1) As Double For i = 1 To Nmax - 1 d(i) = 2 * (HH(i - 1) + HH(i)) fi(i) = HH(i) Next i For i = 2 To Nmax - 1 e(i) = HH(i - 1) Next i Call coeficientes 'Calcula el coeficiente C(i) For i = 0 To Nmax - 1 CoefB(i) = (1 / HH(i)) * (A(i + 1) - A(i)) - (HH(i) / 3) * (CoefC(i + 1) + 2 * CoefC(i)) CoefD(i) = (1 / 3 / HH(i)) * (CoefC(i + 1) - CoefC(i)) Next i For i = 1 To Nmax - 1 PDP(i) = Abs((CoefB(i) + 2 * CoefC(i) * (TD(i) - TD(i)) + 3 * CoefD(i) * (TD(i) - TD(i)) ^ 2) * TD(i)) Next i ' ' TABULACION DE RESULTADOS ' For i = 1 To Numbertest ProgressBar2 = i / Numbertest * 100 Label18.Caption = i / Numbertest * 100 Label18.Refresh Matriz.Cols = 4 Matriz.Rows = Numbertest + 1 Matriz.Row = i Matriz.Col = 0 Matriz.Text = i Matriz.Col = 1 Matriz.Text = Format(Temp1 * TD(i), "0.0000") Matriz.Col = 2 Matriz.Text = Format(PD(i) / Temp2, "0.00000") Matriz.Col = 3 Matriz.Text = Format(PDP(i) / Temp2, "0.00000") Next i Matriz.Row = 0 Matriz.Col = 0 Matriz.Text = " # " Matriz.Col = 1 Matriz.Text = " tD " Matriz.Col = 2 Matriz.Text = " PD " Matriz.Col = 3 Matriz.Text = " tD*PD' " Matriz.Visible = True '

Datos - 5 ' ' GRABAR RESULTADOS DE PRESION Y DERIVADA

Open "DataReal.txt" For Output As #1 Print #1, "t, hr", "dP, psi", "t*dP', psi" Open "Adimens.txt" For Output As #2 Print #2, "tD", "PD", "tD*PD'" For i = 1 To Nmax Print #1, TD(i), PD(i), PDP(i) Print #2, Temp1 * TD(i), PD(i) / Temp2, PDP(i) / Temp2 Next i Close #1 Close #2 End Sub ' ' COEFFICIENTS FOR SPLINE ' Sub coeficientes() ReDim alpha(1 To Nmax - 1) As Double ReDim gama(1 To Nmax - 1) As Double ReDim C(1 To Nmax) As Double ReDim vv(1 To Nmax - 1) As Double Dim i As Long alpha(1) = d(1) gama(1) = fi(1) / alpha(1) For i = 2 To Nmax - 2 alpha(i) = d(i) - e(i) * gama(i - 1) gama(i) = fi(i) / alpha(i) Next i alpha(Nmax - 1) = d(Nmax - 1) - e(Nmax - 1) * alpha(Nmax - 2) For i = 1 To Nmax - 1 vv(i) = (3 / HH(i)) * (A(i + 1) - A(i)) - (3 / HH(i - 1)) * (A(i) - A(i - 1)) Next i C(1) = vv(1) / d(1) For i = 2 To Nmax - 1 C(i) = (vv(i) - e(i) * C(i - 1)) / alpha(i) Next i CoefC(Nmax) = 0 For i = Nmax - 1 To 1 Step -1 CoefC(i) = C(i) - gama(i) * CoefC(i + 1) Next i End Sub Private Sub Command2_Click() Clipboard.Clear 'Copy data Clipboard.SetText Matriz.Clip End Sub ' ' ESTIMATION OF LAPLACE TRANSFORMATION INVERSION ' Public Function L(Z As Double) As Double Dim u1 As Double, u2 As Double, Temp1 As Double, Temp2 As Double ' ' FINITE HOMOGENEOUS RESERVOIR WITHOUT CD AND S ' Temp1 = Sqr(Z) u1 = K1(Temp1 * ReD) * I0(Temp1) + I1(Temp1 * ReD) * K0(Temp1) u2 = Z ^ 1.5 * (I1(Temp1 * ReD) * K1(Temp1) - K1(Temp1 * ReD) * I1(Temp1)) If u2 <> 0 Then L = u1 / u2 End Function ' ' **************** FACTORIAL DETERMINATION ****************** ' Public Function fact(X As Integer) Dim i As Double If X = 0 Then fact = 1 Else fact = 1

Datos - 6 For i = 1 To X fact = fact * i Next i End If End Function ' ' ******* DETERMINATION FACTOR Vi OF STHEFEST ALGORITM ********** ' Public Function Vi(j As Integer) Dim k As Integer, N As Integer, A As Integer, H As Integer Dim summa As Double, im As Double, Num As Double, denom As Double, term As Double N = 8 A = j If A < (N / 2) Then H = A Else H = N / 2 End If ' summa = 0 im = Fix((A + 1) / 2) For k = im To H Num = (k ^ (N / 2) * fact(2 * k)) denom = fact(N / 2 - k) * fact(k) * fact(k - 1) * fact(A - k) * fact(2 * k - A) term = Num / denom summa = summa + term Next k Vi = ((-1) ^ ((N / 2) + A)) * summa End Function ' ' ' Funcion Bessel de Grado y Orden 0 ' Public Function K0(X) Dim p1 As Double, p2 As Double, p3 As Double, p4 As Double, p5 As Double, Dim q1 As Double, q2 As Double, q3 As Double, q4 As Double, q5 As Double, Dim Dum As Double, Y As Double p1 = -0.57721566: p2 = 0.4227842: p3 = 0.23069756 p4 = 0.0348859: p5 = 0.00262698: p6 = 0.0001075: p7 = 0.0000074 q1 = 1.25331414: q2 = -0.07832358: q3 = 0.02189568 q4 = -0.01062446: q5 = 0.00587872: q6 = -0.0025154: q7 = 0.00053208 If X <= 2 Then Y = X * X / 4 Dum = p5 + Y * (p6 + Y * p7) Dum = p2 + Y * (p3 + Y * (p4 + Y * Dum)) K0 = (-Log(X / 2!) * I0(X)) + (p1 + Y * Dum) Else Y = 2! / X Dum = q5 + Y * (q6 + Y * q7) Dum = q2 + Y * (q3 + Y * (q4 + Y * Dum)) K0 = (Exp(-X) / Sqr(X)) * (q1 + Y * Dum) End If End Function ' ' Funcion Bessel de Grado y Orden 1 ' Public Function K1(X) Dim p1 As Double, p2 As Double, p3 As Double, p4 As Double, p5 As Double, Dim q1 As Double, q2 As Double, q3 As Double, q4 As Double, q5 As Double, Dim Dum As Double, Y As Double ' p1 = 1: p2 = 0.15443144: p3 = -0.67278579: p4 = -0.18156897 p5 = -0.01919402: p6 = -0.00110404: p7 = -0.00004686 q1 = 1.25331414: q2 = 0.23498619: q3 = -0.0365562 q4 = 0.01504268: q5 = -0.00780353: q6 = 0.00325614: q7 = -0.00068245 If X <= 2! Then Y = X * X / 4! Dum = p5 + Y * (p6 + Y * p7) Dum = p2 + Y * (p3 + Y * (p4 + Y * Dum)) K1 = (Log(X / 2!) * I1(X)) + (1! / X) * (p1 + Y * Dum)

p6 As Double, p7 As Double q6 As Double, q7 As Double

p6 As Double, p7 As Double q6 As Double, q7 As Double

Datos - 7

Else Y = 2! / X Dum = (q5 + Y * (q6 + Y * q7)) Dum = q2 + Y * (q3 + Y * (q4 + Y * Dum)) K1 = (Exp(-X) / Sqr(X)) * (q1 + Y * Dum) End If End Function ' ' Funcion Bessel I0(x) Returns the modified Bessel function I0 (x) for any real x ' Public Function I0(X) Dim t As Double, Dum As Double, Dum1 As Double t = X / 3.75 If X <= 3.75 Then Dum = 1 + 3.5156229 * t ^ 2 + 3.0899424 * t ^ 4 + 1.2067492 * t ^ 6 + 0.2659732 * t ^ 8 I0 = Dum + 0.0360768 * t ^ 10 + 0.0045813 * t ^ 12 Else Dum = 0.39894228 + 0.01328592 / t + 0.00225319 / (t ^ 2) - 0.00157565 / (t ^ 3) + 0.00916281 / (t ^ 4) Dum = Dum - 0.02057706 / (t ^ 5) + 0.02635537 / (t ^ 6) - 0.01647633 / (t ^ 7) + 0.00392377 / (t ^ 8) Dum1 = Exp(-X) If Dum1 < 1E-100 Then Dum1 = 1 I0 = Dum / (Exp(-X) * Sqr(X)) End If End Function ' ' Funcion Bessel I1(x) ' Public Function I1(X) Dim t As Double, Dum As Double, Dum1 As Double t = X / 3.75 If X <= 3.75 Then Dum = 0.5 + 0.87890594 * t ^ 2 + 0.51498869 * t ^ 4 + 0.15084934 * t ^ 6 Dum = Dum + 0.02658733 * t ^ 8 + 0.00301532 * t ^ 10 + 0.00032411 * t ^ 12 I1 = Dum * X Else Dum = 0.39894228 - 0.03988024 / t - 0.00362018 / (t ^ 2) + 0.00163801 / (t ^ 3) Dum = Dum - 0.01031555 / (t ^ 4) + 0.02282967 / (t ^ 5) - 0.02895312 / (t ^ 6) Dum = Dum + 0.01787654 / (t ^ 7) - 0.00420059 / (t ^ 8) Dum1 = Exp(-X) If Dum1 < 1E-100 Then Dum1 = 1 I1 = Dum / (Dum1 * Sqr(X)) End If End Function Private Sub Command3_Click() Unload Me End End Sub

You might also like