from __future__ import print_function import os, json, glob, textwrap json_options = {'indent' : 2, 'sort_keys' : True} # Data from Mulero, JPCRD, 2012 # CAS codes added from CoolProp 4.2, and wikipedia where necessary Mulero_data = """67-64-1 Acetone 0.0633 1.160 7664-41-7 Ammonia 0.1028 1.211 -0.09453 5.585 7440-37-1 Argon 0.037 1.25 71-43-2 Benzene 0.07298 1.232 -0.0007802 0.8635 -0.0001756 0.3065 106-97-8 n-Butane 0.05138 1.209 106-98-9 1-Butene 0.05644 1.248 112-40-3 n-Dodecane 0.0154 4.180 0.0480 1.170 355-25-9 Decafluorobutane 0.04429 1.242 124-38-9 CarbonDioxide 0.07863 1.254 630-08-0 CarbonMonoxide 0.02843 1.148 463-58-1 CarbonylSulfide 0.07246 1.407 110-82-7 Cyclohexane 0.06485 1.263 124-18-5 n-Decane 0.05473 1.290 7782-39-0 Deuterium 0.009376 1.258 7789-20-0 D2O -0.1423 2.645 0.2094 1.214 115-10-6 DimethylEther 0.063157 1.2595 74-84-0 Ethane 0.07602 1.320 -0.02912 1.676 64-17-5 Ethanol 0.05 0.952 74-85-1 Ethylene 0.0477 1.170 7782-41-4 Fluorine 0.03978 1.218 7440-59-7 Helium 0.0004656 1.040 0.001889 2.468 -0.002006 2.661 142-82-5 n-Heptane 0.07765 1.319 -0.02599 1.600 110-54-3 n-Hexane 0.210952 1.0962 -0.158485 1.05893 1333-74-0 Hydrogen -1.4165 0.63882 0.746383 0.659804 0.675625 0.619149 7783-06-4 HydrogenSulfide 0.078557 1.2074 75-28-5 Isobutane -0.01639 2.102 0.06121 1.304 115-11-7 Isobutene 0.0545 1.230 107-83-5 Isohexane 0.05024 1.194 78-78-4 Isopentane 0.051 1.209 7439-90-9 Krypton 0.0447 1.245 74-82-8 Methane 0.03825 1.191 -0.006024 5.422 -0.0007065 0.6161 67-56-1 Methanol 0.22421 1.3355 -0.21408 1.677 0.083233 4.4402 7440-01-9 Neon 0.012254 1.4136 0.02728 1.4517 -0.025715 1.6567 7727-37-9 Nitrogen 0.02898 1.246 10024-97-2 NitrousOxide 0.07087 1.204 111-84-2 n-Nonane 0.05388 1.262 111-65-9 n-Octane 0.34338 1.6607 -0.50634 1.9632 0.2238 2.3547 7782-44-7 Oxygen 0.03843 1.225 1333-74-0p Parahydrogen 0.005314 1.060 109-66-0 n-Pentane 0.08015 1.408 0.004384 1.031 -0.03437 1.818 678-26-2 Perfluoropentane 0.04394 1.254 74-98-6 n-Propane 0.05334 1.235 -0.01748 4.404 115-07-1 Propylene 0.05268 1.186 74-99-7 Propyne 0.05801 1.205 75-69-4 R11 0.06212 1.247 75-71-8 R12 -0.000124 0.4318 0.05662 1.263 75-72-9 R13 0.05045 1.269 75-73-0 R14 0.0423 1.24 75-43-4 R21 0.06924 1.259 75-45-6 R22 3.0587 1.41809 -2.99856 1.42291 75-46-7 R23 -0.32359 1.6055 0.37702 1.5232 75-10-5 R32 0.07147 1.246 593-53-3 R41 0.05049 1.242 76-13-1 R113 0.0556 1.24 76-14-2 R114 0.05239 1.258 76-15-3 R115 0.04771 1.246 76-16-4 R116 0.047593 1.2666 -0.0073402 1.9892 306-83-2 R123 0.056151 1.2367 2837-89-0 R124 0.05175 1.197 354-33-6 R125 0.05252 1.237 811-97-2 R134a 0.05801 1.241 1717-00-6 R141b 7.3958e-5 0.066331 0.059941 1.2214 75-68-3 R142b 0.05685 1.237 420-46-2 R143a 0.05416 1.255 75-37-6 R152a 0.05808 1.2115 353-36-6 R161 0.05385 1.111 76-19-7 R218 0.04322 1.224 431-89-0 R227ea 0.06127 1.192 -0.009516 0.9795 -0.00192 1.421 431-63-0 R236ea 0.306974 1.12614 -0.247277 1.09899 690-39-1 R236fa 0.05389 1.249 679-86-7 R245ca 0.069297 1.2795 -0.022419 3.1368 460-73-1 R245fa 0.073586 1.0983 0.0103 0.60033 -0.02663 0.72765 406-58-6 R365mfc 0.0534 1.210 754-12-1 R1234yf 0.06274 1.394 115-25-3 RC318 0.0507 1.250 7446-09-5 SulfurDioxide 0.0803 0.928 0.0139 1.570 -0.0114 0.364 2551-62-4 SulfurHexafluoride 0.0538 1.271 -4.064e-5 0.2116 108-88-3 Toluene 0.06897 1.291 2314-97-8 Trifluoroiodomethane 0.05767 1.298 7732-18-5 Water -0.1306 2.471 0.2151 1.233 7440-63-3 Xenon -0.11538 1.0512 0.16598 1.098""" def inject_surface_tension(root_dir): print("*** Injecting surface tension curves from Mulero") Tc_dict = {'Argon':150.687, 'Benzene':562.02, '1-Butene':419.29, #Butene from Mulero 'CarbonMonoxide':132.86, 'Cyclohexane':553.64, 'D2O':643.847, 'n-Decane':617.7, 'Ethane':305.322, 'Fluorine':144.414, 'Helium':5.1953, 'Isobutane':407.81, 'Isobutene':418.09, 'Isopentane':460.35, 'Methanol':513.38, 'Nitrogen':126.192, 'n-Nonane':594.55, 'Oxygen':154.581, 'Parahydrogen':32.938, 'Perfluorobutane':386.326, 'n-Propane':369.89, 'Propyne':402.38, 'R11':471.11, 'R113':487.21, 'R114':418.83, 'R115':353.1, 'R123':456.831, 'R1234yf':367.85, 'R124':395.425, 'R125':339.173, 'R134a':374.21, 'R14':227.51, 'R142b':410.26, 'R143a':345.857, 'R152a':386.411, 'R21':451.48, 'R218':345.02, 'R227ea':374.9, 'R32':351.255, 'R365mfc':460, 'RC318':388.38, 'SulfurDioxide':430.64, 'Toluene':591.75, 'Trifluoroiodomethane':396.44, 'Water':647.096, 'Acetone':508.1, 'n-Butane':425.125, 'CarbonDioxide':304.128, 'DimethylEther':400.378, 'n-Dodecane':658.1, #Decane in Mulero 'Ethylene':282.35, 'n-Heptane':540.13, 'n-Hexane':507.82, 'HydrogenSulfide':373.1, 'Isohexane':497.7, 'Krypton':209.48, 'NitrousOxide':309.52, 'n-Pentane':469.7, 'R116':293.03, 'R13':302, 'R23':299.293, 'R245ca':447.57, 'Xenon':289.733, 'CarbonylSulfide':378.77, 'Hydrogen':33.145, 'Methane':190.564, 'n-Octane':569.32, 'Perfluoropentane':420.555, 'Propylene':364.211, 'R12':385.12, 'R141b':477.5, 'R161':375.3, 'R22':369.295, 'R236ea':412.44, 'R236fa':398.07, 'R245fa':427.16, 'R41':317.28, 'SulfurHexafluoride':318.723, 'Ammonia':405.4, 'Deuterium':38.34, 'Ethanol':513.9, 'Neon':44.4918, 'Decafluorobutane':113.3+273.15 # According to http://encyclopedia.airliquide.com/Encyclopedia.asp?GasID=19#GeneralData, not in Mulero } import glob, json, os for row in Mulero_data.split('\n'): row = row.split(' ') cas = row.pop(0) name = row.pop(0) a = row[0:len(row):2] a = [float(_) for _ in a] n = row[1:len(row):2] n = [float(_) for _ in n] if name not in Tc_dict: raise ValueError( 'could not find Tc for ' + name) continue Tc = Tc_dict[name] # The dictionary of values for the surface tension j_st = dict(Tc = Tc, a = a, n = n, BibTeX = 'Mulero-JPCRD-2012', description = 'sigma = sum(a_i*(1-T/Tc)^n_i)' ) fname = os.path.join(root_dir,'dev','fluids',name+'.json') if not os.path.exists(fname): print(fname+' does not exist') continue j = json.load(open(fname,'r')) j['ANCILLARIES']['surface_tension'] = j_st fp = open(fname, 'w') fp.write(json.dumps(j, **json_options)) fp.close() def inject_environmental_data(root_dir): print('*** Injecting environmental data from DTU') j = json.load(open(os.path.join(root_dir,'dev','environmental_data_from_DTU','DTU_environmental.json'),'r')) for CAS in j: data = j[CAS] fname = os.path.join(root_dir,'dev','fluids',data['Name']+'.json') if os.path.isfile(fname): fluid = json.load(open(fname,'r')) fluid['ENVIRONMENTAL'] = data fp = open(fname, 'w') fp.write(json.dumps(fluid, **json_options)) else: print('Could not inject environmental data for',data['Name']) def inject_ancillaries(root_dir): print('*** Injecting saturation ancillary curves') master = [] for file in glob.glob(os.path.join(root_dir,'dev','fluids','*.json')): path, file_name = os.path.split(file) fluid_name = file_name.split('.')[0] # Load the fluid file fluid = json.load(open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'), 'r')) # Load the ancillary anc = json.load(open(os.path.join(root_dir,'dev','ancillaries',fluid_name+'_anc.json'),'r')) # Apply the ancillary by merging dictionaries fluid.update(anc) # Write fluid back to file fp = open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'),'w') fp.write(json.dumps(fluid, **json_options)) def package_json(root_dir): master = [] inject_ancillaries(root_dir) inject_surface_tension(root_dir) inject_environmental_data(root_dir) print('*** Combining fluid JSON files in JSON format in dev folder...') for file in glob.glob(os.path.join(root_dir,'dev','fluids','*.json')): path, file_name = os.path.split(file) fluid_name = file_name.split('.')[0] # Load the fluid file fluid = json.load(open(os.path.join(root_dir,'dev','fluids', fluid_name+'.json'), 'r')) master += [fluid] fp = open(os.path.join(root_dir,'dev','all_fluids_verbose.json'),'w') fp.write(json.dumps(master, **json_options)) fp.close() fp = open(os.path.join(root_dir,'dev','all_fluids.json'),'w') fp.write(json.dumps(master)) fp.close() if __name__=='__main__': package_json(root_dir = '..')