예제 #1
0
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()
예제 #2
0
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()
예제 #3
0
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)
예제 #4
0
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'))
예제 #5
0
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)
예제 #6
0
        # 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']
예제 #7
0
                        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
예제 #8
0
    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}}}]
예제 #9
0
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'] ] ]