from __future__ import print_function, division
import os.path
import CoolProp
import CoolProp.CoolProp
import subprocess
import sys

import numpy as np

import matplotlib
matplotlib.use('Agg') #Force mpl to use a non-GUI backend
import matplotlib.pyplot as plt

web_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
#plots_path = os.path.join(web_dir,'fluid_properties','incompressibles_consistency')
plots_path = os.path.join(web_dir,'scripts','incompressibles_consistency')

checked = ["TVP1869", "T66"]

N = 50
p = 100e5
Pr = np.empty(N)
la = np.empty(N)
mu = np.empty(N)
cp = np.empty(N)

fig = plt.figure(tight_layout=True)
Pr_axis = fig.add_subplot(221)
la_axis = fig.add_subplot(222)
mu_axis = fig.add_subplot(223)
cp_axis = fig.add_subplot(224)

#Pr_axis = plt.subplot2grid((3,2), (0,0), rowspan=3)
#la_axis = plt.subplot2grid((3,2), (0,1))
#mu_axis = plt.subplot2grid((3,2), (1,1))
#cp_axis = plt.subplot2grid((3,2), (2,1))

Pr_axis.set_xlabel("Temperature $T$ / deg C")
Pr_axis.set_ylabel("Prandtl Number $Pr$")
#Pr_axis.set_ylim([0,10000])
#Pr_axis.set_yscale("log")
la_axis.set_xlabel("Temperature $T$ / deg C")
la_axis.set_ylabel("Thermal Conductivity $\lambda$ / W/m/K")
#la_axis.set_ylim([0,1])
mu_axis.set_xlabel("Temperature $T$ / deg C")
mu_axis.set_ylabel("Dynamic Viscosity $\mu$ / Pa s")
#mu_axis.set_ylim([0,1])
#mu_axis.set_yscale("log")
cp_axis.set_xlabel("Temperature $T$ / deg C")
cp_axis.set_ylabel("Isobaric Heat Capacity $c_p$ / J/kg/K")
#cp_axis.set_ylim([0,5000])

for fluid in CoolProp.__incompressibles_pure__ + CoolProp.__incompressibles_solution__:
#for fluid in CoolProp.__incompressibles_solution__:
#for fluid in CoolProp.__incompressibles_pure__:
    skip_fluid = False
    for ignored in ["example","iceea","icena","icepg"]:
        if ignored in fluid.lower(): 
            skip_fluid = True
    if skip_fluid: 
        continue
    state = CoolProp.AbstractState("INCOMP",fluid)
    error = ""
    for frac in [0.5,0.2,0.8,0.1,0.9]:
        error = ""
        try: 
            state.set_mass_fractions([frac])
            state.update(CoolProp.PT_INPUTS,p,state.Tmax())
            break
        except Exception as e: 
            error = e.message
            try:
                state.set_volu_fractions([frac])
                state.update(CoolProp.PT_INPUTS,p,state.Tmax())
                break
            except Exception as e: 
                error = e.message
                try:
                    state.set_mole_fractions([frac])
                    state.update(CoolProp.PT_INPUTS,p,state.Tmax())
                    break
                except Exception as e: 
                    error = e.message
                    pass
                
    
    Tmin = 0.0
    try:
        Tmin = state.keyed_output(CoolProp.iT_freeze)
    except:
        pass
    Tmin = max(state.Tmin(), Tmin)+1
    Tmax = state.Tmax()
    T = np.linspace(Tmin,Tmax, N)
    for i, Ti in enumerate(T):
        state.update(CoolProp.PT_INPUTS, p, Ti)
        Pr[i] = state.Prandtl()
        la[i] = state.conductivity()
        mu[i] = state.viscosity()
        cp[i] = state.cpmass()
    #print(np.min(Pr), np.max(Pr))
    Pr_axis.plot(T-273.15,Pr)
    la_axis.plot(T-273.15,la)
    mu_axis.plot(T-273.15,mu)
    cp_axis.plot(T-273.15,cp)
    
    if np.max(Pr)>10000:
        if fluid not in checked: 
            print("Very high Prandtl number for {0:s} of {1:f}".format(fluid,np.max(Pr)))
    if np.min(Pr)<0.0:
        if fluid not in checked: 
            print("Very low Prandtl number for {0:s} of {1:f}".format(fluid,np.min(Pr)))
    if np.max(la)>0.8:
        if fluid not in checked: 
            print("Very high thermal conductivity for {0:s} of {1:f}".format(fluid,np.max(la)))
    if np.min(la)<0.3:
        if fluid not in checked: 
            print("Very low thermal conductivity for {0:s} of {1:f}".format(fluid,np.min(la)))
    if np.max(mu)>0.2:
        if fluid not in checked: 
            print("Very high viscosity for {0:s} of {1:f}".format(fluid,np.max(mu)))
    if np.min(mu)<1e-8:
        if fluid not in checked: 
            print("Very low viscosity for {0:s} of {1:f}".format(fluid,np.min(mu)))
    if np.max(cp)>5000:
        if fluid not in checked: 
            print("Very high heat capacity for {0:s} of {1:f}".format(fluid,np.max(cp)))
    if np.min(cp)<1000:
        if fluid not in checked: 
            print("Very low heat capacity for {0:s} of {1:f}".format(fluid,np.min(cp)))
    
#for fluid in CoolProp.__fluids__:
for fluid in ["Water"]:
    state = CoolProp.AbstractState("HEOS",fluid)
    Tmin = max(state.Tmin(), Pr_axis.get_xlim()[0]+273.15)
    Tmax = min(state.Tmax(), Pr_axis.get_xlim()[1]+273.15)
    
    T = np.linspace(Tmin, Tmax, N)
    for i, Ti in enumerate(T):
        try:
            state.update(CoolProp.QT_INPUTS, 0, Ti)
            p = state.p() + 1e5
        except:
            p = state.p_critical() + 1e5
        Pr[i] = np.nan
        la[i] = np.nan
        mu[i] = np.nan
        cp[i] = np.nan 
        try:
            state.update(CoolProp.PT_INPUTS, p, Ti)
            try: 
                Pr[i] = state.Prandtl()
            except Exception as e:
                print(e.message)
            try: 
                la[i] = state.conductivity()
            except Exception as e:
                print(e.message)
            try: 
                mu[i] = state.viscosity()
            except Exception as e:
                print(e.message)
            try: 
                cp[i] = state.cpmass()
            except Exception as e:
                print(e.message)
        except:
            pass    
    #print(np.min(Pr), np.max(Pr))
    if np.sum(np.isnan(Pr)) == 0: 
        Pr_axis.plot(T-273.15,Pr,alpha=0.5,ls=":")
    else: 
        #print("Error: Prandtl undefined for "+fluid)
        pass
    if np.sum(np.isnan(la)) == 0: 
        la_axis.plot(T-273.15,la,alpha=0.5,ls=":")
    else: 
        #print("Error: Conductivuty undefined for "+fluid)
        pass
    if np.sum(np.isnan(mu)) == 0: 
        mu_axis.plot(T-273.15,mu,alpha=0.5,ls=":")
    else: 
        #print("Error: Viscosity undefined for "+fluid)
        pass
    if np.sum(np.isnan(cp)) == 0: 
        cp_axis.plot(T-273.15,cp,alpha=0.5,ls=":")
    else: 
        #print("Error: Heat capacity undefined for "+fluid)
        pass
    
    
fig.tight_layout()
fig.savefig(plots_path+'.pdf')
#fig.savefig(plots_path+'.png')
sys.exit(0)
