import CoolProp, json def extract_coeffs(lines): N_normal, C_normal, N_critical, C_critical, N_spare, C_spare = [int(el) for el in lines[0].split('!')[0].strip().split(' ') if el] terms = [] assert(N_normal > 0) assert(C_normal == 4) chunk = [] for line in lines[1:N_normal + 1]: ll = line.split('!')[0].strip() ll = [float(f) for f in ll.split(' ') if f] chunk.append(ll) n, t, d, l = zip(*chunk) terms.append( dict(type="ResidualHelmholtzPower", n=n, d=d, t=t, l=l) ) if N_critical > 0: chunk = [] for line in lines[1 + N_normal:N_normal + 1 + N_critical]: ll = line.split('!')[0].strip() ll = [float(f) for f in ll.split(' ') if f] chunk.append(ll) n, t, d, l, dummy1, neg_eta, neg_beta, gamma, epsilon, dummy2, dummy3, dummy4 = zip(*chunk) eta, beta = [[-el for el in vec] for vec in [neg_eta, neg_beta]] terms.append( dict(type="ResidualHelmholtzGaussian", n=n, d=d, t=t, eta=eta, beta=beta, gamma=gamma, epsilon=epsilon) ) return terms def extract_active_EOS(file_name): with open(file_name, 'r') as fp: lines = fp.readlines() del fp # Find the #EOS key iEOS = -1 for i, line in enumerate(lines): if line.startswith('#EOS'): if iEOS < 0: iEOS = i else: raise KeyError("Found more than one #EOS in file") # Find the end of the EOS block for i in range(iEOS, len(lines)): if len(lines[i].strip()) == 0: iEOS_end = i break if i == len(lines) - 1: raise KeyError("Could not find empty line at end of EOS block") iEOS_start = iEOS for i in range(iEOS, iEOS_end + 1): if lines[i].startswith('!'): iEOS_start = i break for i in range(iEOS_start + 1, iEOS_end + 1): print(lines[i].strip()) def unpack(line): s = line.split('!')[0].strip() try: return float(s) except ValueError: return s Tmin, Tmax, pmax, rhomax, CPP, MW, Tt, Pt, rhot, NBP, acentric, crit, reducing, R = [unpack(line) for line in lines[iEOS_start + 1:iEOS_start + 1 + 14]] reducing = [float(f) for f in reducing.split(' ') if f] crit = [float(f) for f in crit.split(' ') if f] alphar = extract_coeffs(lines[iEOS_start + 15:iEOS_end + 1]) del file_name, iEOS, iEOS_start, iEOS_end, unpack, lines, line, i return locals().copy() def build_states(): return [] def build_alpha0(ALPHA0): return [] def build_alphar(EOS): return [] def write(EOS, ALPHA0, json_file): base = dict(BibTeX_CP0="", BibTeX_EOS="XXXX TO BE FILLED IN XXX", STATES=build_states(), T_max=EOS['Tmax'], T_max_units='K', Ttriple=EOS['Tt'], Ttriple_units='K', acentric=EOS['acentric'], acentric_units='-', alpha0=build_alpha0(ALPHA0), alphar=EOS['alphar'], gas_constant=EOS['R'], gas_constant_units='J/mol/K', molar_mass=EOS['MW'] / 1000.0, molar_mass_units='kg/mol', p_max=EOS['pmax'] * 1000.0, p_max_units='Pa', pseudo_pure='XXX TO BE FILLED IN XXX' ) with open(json_file, 'w') as fp: json.dump(base, fp, indent=2, sort_keys=True) if __name__ == '__main__': EOS = extract_active_EOS('/Users/ian/Downloads/MDM.FLD') ALPHA0 = [] write(EOS, ALPHA0, 'MDM.json')