import matplotlib
import matplotlib.colors as colors
import matplotlib.cm as cmx
import matplotlib.ticker
import matplotlib.pyplot as plt
import numpy as np
import random

import CoolProp
import CoolProp.CoolProp as CP

Ref = 'R245fa'
EOS = CoolProp.AbstractState('HEOS', Ref)
SVD = CoolProp.AbstractState('SVDSBTL&HEOS', Ref)

HHH, PPP, EEE = [], [], []
cNorm = colors.LogNorm(vmin=1e-12, vmax=10)
for _ in range(20000):
    h = random.uniform(150000, 590000)
    p = 10 ** random.uniform(np.log10(100000), np.log10(7000000))
    try:
        EOS.update(CoolProp.HmassP_INPUTS, h, p)
        SVD.update(CoolProp.HmassP_INPUTS, h, p)
        err = abs(SVD.rhomolar() / EOS.rhomolar() - 1) * 100
    except Exception:
        continue
    HHH.append(h)
    PPP.append(p)
    EEE.append(err)

fig = plt.figure(figsize=(7, 5))
ax = fig.add_axes((0.13, 0.13, 0.74, 0.78))
sc = ax.scatter(HHH, PPP, s=8, c=EEE, edgecolors='none',
                cmap='jet', norm=cNorm)
ax.set_yscale('log')
ax.set_xlabel('Enthalpy [J/kg]')
ax.set_ylabel('Pressure [Pa]')
ax.set_title('SVDSBTL&HEOS density deviation — ' + Ref)
cb = fig.colorbar(sc, ax=ax, fraction=0.05, pad=0.02)
cb.set_label(r'$|\rho_{\mathrm{SVDSBTL}} / \rho_{\mathrm{HEOS}} - 1|\ \%$')