import matplotlib.pyplot as plt
import numpy as np
import math
print("")
print("DETERMINAR DECLINACIONES HIPERBÓLICAS O ARMÓNICAS PARTIENDO DE ECUACIONES DE ARPS (ESTADO PSEUDOESTABLE)")
print("")
# Archivo y Grafica
#pedir al usuario nombre del archivo con .csv
#para archivos cualesquiera, emplear input
#para resolucion rapida, emplear proyectoyaci2.csv
# Importar datos
nombre="proyectoyaci2.csv"
#nombre= input("Ingrese el nombre del archivo con los datos de producción a estudiar: ")
anios=[]
caudaleslog=[]
caudales=[]
with open(nombre) as data:
f=0
for linea in data:
if f>0:
anio,caudal=linea.strip().split(";")
anios.append(float(anio))
caudales.append(float(caudal))
caudaleslog.append(math.log10(float(caudal)))
f+=1
print("Tiempo en años")
print(anios)
print("")
print("Caudal en STB/d")
print(caudales)
print("")
print("Logaritmo del Caudal")
print(caudaleslog)
print("")
qi = caudales[0]
ti = anios[0]
q2 = caudales[-1]
t2 = anios[-1]
print("qi:", qi, "[STB/d]")
print("ti:", ti, "[años]")
print("q2:", q2, "[STB/d]")
print("t2:", t2, "[años]")
#Grafica
x = np.array(anios)
y = np.array(caudaleslog)
plt.plot(x,y,linewidth=5,color='#00ff00')
plt.xlabel('Tiempo [años]')
plt.ylabel('Log(q)')
plt.title('log(q) vs tiempo')
plt.grid()
plt.show()
#funcion interpolacion
def Interpolacion(ListaAnios,ListaCaudal):
qi=ListaCaudal[0]
qn=ListaCaudal[-1]
q1=math.sqrt(qi*qn)
i1=""
i2=""
for i in range(len(ListaCaudal)-1):
if q1<ListaCaudal[i] and q1>ListaCaudal[i+1]:
i1=i
i2=i+1
# print(ListaCaudal[i1],ListaAnios[i1])
# print(ListaCaudal[i2],ListaAnios[i2])
t1=(q1-ListaCaudal[i1])*((ListaAnios[i2]-ListaAnios[i1])/(ListaCaudal[i2]-ListaCaudal[i1]))+ListaAnios[i1]
return t1,q1
print("")
q1 = Interpolacion(anios,caudales)[1]
t1 = Interpolacion(anios,caudales)[0]
print("q1:", q1, "[STB/d]")
print("t1:", t1, "[años]")
print("")
#Se realizan las iteraciones por el metodo de Newton Raphson
def FNdk(t1,t2,qi,q1,q2,nk):
FNdk = ((t2)*(qi/q1)**nk)-((t1)*(qi/q2)**nk)-(t2-t1)
return FNdk
def DerivadaFNdk(t1,t2,qi,q1,q2,nk):
DerivadaFNdk=(((t2)*(qi/q1)**nk)*(math.log(qi/q1)))-(((t1)*(qi/q2)**nk)*(math.log(qi/q2)))
return DerivadaFNdk
def NewExponente(nk,FNdk,DerivadaFNdk):
new_expo = nk-(FNdk/DerivadaFNdk)
return new_expo
nk = 0.5
op = ""
while op != "0":
num_i = int(input(" Ingrese el número de iteraciones que desee realizar: "))
for i in range(num_i):
FNdk1 = float(FNdk(t1, t2, qi, q1, q2, nk))
DerivadaFNdk1 = float(DerivadaFNdk(t1, t2, qi, q1, q2, nk))
NewExponente1 = float(NewExponente(nk, FNdk1, DerivadaFNdk1))
nk = NewExponente1
print(f'La iteración número {i + 1} para el valor nk es {nk:.8}')
print("""
¿Desea repetir iteracion?
Si - Presione un número diferente de 0
No - Presione 0 """)
op = input("Ingrese numero: ")
#cambiamos nk por el parametro "b" que representa el exponente de declinación
# Condicional para diferenciar valores de exponentes de declinacion
b = nk
if nk > 0 and nk < 1:
#
#
#
#
# Para un valor b diferente de 1 o 0, escogemos las ecuaciones para declinación hiperbolica
#
#
#
#
print("")
print("Se desarrollará los datos de producción considerando una declinación hiperbolica")
print("")
# Determinamos el valor de tasa de declinación Di para la declinación hiperbolica
def tasa_hiperbolica(caudal1, caudal2, b, t_dif):
Di = (((caudal1 / caudal2) ** b) - 1) / (b * t_dif)
return Di
t_dif = anios[-1] - anios[-2]
caudal1D = caudales[-2]
caudal2D = caudales[-1]
DiH = tasa_hiperbolica(caudal1D, caudal2D, b, t_dif)
print("La tasa de declinación hiperbolica es: ", DiH, "[1/años]")
print("")
# Determinamos q con t para una declinación hiperbolica
def caudal_futuro_hiperbolico(caudal1, b, Di, tiempo_futuro):
qt = caudal1 * (1 + (b * Di * tiempo_futuro)) ** (-1 / b)
return qt
op = ""
while op != "0":
# valor estandar de tiempo de abandono es 20 años
t_futuro = float(input("Ingrese valor de tiempo en años a determinar el caudal: "))
qt = caudal_futuro_hiperbolico(q2, b, DiH, t_futuro)
print("")
print("El caudal futuro a un tiempo de ", t_futuro, "[años] es de: ", qt, "[STB/d]")
print("")
print("""
¿Desea repetir iteracion?
Si - Presione un número diferente de 0
No - Presione 0 """)
op = input("Ingrese numero: ")
# Determinamos t con q para una declinación hiperbolica
def tiempo_futuro_hiperbolico(caudal1, b, Di, caudal_abandono):
t_futuro = (((caudal1 / caudal_abandono) ** b) - 1) / (b * Di)
return t_futuro
op = ""
while op != "0":
#valor estandar de caudal es 10 stb/d
print("")
caudal_abandono = float(input("Ingrese valor de caudal en STB/d a determinar el tiempo: "))
t_futuro = tiempo_futuro_hiperbolico(caudal2D, b, DiH, caudal_abandono)
print("El tiempo futuro a un caudal de ", caudal_abandono, "[STB/d] es de: ", t_futuro, "[años]")
print("")
print("""
¿Desea repetir iteracion?
Si - Presione un número diferente de 0
No - Presione 0 """)
op = input("Ingrese numero: ")
# Calculo de Reservas Recuperables para una declinación hiperbolica
# Calculo Reservas actuales para una declinación hiperbolica
def ReservasActualesHiperbolica(caudal_inicial, tasa_declinacion, b, caudal_final):
NpAct = ((caudal_inicial * 365) / ((b - 1) * tasa_declinacion)) * (
(caudal_inicial / caudal_final) ** (b - 1) - 1)
return NpAct
primer_caudal_tabla = qi
ultimo_caudal_tabla = caudal2D
ReservaActual = ReservasActualesHiperbolica(primer_caudal_tabla, DiH, b, ultimo_caudal_tabla)
print("")
print("Las reservas actuales bajo declinación hiperbolica son: ", ReservaActual, "[bbl]")
print("")
# Calculo Reservas Remanentes para una declinación hiperbolica
primer_caudal_futuro = caudal2D
ultimo_caudal_futuro = qt
ReservaRemanente = ReservasActualesHiperbolica(primer_caudal_futuro, DiH, b, ultimo_caudal_futuro)
print("Las reservas remanentes bajo declinación hiperbolica son: ", ReservaRemanente, "[bbl]")
print("")
# Suma final actuales más remanentes será reservas recuperables para una declinación hiperbolica
ReservaRecuperable = ReservaActual + ReservaRemanente
print("Las reservas recuperables bajo declinación hiperbolica son: ", ReservaRecuperable, "[bbl]")
print("")
else:
#
#
#
#
# Para un valor de b = 1 entonces se emplean las ecuaciones para una declinación armónica
#
#
#
#
print("")
print("Se desarrollará los datos de producción considerando una declinación armonica")
# Determinamos el valor de tasa de declinación Di para la declinación armonica
def tasa_armonica(caudal1, caudal2, t_dif):
Di = ((caudal1 / caudal2) - 1) / (t_dif)
return Di
t_dif = anios[-1] - anios[-2]
caudal1A = caudales[-2]
caudal2A = caudales[-1]
DiAr = tasa_armonica(caudal1A, caudal2A, t_dif)
print("La tasa de declinación armónica es: ", DiAr, "[1/años]")
print("")
# Determinamos q con t para una declinación armonica
def caudal_futuro_armonico(caudal1, Di, tiempo_futuro):
qt = (caudal1 / (1 + (Di * tiempo_futuro)))
return qt
op = ""
while op != "0":
# t_futuro = 20.0
print("")
t_futuro = float(input("Ingrese valor de tiempo en años a determinar el caudal: "))
qt = caudal_futuro_armonico(q2, DiAr, t_futuro)
print("El caudal futuro a un tiempo de ", t_futuro, "[años] es de: ", qt, "[STB/d]")
print("")
print("""
¿Desea repetir iteracion?
Si - Presione un número diferente de 0
No - Presione 0 """)
op = input("Ingrese numero: ")
# Determinamos t con q para una declinación armonica
def tiempo_futuro_armonico(caudal1, Di, caudal_abandono):
t_futuro = ((caudal1 / caudal_abandono) - 1) / (Di)
return t_futuro
op = ""
while op != "0":
#valor estandar de caudal es 10 stb/d
print("")
caudal_abandono = float(input("Ingrese valor de caudal en STB/d a determinar el tiempo: "))
t_futuro = tiempo_futuro_armonico(caudal2A, DiAr, caudal_abandono)
print("El tiempo futuro a un caudal de ", caudal_abandono, "[STB/d] es de: ", t_futuro, "[años]")
print("")
print("""
¿Desea repetir iteracion?
Si - Presione un número diferente de 0
No - Presione 0 """)
# Calculo Reservas actuales para una declinación armonica
def ReservasActualesArmonico(caudal_inicial, tasa_declinacion, caudal_final):
NpAct = (caudal_inicial * 365 / tasa_declinacion) * (math.log(caudal_inicial / caudal_final))
return NpAct
primer_caudal_tabla = qi
ultimo_caudal_tabla = caudal2A
ReservaActual = ReservasActualesArmonico(primer_caudal_tabla, DiAr, ultimo_caudal_tabla)
print("Las reservas actuales bajo declinación armonica son: ", ReservaActual, "[bbl]")
print("")
# Calculo Reservas Remanentes para una declinación armonica
primer_caudal_futuro = caudal2A
ultimo_caudal_futuro = qt
ReservaRemanente = ReservasActualesArmonico(primer_caudal_futuro, DiAr, ultimo_caudal_futuro)
print("Las reservas remanentes bajo declinación armonica son: ", ReservaRemanente, "[bbl]")
print("")
# Suma final actuales más remanentes será reservas recuperables para una declinación hiperbolica
ReservaRecuperable = ReservaActual + ReservaRemanente
print("Las reservas recuperables bajo declinación armonica son: ", ReservaRecuperable, "[bbl]")
print("")