Files
CoolProp/dev/TTSE/validate_TTSE.py
2019-01-12 20:48:56 -07:00

199 lines
5.9 KiB
Python

import matplotlib
matplotlib.use('WXAgg')
import CoolProp
from CoolProp.Plots import Ph
from CoolProp.Plots.Plots import Trho, Ps, PT, Prho
import CoolProp.CoolProp as CP
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import random
import numpy as np
from math import log, exp
random.seed()
def check_Trho(N=5000, param='P', fluid='R245fa'):
values = []
CP.enable_TTSE_LUT(fluid)
try:
CP.Props('D', 'P', CP.Props(fluid, 'ptriple') + 1, 'Q', 1, fluid)
except:
return []
# CP.set_TTSESinglePhase_LUT_size(fluid,500,500)
hmin, hmax, pmin, pmax = CP.get_TTSESinglePhase_LUT_range(fluid)
for i in range(N):
x1 = random.random()
h = x1 * hmin + (1 - x1) * hmax
x2 = random.random()
logp = x2 * log(pmin) + (1 - x2) * log(pmax)
p = exp(logp)
try:
try:
# Get the T,rho from the EOS directly without the LUT
CP.disable_TTSE_LUT(fluid)
s = CP.Props('S', 'P', p, 'H', h, fluid)
T = CP.Props('T', 'P', p, 'H', h, fluid)
rho = CP.Props('D', 'P', p, 'H', h, fluid)
except:
print('EOS failed: %s %s' % (p, h))
raise
# Now get p,h from the T,rho
CP.enable_TTSE_LUT(fluid)
val = CP.Props(param, 'T', T, 'D', rho, fluid)
CP.disable_TTSE_LUT(fluid)
valREFPROP = CP.Props(param, 'T', T, 'D', rho, fluid)
# print T,rho,val,valREFPROP,(val/valREFPROP-1)*100
if abs(val - valREFPROP) > 0.00001:
raise ValueError
except ValueError:
print('TTSE failed: %s %s' % (T, rho))
values.append((T, rho, 0, 0))
pass
return values
fluid = 'R245fa'
values = check_Trho(param='P', fluid=fluid)
if len(values) == 0:
print('good')
T, rho, values_withTTSE, values_noTTSE = zip(*values)
CP.disable_TTSE_LUT(fluid)
Trho(fluid)
plt.plot(rho, T, '.', mfc='none')
plt.savefig('Trho_TTSE_Validation.png', dpi=300)
plt.gca().set_xscale('log')
plt.show()
quit()
def check_Pother(N=5000, param='T', other='S', fluid='R245fa'):
values = []
CP.enable_TTSE_LUT(fluid)
try:
CP.Props('D', 'P', CP.Props(fluid, 'ptriple') + 1, 'Q', 1, fluid)
except:
return []
# CP.set_TTSESinglePhase_LUT_size(fluid,500,500)
hmin, hmax, pmin, pmax = CP.get_TTSESinglePhase_LUT_range(fluid)
for i in range(N):
x1 = random.random()
h = x1 * hmin + (1 - x1) * hmax
x2 = random.random()
logp = x2 * log(pmin) + (1 - x2) * log(pmax)
p = exp(logp)
try:
try:
# Get the T,rho from the EOS directly without the LUT
CP.disable_TTSE_LUT(fluid)
s = CP.Props('S', 'P', p, 'H', h, fluid)
T = CP.Props('T', 'P', p, 'H', h, fluid)
rho = CP.Props('D', 'P', p, 'H', h, fluid)
except:
print('EOS failed: %s %s' % (p, h))
raise
# Now get p,h from the T,rho
CP.enable_TTSE_LUT(fluid)
if other == 'S':
other_val = s
elif other == 'T':
other_val = T
elif other == 'D':
other_val = rho
else:
raise ValueError
val = CP.Props(param, 'P', p, other, other_val, fluid)
except ValueError:
print('TTSE failed: %s %s' % (p, other_val))
values.append((p, other_val, 0, 0))
pass
return values
fluid = 'R245fa'
for other in ['D', 'T', 'S']:
if other == 'D':
param = 'T'
elif other == 'T':
param = 'D'
elif other == 'S':
param = 'T'
values = check_Pother(other=other)
if len(values) == 0:
print('good: %s' % other)
continue
p, othervals, values_withTTSE, values_noTTSE = zip(*values)
CP.disable_TTSE_LUT(fluid)
if other == 'D':
Prho(fluid)
elif other == 'S':
Ps(fluid)
elif other == 'T':
PT(fluid)
plt.plot(othervals, p, '.', mfc='none')
plt.gca().set_yscale('log')
plt.savefig('P' + other + '_TTSE_Validation.png', dpi=300)
plt.show()
quit()
def check(N=5000, param='D', fluid='R245fa'):
values = []
CP.enable_TTSE_LUT(fluid)
try:
CP.Props('D', 'P', CP.Props(fluid, 'ptriple') + 1, 'Q', 1, fluid)
except:
return []
# CP.set_TTSESinglePhase_LUT_size(fluid,500,500)
hmin, hmax, pmin, pmax = CP.get_TTSESinglePhase_LUT_range(fluid)
for i in range(N):
x1 = random.random()
h = x1 * hmin + (1 - x1) * hmax
x2 = random.random()
logp = x2 * log(pmin) + (1 - x2) * log(pmax)
p = exp(logp)
try:
CP.enable_TTSE_LUT(fluid)
value_withTTSE = CP.Props(param, 'P', p, 'H', h, fluid)
CP.disable_TTSE_LUT(fluid)
value_noTTSE = CP.Props(param, 'P', p, 'H', h, fluid)
values.append((h, p, value_withTTSE, value_noTTSE))
except ValueError:
pass
return values
Ncols = 10
Nrows = 10
for parameter in ['D', 'T', 'S', 'C']:
fig = plt.figure(figsize=(40, 40))
for Index, fluid in enumerate(sorted(CoolProp.__fluids__)):
print(fluid)
ax = fig.add_subplot(Ncols, Nrows, Index + 1)
ax.set_title(fluid)
values = check(fluid=fluid, param=parameter)
if len(values) == 0:
continue
h, p, values_withTTSE, values_noTTSE = zip(*values)
ax = fig.add_subplot(Ncols, Nrows, Index + 1)
CP.disable_TTSE_LUT(fluid)
Ph(fluid)
CP.enable_TTSE_LUT(fluid)
error = (np.array(values_withTTSE) / np.array(values_noTTSE) - 1) * 100
plt.scatter(h, p, s=8, c=np.abs(error), norm=LogNorm(), edgecolor='none', vmin=1e-16, vmax=10)
plt.gca().set_yscale('log')
plt.colorbar()
plt.savefig(parameter + '_TTSE.png', dpi=200)
plt.tight_layout()
plt.close()