def mixture_nichita_ternary(): methane = Chemical('methane') nhexadecane = Chemical('n-hexadecane') carbon_dioxide = Chemical('carbon-dioxide') z = np.array([0.05, 0.05, 0.90]) omegas = np.array([methane.omega, nhexadecane.omega, carbon_dioxide.omega]) Tcs = np.array([methane.Tc, nhexadecane.Tc, carbon_dioxide.Tc]) Pcs = np.array([methane.Pc, nhexadecane.Pc, carbon_dioxide.Pc]) return Mixture(z, Tcs, Pcs, omegas)
def __init__(self, fuel: dict = {"CH4": 1.0}, Ts=298.15, Ps=1.01325e5, **kwargs): self.Ts = Ts self.Ps = Ps # Fuel Decomposition self.fuel_id = {fid: i for (i, fid) in enumerate(fuel.keys())} self.fuel_n = len(self.fuel_id) self.fuel_type = [] self.fuel_frac = [] for (ft, ff) in fuel.items(): self.fuel_type.append(Combustible(ft, Ts, Ps)) self.fuel_frac.append(ff) self.fuel_frac = np.array(self.fuel_frac) self.fuel_frac /= self.fuel_frac.sum() self.AF_ratio = self.AF_stoech ## Reactants Decomposition self.rct_id = {ft: i for (i, ft) in enumerate(fuel)} self.rct_n = len(fuel) if not ('N2' in fuel): self.rct_id['N2'] = self.rct_n self.rct_n += 1 if not ('O2' in fuel): self.rct_id['O2'] = self.rct_n self.rct_n += 1 w, x, y, z = self.get_wxyz() self.rct_chem = [Chemical(rid, Ts, Ps) for rid in self.rct_id.keys()] self.rct_frac = np.zeros(self.rct_n) for rid, i in self.rct_id.items(): if rid == 'O2': self.rct_frac[i] = self.λ * (z + (y - 2 * x) / 4) if 'O2' in fuel: self.rct_frac[i] += fuel['O2'] elif rid == 'N2': self.rct_frac[i] = 3.76 * self.λ * (z + (y - 2 * x) / 4) if 'N2' in fuel: self.rct_frac[i] += fuel['N2'] else: self.rct_frac[i] = fuel[rid] ## Products Creation self.pdt_id = {'CO2': 0, 'CO': 1, 'H2': 2, 'H2O': 3, 'O2': 4, 'N2': 5} self.pdt_n = len(self.pdt_id) self.pdt_chem = [Chemical(pid, Ts, Ps) for pid in self.pdt_id.keys()] self.pdt_frac = np.zeros(self.pdt_n) """
def checkFluid(self): T=float(self.form.editTemperature.text())+273.16 P=float(self.form.editPressure.text())*1e5 self.isMixture=True if self.form.comboFluid.currentText()!='<custom fluid>': self.form.editDensity.setEnabled(False) self.form.editViscosity.setEnabled(False) try: self.fluid=Chemical(self.form.comboFluid.currentText(),T=T,P=P) self.isMixture=False except: self.fluid=Mixture(self.form.comboFluid.currentText(),T=T,P=P) if self.fluid.rhol and self.fluid.mul: self.setLiquid() self.form.radioLiquid.setChecked(True) elif self.fluid.rhog and self.fluid.mug: self.setGas() self.form.radioGas.setChecked(True) else: self.form.labState.setText('*** SOLID (no flow) ***') self.form.editFlow.setText('0') if not self.isMixture: CAS=identifiers.CAS_from_any(self.form.comboFluid.currentText()) IUPAC=identifiers.IUPAC_name(CAS) formula=identifiers.formula(CAS) self.form.labName.setText('CAS = %s\nIUPAC = %s\nformula = %s'%(CAS,IUPAC,formula)) else: self.form.labName.setText(self.form.comboFluid.currentText()+'\n(mixture)') else: # in progress custom fluid self.fluid=None self.form.labName.setText('*** CUSTOM FLUID ***') self.form.editDensity.setEnabled(True) self.form.editViscosity.setEnabled(True) self.form.labResult.setText('---')
def calc(): t_water = float(tempWater_ent.get()) + 273.15 d = float(pipeDia_ent.get()) / 1000 v = float(vel_ent.get()) print('temp water, °C= ', t_water) print('diameter, m= ', d) print('velocity, m/s= ', v) water = Chemical('water', T=t_water, P=1E5) rho_water = water.rho # density mu_water = water.mu # viscosity dynamic # print(mu_water/rho_water) n_reynolds = int(rho_water * v * d / mu_water) print('renolds number=', n_reynolds) if n_reynolds > 4000: print('the flow is turbulent...') else: print('the flow is laminar...') Label(root, text="Results").grid(row=4, column=0, pady=10) res_lbl = Label(root, text=str(n_reynolds), relief=SUNKEN, bg='white') res_lbl.grid(row=5, column=1, pady=2)
def compData(self): db = sqlite3.connect('data.db') cursor = db.cursor() self.A, self.B, self.C, self.Tmax, self.Tmin = np.zeros( len(self.lchem)), np.zeros(len(self.lchem)), np.zeros( len(self.lchem)), np.zeros(len(self.lchem)), np.zeros( len(self.lchem)) self.DG = [] ''' 1,2,3 - Antoine's Constant [Vapour Pressure is in bar] 4,5 - Maximum and minimum Temperature for aplication this equation 6 - List of Molecular Dortmund groups UNIFAC method ''' for i in range(len(self.lchem)): self.aux = [self.lchem[i]] cursor.execute( 'SELECT A,B,C,Tmin,Tmax FROM AntoineConstant WHERE chemicals =(?);', (self.aux)) catch = cursor.fetchall() self.A[i], self.B[i], self.C[i], self.Tmax[i], self.Tmin[ i] = catch[0][0], catch[0][1], catch[0][2], catch[0][3], catch[ 0][4] self.DG.append(Chemical(self.aux[0]).UNIFAC_Dortmund_groups) db.close() return self.A, self.B, self.C, self.Tmax, self.Tmin, self.DG
def checkState(self): T = float(self.form.editTemperature.text()) + 273.16 P = float(self.form.editPressure.text()) * 1e5 try: fluid = Chemical(self.form.comboFluid.currentText(), T=T, P=P) except: fluid = Mixture(self.form.comboFluid.currentText(), T=T, P=P) #if fluid.rhol and fluid.rhog: #self.form.radioLiquid.show() #self.form.radioGas.show() if fluid.rhol: self.isLiquid = True self.form.labState.setText('*** LIQUID ***') self.form.labQ.setText('Flow (m3/h)') self.Rho = fluid.rhol self.Mu = fluid.mul elif fluid.rhog: self.isLiquid = False self.form.labState.setText('*** GAS/VAPOUR ***') self.form.labQ.setText('Flow (kg/h)') self.Rho = fluid.rhog self.Mu = fluid.mug else: self.form.labState.setText('*** SOLID (no flow) ***') self.form.editFlow.setText('0') FreeCAD.Console.PrintMessage('Rho: %.2f\n' % self.Rho)
def __init__(self, fuel='CH4', Ts=298.15, Ps=1.0325e5): self.chem = Chemical(fuel, Ts, Ps) dctn = self.chem.atoms self.w = dctn['N'] if 'N' in dctn else 0 self.x = dctn['O'] if 'O' in dctn else 0 self.y = dctn['H'] if 'H' in dctn else 0 self.z = dctn['C'] if 'C' in dctn else 0
def rho_if(T, P, f_ls=fn_ls, s_ls=sn_ls): ## takes T in K, P in kPa, returns kg/m3 P = P * 1000 rho_ls = [Chemical(f, T, P).rho for f in fn_ls] return rho_ls
def Cpi(T, P, f_ls=fn_ls, s_ls=sn_ls): ## takes T in K, P in kPa, returns J/mol.K P = P * 1000 Cp_ls = [Chemical(f, T, P).Cpm for f in fn_ls] return Cp_ls
def mu_i(T, P, f_ls=fn_ls, s_ls=sn_ls ): ## takes T in K, P in kPa, returns liquid viscosity (Pa.s) P = P * 1000 mu_ls = [Chemical(f, T, P).mu for f in fn_ls] return mu_ls
def MM(f_ls=fn_ls, s_ls=sn_ls, update=False): if update: mm_ls = [Chemical(f, 273.15, 101325).MW for f in fn_ls] return mm_ls else: return [ 58.124, 56.10632, 56.10632, 54.09044, 58.124, 56.10632, 56.10632, 18.01528, 46.06844, 74.1216, 102.17476, 112.21264, 168.31896 ]
def Hf(T, P, f_ls=fn_ls, s_ls=sn_ls, update=False): ## takes T in K, P in kPa, returns J/mol if update: P = P * 1000 Hf_ls = [Chemical(f, T, P).Hf for f in fn_ls] return Hf_ls else: return [ -134990.0, -16900.0, None, 110300.0, -125650.0, -11170.0, -6990.0, -241820.0, -234440.0, -312410.0, None, -104900.0, None ]
def accept(self): Dp = 0 elements = list() fluid = Chemical(self.form.comboFluid.currentText()) Q = float(self.form.editFlow.text()) / 3600 if self.form.comboWhat.currentText() == '<on selection>': elements = FreeCADGui.Selection.getSelection() else: o = FreeCAD.ActiveDocument.getObjectsByLabel( self.form.comboWhat.currentText())[0] if hasattr(o, 'PType') and o.PType == 'PypeBranch': elements = o.Tubes + o.Curves for o in elements: if hasattr(o, 'PType') and o.PType in ['Pipe', 'Elbow']: ID = float(o.ID) / 1000 e = float(self.form.editRough.text()) * 1e-6 / ID v = Q / ((ID)**2 * pi / 4) Re = Reynolds(V=v, D=ID, rho=fluid.rhol, mu=fluid.mul) f = friction.friction_factor(Re, eD=e) # Darcy, =4xFanning if o.PType == 'Pipe': L = float(o.Height) / 1000 K = K_from_f(fd=f, L=L, D=ID) FreeCAD.Console.PrintMessage( 'ID=%.2f\nV=%.2f\ne=%f\nf=%f\nK=%f\nL=%.3f\n***\n' % (ID, v, e, f, K, L)) Dp += dP_from_K(K, rho=fluid.rhol, V=v) elif o.PType == 'Elbow': ang = float(o.BendAngle) R = float(o.BendRadius) / 1000 K = fittings.bend_rounded(ID, ang, f, R) FreeCAD.Console.PrintMessage( 'ID=%.2f\nV=%.2f\ne=%f\nf=%f\nK=%f\nang=%.3f\nR=%f\n***\n' % (ID, v, e, f, K, ang, R)) Dp += dP_from_K(K, rho=fluid.rhol, V=v) elif o.PType == 'Reduct': pass elif hasattr(o, 'Kv') and o.Kv > 0: Dp += (Q * 3600 / o.Kv)**2 * 100000 if Dp > 200: result = ' = %.3f bar' % (Dp / 100000) else: result = ' = %.2e bar' % (Dp / 100000) self.form.labResult.setText(result)
def nitrogen(): return Chemical('N2')
def phase_check(T, P, f_ls=fn_ls, s_ls=sn_ls): P = P * 1e3 P_ls = [Chemical(f, T, P).phase for f in fn_ls] return P_ls
def k(T, P): k_ls = [Chemical(f, T, P).ThermalConductivityLiquid(T, P) for f in fn_ls] return k_ls
def rho(self, T, P): return Chemical(self.chemical_equation, T=T, P=P).rho
def hydrogen_sulfide(): return Chemical('H2S')
def propane(): return Chemical('propane')
def ethane(): return Chemical('ethane')
def methane(): return Chemical('methane')
# *-* coding: utf-8 *-* import math as mt import numpy as np from thermo import Chemical H2 = Chemical('H2') O2 = Chemical('O2') N2 = Chemical('N2') CO2 = Chemical('CO2') H2O = Chemical('H2O') """ Combustible est un objet représentant un combustible ainsi que sa combustion. Un combustible est defini par la formule : Cz Hy Ox Nw Les paramètres sont : - w : indice d'azote - x : indice d'oxygene - y : indice d'hydrogene - z : indice de carbone Le méthane (CH4) est le combustible defini par defaut. """ class Combustible: def __init__(self, fuel='CH4', Ts=298.15, Ps=1.0325e5): self.chem = Chemical(fuel, Ts, Ps) dctn = self.chem.atoms self.w = dctn['N'] if 'N' in dctn else 0
def carbon_dioxide(): return Chemical('CO2')
# Water at 10°C flows in a 150-mm-diameter pipe at a velocity of 5.5 m/s. Is this flow laminar or turbulent? from thermo import Chemical #inputs var t_water = 10 + 273.15 #temp water in K d = 150 / 1000 #diameter, m v = 5.5 #velocity,m/s #get properties water = Chemical('water', T=t_water, P=1E5) rho_water = water.rho #density print('water density', rho_water) mu_water = water.mu #viscosity dynamic print('water dynamic viscosity', mu_water) # print(mu_water/rho_water) n_reynolds = rho_water * v * d / mu_water print('renolds number=', n_reynolds) if n_reynolds > 4000: print('the flow is turbulent...') else: print('the flow is laminar...')
return dt_o * (Nt / K)**(1 / n) Db = Dbf(Nt) #bundle diameter Dshell = Db + 15e-3 pt = 1.25 * dt_o lb = Dshell / 5 de = 1.1 / dt_o * (pt**2 - 0.917 * dt_o**2) ## tube side: # %% # %% T = 48 rho_s, mu_s, k_s, Cp_s = Chemical('water', 48 + 273.15, 200000).rho, Chemical( 'water', 48 + 273.15, 200000).mu, Chemical('water', 48 + 273.15, 200000).ThermalConductivityLiquid( 48 + 273.15, 200000), Chemical('water', 48 + 273.15, 200000).Cp rho_s, mu_s, k_s, Cp_s #%% def Re_f(rho, dp, mu, u): return rho * u * dp / mu Re_t = Re_f(rho_t, dt_o, mu_t, u_t) print(Re_t)