def readStatefromJSON(self, solid): if solid: self._bool = True self.status = solid["status"] self.ids = solid["ids"] self.componente = [Componente(int(i)) for i in self.ids] self.caudalUnitario = [MassFlow(q) for q in solid["unitFlow"]] self.caudal = MassFlow(solid["caudal"]) self.diametros = [Length(d, "m", "ParticleDiameter") for d in solid["diametros"]] self.fracciones = solid["fracciones"] self.fracciones_acumuladas = solid["fracciones_acumuladas"] self.diametro_medio = Length(solid["diametro_medio"]) self.rho = Density(solid["rho"]) self.T = Temperature(solid["T"]) else: self._bool = False self.status = False
def calculo(self): if self.kwargs["solids"] is not None: self.ids = self.kwargs["solids"] else: Config = getMainWindowConfig() txt = Config.get("Components", "Solids") if isinstance(txt, str): self.ids = eval(txt) else: self.ids = txt self.componente = [Componente(int(i)) for i in self.ids] caudal = self.kwargs.get("caudalSolido", []) diametro_medio = self.kwargs.get("diametroMedio", 0.0) fraccion = self.kwargs.get("distribucion_fraccion", []) diametros = self.kwargs.get("distribucion_diametro", []) if self.status == 0: self._bool = False return else: self._bool = True self.caudalUnitario = [MassFlow(i) for i in caudal] self.caudal = MassFlow(sum(self.caudalUnitario)) self.diametros = diametros self.fracciones = fraccion if self.status == 2: self.diametros = [ Length(i, "m", magnitud="ParticleDiameter") for i in diametros ] self.fracciones = fraccion diametro_medio = 0 self.fracciones_acumuladas = [0] for di, xi in zip(diametros, fraccion): diametro_medio += di * xi self.fracciones_acumuladas.append( xi + self.fracciones_acumuladas[-1]) del self.fracciones_acumuladas[0] self.diametro_medio = Length(diametro_medio, magnitud="ParticleDiameter") self.RhoS(self.kwargs.get("T", 300))
if __name__ == "__main__": # from lib.mezcla import Mezcla # mix = Mezcla(tipo=5, caudalMolar=1, ids=[2, 47, 98], fraccionMolar=[0.5, 0.3, 0.2]) # # eq = PRMathiasCopeman(800, 36937532, mix) # eq = PRMathiasCopeman(800, 34925714.27837578, mix) # Methane, O2, Ar # Tc = (190.564, 154.581, 150.687) # Pc = (4599200, 5042800, 4863000) # f_acent = (0.01100, 0.02200, -0.00200) # x = (0.50000, 0.30000, 0.20000) from lib.mezcla import Mezcla from lib.compuestos import Componente ch4 = Componente(2) ch4.Tc, ch4.Pc, ch4.f_acent = 190.564, 4599200, 0.011 o2 = Componente(47) o2.Tc, o2.Pc, o2.f_acent = 154.581, 5042800, 0.022 ar = Componente(98) ar.Tc, ar.Pc, ar.f_acent = 150.687, 4863000, -0.002 mix = Mezcla(5, customCmp=[ch4, o2, ar], caudalMolar=1, fraccionMolar=[0.5, 0.3, 0.2]) print(2222) eq = PRMathiasCopeman(800, 34933409.8798343, mix) print(eq._phir(800, 5000, eq.yi))
def calculo(self): fluido = self._name() args = self.args() estado = CP.AbstractState("HEOS", fluido) if self._multicomponent: estado.set_mole_fractions(self.kwargs["fraccionMolar"]) estado.update(self._par, *args) self.M = unidades.Dimensionless(estado.molar_mass()*1000) if self._multicomponent: # Disabled CoolProp critical properties for multicomponent, # see issue #1087 # Calculate critical properties with mezcla method # Coolprop for mixtures can fail and it's slow Cmps = [Componente(int(i)) for i in self.kwargs["ids"]] # Calculate critic temperature, API procedure 4B1.1 pag 304 V = sum([xi*cmp.Vc for xi, cmp in zip(self.kwargs["fraccionMolar"], Cmps)]) k = [xi*cmp.Vc/V for xi, cmp in zip(self.kwargs["fraccionMolar"], Cmps)] Tcm = sum([ki*cmp.Tc for ki, cmp in zip(k, Cmps)]) self.Tc = unidades.Temperature(Tcm) # Calculate pseudocritic temperature tpc = sum([x*cmp.Tc for x, cmp in zip(self.kwargs["fraccionMolar"], Cmps)]) # Calculate pseudocritic pressure ppc = sum([x*cmp.Pc for x, cmp in zip(self.kwargs["fraccionMolar"], Cmps)]) # Calculate critic pressure, API procedure 4B2.1 pag 307 sumaw = 0 for xi, cmp in zip(self.kwargs["fraccionMolar"], Cmps): sumaw += xi*cmp.f_acent pc = ppc+ppc*(5.808+4.93*sumaw)*(self.Tc-tpc)/tpc self.Pc = unidades.Pressure(pc) # Calculate critic volume, API procedure 4B3.1 pag 314 sumaxvc23 = sum([xi*cmp.Vc**(2./3) for xi, cmp in zip(self.kwargs["fraccionMolar"], Cmps)]) k = [xi*cmp.Vc**(2./3)/sumaxvc23 for xi, cmp in zip(self.kwargs["fraccionMolar"], Cmps)] # TODO: Calculate C value from component type. # For now it suppose all are hidrycarbon (C=0) C = 0 V = [[-1.4684*abs((cmpi.Vc-cmpj.Vc)/(cmpi.Vc+cmpj.Vc))+C for cmpj in Cmps] for cmpi in Cmps] v = [[V[i][j]*(cmpi.Vc+cmpj.Vc)/2. for j, cmpj in enumerate( Cmps)] for i, cmpi in enumerate(Cmps)] suma1 = sum([ki*cmp.Vc for ki, cmp in zip(k, Cmps)]) suma2 = sum([ki*kj*v[i][j] for j, kj in enumerate(k) for i, ki in enumerate(k)]) self.rhoc = unidades.Density((suma1+suma2)*self.M) else: self.Tc = unidades.Temperature(estado.T_critical()) self.Pc = unidades.Pressure(estado.p_critical()) self.rhoc = unidades.Density(estado.rhomass_critical()) self.R = unidades.SpecificHeat(estado.gas_constant()/self.M) self.Tt = unidades.Temperature(estado.Ttriple()) estado2 = CP.AbstractState("HEOS", fluido) if self._multicomponent: estado2.set_mole_fractions(self.kwargs["fraccionMolar"]) estado2.update(CP.PQ_INPUTS, 101325, 1) self.Tb = unidades.Temperature(estado2.T()) self.f_accent = unidades.Dimensionless(estado.acentric_factor()) # Dipole moment only available for REFPROP backend # self.momentoDipolar(estado.keyed_output(CP.idipole_moment)) self.phase, x = self.getphase(estado) self.x = unidades.Dimensionless(x) if self._multicomponent: string = fluido.replace("&", " (%0.2f), ") string += " (%0.2f)" self.name = string % tuple(self.kwargs["fraccionMolar"]) self.CAS = "" self.synonim = "" self.formula = "" else: self.name = fluido self.CAS = estado.fluid_param_string("CAS") self.synonim = estado.fluid_param_string("aliases") self.formula = estado.fluid_param_string("formula") self.P = unidades.Pressure(estado.p()) self.T = unidades.Temperature(estado.T()) self.Tr = unidades.Dimensionless(self.T/self.Tc) self.Pr = unidades.Dimensionless(self.P/self.Pc) self.rho = unidades.Density(estado.rhomass()) self.v = unidades.SpecificVolume(1./self.rho) cp0 = self._prop0(estado) self._cp0(cp0) self.Liquido = ThermoAdvanced() self.Gas = ThermoAdvanced() if self.x == 0: # liquid phase self.fill(self.Liquido, estado) self.fill(self, estado) self.fillNone(self.Gas) elif self.x == 1: # vapor phase self.fill(self.Gas, estado) self.fill(self, estado) self.fillNone(self.Liquido) else: # Two phase liquido = CP.AbstractState("HEOS", fluido) if self._multicomponent: xi = estado.mole_fractions_liquid() liquido.set_mole_fractions(xi) liquido.specify_phase(CP.iphase_liquid) liquido.update(CP.QT_INPUTS, 0, self.T) self.fill(self.Liquido, liquido) vapor = CP.AbstractState("HEOS", fluido) if self._multicomponent: yi = estado.mole_fractions_vapor() vapor.set_mole_fractions(yi) vapor.specify_phase(CP.iphase_gas) vapor.update(CP.QT_INPUTS, 1, self.T) self.fill(self.Gas, vapor) self.fill(self, estado) # Calculate special properties useful only for one phase if self._multicomponent: self.sigma = unidades.Tension(None) elif x < 1 and self.Tt <= self.T <= self.Tc: self.sigma = unidades.Tension(estado.surface_tension()) else: self.sigma = unidades.Tension(None) self.virialB = unidades.SpecificVolume(estado.Bvirial()) self.virialC = unidades.SpecificVolume_square(estado.Cvirial()) self.invT = unidades.InvTemperature(-1/self.T) if 0 < self.x < 1: self.Hvap = unidades.Enthalpy(self.Gas.h-self.Liquido.h) self.Svap = unidades.SpecificHeat(self.Gas.s-self.Liquido.s) else: self.Hvap = unidades.Enthalpy(None) self.Svap = unidades.SpecificHeat(None)