def Ks(self, T, P, xs, ys, Psats): gammas = self.gammas(T=T, xs=xs) if self.use_phis: phis_g = self.phis_g(T=T, P=P, ys=ys) phis_l = self.phis_l(T=T, P=P, xs=xs) # print(phis_l, phis_g, [i/j for i, j in zip(phis_l, phis_g)]) if self.use_Poynting: Poyntings = self.Poyntings(T=T, P=P, Psats=Psats) return [ K_value(P=P, Psat=Psats[i], gamma=gammas[i], phi_l=phis_l[i], phi_g=phis_g[i], Poynting=Poyntings[i]) for i in self.cmps ] return [ K_value(P=P, Psat=Psats[i], gamma=gammas[i], phi_l=phis_l[i], phi_g=phis_g[i]) for i in self.cmps ] if self.use_Poynting: Poyntings = self.Poyntings(T=T, P=P, Psats=Psats) Ks = [ K_value(P=P, Psat=Psats[i], gamma=gammas[i], Poynting=Poyntings[i]) for i in self.cmps ] return Ks Ks = [K_value(P=P, Psat=Psats[i], gamma=gammas[i]) for i in self.cmps] return Ks
def flash_PVF_zs(self, P, VF, zs): assert 0 <= VF <= 1 Tsats = self._Tsats(P) T = brenth(self._P_VF_err, min(Tsats) * (1 + 1E-7), max(Tsats) * (1 - 1E-7), args=(P, VF, zs)) Psats = self._Psats(T) Ks = [K_value(P=P, Psat=Psat) for Psat in Psats] V_over_F, xs, ys = flash_inner_loop(zs=zs, Ks=Ks) return 'l/g', xs, ys, V_over_F, T
def flash_UNIFAC_sequential_substitution(T, P, zs, Psats, chemgroups): gammas = UNIFAC(chemgroups=chemgroups, T=T, xs=zs) Ks = [ K_value(P=P, Psat=Psat, gamma=gamma) for Psat, gamma in zip(Psats, gammas) ] V_over_F, xs, ys = flash_inner_loop(zs, Ks) for i in range(100): gammas = UNIFAC(chemgroups=chemgroups, T=T, xs=xs) Ks = [ K_value(P=P, Psat=Psat, gamma=gamma) for Psat, gamma in zip(Psats, gammas) ] V_over_F, xs_new, ys_new = flash_inner_loop(zs, Ks) err = ( sum([abs(x_new - x_old) for x_new, x_old in zip(xs_new, xs)]) + sum([abs(y_new - y_old) for y_new, y_old in zip(ys_new, ys)])) xs, ys = xs_new, ys_new if err < 1E-11: break return V_over_F, xs, ys
def flash_TP_zs(self, T, P, zs): Psats = self._Psats(T) Pdew = dew_at_T(zs, Psats) Pbubble = bubble_at_T(zs, Psats) if P <= Pdew: # phase, ys, xs, quality return 'g', None, zs, 1 elif P >= Pbubble: return 'l', zs, None, 0 else: Ks = [K_value(P=P, Psat=Psat) for Psat in Psats] V_over_F, xs, ys = flash_inner_loop(zs=zs, Ks=Ks) return 'l/g', xs, ys, V_over_F
def flash_TVF_zs(self, T, VF, zs): assert 0 <= VF <= 1 Psats = self._Psats(T) if VF == 0: P = bubble_at_T(zs, Psats) elif VF == 1: P = dew_at_T(zs, Psats) else: P = brenth(self._T_VF_err, min(Psats) * (1 + 1E-7), max(Psats) * (1 - 1E-7), args=(VF, zs, Psats)) Ks = [K_value(P=P, Psat=Psat) for Psat in Psats] V_over_F, xs, ys = flash_inner_loop(zs=zs, Ks=Ks) return 'l/g', xs, ys, V_over_F, P
def _P_VF_err(self, T, P, VF, zs): Psats = self._Psats(T) Ks = [K_value(P=P, Psat=Psat) for Psat in Psats] return flash_inner_loop(zs=zs, Ks=Ks)[0] - VF
def _T_VF_err(self, P, VF, zs, Psats): Ks = [K_value(P=P, Psat=Psat) for Psat in Psats] return flash_inner_loop(zs=zs, Ks=Ks)[0] - VF