def record_cmd_print(fdir, readme, dir=None): dir = fdir #readme['finished at'] = '{}'.format(datetime.now()) if not os.path.isdir(dir): dir = '/'.join(fdir.split('/')[0:-1]) if dir == "": dir = "./" with open (dir+"/readme", "w") as fp: myjsonout(readme, fp, indent="", comma="") if "ERROR" in readme.keys(): error ="**********FATAL ERROR encountered, you may check readme and E-V plot in the folder "+dir+"/figures" volumes = readme['E-V']['volumes'] energies = readme['E-V']['energies'] folder = os.path.join(dir,'figures') if not os.path.exists(folder): os.mkdir(folder) thermoplot(folder,"0 K total energies (eV/atom)",volumes, energies, plottitle=dir, lp=True) with open (os.path.join(dir,"ERROR"), "w") as fp: fp.write('{}\n'.format(readme['ERROR'])) if dir!=None: fp.write('{}\n'.format(error)) print ("\n", error, "\n") else: if os.path.exists(os.path.join(dir,"ERROR")): os.remove(os.path.join(dir,"ERROR")) with open ("runs.log", "a") as fp: try: #fp.write('phonon quality={}, LTC zigzag={}'.format(readme['phonon quality'], readme['LTC quality'])) fp.write('phonon quality={}'.format(readme['phonon quality'])) if os.path.exists(dir+'/fitF'): fp.write(', for fitF is on: {}\n'.format(dir)) else: fp.write(', for fitF is off: {}\n'.format(dir)) except: fp.write('FATAL ERROR in {}\n'.format(dir)) pass
def EV_find(self): evdirhome = 'E-V' if not os.path.exists(evdirhome): os.mkdir(evdirhome) hit = [] count = [] phases = [] volumes = [] ITEMS = [] potname = [] fp_ev = open(os.path.join(evdirhome, "E-V.dat"), "w") for i in self.items: mm = i['metadata']['tag'] els = i['elements'] if self.skipby("", mm, els=els): continue if self.hit_condition is not None: if mm not in self.hit_condition: continue if mm in hit: volume = i['output']['structure']['lattice']['volume'] if volume not in volumes[hit.index(mm)]: volumes[hit.index(mm)].append(volume) count[hit.index(mm)] += 1 else: ITEMS.append(i) hit.append(mm) count.append(1) volumes.append([i['output']['structure']['lattice']['volume']]) potsoc = get_used_pot(i) structure = Structure.from_dict(i['output']['structure']) formula_pretty = structure.composition.reduced_formula try: formula2composition(formula_pretty) except: formula_pretty = reduced_formula( structure.composition.alphabetical_formula) sa = SpacegroupAnalyzer(structure) phasename = formula_pretty+'_'\ + sa.get_space_group_symbol().replace('/','.')+'_'+str(sa.get_space_group_number()) potname.append(potsoc) if phasename in phases: for jj in range(10000): nphasename = phasename + "#" + str(jj) if nphasename in phases: continue phasename = nphasename break phases.append(phasename) blank_lines = False for i, mm in enumerate(hit): if self.hit_condition is not None: if mm not in self.hit_condition: continue if self.qhamode == 'phonon': if self.hit_count[mm] < self.nV: continue if count[i] < self.nV: continue if self.skipby(phases[i], mm): continue EV, POSCAR, INCAR = get_rec_from_metatag(self.vasp_db, mm) metadata = {'tag': mm} pname = phases[i].split('#') if len(pname) > 1: phases[i] = pname[0] + potname[i] + EV[ 'MagState'] + '#' + pname[1] else: phases[i] = pname[0] + potname[i] + EV['MagState'] if EV['natoms'] < self.natoms: continue sys.stdout.write('{}, static: {:>2}, natoms: {:>3}, {}\n'.format( metadata, count[i], EV['natoms'], phases[i])) folder = os.path.join(evdirhome, phases[i]) if not os.path.exists(folder): os.mkdir(folder) with open(os.path.join(folder, 'POSCAR'), 'w') as fp: fp.write(POSCAR) readme = {} readme['E-V'] = EV readme['INCAR'] = INCAR readme['POSCAR'] = POSCAR natoms = readme['E-V']['natoms'] with open(os.path.join(folder, 'readme'), 'w') as fp: myjsonout(readme, fp, indent="", comma="") i_energies = np.array(EV['energies']) / natoms i_volumes = np.array(EV['volumes']) / natoms val, idx = min((val, idx) for (idx, val) in enumerate(i_energies)) if blank_lines: print("\n", file=fp_ev) blank_lines = True print("#phase:", phases[i], file=fp_ev) print("#metadata:", mm, file=fp_ev) print("#natoms:", natoms, file=fp_ev) elist = ['Fe', 'Cu', 'Se', 'Al', 'Ni', 'Co', 'Pt', 'Ta', 'O'] el = [] nel = [] if len(EV['magmoms']) > 0: fp_ev.write("#magmoms:") magmoms = EV['magmoms'][idx] m0 = magmoms[0] n0 = 1 for j in range(1, len(magmoms)): if magmoms[j] == m0: n0 += 1 else: if n0 == 1: fp_ev.write('{},'.format(m0)) else: fp_ev.write('{}*{},'.format(n0, m0)) idx = len(el) % len(elist) el.append(elist[idx]) nel.append(n0) n0 = 1 m0 = magmoms[j] if n0 == 1: fp_ev.write('{}\n'.format(m0)) else: fp_ev.write('{}*{}\n'.format(n0, m0)) idx = len(el) % len(elist) el.append(elist[idx]) nel.append(n0) lines = [l for l in POSCAR.split('\n') if l != ""] with open(os.path.join(folder, phases[i] + '.VASP'), 'w') as fp: for j in range(0, 5): print(lines[j], file=fp) for j in range(len(el)): fp.write(' {}'.format(el[j])) fp.write('\n') for j in range(len(nel)): fp.write(' {}'.format(nel[j])) fp.write('\n') print(lines[7], file=fp) for j in range(8, len(lines)): print(lines[j], float(list(magmoms[j - 8].values())[0]), file=fp) for j in range(len(i_volumes)): print(i_volumes[j], i_energies[j], file=fp_ev) thermoplot(folder, "0 K total energies (eV/atom)", i_volumes, i_energies)
def EV_find(self): hit = [] count = [] phases = [] volumes = [] ITEMS = [] for i in self.items: try: mm = i['metadata']['tag'] except: continue if mm in hit: volume = i['output']['structure']['lattice']['volume'] if volume not in volumes[hit.index(mm)]: volumes[hit.index(mm)].append(volume) count[hit.index(mm)] += 1 #if mm=='5252ccc3-e8da-499f-bb9e-9cf7eb1c5370': print("eeeeeeeee",mm, pot) else: ITEMS.append(i) hit.append(mm) count.append(1) volumes.append([i['output']['structure']['lattice']['volume']]) pot = i['input']['pseudo_potential']['functional'].upper() #if mm=='5252ccc3-e8da-499f-bb9e-9cf7eb1c5370': print("eeeeeeeee",mm, pot) if pot == "": pot = i['orig_inputs']['potcar']['functional'].upper() if pot == 'Perdew-Zunger81'.upper(): pot = "LDA" try: pot += "+" + i['input']['GGA'] except: pass if i['input']['is_hubbard']: pot += '+U' try: if i['input']['incar']['LSORBIT']: potsoc = pot + "SOC" except: potsoc = pot structure = Structure.from_dict(i['output']['structure']) natoms = len(structure.sites) formula_pretty = structure.composition.reduced_formula try: formula2composition(formula_pretty) except: formula_pretty = reduced_formula( structure.composition.alphabetical_formula) sa = SpacegroupAnalyzer(structure) phasename = formula_pretty+'_'\ + sa.get_space_group_symbol().replace('/','.')+'_'+str(sa.get_space_group_number())+potsoc if phasename in phases: for jj in range(10000): nphasename = phasename + "#" + str(jj) if nphasename in phases: continue phasename = nphasename break phases.append(phasename) for i, m in enumerate(hit): if count[i] < self.nV: continue if self.skipby(phases[i]): continue sys.stdout.write('{}, static: {:>2}, {}\n'.format( m, count[i], phases[i])) EV, POSCAR, INCAR = get_rec_from_metatag(self.vasp_db, m) evdir = './E-V/' if not os.path.exists(evdir): os.mkdir(evdir) folder = evdir + phases[i] if not os.path.exists(folder): os.mkdir(folder) with open(folder + '/POSCAR', 'w') as fp: fp.write(POSCAR) readme = {} readme['E-V'] = EV readme['INCAR'] = INCAR readme['POSCAR'] = POSCAR with open(folder + '/readme', 'w') as fp: myjsonout(readme, fp, indent="", comma="") thermoplot(folder, "0 K total energies (eV/atom)", EV['volumes'], EV['energies'])