def run_hse_prep_calculation(dim=2, submit=True):
    """
    Submits a quick static calculation to calculate the IBZKPT
    file using a smaller number of k-points (200/atom instead of
    1000/atom). The other outputs from this calculation are
    essentially useless.

    Args:
        dim (int): 2 for relaxing a 2D material, 3 for a 3D material.
        submit (bool): Whether or not to submit the job.
    """

    if not os.path.isdir('hse_prep'):
        os.mkdir('hse_prep')
    os.chdir('hse_prep')
    os.system('cp ../CONTCAR ./POSCAR')
    if os.path.isfile('../POTCAR'):
        os.system('cp POTCAR .')
    relax(dim=2, submit=False)
    incar_dict = Incar.from_file('INCAR').as_dict()
    incar_dict.update({'NSW': 0, 'NELM': 1, 'LWAVE': False, 'LCHARG': False,
                       'LAECHG': False})
    Incar.from_dict(incar_dict).write_file('INCAR')

    Kpoints.automatic_density(
        Structure.from_file('POSCAR'), 200
    ).write_file('KPOINTS')

    if dim == 2:
        kpts_lines = open('KPOINTS').readlines()

        with open('KPOINTS', 'w') as kpts:
            for line in kpts_lines[:3]:
                kpts.write(line)
            kpts.write(kpts_lines[3].split()[0] + ' '
                       + kpts_lines[3].split()[1] + ' 1')

    if QUEUE == 'pbs':
        write_pbs_runjob('{}_prep'.format(
            os.getcwd().split('/')[-2]), 1, 16, '800mb', '6:00:00', VASP)
        submission_command = 'qsub runjob'

    elif QUEUE == 'slurm':
        write_slurm_runjob('{}_prep'.format(
            os.getcwd().split('/')[-2]), 16, '800mb', '6:00:00', VASP)
        submission_command = 'sbatch runjob'

    if submit:
        os.system(submission_command)

    os.chdir('../')
INTERVAL = 360  # Seconds between convergence checks

directories = [
    dir for dir in os.listdir(os.getcwd())
    if os.path.isdir(dir) and dir not in ['all_competitors']
]

if __name__ == '__main__':

    competing_species = get_competing_species(directories)
    relax_competing_species(competing_species)

    for directory in directories:
        os.chdir(directory)
        relax()
        os.chdir('../')

    loop = True
    while loop:
        print('>> Checking convergence')
        finished_2d, finished_3d = [], []

        for directory in directories:
            if is_converged(directory):
                finished_2d.append(directory)
        for directory in competing_species:
            if is_converged('all_competitors/{}'.format(directory[0])):
                finished_3d.append(directory[0])

        if len(finished_2d + finished_3d) == len(directories +
                                               plot_hull_distances)


INTERVAL = 360  # Seconds between convergence checks

directories = [dir for dir in os.listdir(os.getcwd()) if os.path.isdir(dir)
               and dir not in ['all_competitors']]

if __name__ == '__main__':

    competing_species = get_competing_species(directories)
    relax_competing_species(competing_species)

    for directory in directories:
        os.chdir(directory)
        relax()
        os.chdir('../')

    loop = True
    while loop:
        print('>> Checking convergence')
        finished_2d, finished_3d = [], []

        for directory in directories:
            if is_converged(directory):
                finished_2d.append(directory)
        for directory in competing_species:
            if is_converged('all_competitors/{}'.format(directory[0])):
                finished_3d.append(directory[0])

        if len(finished_2d + finished_3d) == len(