def run_vasp(override=[], suffix=''): ''' execute vasp with given override and suffix :param override: :param suffix: :return: ''' from Classes_Pymatgen import Incar from Classes_Custodian import StandardJob from custodian.custodian import Custodian import os # Determine wheter to use Gamma optimized vasp incar = Incar.from_file('INCAR') if 'AUTO_GAMMA' in incar and incar['AUTO_GAMMA']: vasp = os.environ['VASP_GAMMA'] else: vasp = os.environ['VASP_KPTS'] handlers = [] vaspjob = [StandardJob(['mpirun', '-np', os.environ['VASP_PROCS'], vasp], 'vasp.log', auto_npar=False, backup=False, settings_override=override, suffix=suffix, final=False)] c = Custodian(handlers, vaspjob, max_errors=10) c.run()
def run_vasp(override=[], suffix='', walltime=None, buffer_time=None): """ execute vasp with given override and suffix :param override: :param suffix: :return: """ from Classes_Pymatgen import Incar from Classes_Custodian import StandardJob from custodian.custodian import Custodian import os # Determine wheter to use Gamma optimized vasp incar = Incar.from_file('INCAR') if 'AUTO_GAMMA' in incar and incar['AUTO_GAMMA']: vasp = os.environ['VASP_GAMMA'] else: vasp = os.environ['VASP_KPTS'] handlers = [] if walltime: handlers += [ WalltimeHandler( wall_time=walltime, buffer_time=buffer_time, electronic_step_stop=True, ) ] if os.environ['VASP_MPI'] == 'srun': vaspjob = [ StandardJob(['srun', vasp], 'vasp.log', auto_npar=False, backup=False, settings_override=override, suffix=suffix, final=False) ] else: vaspjob = [ StandardJob(['mpirun', '-np', os.environ['VASP_PROCS'], vasp], 'vasp.log', auto_npar=False, backup=False, settings_override=override, suffix=suffix, final=False) ] c = Custodian(handlers, vaspjob, max_errors=10) c.run()
def neb2dim(neb_dir, dimer_dir, ts_i=None): if not ts_i: neb_dir = os.path.abspath(neb_dir) dimer_dir = os.path.abspath(dimer_dir) try: energies = NEBAnalysis.from_dir(neb_dir).energies except: if input('Failed, do: rm ' + neb_dir + '*/*.xyz and try again? (y)') == 'y': os.system('rm ' + neb_dir + '/*/*.xyz') energies = NEBAnalysis.from_dir(neb_dir).energies else: raise Exception('Could not read NEB dir') ts_i = list(energies).index(energies.max()) print('Copying TS directory {}'.format(str(ts_i).zfill(2))) if not os.path.exists(dimer_dir): os.makedirs(dimer_dir) for f in os.listdir(os.path.join(neb_dir, str(ts_i).zfill(2))): shutil.copy(os.path.join(neb_dir, str(ts_i).zfill(2), f), dimer_dir) for f in ['INCAR', 'KPOINTS', 'POTCAR']: shutil.copy(os.path.join(neb_dir, f), dimer_dir) print('Modifying INCAR') incar = Incar.from_file(os.path.join(dimer_dir, 'INCAR')) incar['ICHAIN'] = 2 incar['EDIFF'] = 1e-7 incar['NSW'] = 5000 if 'neb' in incar['SYSTEM']: incar['SYSTEM'] = incar['SYSTEM'].replace('neb', 'dim') else: incar['SYSTEM'] = incar['SYSTEM'] + ' dim' for neb_setting in ['IMAGES', 'LCLIMB']: if neb_setting in incar: del incar[neb_setting] incar.write_file(os.path.join(dimer_dir, 'INCAR')) print('Making MODECAR') mode1 = os.path.join(neb_dir, str(ts_i - 1).zfill(2)) mode2 = os.path.join(neb_dir, str(ts_i + 1).zfill(2)) cwd = os.path.abspath('.') os.chdir(dimer_dir) os.system('modemake.pl ' + mode1 + '/CONTCAR ' + mode2 + '/CONTCAR &> /dev/null') os.chdir(cwd)
def write_run(run, run_folder, write_vasprun=False): os.makedirs(run_folder, exist_ok=True) incar = Incar.from_dict(run['incar']) poscar = Poscar.from_dict(run['poscar']) kpoints = Kpoints.from_dict(run['kpoints']) energy = run['energy'] files = [ ('INCAR', incar), ('KPOINTS', kpoints), ('POSCAR', poscar), ] for filename, pymg_object in files: pymg_object.write_file(os.path.join(run_folder, filename)) with open(os.path.join(run_folder, 'energy.txt'), 'w') as f: f.write(str(energy)) if write_vasprun: if not os.path.exists(os.path.join(run_folder, 'vasprun.xml')): print(' Writing Vasprun') get_file(fs, run['vasprun'], new_file=os.path.join(run_folder, 'vasprun.xml'))
def get_energy(i, structure: Structure, target=0.01): """ :param i: folder for structure to be placed in :param structure: Structure :param target: energy to converge to :return: energy in eV """ cwd = os.path.abspath('.') handlers = [VaspErrorHandler('vasp.log'), PositiveEnergyErrorHandler(), NonConvergingErrorHandler(nionic_steps=10, change_algo=True)] settings = [ {'dict': 'INCAR', 'action': {'_set': {'NSW': 5000, 'IOPT': 0, 'IBRION': 3, 'EDIFFG': 1e-5, 'POTIM' : 0}, }} ] folder = os.path.join(cwd, str(i).zfill(4)) if os.path.exists(folder): Poscar(structure).write_file(os.path.join(folder, 'POSCAR')) try: vasprun_above = Vasprun(os.path.join(folder, 'above', 'vasprun.xml')) vasprun_below = Vasprun(os.path.join(folder, 'below', 'vasprun.xml')) if vasprun_above.converged and vasprun_below.converged: # if vasprun_above.final_energy - vasprun_below.final_energy < target: # for f in ['WAVECAR', 'CHGCAR', 'vasprun.xml', 'CONTCAR', 'POSCAR', 'INCAR', 'KPOINTS', 'POTCAR'] # shutil.copy(os.path.join(folder, 'above', f), f with open(os.path.join(folder, 'energy.txt'), 'w') as f: f.write(str(min(vasprun_above.final_energy, vasprun_below.final_energy))) return min(vasprun_above.final_energy, vasprun_below.final_energy) except: try: if os.path.exists(os.path.join(folder, 'energy.txt')): with open(os.path.join(folder, 'energy.txt'), 'r') as f: energy = float(f.read().split()[0]) return energy else: shutil.copy('INCAR', os.path.join(folder, 'INCAR')) vasprun = Vasprun(os.path.join(folder, 'vasprun.xml')) with open(os.path.join(folder, 'energy.txt'), 'w') as f: f.write(str(vasprun.final_energy)) return vasprun.final_energy except: pass else: os.mkdir(folder) above = None below = None for dir in [dir for dir in os.listdir(cwd) if os.path.isdir(os.path.join(cwd, dir))]: try: dir_i = int(dir) if i == dir_i: pass if dir_i > i: if above is None: above = dir_i elif dir_i - i < above - i: above = dir_i elif dir_i < i: if below is None: below = dir_i elif dir_i - i < below - i: below = dir_i elif closest is None: closest = dir elif abs(i - int(closest)) >= abs(i - int(dir)): closest = dir except: pass same_wfxns = 0 for dir_i, dir in [(str(above).zfill(4), 'above'), (str(below).zfill(4), 'below')]: try: vasprun = Vasprun(os.path.join(folder, dir, 'vasprun.xml')) if vasprun.converged: pass else: raise Exception('Not Converged') except: os.makedirs(os.path.join(folder, dir), exist_ok=True) if not os.path.exists(os.path.join(folder, dir, 'WAVECAR')): try: shutil.copy(os.path.join(dir_i, 'WAVECAR'), os.path.join(folder, dir, 'WAVECAR')) shutil.copy(os.path.join(dir_i, 'CHGCAR'), os.path.join(folder, dir, 'CHGCAR')) except: if os.path.exists(os.path.join(dir_i, 'above', 'vasprun.xml')) and \ os.path.exists(os.path.join(dir_i, 'below', 'vasprun.xml')): vasprun_above = Vasprun(os.path.join(dir_i, 'above', 'vasprun.xml')) vasprun_below = Vasprun(os.path.join(dir_i, 'below', 'vasprun.xml')) if vasprun_above.final_energy < vasprun_below.final_energy: lowest_dir = 'above' else: lowest_dir = 'below' shutil.copy(os.path.join(dir_i, lowest_dir, 'WAVECAR'), os.path.join(folder, dir, 'WAVECAR')) shutil.copy(os.path.join(dir_i, lowest_dir, 'CHGCAR'), os.path.join(folder, dir, 'CHGCAR')) if vasprun_above.final_energy - vasprun_below.final_energy < target: same_wfxns += 1 if same_wfxns == 2: logging.info('Wavefunctions are the same') if os.path.exists(os.path.join(folder, dir, 'below')): shutil.rmtree(os.path.join(folder, dir, 'below')) shutil.copytree(os.path.join(folder, dir, 'above'), os.path.join(folder, dir, 'below')) else: shutil.copy('INCAR', os.path.join(folder, dir, 'INCAR')) shutil.copy('KPOINTS', os.path.join(folder, dir, 'KPOINTS')) shutil.copy('POTCAR', os.path.join(folder, dir, 'POTCAR')) os.chdir(folder) os.chdir(dir) Poscar(structure).write_file('POSCAR') incar = Incar.from_file('INCAR') if 'AUTO_GAMMA' in incar and incar['AUTO_GAMMA']: vasp = os.environ['VASP_GAMMA'] else: vasp = os.environ['VASP_KPTS'] incar.write_file('INCAR') if os.environ['VASP_MPI'] == 'srun': j = StandardJob([os.environ['VASP_MPI'], vasp], 'vasp.log', auto_npar=False, final=True, settings_override=settings) else: j = StandardJob([os.environ['VASP_MPI'], '-np', os.environ['PBS_NP'], vasp], 'vasp.log', auto_npar=False, final=True, settings_override=settings) c = Custodian(handlers, [j], max_errors=10) c.run() os.chdir(cwd) return get_energy(i, structure)
# if (lb_e <= cutoff and ub_e >= cutoff) or (ub_e - lb_e > max_range and lb_e <= cutoff + max_range / 2 and ub_e >= cutoff - max_range / 2): print('{} {}'.format(material,i)) material_folder = os.path.join(folder, material, str(i)) lb = ts['lb'][i - 1] ubs = ts['ub'][i-1] start = mat['start'] final = mat['finals'][i-1] #Write LB write_run(start, os.path.join(material_folder, 'start'), write_vasprun=True) write_run(final, os.path.join(material_folder, 'final'), write_vasprun=True) write_run(lb, os.path.join(material_folder, 'lb'), write_vasprun=True) write_run(mat['base'], os.path.join(material_folder, 'base'), write_vasprun=True) incar = Incar.from_dict(lb['incar']) incar['IMAGES'] = 1 incar['SPRING'] = 0 incar['LCLIMB'] = False incar['ISTART'] = 0 incar['ICHARG'] = 2 incar['IOPT'] = 1 incar['IBRION'] = 3 incar['POTIM'] = 0 incar['EDIFFG'] = -0.05 incar['EDIFF'] = 1e-5 incar['NELM'] = 100 incar['NSW'] = 5000 kpoints = Kpoints.from_dict(lb['kpoints']) potcar = lb['potcar']
auto_npar=False, backup=False, settings_override=override, suffix=suffix, final=False) ] c = Custodian(handlers, vaspjob, max_errors=10) c.run() try: shutil.copy('POSCAR.real', 'POSCAR') except: pass incar = Incar.from_file('INCAR') # Check for NUPDOWNdd if os.path.exists( 'nupdown_info' ) and 'AUTO_NUPDOWN' in incar: # Determine if full check must be done or if just using past NUPDOWN with open('nupdown_info') as f: lines = f.readlines() nupdown_best = int(lines[0].strip()) # optimal NUPDOWN is first line nupdown_iters = int( lines[1].strip()) # number of iterations with best nupdown if nupdown_iters < incar['AUTO_NUPDOWN_ITERS']: nupdown_check = False else: nupdown_check = True else: nupdown_check = True
handlers = [] vaspjob = [StandardJob(['mpirun', '-np', os.environ['VASP_PROCS'], vasp], 'vasp.log', auto_npar=False, backup=False, settings_override=override, suffix=suffix, final=False)] c = Custodian(handlers, vaspjob, max_errors=10) c.run() shutil.copy('../../INCAR', 'INCAR') shutil.copy('../../KPOINTS', 'KPOINTS') shutil.copy('../../POTCAR', 'POTCAR') try: shutil.copy('POSCAR.real', 'POSCAR') except: pass incar = Incar.from_file('INCAR') # Check for NUPDOWN if os.path.exists('nupdown_info'): # Determine if full check must be done or if just using past NUPDOWN with open('nupdown_info') as f: lines = f.readlines() nupdown_best = int(lines[0].strip()) # optimal NUPDOWN is first line nupdown_iters = int(lines[1].strip()) # number of iterations with best nupdown if nupdown_iters < incar['AUTO_NUPDOWN_ITERS']: nupdown_check = False else: nupdown_check = True else: nupdown_check = True if 'AUTO_NUPDOWN' in incar and not nupdown_check: # have a guess of nupdown override = [{"dict": "INCAR", "action": {"_set": {"NUPDOWN": nupdown_best}}}]
import numpy as np import logging import sys FORMAT = '%(asctime)s %(message)s' logging.basicConfig(format=FORMAT, level=logging.INFO, filename='run.log') root = logging.getLogger() root.setLevel(logging.DEBUG) ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) root.addHandler(ch) iterate = None i = Incar.from_file('INCAR') atoms = read('POSCAR')# type: Atoms if 'CONSATOM3' in i and 'CONTINUE_3PT' in i: from Classes_ASE import LockedTo3AtomPlane print('3 Atom Constraint cont.') a = read('POSCAR')# type: Atoms c = LockedTo3AtomPlane(i['DIFFATOM'], (i['CONSATOM1'], i['CONSATOM2'], i['CONSATOM3']), a.positions[i['DIFFATOM']]) elif 'CONSTYPE' in i and i['CONSTYPE'] == 'Bond': if 'ITERATE' in i and i['ITERATE']: from ase.constraints import FixInternals print('Constraining Bonds to fixed length') bond1 = atoms.get_distance(i['DIFFATOM'], i['CONSATOM1'], mic=True) bond2 = atoms.get_distance(i['DIFFATOM'], i['CONSATOM2'], mic=True) bonds = [ [ bond1, [ i['DIFFATOM'], i['CONSATOM1'] ] ], [ bond2, [ i['DIFFATOM'], i['CONSATOM2'] ] ]