Beispiel #1
0
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)
Beispiel #2
0
    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)
        """
Beispiel #3
0
 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('---')
Beispiel #4
0
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)
Beispiel #5
0
    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
Beispiel #6
0
 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
Beispiel #8
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
Beispiel #10
0
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
Beispiel #11
0
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
        ]
Beispiel #13
0
 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)
Beispiel #14
0
def nitrogen():
    return Chemical('N2')
Beispiel #15
0
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
Beispiel #16
0
def k(T, P):
    k_ls = [Chemical(f, T, P).ThermalConductivityLiquid(T, P) for f in fn_ls]
    return k_ls
Beispiel #17
0
 def rho(self, T, P):
     return Chemical(self.chemical_equation, T=T, P=P).rho
Beispiel #18
0
def hydrogen_sulfide():
    return Chemical('H2S')
Beispiel #19
0
def propane():
    return Chemical('propane')
Beispiel #20
0
def ethane():
    return Chemical('ethane')
Beispiel #21
0
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
Beispiel #23
0
def carbon_dioxide():
    return Chemical('CO2')
Beispiel #24
0
# 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...')
Beispiel #25
0
    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)