miércoles, 29 de junio de 2022

Tkinter Compresibilidad del Agua Cw

Continuando con la creación de interfaces gráficas, se trae ahora la Compresibilidad del agua, la interfaz cuenta con 3 correlaciones que  permiten la obtención de Cw, A continuación se muestra el código completo:
 
import math as math
from tkinter import *
import tkinter as tk
from tkinter import ttk
import numpy as np
from tkinter import messagebox
 
Ventana = Tk()
Ventana.geometry("300x300")
Ventana.maxsize(300,300)
Ventana.minsize(300,300)
Ventana.title("Compresibilidad del Agua")
Ventana.configure(background="gray80",highlightbackground="gray80",highlightcolor="black")
 
Recuadro_Entradas = tk.LabelFrame(Ventana)
Recuadro_Entradas.place(relx=0.01, rely=0.01, relheight=0.40, relwidth=0.980)
Recuadro_Entradas.configure(relief='groove',foreground="black",text='''Entradas''',background="gray80",highlightbackground="gray80",highlightcolor="black",width=330)
 
Mensaje_1 = tk.Message(Recuadro_Entradas)
Mensaje_1.place(relx=0.01, rely=0.05, height=25, width=50)
Mensaje_1.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''P''')
Mensaje_2 = tk.Message(Recuadro_Entradas)
Mensaje_2.place(relx=0.01, rely=0.38, height=25, width=50)
Mensaje_2.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Pb''')
Mensaje_3 = tk.Message(Recuadro_Entradas)
Mensaje_3.place(relx=0.01, rely=0.71, height=25, width=50)
Mensaje_3.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''T''')
Mensaje_4 = tk.Message(Recuadro_Entradas)
Mensaje_4.place(relx=0.52, rely=0.05, height=25, width=50)
Mensaje_4.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''S''')
Mensaje_5 = tk.Message(Recuadro_Entradas)
Mensaje_5.place(relx=0.52, rely=0.38, height=25, width=50)
Mensaje_5.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''Yg''')
 
Entrada_1 = tk.Entry(Recuadro_Entradas)
Entrada_1.place(relx=0.2, rely=0.05, height=20, width=80)
Entrada_1.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_2 = tk.Entry(Recuadro_Entradas)
Entrada_2.place(relx=0.2, rely=0.39, height=20, width=80)
Entrada_2.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_3 = tk.Entry(Recuadro_Entradas)
Entrada_3.place(relx=0.2, rely=0.72, height=20, width=80)
Entrada_3.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_4 = tk.Entry(Recuadro_Entradas)
Entrada_4.place(relx=0.715, rely=0.05, height=20, width=80)
Entrada_4.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
Entrada_5 = tk.Entry(Recuadro_Entradas)
Entrada_5.place(relx=0.715, rely=0.39, height=20, width=80)
Entrada_5.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
 
Entrada_1.delete(0,tk.END);Entrada_1.insert(tk.END,"");Entrada_1.insert(tk.END,0.00)
Entrada_2.delete(0,tk.END);Entrada_2.insert(tk.END,"");Entrada_2.insert(tk.END,0.00)
Entrada_3.delete(0,tk.END);Entrada_3.insert(tk.END,"");Entrada_3.insert(tk.END,0.00)
Entrada_4.delete(0,tk.END);Entrada_4.insert(tk.END,"");Entrada_4.insert(tk.END,0.00)
Entrada_5.delete(0,tk.END);Entrada_5.insert(tk.END,"");Entrada_5.insert(tk.END,0.00)
 
Recuadro_Correlaciones = tk.LabelFrame(Ventana)
Recuadro_Correlaciones.place(relx=0.01, rely=0.44, relheight=0.20, relwidth=0.980)
Recuadro_Correlaciones.configure(relief='groove',foreground="black",text='''Correlaciones Disponibles''',background="gray80",highlightbackground="gray80",highlightcolor="black",width=330)
 
Valores = ["Correlaciones por arriba del punto de burbuja", "Dodson, C.R. y Standing, M.B.","Osif, T.L.","Correlaciones por debajo o en el punto de burbuja","Ramey, H.J., Jr."]
 
Variable = tk.StringVar()
Visor_correlaciones = ttk.Combobox(Recuadro_Correlaciones)
Visor_correlaciones.place(relx=0.02, rely=0.40, height=25, width=280, bordermode='ignore')
Visor_correlaciones.configure(takefocus="",state="readonly",textvariable = Variable, justify = "center",values = Valores)
Visor_correlaciones.current(0)
 
def Correlaciones_Cw(event):
 
            try:
 
                        """S = 20000/10000 # ppm
                                   P = 5000 # psi
                                   T = 200 #°F
                                   Pb = 3500 # psi
                                   Yg = 0.63
                        """
                       
                        P = float(Entrada_1.get()) # psi
                        Pb = float(Entrada_2.get()) # °F
                        T = float(Entrada_3.get()) # °S
                        S = float(Entrada_4.get()) # psi
                        Yg = float(Entrada_5.get()) # °F
 
                        if P <= 0:
 
                                   messagebox.showwarning("Advertencia!","La Presión es incorrecta")
 
                        elif Pb <= 0:
 
                                   messagebox.showwarning("Advertencia!","La Presión de Burbuja es incorrecta")
 
                        elif T <= 0:
 
                                   messagebox.showwarning("Advertencia!","La Temperatura es incorrecta")
 
                        elif S <= 0:
 
                                   messagebox.showwarning("Advertencia!","La Salinidad es incorrecta")
 
                        elif Yg <= 0:
 
                                   messagebox.showwarning("Advertencia!","La Densidad del Gas es incorrecta")
 
                        else:
 
                                   S = S/10000
 
                                   if str(Variable.get()) == Valores[0]:
 
                                               pass
 
                                   elif str(Variable.get()) == Valores[1]:
 
                                               A = 3.8546-1.34*(10**-4)*P
                                               B = -0.01052+4.77*(10**-7)*P
                                               C = 3.9267*(10**-5)-8.8*(10**-10)*P
 
                                               Cwp=(A+B*T+C*(T**2))/10**6
 
                                               # Factor de corrección por solubilidad del gas
 
                                               # Correlación de Culberson, O.L y McKetta, J.J., Jr.
 
                                               A = 8.15839-(6.12265*(10**(-2) )*T)+(1.91663*(10**(-4) )*(T**2 ))-(2.1654*(10**(-7) )*(T**3 ))
                                               B = (1.01021*(10**(-2) ))-(7.44241*(10**(-5) )*T)+(3.05553*(10**(-7) )*(T**2 ))-(2.94883*(10**(-10) )*(T**3 ))
                                               C = (-9.02505+(0.130237*T)-(8.53425*(10**(-4) )*(T**2 ))+(2.34122*(10**(-6) )*(T**3 ))-(2.37049*(10**(-9) )*(T**4 )))*(10**(-7) )
 
                                               Rswp = A+B*P+C*P**2
 
                                               # Corrección por salinidad dentro de los rangos 0<Salinidad(%)<30 y 70<Temperatura(°F)<250
 
                                               Rsw = (10**(-0.0840655*S*(T**-0.285854)))*Rswp
 
                                               Cw = (1+(8.9*10**-3)*Rsw)*Cwp
 
                                               # Corrección por efectos de solidos disueltos
 
                                               Cw1 = (1+(S**0.7)*(-5.2*(10**-2)+2.7*(10**-4)*T-1.14*(10**-6)*(T**2)+1.121*(10**-9)*(T**3)))*Cw
 
 
                                               Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,Cw1)
 
                                   elif str(Variable.get()) == Valores[2]:
 
                                               # Correlación de Osif, T.L.
 
                                               Cw2 = 1/(7.033*P+541.5*S-537*T+403300)
 
                                               Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,Cw2)
 
                                   elif str(Variable.get()) == Valores[3]:
 
                                               pass
 
                                   elif str(Variable.get()) == Valores[4]:
 
                                               # Las correlaciones para obtener la compresibilidad por debajo de la presión en el punto de burbuja.
 
                                               # Compresibilidad del agua pura
 
                                               A = 3.8546-1.34*(10**-4)*P
                                               B = -0.01052+4.77*(10**-7)*P
                                               C = 3.9267*(10**-5)-8.8*(10**-10)*P
 
                                               Cwp=(A+B*T+C*(T**2))/10**6
 
                                               # Correlación de McCoy, R.L # Solubilidad del gas natural en agua pura
 
                                               A = 2.12+3.45*(10**-3)*T-3.59*(10**-5)*(T**2)
                                               B = 0.0107-5.26*(10**-5)*T+1.48*(10**-7)*(T**2)
                                               C = -8.75*(10**-7)+3.9*(10**-9)*T-1.02*(10**-11)*(T**2)
 
                                               Rswp= A+B*P+C*P**2
 
                                               # Factor de corrección de salinidad
 
                                               Rsw2 = (1-(0.0753-(1.73*10**-4)*T)*S)*Rswp
 
                                               Cw = (1+(8.9*10**-3)*Rsw2)*Cwp
 
                                               # Factor volumétrico del agua
 
                                               VwT= -1.0001*(10**-2)+1.33391*(10**-4)*T+5.50654*(10**-7)*(T**2)
                                               Vwp= (-1.95301*(10**-9)*P*T)-(1.72834*(10**-13)*(P**2)*T)-(3.58922*(10**-7)*P)-(2.25341*(10**-10)*(P**2))
                                               Bwb = (1+Vwp)*(1+VwT)
 
                                               # Presión y temperatura, pseudoreducida y pseudocritica
 
                                               Psc = 677+(15*Yg)-37.5*(Yg**2)
                                               Tsc = 168+(325*Yg)-12.5*(Yg**2)
 
                                               Tpr = (T+460)/Tsc
 
                                               Ppr = P/Psc
 
                                               # Factor de compresibilidad
 
                                               def FACTOR_Z(Tpr,Ppr):
 
                                                           A1 = 0.3265
                                                           A2 = -1.07
                                                           A3 = -0.5339
                                                           A4 = 0.01569
                                                           A5 = -0.05165
                                                           A6 = 0.5475
                                                           A7 = -0.7361
                                                           A8 = 0.1844
                                                           A9 = 0.1056
                                                           A10 = 0.6134
                                                           A11 = 0.721
 
                                                           error = 1
 
                                                           Z = 0.6000
 
                                                           while error > 0.00000001:
 
                                                                       Pr = (0.27*Ppr)/(Z*Tpr)
 
                                                                       F = Z-(1+(A1+(A2/Tpr)+(A3/(Tpr**3))+(A4/(Tpr**4))+(A5/(Tpr**5)))*Pr+(A6+(A7/Tpr)+(A8/(Tpr**2)))*(Pr**2)-A9*((A7/Tpr)+(A8/(Tpr**2)))*(Pr**5)+A10*(1+A11*(Pr**2))*((Pr**2)/(Tpr**3))*np.exp(-A11*Pr**2))
 
                                                                       G = 1+(A1+(A2/Tpr)+(A3/(Tpr**3))+(A4/(Tpr**4))+(A5/(Tpr**5)))*(Pr/Z)+2*(A6+(A7/Tpr)+(A8/(Tpr**2)))*((Pr**2)/Z)-5*A9*((A7/Tpr)+(A8/(Tpr**2)))*((Pr**5)/Z)+((2*A10*(Pr**2))/(Z*(Tpr**3)))*(1+(A11*(Pr**2))-((A11**2)*(Pr**2)**2))*np.exp(-A11*Pr**2)
 
                                                                       Z2 = Z-(F/G)
 
                                                                       error = (Z2-Z)/Z2
 
                                                                       Z = Z2
 
                                                           return Z
 
                                               Z = FACTOR_Z(Tpr,Ppr)
 
                                               # Factor volumétrico del gas
 
                                               Bg = 0.0053*((Z*(T+460))/P)
 
                                               # Correlación de Ramey, H.J., Jr.
 
                                               B = 0.0107-5.26*(10**-5)*T+1.48*(10**-7)*(T**2)
                                               C = -8.75*(10**-7)+3.9*(10**-9)*T-1.02*(10**-11)*(T**2)
 
                                               A = B+2*C*P
 
                                               Rsw1 = (10**(-0.0840655*S*(T**-0.285854)))*A
 
                                               Cw3 = Cw+(Bg/Bwb)*Rsw1
 
                                               Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,Cw3)
 
                                   else:
 
                                               print("Error al realizar la selección de la opción")
           
            except ZeroDivisionError:
 
                        messagebox.showwarning("Advertencia!","Los datos ingresados son incorrectos, por favor revisalos")
 
            except SyntaxError:
 
                        messagebox.showwarning("Advertencia!","Los datos ingresados son incorrectos, por favor revisalos")
 
            except ValueError:
 
                        messagebox.showwarning("Advertencia!","Los datos ingresados son incorrectos, por favor revisalos")
 
            finally:
 
                        pass
 
            return
 
Visor_correlaciones.bind('<<ComboboxSelected>>', Correlaciones_Cw)
 
Recuadro_Salidas = tk.LabelFrame(Ventana)
Recuadro_Salidas.place(relx=0.01, rely=0.67, relheight=0.20, relwidth=0.980)
Recuadro_Salidas.configure(relief='groove',foreground="black",text='''Salidas''',background="gray80",highlightbackground="gray80",highlightcolor="black",width=330)
 
Mensaje_4 = tk.Label(Recuadro_Salidas)
Mensaje_4.place(relx=0.10, rely=0.20, height=25, width=80)
Mensaje_4.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='left',text='''Cw''')
Mensaje_9 = tk.Label(Recuadro_Salidas)
Mensaje_9.place(relx = 0.69, rely = 0.20, height=25, width=50)
Mensaje_9.configure(background="gray80",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center',text='''1/psi''')
Salida_1 = tk.Entry(Recuadro_Salidas)
Salida_1.place(relx=0.35, rely=0.21, height=20, width=80)
Salida_1.configure(background="white",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",justify='center')
 
Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,"");Salida_1.insert(tk.END,0.00)
 
def Limpiando():
 
            Entrada_1.delete(0,tk.END);Entrada_1.insert(tk.END,"");Entrada_1.insert(tk.END,0.00)
            Entrada_2.delete(0,tk.END);Entrada_2.insert(tk.END,"");Entrada_2.insert(tk.END,0.00)
            Entrada_3.delete(0,tk.END);Entrada_3.insert(tk.END,"");Entrada_3.insert(tk.END,0.00)
            Entrada_4.delete(0,tk.END);Entrada_4.insert(tk.END,"");Entrada_4.insert(tk.END,0.00)
            Entrada_5.delete(0,tk.END);Entrada_5.insert(tk.END,"");Entrada_5.insert(tk.END,0.00)
            Salida_1.delete(0,tk.END);Salida_1.insert(tk.END,"");Salida_1.insert(tk.END,0.00)
 
            return
 
Limpieza = Button(Ventana,activebackground="OliveDrab4",activeforeground="black",background="gray80",disabledforeground="#a3a3a3",foreground="#000000",highlightbackground="#d9d9d9",highlightcolor="black",pady="0",text='''Limpieza''', command = Limpiando).place(relx = 0.01, rely = 0.89, height=27, width=293)
 
Ventana.mainloop()
 
El código devuelve lo siguiente: