예제 #1
0
 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)
예제 #2
0
    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
예제 #3
0
 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
예제 #4
0
    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
예제 #5
0
    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
예제 #6
0
    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")
예제 #7
0
파일: pump.py 프로젝트: edusegzy/pychemqt
    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
예제 #8
0
 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)
예제 #9
0
    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
예제 #10
0
    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)
예제 #11
0
 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)
예제 #12
0
    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)
예제 #13
0
        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_())
예제 #14
0
                                           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_())
예제 #15
0
    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_())
예제 #16
0
            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)
예제 #17
0
            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)
예제 #18
0
                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,
예제 #19
0
            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_())
예제 #20
0
    #    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()
예제 #21
0
    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
예제 #22
0
파일: pump.py 프로젝트: edusegzy/pychemqt
    #    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__
예제 #23
0
    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")
예제 #24
0
            (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)
예제 #25
0
        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_())
예제 #26
0
            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_())
예제 #27
0
#    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")
예제 #28
0
            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_())
예제 #29
0
        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_())
예제 #30
0
        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])