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
def check_Props(parameter, SI_over_kSI): CP.set_standard_unit_system(CoolProp.unit_systems_constants.UNIT_SYSTEM_SI) val_SI = CP.Props(parameter,'T',300.0,'D',1.0,'R134a') CP.set_standard_unit_system(CoolProp.unit_systems_constants.UNIT_SYSTEM_KSI) val_kSI = CP.Props(parameter,'T',300.0,'D',1.0,'R134a') try: val_SI = val_SI() val_kSI = val_kSI() except: pass print(val_SI,val_kSI, val_SI/val_kSI - SI_over_kSI) if abs(val_SI/val_kSI - SI_over_kSI) > 1e-12: raise ValueError(val_SI/val_kSI-SI_over_kSI)
def critical_table(Fluid): params = dict( Tc=CP.Props(Fluid, 'Tcrit'), rhoc=CP.Props(Fluid, 'rhocrit'), pc=CP.Props(Fluid, 'pcrit'), ) return textwrap.dedent(""" Critical Parameters ============================== ============================== Temperature [K] {Tc:0.3f} Density [kg/m\ :sup:`3`\ ] {rhoc:0.6f} Pressure [kPa] {pc:0.5f} ============================== ============================== """.format(**params))
def __sat_bounds(self, kind, smin=None, smax=None): """ Generates limits for the saturation line in either T or p determined by 'kind'. If xmin or xmax are provided, values will be checked against the allowable range for the EOS and an error might be generated. Returns a tuple containing (xmin, xmax) """ if kind == 'P': name = 'pressure' min_key = 'ptriple' elif kind == 'T': name = 'temperature' min_key = 'Tmin' fluid_min = CP.Props(self.fluid_ref, min_key) fluid_crit = CP.Props(self.fluid_ref, ''.join([kind, 'crit'])) if smin is None: smin = fluid_min + SMALL elif smin > fluid_crit: raise ValueError(''.join([ 'Minimum ', name, ' cannot be greater than fluid critical ', name, '.' ])) if smax is None: smax = fluid_crit - SMALL elif smax > fluid_crit: raise ValueError(''.join([ 'Maximum ', name, ' cannot be greater than fluid critical ', name, '.' ])) smin = max(smin, fluid_min + SMALL) smax = min(smax, fluid_crit - SMALL) return (smin, smax)
def params_table(Fluid): params = dict(mm=CP.Props(Fluid, 'molemass'), Tt=CP.Props(Fluid, 'Ttriple'), pt=CP.Props(Fluid, 'ptriple'), Tmin=CP.Props(Fluid, 'Tmin'), CAS=CP.get_CAS_code(Fluid), ASHRAE=CP.get_ASHRAE34(Fluid)) return textwrap.dedent(""" Fluid Data ========== Fluid Parameters ========================= ============================== Mole Mass [kg/kmol] {mm:0.5f} Triple Point Temp. [K] {Tt:0.3f} Triple Point Press. [kPa] {pt:0.10g} Minimum temperature [K] {Tmin:0.3f} CAS number {CAS:s} ASHRAE classification {ASHRAE:s} ========================= ============================== """.format(**params))
def build_all_ancillaries(): for fluid in sorted(CoolProp.__fluids__): print fluid if fluid in ['SES36']: build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-1]) elif fluid == 'R507A': build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-0.1]) elif fluid == 'R407F': build_ancillaries(fluid, Tlims = [CP.Props(fluid,'Ttriple'), CP.Props(fluid, 'Tcrit')-2]) else: build_ancillaries(fluid)
def time_check(N, h, p, TTSE=False, mode='TTSE'): if TTSE: if mode == 'TTSE': setup = "import CoolProp; import CoolProp.CoolProp as CP; CP.enable_TTSE_LUT('Water'); CP.set_TTSE_mode('Water','TTSE'); CP.Props('T','H',500,'P',10000,'Water'); IWater = CP.get_Fluid_index('Water'); from CoolProp.param_constants import iT,iH,iP,iD" elif mode == 'BICUBIC': setup = "import CoolProp; import CoolProp.CoolProp as CP; CP.enable_TTSE_LUT('Water'); CP.set_TTSE_mode('Water','BICUBIC'); CP.Props('T','H',500,'P',10000,'Water'); IWater = CP.get_Fluid_index('Water'); from CoolProp.param_constants import iT,iH,iP,iD" else: raise ValueError() else: setup = "import CoolProp.CoolProp as CP; IWater = CP.get_Fluid_index('Water'); CP.disable_TTSE_LUT('Water'); from CoolProp.param_constants import iT,iH,iP,iD" time = timeit.Timer( "CP.IProps(iD,iH," + str(h) + ",iP," + str(p) + ",IWater)", setup).timeit(N) / N * 1e6 value = CP.Props('D', 'H', h, 'P', p, 'Water') return time, value
def drawLines(Ref, lines, axis, plt_kwargs=None): """ Just an internal method to systematically plot values from the generated 'line' dicts, method is able to cover the whole saturation curve. Closes the gap at the critical point and adds a marker between the two last points of bubble and dew line if they reach up to critical point. Returns the an array of line objects that can be used to change the colour or style afterwards. """ if not plt_kwargs is None: for line in lines: line['opts'] = plt_kwargs plottedLines = [] if len(lines) == 2 and ( 'q' in str(lines[0]['type']).lower() and 'q' in str(lines[1]['type']).lower()) and ( (0 == lines[0]['value'] and 1 == lines[1]['type']) or (1 == lines[0]['value'] and 0 == lines[1]['type'])): # We plot the saturation curve bubble = lines[0] dew = lines[1] line, = axis.plot(bubble['x'], bubble['y'], **bubble['opts']) plottedLines.extend([line]) line, = axis.plot(dew['x'], dew['y'], **dew['opts']) plottedLines.extend([line]) # Do we need to test if this is T or p? Tmax = min(bubble['kmax'], dew['kmax']) if Tmax > CP.Props(Ref, 'Tcrit') - 2e-5: axis.plot(numpy.r_[bubble['x'][-1], dew['x'][-1]], numpy.r_[bubble['y'][-1], dew['y'][-1]], **bubble['opts']) #axis.plot((bubble['x'][-1]+dew['x'][-1])/2.,(bubble['y'][-1]+dew['y'][-1])/2.,'o',color='Tomato') else: for line in lines: line, = axis.plot(line['x'], line['y'], **line['opts']) plottedLines.extend([line]) return plottedLines
def _get_fluid_data(self, req_prop, prop1_name, prop2_name, prop1_vals, prop2_vals): """ Calculates lines for constant iName (iVal) over an interval of xName (xVal). Returns (x[],y[]) - a tuple of arrays containing the values in x and y dimensions. """ if len(prop1_vals) != len(prop2_vals): raise ValueError(''.join([ 'We need the same number of x value ', 'arrays as iso quantities.' ])) y_vals = [] x_vals = [] for i, p1_val in enumerate(prop1_vals): x_vals.append(prop2_vals[i]) y_vals.append([ CP.Props(req_prop, prop1_name, p1_val, prop2_name, x, self.fluid_ref) for x in prop2_vals[i] ]) return [x_vals, y_vals]
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
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
import CoolProp.CoolProp as CP fluid = 'Propane' print(CP.enable_TTSE_LUT(fluid)) print(CP.isenabled_TTSE_LUT(fluid)) print(CP.Props('H', 'P', 300, 'Q', 0, fluid)) print(CP.Props('H', 'P', 310, 'Q', 0, fluid)) print(CP.Props('H', 'P', 315, 'Q', 0, fluid)) # fluid = 'TestSolution-0.3' print(CP.enable_TTSE_LUT(fluid)) print(CP.isenabled_TTSE_LUT(fluid)) print(CP.Props('H', 'P', 3000, 'T', 280, fluid))
from CoolProp import CoolProp as CP from PDSim.misc.datatypes import Collector import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from scipy.odr import * import textwrap fluid_REF = 'Propane' Tcrit_REF = CP.Props(fluid_REF, 'Tcrit') omega_REF = CP.Props(fluid_REF, "accentric") molemass_REF = CP.Props(fluid_REF, 'molemass') rhocrit_REF = CP.Props(fluid_REF, 'rhocrit') Zcrit_REF = CP.DerivTerms('Z', Tcrit_REF, rhocrit_REF, fluid_REF) fluid = 'DimethylEther' molemass = CP.Props(fluid, 'molemass') Ttriple = CP.Props(fluid, 'Ttriple') Tcrit = CP.Props(fluid, 'Tcrit') omega = CP.Props(fluid, "accentric") rhocrit = CP.Props(fluid, 'rhocrit') pcrit = CP.Props(fluid, 'pcrit') Zcrit = CP.DerivTerms('Z', Tcrit, rhocrit, fluid) N = 12 RHO, TTT, RHO0, TTT0 = Collector(), Collector(), Collector(), Collector() rhomax = CP.Props('D', 'T', Ttriple, 'Q', 0, fluid) #Build a database of "experimental" data for T in np.linspace(Ttriple, Tcrit + 50, 80):
def Tr(): global ip, irho for fluid, values in polynomial_in_Tr.iteritems(): axp = figp.add_subplot(Nrow, Ncol, ip) ip += 1 axrho = figrho.add_subplot(Nrow, Ncol, irho) irho += 1 axp.set_xlabel('T [K]') axp.set_ylabel('p [Pa]') axrho.set_xlabel('T [K]') axrho.set_ylabel('rho [mol/m$^3$]') axp.set_title(fluid + ' - ' + str(round(CP.Props(fluid, "molemass"), 2))) axrho.set_title(fluid) fname = os.path.join('fluids', fluid + '.json') j = json.load(open(fname, 'r')) for part in values['parts']: if 'T_min' not in part: part['T_min'] = round(CP.Props(fluid, "Tmin"), 4) values['type'] = 'polynomial_in_Tr' j['ANCILLARIES']['melting_line'] = values fp = open(fname, 'w') from package_json import json_options fp.write(json.dumps(j, **json_options)) fp.close() if fluid == 'Ethylene': T = [ 104.003, 104.059, 104.13, 104.2, 104.27, 104.41, 104.55, 104.69, 104.83, 104.969, 105.108, 105.386, 106.077, 106.764, 107.446, 111.384, 119.283, 127.136, 158.146, 188.621 ] p = np.array([ 0.1, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 50, 75, 100, 200, 300 ]) * 1e6 axp.plot(T, p, '*') # if not isinstance(values, list): # values = [values] # df = pandas.read_csv('melting_curves/'+fluid+'.mlt',names=['T','p','rho']) # axp.plot(df['T'], df['p'], 'o', mfc='none') # x,y = plot_rho(df['T'],df['rho'],fit = True) # axrho.plot(x,y, 'o', mfc='none') # # else: # for i in ['I','II']: # df = pandas.read_csv('melting_curves/'+fluid+'-'+i+'.mlt',names=['T','p','rho']) # axp.plot(df['T'], df['p'], 'o', mfc='none') # x,y = plot_rho(df['T'],df['rho'],fit = True) # axrho.plot(x,y, 'o', mfc='none') T_m = values['T_m'] for i, value in enumerate(values['parts']): Tmin = value.get('T_min', CP.Props(fluid, "Tmin")) Tmax = value['T_max'] T = np.linspace(Tmin, Tmax, 200) a = value['a'] t = value['t'] T_t = value['T_0'] p_t = value['p_0'] RHS = 0 for i in range(len(a)): RHS += a[i] * ((T / T_t)**t[i] - 1) p = p_t * (RHS + 1) axp.plot(T, p) cc = 1.75 aa = 3e8 #(101325-p_0)/((T_m/T_0)**cc-1) pt = CP.Props(fluid, 'ptriple') pp = pt + aa * ((T / Tmin)**cc - 1) axp.plot(T_m, 101325, '*') axp.plot(T, pp, '--') print fluid, CP.Props(fluid, "molemass"), CP.Props( fluid, 'accentric'), pp[-1] / p[-1] - 1
def theta(): global ip, irho for fluid, values in polynomial_in_theta.iteritems(): axp = figp.add_subplot(Nrow, Ncol, ip) ip += 1 axrho = figrho.add_subplot(Nrow, Ncol, irho) irho += 1 axp.set_xlabel('T [K]') axp.set_ylabel('p [Pa]') axrho.set_xlabel('T [K]') axrho.set_ylabel('rho [mol/m$^3$]') axp.set_title(fluid + ' - ' + str(round(CP.Props(fluid, "molemass"), 2))) axrho.set_title(fluid) fname = os.path.join('fluids', fluid + '.json') j = json.load(open(fname, 'r')) for part in values['parts']: if 'T_min' not in part: part['T_min'] = round(CP.Props(fluid, "Tmin"), 4) values['type'] = 'polynomial_in_Theta' j['ANCILLARIES']['melting_line'] = values fp = open(fname, 'w') from package_json import json_options fp.write(json.dumps(j, **json_options)) fp.close() T_m = values['T_m'] for value in values['parts']: a = value['a'] t = value['t'] T_t = value['T_0'] p_t = value['p_0'] Tmin = T_t Tmax = value['T_max'] T = np.linspace(Tmin, Tmax, 200) RHS = 0 for i in range(len(a)): RHS += a[i] * (T / T_t - 1)**t[i] p = p_t * (RHS + 1) #df = pandas.read_csv('melting_curves/' + fluid + '.mlt', names=['T','p','rho']) #axp.plot(df['T'], df['p'], 'o', mfc='none') axp.plot(T, p) #x,y = plot_rho(df['T'],df['rho'],fit = True) #axrho.plot(x,y, 'o', mfc='none') cc = 1.75 aa = 3e8 #(101325-p_0)/((T_m/T_0)**cc-1) pt = CP.Props(fluid, 'ptriple') pp = pt + aa * ((T / Tmin)**cc - 1) axp.plot(T_m, 101325, '*') axp.plot(T, pp, '--') print fluid, CP.Props(fluid, "molemass"), CP.Props( fluid, 'accentric'), pp[-1] / p[-1] - 1
def __set_axis_limits(self, swap_xy): """ Generates limits for the axes in terms of x,y defined by 'plot' based on temperature and pressure. Returns a tuple containing ((xmin, xmax), (ymin, ymax)) """ # Get current axis limits, be sure to set those before drawing isolines # if no limits are set, use triple point and critical conditions X = [ CP.Props(self.graph_type[1], 'T', 1.5 * CP.Props(self.fluid_ref, 'Tcrit'), 'P', CP.Props(self.fluid_ref, 'ptriple'), self.fluid_ref), CP.Props(self.graph_type[1], 'T', 1.1 * CP.Props(self.fluid_ref, 'Tmin'), 'P', 1.5 * CP.Props(self.fluid_ref, 'pcrit'), self.fluid_ref), CP.Props(self.graph_type[1], 'T', 1.5 * CP.Props(self.fluid_ref, 'Tcrit'), 'P', 1.5 * CP.Props(self.fluid_ref, 'pcrit'), self.fluid_ref), CP.Props(self.graph_type[1], 'T', 1.1 * CP.Props(self.fluid_ref, 'Tmin'), 'P', CP.Props(self.fluid_ref, 'ptriple'), self.fluid_ref) ] Y = [ CP.Props(self.graph_type[0], 'T', 1.5 * CP.Props(self.fluid_ref, 'Tcrit'), 'P', CP.Props(self.fluid_ref, 'ptriple'), self.fluid_ref), CP.Props(self.graph_type[0], 'T', 1.1 * CP.Props(self.fluid_ref, 'Tmin'), 'P', 1.5 * CP.Props(self.fluid_ref, 'pcrit'), self.fluid_ref), CP.Props(self.graph_type[0], 'T', 1.1 * CP.Props(self.fluid_ref, 'Tcrit'), 'P', 1.5 * CP.Props(self.fluid_ref, 'pcrit'), self.fluid_ref), CP.Props(self.graph_type[0], 'T', 1.5 * CP.Props(self.fluid_ref, 'Tmin'), 'P', CP.Props(self.fluid_ref, 'ptriple'), self.fluid_ref) ] limits = [[min(X), max(X)], [min(Y), max(Y)]] if not self.axis.get_autoscalex_on(): limits[0][0] = max([limits[0][0], min(self.axis.get_xlim())]) limits[0][1] = min([limits[0][1], max(self.axis.get_xlim())]) limits[1][0] = max([limits[1][0], min(self.axis.get_ylim())]) limits[1][1] = min([limits[1][1], max(self.axis.get_ylim())]) self.axis.set_xlim(limits[0]) self.axis.set_ylim(limits[1]) return limits
def simon(): global ip, irho for fluid, values in Simon_curves.iteritems(): axp = figp.add_subplot(Nrow, Ncol, ip) ip += 1 axrho = figrho.add_subplot(Nrow, Ncol, irho) irho += 1 axp.set_xlabel('T [K]') axp.set_ylabel('p [Pa]') axrho.set_xlabel('T [K]') axrho.set_ylabel('rho [mol/m$^3$]') axp.set_title(fluid + ' - ' + str(round(CP.Props(fluid, "molemass"), 2))) axrho.set_title(fluid) fname = os.path.join('fluids', fluid + '.json') j = json.load(open(fname, 'r')) for part in values['parts']: if 'T_min' not in part: part['T_min'] = round(CP.Props(fluid, "Tmin"), 4) values['type'] = 'Simon' j['ANCILLARIES']['melting_line'] = values fp = open(fname, 'w') from package_json import json_options fp.write(json.dumps(j, **json_options)) fp.close() # if not isinstance(values, list): # values = [values] # df = pandas.read_csv('melting_curves/'+fluid+'.mlt',names=['T','p','rho']) # axp.plot(df['T'], df['p'], 'o', mfc='none') # x,y = plot_rho(df['T'],df['rho'],fit = True) # axrho.plot(x,y, 'o', mfc='none') # else: # for i in ['I','II']: # df = pandas.read_csv('melting_curves/'+fluid+'-'+i+'.mlt',names=['T','p','rho']) # axp.plot(df['T'], df['p'], 'o', mfc='none') # x,y = plot_rho(df['T'],df['rho'],fit = True) # axrho.plot(x,y, 'o', mfc='none') T_m = values['T_m'] for i, value in enumerate(values['parts']): Tmin = value.get('T_min', CP.Props(fluid, "Tmin")) Tmax = value['T_max'] T = np.linspace(Tmin, Tmax, 200) T_0 = value['T_0'] p_0 = value['p_0'] a = value['a'] c = value['c'] p = p_0 + a * ((T / T_0)**c - 1) axp.plot(T, p) cc = 1.75 aa = 3e8 #(101325-p_0)/((T_m/T_0)**cc-1) pt = CP.Props(fluid, 'ptriple') pp = pt + aa * ((T / Tmin)**cc - 1) axp.plot(T_m, 101325, '*') axp.plot(T, pp, '--') print fluid, CP.Props(fluid, "molemass"), CP.Props( fluid, 'accentric'), pp[-1] / p[-1] - 1
from pyrp.refpropClasses import RefpropSI import CoolProp.CoolProp as cp p = 30000 T = 273.15 ref = False if ref: xkg = [0.473194694453358, 0.205109095413331, 0.321696210133311] names = "R32|R125|R134a" RP = RefpropSI() RP.SETUPFLEX(xkg=xkg, FluidNames=names) T_A, p_A, D_A, Dl_A, Dv_A, q_A, e_A, h_A, s_A, cv_A, cp_A, w_A = RP.PQFLSH( p, 0) T_B, p_B, D_B, Dl_B, Dv_B, q_B, e_B, h_B, s_B, cv_B, cp_B, w_B = RP.PQFLSH( p, 1) T_C, p_C, D_C, Dl_C, Dv_C, q_C, e_C, h_C, s_C, cv_C, cp_C, w_C = RP.TQFLSH( T, 0) hlb = h_A / 1000. hrb = h_B / 1000. h200 = h_C / 1000. print "Refprop: ", hlb, hrb, h200 else: R407F = 'REFPROP-MIX:R32[0.473194694453358]&R125[0.205109095413331]&R134a[0.321696210133311]' #R407F='REFPROP-MIX:R32[0.651669604033581]&R125[0.122438378639971]&R134a[0.225892017326446]' hlb = cp.Props('H', 'P', 30, 'Q', 0, R407F) # 30 kPa saturated liquid hrb = cp.Props('H', 'P', 30, 'Q', 1, R407F) # 30 kPa saturated vapour h200 = cp.Props('H', 'T', 273.15, 'Q', 0, R407F) # saturated liquid at 0C IIR print "CoolProp: ", hlb, hrb, h200
def PropertyConsistency(Fluid): Tmax = CP.Props(Fluid, "Tcrit") - 1 if Fluid == 'SES36' else CP.Props( Fluid, "Tcrit") - 0.01 return textwrap.dedent(""" Check of p,h and p,s as inputs (X: Failure .: Success) ================================================================= .. plot:: from CoolProp.Plots.Plots import Ph,Ps from CoolProp.CoolProp import Props from matplotlib import pyplot as plt import numpy as np Ref = "{Fluid:s}" fig = plt.figure(figsize=(10,5)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) Tmin = Props(Ref,'Tmin')+3 pmin = Props('P','T',Tmin,'Q',0,Ref) pmax = Props(Ref,'pcrit')*2 hmin = Props('H','T',Tmin,'Q',0,Ref) hmax = 2*Props('H','T',Props(Ref,'Tcrit')-1,'Q',1,Ref)-hmin smin = Props('S','T',Tmin,'Q',0,Ref) smax = 2*Props('S','T',Props(Ref,'Tcrit')-1,'Q',1,Ref)-smin Ph(Ref, axis = ax1, Tmin = Tmin, Tmax = {Tmax:f}) Ps(Ref, axis = ax2, Tmin = Tmin, Tmax = {Tmax:f}) for p in np.linspace(pmin,pmax,10): for h in np.linspace(hmin,hmax): _bad = False try: T = Props('T','H',h,'P',p,Ref) rho = Props('D','H',h,'P',p,Ref) hEOS = Props('H','T',T,'D',rho,Ref) except ValueError: _bad = True if _bad or abs(hEOS/h-1)>1e-6: ax1.plot(h,p,'x',ms = 10) else: ax1.plot(h,p,'k.', ms = 1) for p in np.linspace(pmin,pmax,10): for s in np.linspace(smin,smax): _bad = False try: T = Props('T','S',s,'P',p,Ref) rho = Props('D','S',s,'P',p,Ref) sEOS = Props('S','T',T,'D',rho,Ref) except ValueError: _bad = True if _bad or abs(sEOS/s-1)>1e-6: ax2.plot(s,p,'x',ms = 10) else: ax2.plot(s,p,'k.', ms = 1) plt.tight_layout() """.format(Fluid=Fluid, Tmax=Tmax))
gaseous = CP.DerivTerms(key, T[2], D[2], fluid) supercrit = CP.DerivTerms(key, T[3], D[3], fluid) print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format( key, liquid, twophase, gaseous, supercrit) for key in keys: liquid = CP.DerivTermsU(key, T[0], D[0], fluid, 'SI') twophase = CP.DerivTermsU(key, T[1], D[1], fluid, 'SI') gaseous = CP.DerivTermsU(key, T[2], D[2], fluid, 'SI') supercrit = CP.DerivTermsU(key, T[3], D[3], fluid, 'SI') print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format( key, liquid, twophase, gaseous, supercrit) print print "Testing Props: " for key in keys: liquid = CP.Props(key, "T", float(T[0]), "D", float(D[0]), fluid) twophase = CP.Props(key, "T", float(T[1]), "D", float(D[1]), fluid) gaseous = CP.Props(key, "T", float(T[2]), "D", float(D[2]), fluid) supercrit = CP.Props(key, "T", float(T[3]), "D", float(D[3]), fluid) print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format( key, liquid, twophase, gaseous, supercrit) for key in keys: liquid = CP.PropsU(key, "T", float(T[0]), "D", float(D[0]), fluid, 'SI') twophase = CP.PropsU(key, "T", float(T[1]), "D", float(D[1]), fluid, 'SI') gaseous = CP.PropsU(key, "T", float(T[2]), "D", float(D[2]), fluid, 'SI') supercrit = CP.PropsU(key, "T", float(T[3]), "D", float(D[3]), fluid, 'SI') print '{:<25}: {:>10.5f}; {:>10.5f}; {:>10.5f}; {:>10.5f}'.format( key, liquid, twophase, gaseous, supercrit)
#!/usr/bin/python import sys import CoolProp.CoolProp as CP # print "{0:14.8f}".format(CP.Props('V','D',13,'P',500,'n-Pentane')) # print "{0:14.8f}".format(CP.Props('V','H',158,'P',1000,'TX22')) #T = 300 T = float(sys.argv[1]) P = float(sys.argv[2]) print("Temperature: " + str(T)) print("Pressure: " + str(P)) print("") print("Viscosity: ") print("{0:14.8f}".format(CP.Props('V', 'T', T, 'P', P, 'SecCoolSolution-20%'))) print("{0:14.8f}".format(CP.Props('V', 'T', T, 'P', P, 'MEG-20%'))) print("{0:14.8f}".format(CP.Props('V', 'T', T, 'P', P, 'EG-20%'))) print("{0:14.8f}".format(CP.Props('V', 'T', T, 'P', P, 'water'))) # print # print "{0:14.8f}".format(CP.Props('L','D',13,'P',500,'n-Pentane')) # print "{0:14.8f}".format(CP.Props('L','H',158,'P',P,'TX22')) print("") print("Conductivity: ") print("{0:14.8f}".format(CP.Props('L', 'T', T, 'P', P, 'SecCoolSolution-20%'))) print("{0:14.8f}".format(CP.Props('L', 'T', T, 'P', P, 'MEG-20%'))) print("{0:14.8f}".format(CP.Props('L', 'T', T, 'P', P, 'EG-20%'))) print("{0:14.8f}".format(CP.Props('L', 'T', T, 'P', P, 'water'))) print("") print("Density: ") print("{0:14.8f}".format(CP.Props('D', 'T', T, 'P', P, 'SecCoolSolution-20%'))) print("{0:14.8f}".format(CP.Props('D', 'T', T, 'P', P, 'MEG-20%'))) print("{0:14.8f}".format(CP.Props('D', 'T', T, 'P', P, 'EG-20%'))) print("{0:14.8f}".format(CP.Props('D', 'T', T, 'P', P, 'water')))
from CoolProp.Plots import Ph import CoolProp.CoolProp as CP import matplotlib.pyplot as plt import matplotlib.colors as colors import matplotlib.cm as cmx import matplotlib.ticker import numpy as np import random fig = plt.figure(figsize=(10,5)) ax1 = fig.add_axes((0.08,0.1,0.32,0.83)) ax2 = fig.add_axes((0.50,0.1,0.32,0.83)) Ref = 'R245fa' T = np.linspace(CP.Props(Ref,'Tmin')+0.1,CP.Props(Ref,'Tcrit')-0.01,300) pV = CP.Props('P','T',T,'Q',1,Ref) hL = CP.Props('H','T',T,'Q',0,Ref) hV = CP.Props('H','T',T,'Q',1,Ref) HHH1, PPP1, EEE1 = [], [], [] HHH2, PPP2, EEE2 = [], [], [] cNorm = colors.LogNorm(vmin=1e-12, vmax=10) scalarMap = cmx.ScalarMappable(norm = cNorm, cmap = plt.get_cmap('jet')) for a_useless_counter in range(40000): h = random.uniform(100,590) p = 10**random.uniform(np.log10(100),np.log10(7000))
import numpy as np import matplotlib.pyplot as plt from scipy.odr import * import textwrap # #fluid = 'Propane' #Rfluid = 'REFPROP-propane' #e_k = 263.88 #sigma = 0.49748 # fluid = 'DimethylEther' Rfluid = 'REFPROP-DME' e_k = 329.72 sigma = 0.5529 molemass = CP.Props(fluid, 'molemass') Ttriple = CP.Props(fluid, 'Ttriple') Tcrit = CP.Props(fluid, 'Tcrit') rhocrit = CP.Props(fluid, 'rhocrit') n = 6 m = 3 NP = 1 Nb = 0 N = (n - 1) * (m + 1) + 3 + Nb mu, mu_dilute, RHO, TTT = Collector(), Collector(), Collector(), Collector() rhomax = CP.Props('D', 'T', Ttriple, 'Q', 0, fluid) # Build a database of "experimental" data for T in np.linspace(Ttriple, Tcrit + 30, 400):
if not os.path.exists('hsancillaries.json'): from matplotlib.backends.backend_pdf import PdfPages pp = PdfPages('multipage.pdf') jj = {} for i, fluid in enumerate(sorted(CoolProp.__fluids__)): fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) plt.suptitle(fluid) print i, fluid N = 10000 Tc = CP.Props(fluid, 'Tcrit') rhoc = CP.Props(fluid, 'rhocrit') MM = CP.Props(fluid, 'molemass') try: T = np.r_[np.linspace(Tc - 0.1, CP.Props(fluid, 'Tmin'), N)] #, np.linspace(Tc-0.1, Tc-1e-1, N)] hfg = (CP.PropsSI('H', 'T', T, 'Q', 1, fluid) - CP.PropsSI('H', 'T', T, 'Q', 0, fluid)) * MM / 1000 sfg = (CP.PropsSI('S', 'T', T, 'Q', 1, fluid) - CP.PropsSI('S', 'T', T, 'Q', 0, fluid)) * MM / 1000 except BaseException as E: print E continue try: p = CP.PropsSI('P', 'T', T, 'Q', 0, fluid)
from CoolProp import CoolProp as CP from PDSim.misc.datatypes import Collector import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fluid = 'R245fa' Ttriple = CP.Props(fluid, 'Ttriple') Tcrit = CP.Props(fluid, 'Tcrit') RHO, TTT, RHO0, TTT0, ERR = Collector(), Collector(), Collector(), Collector( ), Collector() rhomax = CP.Props('D', 'T', Ttriple, 'Q', 0, 'R245fa') # Build a database of "experimental" data for T in np.linspace(Ttriple, Tcrit + 50, 80): for rho in np.linspace(1e-10, rhomax, 80): if (T > Tcrit or rho > CP.rhosatL_anc(fluid, T) or rho < CP.rhosatV_anc(fluid, T)): h = CP.Props('H', 'T', T, 'D', rho, 'R245fa') p = CP.Props('P', 'T', T, 'D', rho, 'R245fa') RHO << rho TTT << T ERR << h TTT0 << p fig = plt.figure() ax1 = fig.add_subplot(121, projection='3d') ax1.scatter(np.array(RHO.vec), np.array(TTT.vec), ERR.vec) ax2 = fig.add_subplot(122, projection='3d')
from __future__ import print_function import CoolProp import CoolProp.CoolProp as CP print('CoolProp version: ', CoolProp.__version__) print('CoolProp gitrevision: ', CoolProp.__gitrevision__) print('CoolProp fluids: ', CoolProp.__fluids__) print(' ') print('************ USING EOS *************') print(' ') print('FLUID STATE INDEPENDENT INPUTS') print('Critical Density Propane:', CP.Props('Propane', 'rhocrit'), 'kg/m^3') print('TWO PHASE INPUTS (Pressure)') print('Density of saturated liquid Propane at 101.325 kPa:', CP.Props('D', 'P', 101.325, 'Q', 0, 'Propane'), 'kg/m^3') print('Density of saturated vapor R290 at 101.325 kPa:', CP.Props('D', 'P', 101.325, 'Q', 1, 'R290'), 'kg/m^3') print('TWO PHASE INPUTS (Temperature)') print('Density of saturated liquid Propane at 300 K:', CP.Props('D', 'T', 300, 'Q', 0, 'Propane'), 'kg/m^3') print('Density of saturated vapor R290 at 300 K:', CP.Props('D', 'T', 300, 'Q', 1, 'R290'), 'kg/m^3') p = CP.Props('P', 'T', 300, 'D', 1, 'Propane') h = CP.Props('H', 'T', 300, 'D', 1, 'Propane') T = CP.Props('T', 'P', p, 'H', h, 'Propane') D = CP.Props('D', 'P', p, 'H', h, 'Propane')
def compareProperty(fluid="", p=0, what=""): global c_diff, c_unit, c_exce if p == 0: p = 0.75 * CP.Props(fluid, "pcrit") Delta_T = 50 T_bub = CP.Props("T", "P", p, "Q", 0, fluid) T_dew = CP.Props("T", "P", p, "Q", 1, fluid) h_bub = CP.Props("H", "P", p, "Q", 0, fluid) h_dew = CP.Props("H", "P", p, "Q", 1, fluid) T_1 = T_bub - Delta_T if T_1 < CP.Props(fluid, "Tmin"): T_1 = CP.Props(fluid, "Tmin") + 0.5 * (T_bub - CP.Props(fluid, "Tmin")) T_2 = T_dew + Delta_T h_1 = CP.Props("H", "P", p, "T", T_1, fluid) h_2 = CP.Props("H", "P", p, "T", T_2, fluid) h_liq = numpy.linspace(h_1, h_bub, num=100) h_vap = numpy.linspace(h_dew, h_2, num=100) T_liq = CP.Props("T", "P", p, "H", h_liq, fluid) - T_bub T_vap = CP.Props("T", "P", p, "H", h_vap, fluid) - T_dew X_liq_STDV = CP.Props(what, "P", p, "H", h_liq, fluid) X_vap_STDV = CP.Props(what, "P", p, "H", h_vap, fluid) CP.enable_TTSE_LUT(fluid) X_liq_TTSE = CP.Props(what, "P", p, "H", h_liq, fluid) X_vap_TTSE = CP.Props(what, "P", p, "H", h_vap, fluid) if numpy.max([X_liq_STDV / X_liq_TTSE, X_vap_STDV / X_vap_TTSE ]) > 1.25 or numpy.min([ X_liq_STDV / X_liq_TTSE, X_vap_STDV / X_vap_TTSE ]) < 0.75: c_diff += 1 print "" print "There were problems with " + what + " for " + fluid print "Relative difference liquid: " + str( numpy.mean((X_liq_STDV - X_liq_TTSE) / X_liq_STDV)) print "Relative difference vapour: " + str( numpy.mean((X_vap_STDV - X_vap_TTSE) / X_vap_STDV)) print "Average factor liquid: " + str( numpy.mean(X_liq_STDV / X_liq_TTSE)) print "Average factor vapour: " + str( numpy.mean(X_vap_STDV / X_vap_TTSE))
def props(cp1,cp2,cp3,cp4,cp5,cp6): return cp.Props(cp1,cp2,cp3,cp4,cp5,cp6)
import matplotlib.pyplot as plt import CoolProp.CoolProp as CP import itertools, numpy as np variables = ['T','P','H','S','U','D'] for fluid in ['Water','CO2','n-Propane']: T = np.linspace(CP.Props(fluid,'Tmin'),CP.Props(fluid,'Tcrit'),1000) fig = plt.figure(1, figsize=(10, 10), dpi=100) for i, types in enumerate(itertools.combinations(variables,2)): ax = plt.subplot(5, 3, i+1) types = list(types) if types[0] in ['T','P'] and types != ['T','P']: types[0],types[1] = types[1],types[0] xL = CP.Props(types[0],'T',T,'Q',0,fluid) yL = CP.Props(types[1],'T',T,'Q',0,fluid) xV = CP.Props(types[0],'T',T,'Q',1,fluid) yV = CP.Props(types[1],'T',T,'Q',1,fluid) xc = CP.Props(types[0],'T',CP.Props(fluid,'Tcrit'),'Q',1,fluid) yc = CP.Props(types[1],'T',CP.Props(fluid,'Tcrit'),'Q',1,fluid) ax.plot(xL,yL,'k') ax.plot(xV,yV,'k') ax.plot(xc,yc,'o') if types[0] in ['P','D']: ax.set_xscale('log')
from __future__ import division from CoolProp import CoolProp as CP Fluid = 'CO2' R = 8.314472 / CP.Props(Fluid, 'molemass') Tc = CP.Props(Fluid, 'Tcrit') pc = CP.Props(Fluid, 'pcrit') w = CP.Props(Fluid, 'accentric') a = 0.457235 * R**2 * Tc**2 / pc b = 0.077796 * R * Tc / pc kappa = 0.37464 + 1.54226 * w - 0.26992 * w**2 T = 298.15 rho = 1000 v = 1 / rho Tr = T / Tc alpha = (1 + kappa * (1 - Tr**0.5))**2 p = R * T / (v - b) - a * alpha / (v**2 + 2 * b * v - b**2) print("%s %s" % (p, CP.Props('P', 'T', T, 'D', rho, Fluid)))