Skip to content
Snippets Groups Projects
test_crit_scaling.py 3.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • import sys
    import teqp
    
    import numpy as np
    
    import CoolProp.CoolProp as CP
    
    def crit_density_guess(model, Tc, rhoc):
        """
        """
        R = 8.31446261815324
        z = np.array([1.0])
    
        ders = model.get_Ar04n(Tc, rhoc, z)
        dpdrho = R*Tc*(1 + 2*ders[1] + ders[2])
        d2pdrho2 = R*Tc/rhoc*(2*ders[1] + 4*ders[2] + ders[3])
        d3pdrho3 = R*Tc/rhoc**2*(6*ders[2] + 6*ders[3] + ders[4])
    
        def fd2pdrho2(rho):
            ders = model.get_Ar04n(Tc, rho, z)
            return 1/rhoc*(2*ders[1] + 4*ders[2] + ders[3])
        drho = 0.001*rhoc
        d3pdrho3chk = (fd2pdrho2(rhoc+drho)-fd2pdrho2(rhoc-drho))/(2*drho)
        print(d3pdrho3, d3pdrho3chk)
        print(rhoc)
    
        Ar11 = model.get_Ar11(Tc, rhoc, z)
        Ar12 = model.get_Ar12(Tc, rhoc, z)
        d2pdrhodT = R*(1 + 2*ders[1] + ders[2] - 2*Ar11 - Ar12)
    
        def fd2pdrho2B(T):
            ders = model.get_Ar04n(T, rhoc, z)
            return Tc*R*(1 + 2*ders[1] + ders[2])
        dT = 0.00001*Tc
        d2pdrhodTchk = (fd2pdrho2B(Tc+dT)-fd2pdrho2B(Tc))/(dT)
        print(d2pdrhodT, d2pdrhodTchk*1e6/1e6, 'p_1rho1T / MPa cm3/(mol K)')
        
        # AS = CP.AbstractState('HEOS', 'PROPANE')
        # AS.update(CP.DmolarT_INPUTS, rhoc, Tc)
        # print(AS.dalphar_dDelta(), ders[1], 'Ar01')
        # print(AS.d2alphar_dDelta2(), ders[2], 'Ar02')
        # print(AS.d3alphar_dDelta3(), ders[3], 'Ar03')
        # print(AS.d4alphar_dDelta4(), ders[4], 'Ar04')
        # print(AS.d2alphar_dDelta_dTau(), Ar11, 'Ar11')
        # print(AS.d3alphar_dDelta2_dTau(), Ar12, 'Ar12')
        # print(AS.second_partial_deriv(CP.iP, CP.iT, CP.iDmolar, CP.iDmolar, CP.iT), 'd2pdrhodT', d2pdrhodT)
    
        Brho = (6*d2pdrhodT*Tc/d3pdrho3)**0.5
    
        drhohat_dT = Brho/Tc
        dT = 0.001*Tc
        T = Tc-dT
        drhohat = dT*drhohat_dT
        rho1 = drhohat/(1-T/Tc)**0.5 + rhoc
        rho2 = -drhohat/(1-T/Tc)**0.5 + rhoc
        rholiq = max(rho1, rho2)
        rhovap = min(rho1, rho2)
    
        return T, rholiq, rhovap, Brho
    
    model = teqp.build_multifluid_model(['n-Propane'], '../mycp', '../mycp/dev/mixtures/mixture_binary_pairs.json')
    Tc = model.get_Tcvec()[0]
    vc = model.get_vcvec()[0]
    print(Tc, 1/vc)
    
    T, rhoL, rhoV, slope = crit_density_guess(model, Tc, 1/vc)
    # print(CP.PropsSI('Dmolar','T',T,'Q',0,'REFPROP::PROPANE'), rhoL)
    # print(CP.PropsSI('Dmolar','T',T,'Q',1,'REFPROP::PROPANE'), rhoV)
    
    rhoc = 1/vc
    import numpy as np
    import matplotlib.pyplot as plt
    Ts = np.linspace(0.999*Tc, Tc)
    rhoL = CP.PropsSI('Dmolar','T',Ts,'Q',0,'REFPROP::PROPANE')
    rhoV = CP.PropsSI('Dmolar','T',Ts,'Q',1,'REFPROP::PROPANE')
    
    linel, = plt.plot(Ts, (rhoL-rhoc)*(1-Ts/Tc)**0.5)
    linev, = plt.plot(Ts, (rhoV-rhoc)*(1-Ts/Tc)**0.5)
    
    # Extrapolation with near-critical slope
    yL = (rhoL-rhoc)*(1-Ts/Tc)**0.5
    mc = (yL[-1]-yL[-4])/(Ts[-1]-Ts[-4])
    mc = -slope/Tc
    yy = mc*(Ts-Ts[-1]) + yL[-1]
    plt.plot(Ts, yy, dashes=[2,2], color=linel.get_color())
    
    yV = (rhoV-rhoc)*(1-Ts/Tc)**0.5
    mc = (yV[-1]-yV[-4])/(Ts[-1]-Ts[-4])
    mc = slope/Tc
    yy = mc*(Ts-Ts[-1]) + yV[-1]
    print(mc, slope)
    plt.plot(Ts, yy, dashes=[2,2], color=linev.get_color())
    
    plt.gca().set(xlabel='$T$ / K', ylabel=r'$(\rho^\alpha-\rho_{\rm crit})\sqrt{1-T/T_{\rm crit}}$')
    plt.title('propane (Lemmon)')
    plt.savefig('propane_critical_scaling.pdf')
    plt.show()