def calculo(self): ind1 = self.Comp1.currentIndex() ind2 = self.Comp2.currentIndex() if ind1 != ind2: zi = arange(0.025, 1., 0.025) id1 = self.indices[ind1] id2 = self.indices[ind2] x = [0] y = [0] for z in zi: try: fraccion = [0.] * len(self.indices) fraccion[ind1] = z fraccion[ind2] = 1 - z mez = Mezcla(tipo=3, fraccionMolar=fraccion, caudalMasico=1.) tb = mez.componente[0].Tb corr = Corriente(T=tb, P=101325., mezcla=mez) T = corr.eos._Dew_T() corr = Corriente(T=T, P=101325., mezcla=mez) while corr.Liquido.fraccion[0] == corr.Gas.fraccion[ 0] and corr.T < corr.mezcla.componente[1].Tb: corr = Corriente(T=corr.T - 0.1, P=101325., mezcla=mez) x.append(corr.Liquido.fraccion[0]) y.append(corr.Gas.fraccion[0]) except: pass x.append(1) y.append(1) self.rellenar(x, y)
def calculo(self): self.entrada = self.kwargs["entrada"] Pout = self.kwargs["Pout"] DeltaP = self.kwargs["DeltaP"] Dew = self.kwargs["Dew"] Bubble = self.kwargs["Bubble"] if self.kwargs["off"] == 1: if Pout: self.Pout = unidades.Pressure(Pout) elif DeltaP: self.Pout = unidades.Pressure(self.entrada.P - DeltaP) elif Dew: corriente = self.entrada.clone(T=Dew) self.Pout = corriente.eos._Dew_P() elif Bubble: corriente = self.entrada.clone(T=Bubble) self.Pout = corriente.eos._Bubble_P() self.salida = [self.entrada.clone(P=self.Pout)] elif self.kwargs["off"] == 2: self.entrada = Corriente() self.salida = [self.entrada] else: self.salida = [self.entrada] self.outT = self.salida[0].T self.outP = self.salida[0].P self.outX = self.salida[0].x
def f(T): fracciones, h = self.reaccion.conversion(self.entrada, T) corriente = Corriente(T, self.entrada.P.atm, self.entrada.caudalmasico.kgh, Mezcla(self.entrada.ids, fracciones), self.entrada.solido) return corriente.h - self.Q - self.entrada.h - h
def calculo(self): """Calculate procedure, only apply pressure loss method chosen""" self.entrada = self.kwargs["entrada"] Pout = self.kwargs["Pout"] DeltaP = self.kwargs["DeltaP"] Dew = self.kwargs["Dew"] Bubble = self.kwargs["Bubble"] if self.kwargs["off"] == 1: if Pout: self.Pout = unidades.Pressure(Pout) elif DeltaP: self.Pout = unidades.Pressure(self.entrada.P-DeltaP) elif Dew: corriente = self.entrada.clone(T=Dew) self.Pout = corriente.eos._Dew_P() elif Bubble: corriente = self.entrada.clone(T=Bubble) self.Pout = corriente.eos._Bubble_P() self.salida = [self.entrada.clone(P=self.Pout)] elif self.kwargs["off"] == 2: self.entrada = Corriente() self.salida = [self.entrada] else: self.salida = [self.entrada] self.Pout = unidades.Pressure(self.salida[0].P) # Calculate other properties self.outT = self.salida[0].T self.outX = self.salida[0].x
def calculo(self): self.entrada = self.kwargs["entrada"] self.criterio = self.kwargs["criterio"] Pout = self.kwargs["Pout"] if self.criterio == 2: self.Pout = unidades.Pressure(Pout) else: lst = [] for entrada in self.entrada: if entrada.status: lst.append(entrada.P) if self.criterio == 0: self.Pout = unidades.Pressure(min(lst)) else: self.Pout = unidades.Pressure(sum(lst, 0.0) / len(lst)) h_in = 0 To = 0 caudalunitariomasico = [0] * len(self.entrada[0].fraccion) for entrada in self.entrada: if entrada.status: h_in += entrada.h To += entrada.T * entrada.caudalmasico for i, caudal in enumerate(entrada.caudalunitariomasico): caudalunitariomasico[i] += caudal To /= sum(caudalunitariomasico) if self.entrada[0].Config.get("Components", "Solids"): #TODO: Add solid mixer pass f = lambda T: Corriente( T=T, P=self.Pout, caudalUnitarioMasico=caudalunitariomasico ).h - h_in T = fsolve(f, To)[0] salida = Corriente(T=T, P=self.Pout, caudalUnitarioMasico=caudalunitariomasico) self.salida = [salida] self.outT = salida.T self.outP = salida.P self.outX = salida.x self.outMolarFlow = salida.caudalmolar self.outMassFlow = salida.caudalmasico self.outVolFlow = salida.Q
def readFromJSON(self, data, huella=True): """Read project from stream huella: boolean to save project file to pychemqt_temporal""" # read configuration config = ConfigParser() for section, options in data["config"].items(): config.add_section(section) for option, value in options.items(): config.set(section, option, value) self.setConfig(config) if not huella: os.rename(conf_dir + "pychemqtrc_temporal", conf_dir + "pychemqtrc_temporal_bak") config.write(open(conf_dir + "pychemqtrc_temporal", "w")) # read equipments items = {} for id, equip in data["equipment"].items(): if id[0] == "e": index = equip["id"] eq = equipments[index]() eq.readFromJSON(equip) else: eq = None items[id] = eq self.setItems(items) # read streams streams = {} for id, stream in data["stream"].items(): id = int(id) up = stream["up"] down = stream["down"] ind_up = stream["ind_up"] ind_down = stream["ind_down"] obj = Corriente() obj.readFromJSON(stream) streams[id] = (up, down, ind_up, ind_down, obj) if huella: if down[0] == "e": equip = self.items[down] if isinstance(equip, Mixer): kwargs = {"entrada": obj, "id_entrada": ind_down} equip.cleanOldValues(**kwargs) else: kwargs = {equip.kwargsInput[ind_down]: obj} equip.kwargs.update(kwargs) if up[0] == "e": equip = self.items[up] # Equipment with variable output streams must be corrected while len(equip.salida) <= ind_up: equip.salida.append(None) equip.salida[ind_up] = obj self.setStreams(streams) if not huella: os.rename(conf_dir + "pychemqtrc_temporal_bak", conf_dir + "pychemqtrc_temporal")
def calculo(self): self.entrada = self.kwargs["entrada"] self.rendimientoCalculado = Dimensionless(self.kwargs["rendimiento"]) if self.kwargs["Pout"]: DeltaP = Pressure(self.kwargs["Pout"] - self.entrada.P) elif self.kwargs["deltaP"]: DeltaP = Pressure(self.kwargs["deltaP"]) elif self.kwargs["Carga"]: DeltaP = Pressure(self.kwargs["Carga"] * self.entrada.Liquido.rho * g) else: DeltaP = Pressure(0) if self.kwargs["usarCurva"]: if self.kwargs["diametro"] != self.kwargs["curvaCaracteristica"][ 0] or self.kwargs["velocidad"] != self.kwargs[ "curvaCaracteristica"][1]: self.curvaActual = self.calcularCurvaActual() else: self.curvaActual = self.kwargs["curvaCaracteristica"] self.Ajustar_Curvas_Caracteristicas() if not self.kwargs["usarCurva"]: head = Length(DeltaP / g / self.entrada.Liquido.rho) power = Power(head * g * self.entrada.Liquido.rho * self.entrada.Q / self.rendimientoCalculado) P_freno = Power(power * self.rendimientoCalculado) elif not self.kwargs["incognita"]: head = Length(polyval(self.CurvaHQ, self.entrada.Q)) self.DeltaP = Pressure(head * g * self.entrada.Liquido.rho) power = Power(self.entrada.Q * DeltaP) P_freno = Power(polyval(self.CurvaPotQ, self.entrada.Q)) self.rendimientoCalculado = Dimensionless(power / P_freno) else: head = Length(self.DeltaP / g / self.entrada.Liquido.rho) caudalvolumetrico = roots( [self.CurvaHQ[0], self.CurvaHQ[1], self.CurvaHQ[2] - head])[0] power = Power(caudalvolumetrico * self.DeltaP) self.entrada = Corriente( self.entrada.T, self.entrada.P.atm, caudalvolumetrico * self.entrada.Liquido.rho * 3600, self.entrada.mezcla, self.entrada.solido) P_freno = Power(polyval(self.CurvaPotQ, caudalvolumetrico)) self.rendimientoCalculado = Dimensionless(power / P_freno) self.headCalculada = head self.power = power self.P_freno = P_freno self.salida = [self.entrada.clone(P=self.entrada.P + DeltaP)] self.Pin = self.entrada.P self.PoutCalculada = self.salida[0].P self.Q = self.entrada.Q.galUSmin self.volflow = self.entrada.Q
def cleanOldValues(self, **kwargs): if kwargs.has_key("entrada"): if isinstance(kwargs["entrada"], list): kwargs["id_entrada"] = None else: corriente = kwargs["entrada"] kwargs["entrada"] = self.kwargs["entrada"][:] while len(kwargs["entrada"]) < kwargs["id_entrada"] + 1: kwargs["entrada"].append(Corriente()) kwargs["entrada"][kwargs["id_entrada"]] = corriente kwargs["id_entrada"] = None self.kwargs.update(kwargs)
def calculo(self): """Calculate procedure, only a mass balance""" self.entrada = self.kwargs["entrada"] self.criterio = self.kwargs["criterio"] # Define output pressure if self.criterio == 2: Pout = self.kwargs["Pout"] else: lst = [] for entrada in self.entrada: if entrada.status: lst.append(entrada.P) if self.criterio == 0: Pout = min(lst) else: Pout = sum(lst, 0.0) / len(lst) self.Pout = unidades.Pressure(Pout) # Heat balance for calculate output temperature h_in = 0 To = 0 massUnitFlow = [0]*len(self.entrada[0].fraccion) for entrada in self.entrada: if entrada.status: h_in += entrada.h To += entrada.T*entrada.caudalmasico for i, caudal in enumerate(entrada.caudalunitariomasico): massUnitFlow[i] += caudal To /= sum(massUnitFlow) def f(T): output = Corriente(T=T, P=self.Pout, caudalUnitarioMasico=massUnitFlow) return output.h-h_in T = fsolve(f, To)[0] # TODO: Add solid mixer capability if self.entrada[0].solido: pass salida = Corriente(T=T, P=self.Pout, caudalUnitarioMasico=massUnitFlow) self.salida = [salida] # Calculate other properties self.outT = salida.T self.outX = salida.x self.outMolarFlow = salida.caudalmolar self.outMassFlow = salida.caudalmasico self.outVolFlow = salida.Q
def calculo(self): self.entrada = self.kwargs.get("entrada", None) self.thermal = self.kwargs.get("thermal", 0) #TODO: implementar para más de una reacción self.reaccion = self.kwargs.get("reaccion", 0)[0] # P=self.kwargs.get("P", 0) # if P: # self.entrada=Corriente(self.entrada.T, P, self.entrada.caudalmasico.kgh, self.entrada.mezcla, self.entrada.solido) T = self.kwargs.get("T", 0) if T: self.T = unidades.Temperature(T) else: self.T = self.entrada.T self.Q = unidades.Power(self.kwargs.get("Q", 0)) self.Text = self.kwargs.get("Text", 0) self.U = unidades.HeatTransfCoef(self.kwargs.get("U", 0)) if self.thermal in [0, 2]: def f(T): fracciones, h = self.reaccion.conversion(self.entrada, T) corriente = Corriente(T, self.entrada.P.atm, self.entrada.caudalmasico.kgh, Mezcla(self.entrada.ids, fracciones), self.entrada.solido) return corriente.h - self.Q - self.entrada.h - h T = fsolve(f, self.entrada.T) fracciones, h = self.reaccion.conversion(self.entrada, T) elif self.thermal == 1: T = self.T fracciones, h = self.reaccion.conversion(self.entrada, T) elif self.thermal == 3: pass print(fracciones) self.Salida = Corriente(T=T, P=self.entrada.P, caudalMasico=self.entrada.caudalmasico, fraccionMolar=fracciones, solido=self.entrada.solido) self.Heat = unidades.Power(self.Salida.h - self.entrada.h - h)
def cleanOldValues(self, **kwargs): """Clean incompatible kwargs parameters New defined entrada delete old entrada Entrada as list not need the id_entrada """ if "entrada" in kwargs: if isinstance(kwargs["entrada"], list): kwargs["id_entrada"] = None else: corriente = kwargs["entrada"] kwargs["entrada"] = self.kwargs["entrada"][:] while len(kwargs["entrada"]) < kwargs["id_entrada"]+1: kwargs["entrada"].append(Corriente()) kwargs["entrada"][kwargs["id_entrada"]] = corriente kwargs["id_entrada"] = None self.kwargs.update(kwargs)
def addStream(self, id, up, down, obj=Corriente(), ind_up=0, ind_down=0): if up[0] == "i": obj = self.items[up] stream = (up, down, ind_up, ind_down, obj) if id not in list(self.streams.keys()): self.streams[id] = stream # self.graph.add_edge((up, down)) if down[0] == "e": eq = self.items[down] if isinstance(eq, Mixer): kwargs = {"entrada": obj, "id_entrada": ind_down} else: kwargs = {eq.kwargsInput[ind_down]: obj} eq(**kwargs)
self.rendimientoAdmisible.setResaltado(tipo_calculo) self.changeParams("metodo", tipo_calculo) if __name__ == "__main__": import sys from lib.corriente import Corriente, Solid app = QtWidgets.QApplication(sys.argv) diametros = [ 17.5e-6, 22.4e-6, 26.2e-6, 31.8e-6, 37e-6, 42.4e-6, 48e-6, 54e-6, 60e-6, 69e-6, 81.3e-6, 96.5e-6, 109e-6, 127e-6 ] fracciones = [ 0.02, 0.03, 0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.05, 0.03, 0.02 ] solido = Solid(caudalSolido=[0.1], distribucion_diametro=diametros, distribucion_fraccion=fracciones) corriente = Corriente(T=300, P=101325, caudalMasico=1., fraccionMolar=[1.], solido=solido) precipitador = ElectricPrecipitator(entrada=corriente, metodo=1, rendimientoAdmisible=0.9) dialogo = UI_equipment(precipitador) dialogo.show() sys.exit(app.exec_())
decimales=2) self.C_inst.setReadOnly(True) layout.addWidget(self.C_inst, 1, 2) lyt_Cost.addItem( QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding), 13, 0, 1, 6) # Output tab self.addSalida( QtWidgets.QApplication.translate("pychemqt", "Destilate")) self.addSalida(QtWidgets.QApplication.translate("pychemqt", "Residue")) if equipment: self.setEquipment(equipment) if __name__ == "__main__": import sys from lib.corriente import Corriente app = QtWidgets.QApplication(sys.argv) entrada = Corriente(T=340, P=101325, caudalMasico=0.01, ids=[10, 38, 22, 61], fraccionMolar=[.3, 0.5, 0.05, 0.15]) flash = Flash(entrada=entrada) dialogo = UI_equipment(flash) dialogo.show() sys.exit(app.exec_())
def calculo(self): if self.todos_datos(): self.rellenoSalida() def rellenoSalida(self): pass def todos_datos(self): pass def calcularCostos(self): if self.todos_datos(): if self.tipo.currentIndex()==0: self.FireHeater.Coste(self.factorInstalacion.value(), 0, self.tipobox.currentIndex(), self.material.currentIndex()) else: self.FireHeater.Coste(self.factorInstalacion.value(), 1, self.tipocilindrico.currentIndex(), self.material.currentIndex()) self.C_adq.setValue(self.FireHeater.C_adq.config()) self.C_inst.setValue(self.FireHeater.C_inst.config()) if __name__ == "__main__": import sys from lib.corriente import Corriente, Mezcla app = QtWidgets.QApplication(sys.argv) agua=Corriente(300, 1, 3600, Mezcla([62], [1])) dialogo = UI_equipment(agua) dialogo.show() sys.exit(app.exec_())
fracciones, h = self.reaccion.conversion(self.entrada, T) elif self.thermal == 3: pass print(fracciones) self.Salida = Corriente(T=T, P=self.entrada.P, caudalMasico=self.entrada.caudalmasico, fraccionMolar=fracciones, solido=self.entrada.solido) self.Heat = unidades.Power(self.Salida.h - self.entrada.h - h) if __name__ == '__main__': from math import exp, log mezcla = Corriente(T=300, P=101325., caudalMasico=1.0, ids=[1, 46, 47, 62], fraccionMolar=[0.03, 0.96, 0.01, 0.]) reaccion = Reaction(comp=[1, 46, 47, 62], coef=[-2, 0, -1, 2], tipo=0, base=0, conversion=0.9) print(reaccion) reactor = Reactor(entrada=mezcla, reaccion=[reaccion], thermal=1) print(reactor.status) print(reactor.Salida.fraccion, reactor.Salida.T, reactor.Heat.MJh)
elif self.material == 2: #Monel a, b = 70., 5.50 else: #Nickel a, b = 84.4, 6.56 else: #Proceso inorgánico if self.material == 0: #Hastelloy a, b = 300., 10. elif self.material == 1: #Acero Inoxidable a, b = 98., 5.06 elif self.material == 2: #Monel a, b = 114., 7.14 else: #Nickel a, b = 143., 9.43 W = self.entrada.caudal.Tmh C = (a + b * W) * 1000 self.C_adq = unidades.Currency(C * self.Current_index / self.Base_index) self.C_inst = unidades.Currency(self.C_adq * self.f_install) if __name__ == '__main__': entrada = Corriente(423.15, 3, 9000, [[46, 47, 49, 64], [0.78, 0.21, 0.0001, 0.0009]], [64], [[1e-6, 1]]) cristalizador = Crystallizer(entrada, 0.1) # agua=Corriente(300, 1, 4.3756, [[62], [1]]) # scrubber=Scrubber(entrada, agua, 0.1)
self.DeTube.setValue(material[6]) def showFinTube(self): dialogo = Dialog_Finned(self.Equipment.kwargs) if dialogo.exec_(): kwarg = dialogo.kwarg() self.calculo(**kwarg) if __name__ == "__main__": import sys from lib.corriente import Corriente app = QtGui.QApplication(sys.argv) caliente = Corriente(T=140 + 273.15, P=361540., caudalMasico=1.36, ids=[62], fraccionMolar=[1.]) fria = Corriente(T=20 + 273.15, P=101325., caudalMasico=5000 / 3600., ids=[62], fraccionMolar=[1.]) Cambiador = Hairpin(entradaTubo=caliente, entradaExterior=fria, modo=1, DiTube=0.0525, DeTube=0.0603, DeeTube=0.0779, kTube=54, rTube=0.0459994e-3,
self.rellenoSalida() def rellenoSalida(self): pass def todos_datos(self): pass def calcularCostos(self): if self.todos_datos(): self.ShellTube.Coste(self.factorInstalacion.value(), 0, self.tipo.currentIndex(), self.material.currentIndex()) self.C_adq.setValue(self.ShellTube.C_adq.config()) self.C_inst.setValue(self.ShellTube.C_inst.config()) if __name__ == "__main__": import sys from lib.corriente import Corriente, Mezcla app = QtWidgets.QApplication(sys.argv) agua = Corriente(T=300, P=101325, caudalMasico=3600, ids=[62], fraccion=[1]) dialogo = UI_equipment(agua) dialogo.show() sys.exit(app.exec_())
# agua=Corriente(T=300, P=101325., caudalMasico=1000, ids=[4, 5, 6, 7, 8, 10, 11, 12, 13], fraccionMolar=[0.02361538, 0.2923077, 0.3638462, 0.02769231, 0.01153846, 0.01769231, 0.03007692, 0.2093846, 0.02384615]) # columna=ColumnFUG(entrada=agua, LK=2, LKsplit=0.9, HK=3, HKsplit=0.9, R_Rmin=1.05, calc_feed=0, DeltaP=0.1) # print columna.Rmin # print columna.DutyCondenser.MJh, columna.DutyReboiler.MJh # blend=Corriente(T=340, P=101325, caudalMasico=1, fraccionMolar=[0.3, 0.5, 0.05, 0.15]) # columna=ColumnFUG(entrada=blend, LK=0, LKsplit=0.9866, HK=3, HKsplit=0.639, R_Rmin=1.1, feed=0) # P = unidades.Pressure(315, "psi") # blend=Corriente(T=T, P=P, caudalMasico=1, fraccionMolar=[0.26, 0.09, 0.25, 0.17, 0.11, 0.12]) # columna=ColumnFUG(entrada=blend, LK=0, LKsplit=0.96666, HK=3, HKsplit=0.95, R_Rmin=1.2) # print columna.DutyCondenser # print((blend.mezcla.ids)) # kw = {"MEoS": True, "coolProp": True} # entrada = Corriente(T=300, x=0.5, caudalMasico=0.01, ids=[5, 6, 7, 8], # fraccionMolar=[.3, 0.5, 0.05, 0.15], **kw) kw = {"MEoS": True, "coolProp": True, "ids": [5, 6, 7, 8, 10]} entrada = Corriente(**kw) entrada(T=300) entrada(x=0.5) entrada(caudalMasico=0.01) entrada(fraccionMolar=[.3, 0.25, 0.05, 0.15, 0.25]) flash = Flash(entrada=entrada) print(flash.propTxt()) # from scipy import * # from scipy.integrate import odeint # from pylab import * # import matplotlib.pyplot as plt # batch()
def calculo(self): self.entrada = self.kwargs["entrada"] self.LKsplit = unidades.Dimensionless(self.kwargs["LKsplit"]) self.HKsplit = unidades.Dimensionless(self.kwargs["HKsplit"]) self.RCalculada = unidades.Dimensionless(self.kwargs["R"]) self.R_Rmin = unidades.Dimensionless(self.kwargs["R_Rmin"]) if self.kwargs["Pd"]: self.Pd = unidades.Pressure(self.kwargs["Pd"]) else: self.Pd = self.entrada.P self.DeltaP = unidades.Pressure(self.kwargs["DeltaP"]) #Estimate splits of components b = [] d = [] for i, caudal_i in enumerate(self.entrada.caudalunitariomolar): if i == self.kwargs["LK"]: b.append(caudal_i * (1 - self.LKsplit)) d.append(caudal_i * self.LKsplit) elif i == self.kwargs["HK"]: d.append(caudal_i * (1 - self.HKsplit)) b.append(caudal_i * self.HKsplit) elif self.entrada.eos.Ki[i] > self.entrada.eos.Ki[ self.kwargs["LK"]]: b.append(0) d.append(caudal_i) elif self.entrada.eos.Ki[i] < self.entrada.eos.Ki[ self.kwargs["HK"]]: d.append(0) b.append(caudal_i) else: d.append(caudal_i * 0.5) b.append(caudal_i * 0.5) while True: bo = b do = d xt = [Q / sum(d) for Q in d] xb = [Q / sum(b) for Q in b] Qt = sum( [di * comp.M for di, comp in zip(d, self.entrada.componente)]) Qb = sum( [bi * comp.M for bi, comp in zip(b, self.entrada.componente)]) destilado = Corriente(T=self.entrada.T, P=self.Pd, caudalMasico=Qt, fraccionMolar=xt) residuo = Corriente(T=self.entrada.T, P=self.Pd, caudalMasico=Qb, fraccionMolar=xb) #TODO: Add algorithm to calculate Pd and condenser type fig 12.4 pag 230 #Fenske equation for Nmin alfam = (destilado.eos.Ki[self.kwargs["LK"]] / destilado.eos.Ki[self.kwargs["HK"]] * residuo.eos.Ki[self.kwargs["LK"]] / residuo.eos.Ki[self.kwargs["HK"]])**0.5 Nmin = log10( destilado.caudalunitariomolar[self.kwargs["LK"]] / destilado.caudalunitariomolar[self.kwargs["HK"]] * residuo.caudalunitariomolar[self.kwargs["HK"]] / residuo.caudalunitariomolar[self.kwargs["LK"]]) / log10(alfam) #Evaluación composición salidas b = [] d = [] for i in range(len(self.entrada.ids)): if i in [self.kwargs["LK"], self.kwargs["HK"]]: b.append(bo[i]) d.append(do[i]) else: alfa = (destilado.eos.Ki[i] / destilado.eos.Ki[self.kwargs["HK"]] * residuo.eos.Ki[i] / residuo.eos.Ki[self.kwargs["HK"]])**0.5 b.append(self.entrada.caudalunitariomolar[i] / (1 + do[self.kwargs["HK"]] / bo[self.kwargs["HK"]] * alfa**Nmin)) d.append(self.entrada.caudalunitariomolar[i] * do[self.kwargs["HK"]] / bo[self.kwargs["HK"]] * alfa**Nmin / (1 + do[self.kwargs["HK"]] / bo[self.kwargs["HK"]] * alfa**Nmin)) res = sum([ abs(inicial - final) for inicial, final in zip(bo, b) ]) + sum([abs(inicial - final) for inicial, final in zip(do, d)]) if res < 1e-10: self.Nmin = Nmin - self.kwargs["condenser"] + 1 break #Calculo de la razón de reflujo mínima, ecuación de Underwood alfa = self.entrada.eos.Ki[self.kwargs["LK"]] / self.entrada.eos.Ki[ self.kwargs["HK"]] self.Rmin = unidades.Dimensionless( abs( float(destilado.caudalmolar / self.entrada.caudalmolar * (destilado.fraccion[self.kwargs["LK"]] / self.entrada.Liquido.fraccion[self.kwargs["LK"]] - alfa * destilado.fraccion[self.kwargs["HK"]] / self.entrada.Liquido.fraccion[self.kwargs["HK"]]) / (alfa - 1)))) #Cálculo del número de etapas reales, ecuación de Gilliland if self.R_Rmin and not self.RCalculada: self.RCalculada = unidades.Dimensionless(self.R_Rmin * self.Rmin) X = (self.RCalculada - self.Rmin) / (self.RCalculada + 1) Y = 1 - exp((1 + 54.4 * X) / (11 + 117.2 * X) * (X - 1) / X**0.5) self.NTray = unidades.Dimensionless((Y + self.Nmin) / (1 - Y) - 1 - self.kwargs["condenser"]) #Cálculo del piso de la alimentación if self.kwargs["feed"]: #Ec. de Fenske alfa_b = residuo.eos.Ki[self.kwargs["LK"]] / residuo.eos.Ki[ self.kwargs["HK"]] alfa_d = destilado.eos.Ki[self.kwargs["LK"]] / destilado.eos.Ki[ self.kwargs["HK"]] alfa_f = self.entrada.eos.Ki[ self.kwargs["LK"]] / self.entrada.eos.Ki[self.kwargs["HK"]] ratio = log(destilado.fraccion[self.kwargs["LK"]] / self.entrada.fraccion[self.kwargs["LK"]] * self.entrada.fraccion[self.kwargs["HK"]] / destilado.fraccion[self.kwargs["HK"]]) / log( self.entrada.fraccion[self.kwargs["LK"]] / residuo.fraccion[self.kwargs["LK"]] * residuo.fraccion[self.kwargs["HK"]] / self.entrada.fraccion[self.kwargs["HK"]]) * log( (alfa_b * alfa_f)**0.5) / log( (alfa_d * alfa_f)**0.5) else: #Ec. de Kirkbride ratio = (self.entrada.fraccion[self.kwargs["HK"]] / self.entrada.fraccion[self.kwargs["LK"]] * residuo.fraccion[self.kwargs["LK"]]**2 / destilado.fraccion[self.kwargs["HK"]]**2 * residuo.caudalmolar / destilado.caudalmolar)**0.206 self.Ns = self.NTray / (ratio + 1) self.Nr = self.NTray - self.Ns self.N_feed = unidades.Dimensionless(self.Ns + 1) if self.kwargs["condenser"]: #Parcial Tout = destilado.eos._Dew_T() else: Tout = destilado.eos._Bubble_T() Tin = destilado.eos._Dew_T() SalidaDestilado = destilado.clone(T=Tout) #FIXME: o el ejemplo está mal planteado o este valor es ilógico ToutReboiler = residuo.eos._Bubble_T() ToutReboiler2 = residuo.eos._Dew_T() print((ToutReboiler, ToutReboiler2, Tin, Tout)) SalidaResiduo = residuo.clone(T=ToutReboiler) self.salida = [SalidaDestilado, SalidaResiduo] inCondenser = destilado.clone(T=Tin, P=self.entrada.P, split=self.RCalculada + 1) outCondenser = destilado.clone(T=Tout, P=self.entrada.P, split=self.RCalculada + 1) self.DutyCondenser = unidades.Power(outCondenser.h - inCondenser.h) self.DutyReboiler = unidades.Power(SalidaDestilado.h + SalidaResiduo.h - self.DutyCondenser - self.entrada.h) self.DestiladoT = SalidaDestilado.T self.DestiladoP = SalidaDestilado.P self.DestiladoMassFlow = SalidaDestilado.caudalmasico self.DestiladoMolarComposition = SalidaDestilado.fraccion self.ResiduoT = SalidaResiduo.T self.ResiduoP = SalidaResiduo.P self.ResiduoMassFlow = SalidaResiduo.caudalmasico self.ResiduoMolarComposition = SalidaResiduo.fraccion self.LKName = self.salida[0].componente[self.kwargs["LK"]].nombre self.HKName = self.salida[0].componente[self.kwargs["HK"]].nombre
# NHPS=r_[0]*9 # bomba(entrada=agua, usarCurva=1, calculo=1, DeltaP=DeltaP.atm, curvaCaracteristica=[3.5, 1500, Q, h, Pot, NHPS]) ## print bomba.head, "m" ## print bomba.entrada.caudal_volumetrico.m3h, "m3h" ## print bomba.rendimiento*100, "%" ## print bomba.power.hp, "HP, ", bomba.power.kW, "kW" ## print bomba.salida.P.atm, "atm" ## print agua.caudal_volumetrico.m3h, bomba.entrada.caudal_volumetrico.m3h # bomba.coste(2.8, 421.2, 600) ## print bomba.C_bomba, bomba.C_motor, bomba.C_adq, bomba.C_inst ## print bomba.C_inst # bomba.export2xls() agua = Corriente(T=275, P=101325., ids=[62], caudalMasico=1, fraccionMolar=[1.]) bomba = Pump(entrada=agua, rendimiento=0.75, deltaP=20 * 101325, tipo_bomba=1) # print bomba.power.hp # print bomba.C_inst # print bool(bomba) # bomba.clear() # print bomba.__dict__ # print bool(bomba) # bomba=Pump() # print bomba.__class__
def loadFromStream(self, stream, huella=True, run=True): """Read project from stream huella: boolean to save project file to pychemqt_temporal""" # read configuration config = ConfigParser() for i in range(stream.readInt32()): section = stream.readString() config.add_section(section) for contador_option in range(stream.readInt32()): option = stream.readString() valor = stream.readString() config.set(section, option, valor) #TODO: Necesario para cargar los proyectos viejos # config.set("Thermo", "freesteam", "False") config.set("Units", "MolarSpecificHeat", "0") self.setConfig(config) if not huella: os.rename(conf_dir + "pychemqtrc_temporal", conf_dir + "pychemqtrc_temporal_bak") config.write(open(conf_dir + "pychemqtrc_temporal", "w")) # read equipments items = {} contador_equipos = stream.readInt32() for i in range(contador_equipos): id = stream.readString() if id[0] == "e": equip = equipments[stream.readInt32()]() equip.readFromStream(stream, run) else: equip = None items[id] = equip self.setItems(items) # read streams streams = {} contador_streams = stream.readInt32() for item in range(contador_streams): id = stream.readInt32() up = stream.readString() down = stream.readString() ind_up = stream.readInt32() ind_down = stream.readInt32() obj = Corriente() obj.readFromStream(stream, run) streams[id] = (up, down, ind_up, ind_down, obj) if huella: if down[0] == "e": equip = self.items[down] if isinstance(equip, Mixer): kwargs = {"entrada": obj, "id_entrada": ind_down} else: kwargs = {equip.kwargsInput[ind_down]: obj} equip(**kwargs) self.setStreams(streams) if not huella: os.rename(conf_dir + "pychemqtrc_temporal_bak", conf_dir + "pychemqtrc_temporal")
(QApplication.translate("pychemqt", "Purchase Cost"), "C_adq", Currency), (QApplication.translate("pychemqt", "Installed Cost"), "C_inst", Currency) ] return list if __name__ == '__main__': # import doctest # doctest.testmod() # corriente=Corriente(T=400, P=101325, caudalMasico=0.1, fraccionMasica=[1., 0, 0, 0]) # compresor=Compressor(entrada=corriente, metodo=1, termodinamica=0, razon=3, rendimiento=0.75, etapas=1) # print compresor.power.kW # compresor(compresor=2, transmision=1, motor=0, rpm=1) # print compresor.C_inst corriente = Corriente(T=873.15, P=1013250, caudalMasico=0.1, fraccionMasica=[1.]) turbina = Turbine(entrada=corriente, metodo=1, razon=0.3, rendimiento=0.5) print turbina.power.MJh print turbina.C_inst print turbina.salida[0].T # agua=Corriente(T=500, P=101325., caudalMasico=1, fraccionMasica=[1.]) # print agua.P*2 # compresor=Compressor(entrada=agua, Pout=5*101325, rendimiento=0.75)
17.5e-6, 22.4e-6, 26.2e-6, 31.8e-6, 37e-6, 42.4e-6, 48e-6, 54e-6, 60e-6, 69e-6, 81.3e-6, 96.5e-6, 109e-6, 127e-6 ] fracciones = [ 0.02, 0.03, 0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.05, 0.03, 0.02 ] solido = Solid(T=300, caudalSolido=[1 / 3600.], distribucion_diametro=diametros, distribucion_fraccion=fracciones, solids=[638]) kw = {"fraccionMolar": [1.], "MEoS": True} aire = Corriente(T=350, P=101325, caudalMasico=0.01, ids=[475], solido=solido, **kw) agua = Corriente(T=300, P=101325, caudalMasico=0.1, ids=[62], **kw) scrubber = Scrubber(entradaGas=aire, entradaLiquido=agua, diametro=0.25, modelo_rendimiento=0, modelo_DeltaP=1, k=1000) dialogo = UI_equipment(scrubber) # dialogo = UI_equipment() dialogo.show() sys.exit(app.exec_())
valor = self.fracciones.getColumn(0, False) if self.criterio.currentIndex() == 0: if len(valor)+1 < self.fracciones.rowCount(): return elif len(valor)+1 == self.fracciones.rowCount(): valor.append(1-sum(valor)) elif len(valor) == self.fracciones.rowCount(): valor[-1] = 1-sum(valor[:-1]) self.calculo(**{parametro: valor}) def rellenar(self): UI_equip.rellenar(self) if self.Equipment.status == 1 and self.criterio.currentIndex() == 1: self.entrada.setCorriente(self.Equipment.entrada) def rellenarInput(self): UI_equip.rellenarInput(self) self.fracciones.setColumn(0, self.Equipment.kwargs["split"]) if __name__ == "__main__": import sys from lib.corriente import Corriente app = QtWidgets.QApplication(sys.argv) agua = Corriente(T=300, P=101325, caudalMasico=1, ids=[62], fraccionMolar=[0.1]) divisor = Divider(entrada=agua, salidas=2, split=[0.3, 0.7]) dialogo = UI_equipment(divisor) dialogo.show() sys.exit(app.exec_())
# project.setInput(2, fria) # Cambiador(modo=1, # DiTube=0.0525, DeTube=0.0603, DeeTube=0.0779, kTube=54, rTube=0.0459994e-3, # annulliFouling= 0.000352, tubeFouling=0.000176, LTube=2.5) # project.setItem(1, Cambiador) # print project.getOutput(1), project.getStream(2) # eq=project.getItem(1) # print eq.kwargs # print eq.status, eq.msg # print "Project has cycle: ", project.hasCycle() # bomba(entrada=entrada, rendimiento=0.75, deltaP=2) # # items={"i1": entrada, "e1": bomba} # streams=[("i1", "e1", 0, 0), ("e1", "o1", 0, 0)] # # project=Project(items=items, streams=streams) # project.printer() # print dir(gv) # print gv.nextin(project.graph) project = Project() project.addItem("i1", Corriente()) project.addItem("i2", Corriente()) mezclador = Mixer() project.addItem("e1", mezclador) project.addStream(1, "i1", "e1", ind_down=0) project.addStream(2, "i2", "e1", ind_down=1) project.addItem("o1", Corriente()) project.addStream(3, "e1", "o1")
self.tiempo.setResaltado(False) self.deltaP.setReadOnly(False) self.deltaP.setRetornar(True) self.deltaP.setResaltado(True) else: self.numFiltros.setReadOnly(True) self.numFiltros.setRetornar(False) self.numFiltros.setResaltado(False) self.tiempo.setReadOnly(False) self.tiempo.setRetornar(True) self.tiempo.setResaltado(True) self.deltaP.setReadOnly(False) self.deltaP.setRetornar(True) self.deltaP.setResaltado(True) if __name__ == "__main__": import sys from lib.corriente import Mezcla, Corriente, Solid app = QtWidgets.QApplication(sys.argv) distribucion = [[17.5, 0.02], [22.4, 0.03], [26.2, 0.05], [31.8, 0.1], [37, 0.1], [42.4, 0.1], [48, 0.1], [54, 0.1], [60, 0.1], [69, 0.1], [81.3, 0.1], [96.5, 0.05], [109, 0.03], [127, 0.02]] solido = Solid([64], [138718], distribucion) entrada = Corriente(423.15, 3, 11784, Mezcla([475], [1]), solido) dialogo = UI_equipment(entrada) dialogo.show() sys.exit(app.exec_())
lyt_Calc.addWidget(QtWidgets.QLabel(QtWidgets.QApplication.translate( "pychemqt", "T bubble point")), 6, 1) self.Bubble = Entrada_con_unidades(Temperature) self.Bubble.valueChanged.connect(partial(self.changeParams, "Bubble")) lyt_Calc.addWidget(self.Bubble, 6, 2) lyt_Calc.addItem(QtWidgets.QSpacerItem( 20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding), 10, 1, 1, 6) self.criterio_Changed(0) if equipment: self.setEquipment(equipment) def criterio_Changed(self, int): self.Pout.setEnabled(int == 1) self.DeltaP.setEnabled(int == 1) self.Dew.setEnabled(int == 1) self.Bubble.setEnabled(int == 1) self.calculo(off=int) if __name__ == "__main__": import sys from lib.corriente import Corriente app = QtWidgets.QApplication(sys.argv) agua = Corriente(T=300, P=101325, caudalMasico=1, fraccionMasica=[1.]) valvula = Valve(entrada=agua, off=1, DeltaP=1000) dialogo = UI_equipment(valvula) dialogo.show() sys.exit(app.exec_())
list = [(QApplication.translate("pychemqt", "Output Temperature"), "outT", unidades.Temperature), (QApplication.translate("pychemqt", "Output Pressure"), "outP", unidades.Pressure), (QApplication.translate("pychemqt", "Output vapor fraction"), "outX", unidades.Dimensionless), (QApplication.translate("pychemqt", "Working Condition"), ("TEXT_WORKING", "off"), str)] return list if __name__ == '__main__': # import doctest # doctest.testmod() agua = Corriente(T=300, P=101325, caudalMasico=1, fraccionMasica=[1.]) # agua2=Corriente(T=300, P=101325*2, caudalMasico=2, fraccionMasica=[1.]) mezclador = Mixer(entrada=[agua, Corriente()], criterio=0) # print mezclador.status, mezclador.msg print mezclador.salida[0].kwargs # print mezclador.salida[0].caudalmasico, # agua3=Corriente(T=300, P=101325, caudalMasico=4, fraccionMasica=[1., 0, 0, 0]) # mezclador(id_entrada=2, entrada=agua3) # print mezclador.salida[0].caudalmasico # agua=Corriente(T=300, P=101325, caudalMasico=1, fraccionMolar=[0.3, 0.2, 0.25, 0.25]) # divisor=Divider(entrada=agua, salidas=3) # divisor(split=[0.3, 0.45, 0.25]) # print divisor.status, divisor.kwargs["salidas"], divisor.msg # # agua=Corriente(T=300, P=101325, caudalMasico=1, fraccionMasica=[1., 0, 0, 0])