Exemple #1
0
def relax(dim=2, submit=True, force_overwrite=False):
    """
    Writes input files and (optionally) submits a self-consistent
    relaxation. Should be run before pretty much anything else, in
    order to get the right energy and structure of the material.

    Args:
        dim (int): 2 for relaxing a 2D material, 3 for a 3D material.
        submit (bool): Whether or not to submit the job.
        force_overwrite (bool): Whether or not to overwrite files
            if an already converged vasprun.xml exists in the
            directory.
    """

    if force_overwrite or not utl.is_converged(os.getcwd()):
        directory = os.getcwd().split('/')[-1]

        # vdw_kernel.bindat file required for VDW calculations.
        if VDW_KERNEL:
            os.system('cp {} .'.format(VDW_KERNEL))
        # KPOINTS
        Kpoints.automatic_density(Structure.from_file('POSCAR'),
                                  1000).write_file('KPOINTS')

        # INCAR
        INCAR_DICT.update(
            {'MAGMOM': utl.get_magmom_string(Structure.from_file('POSCAR'))}
        )
        Incar.from_dict(INCAR_DICT).write_file('INCAR')
        # POTCAR
        utl.write_potcar()

        # Special tasks only performed for 2D materials.
        if dim == 2:
            # Ensure 20A interlayer vacuum
            utl.ensure_vacuum(Structure.from_file('POSCAR'), 20)
            # Remove all z k-points.
            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')

        # Submission script
        if dim == 2:
            binary = VASP_TWOD_BIN
        elif dim == 3:
            binary = VASP_STD_BIN
        if QUEUE_SYSTEM == 'pbs':
            utl.write_pbs_runjob(directory, 1, 16, '800mb', '6:00:00', binary)
            submission_command = 'qsub runjob'

        elif QUEUE_SYSTEM == 'slurm':
            utl.write_slurm_runjob(directory, 16, '800mb', '6:00:00', binary)
            submission_command = 'sbatch runjob'

        if submit:
            os.system(submission_command)
Exemple #2
0
def relax(dim=2, submit=True, force_overwrite=False):
    """
    Writes input files and (optionally) submits a self-consistent
    relaxation. Should be run before pretty much anything else, in
    order to get the right energy and structure of the material.

    Args:
        dim (int): 2 for relaxing a 2D material, 3 for a 3D material.
        submit (bool): Whether or not to submit the job.
        force_overwrite (bool): Whether or not to overwrite files
            if an already converged vasprun.xml exists in the
            directory.
    """

    if force_overwrite or not utl.is_converged(os.getcwd()):
        directory = os.getcwd().split('/')[-1]

        # vdw_kernel.bindat file required for VDW calculations.
        if VDW_KERNEL:
            os.system('cp {} .'.format(VDW_KERNEL))
        # KPOINTS
        Kpoints.automatic_density(Structure.from_file('POSCAR'),
                                  1000).write_file('KPOINTS')

        # INCAR
        INCAR_DICT.update(
            {'MAGMOM': utl.get_magmom_string(Structure.from_file('POSCAR'))})
        Incar.from_dict(INCAR_DICT).write_file('INCAR')
        # POTCAR
        utl.write_potcar()

        # Special tasks only performed for 2D materials.
        if dim == 2:
            # Ensure 20A interlayer vacuum
            utl.ensure_vacuum(Structure.from_file('POSCAR'), 20)
            # Remove all z k-points.
            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')

        # Submission script
        if dim == 2:
            binary = VASP_TWOD_BIN
        elif dim == 3:
            binary = VASP_STD_BIN
        if QUEUE_SYSTEM == 'pbs':
            utl.write_pbs_runjob(directory, 1, 16, '800mb', '6:00:00', binary)
            submission_command = 'qsub runjob'

        elif QUEUE_SYSTEM == 'slurm':
            utl.write_slurm_runjob(directory, 16, '800mb', '6:00:00', binary)
            submission_command = 'sbatch runjob'

        if submit:
            os.system(submission_command)
Exemple #3
0
def run_gamma_calculations(submit=True, step_size=0.5):
    """
    Setup a 2D grid of static energy calculations to plot the Gamma
    surface between two layers of the 2D material. These calculations
    are run and stored in subdirectories under 'friction/lateral'.

    Args:
        submit (bool): Whether or not to submit the jobs.
        step_size (float): the distance between grid points in
            Angstroms.
    """

    if not os.path.isdir('friction'):
        os.mkdir('friction')
    os.chdir('friction')

    if not os.path.isdir('lateral'):
        os.mkdir('lateral')
    os.chdir('lateral')

    os.system('cp ../../CONTCAR POSCAR')

    # Pad the bottom layer with 20 Angstroms of vacuum.
    utl.ensure_vacuum(Structure.from_file('POSCAR'), 20)
    structure = Structure.from_file('POSCAR')
    n_sites_per_layer = structure.num_sites

    n_divs_x = int(math.ceil(structure.lattice.a / step_size))
    n_divs_y = int(math.ceil(structure.lattice.b / step_size))

    # Get the thickness of the material.
    max_height = max([site.coords[2] for site in structure.sites])
    min_height = min([site.coords[2] for site in structure.sites])
    thickness = max_height - min_height

    # Make a new layer.
    species, coords = [], []
    for site in structure.sites:
        # Original site
        species.append(site.specie)
        coords.append(site.coords)
        # New layer site
        species.append(site.specie)
        coords.append(
            [site.coords[0], site.coords[1], site.coords[2] + thickness + 3.5])

    Structure(structure.lattice, species, coords,
              coords_are_cartesian=True).to('POSCAR', 'POSCAR')

    for x in range(n_divs_x):
        for y in range(n_divs_y):
            dir = '{}x{}'.format(x, y)

            if not os.path.isdir(dir):
                os.mkdir(dir)

            # Copy input files
            os.chdir(dir)
            os.system('cp ../../../INCAR .')
            os.system('cp ../../../KPOINTS .')
            os.system('cp ../POSCAR .')
            if VDW_KERNEL:
                os.system('cp {} .'.format(VDW_KERNEL))

            # Shift the top layer
            structure = Structure.from_file("POSCAR")
            all_z_coords = [s.coords[2] for s in structure.sites]
            top_layer = [
                s for s in structure.sites
                if s.coords[2] > np.mean(all_z_coords)
            ]
            structure.remove_sites(
                [i for i, s in enumerate(structure.sites) if s in top_layer])
            for site in top_layer:
                structure.append(site.specie, [
                    site.coords[0] + float(x) / float(n_divs_x),
                    site.coords[1] + float(y) / float(n_divs_y), site.coords[2]
                ],
                                 coords_are_cartesian=True)

            structure = structure.get_sorted_structure()
            structure.to("POSCAR", "POSCAR")
            utl.write_potcar()
            incar_dict = Incar.from_file('INCAR').as_dict()
            incar_dict.update({
                'NSW': 0,
                'LAECHG': False,
                'LCHARG': False,
                'LWAVE': False,
                'LVTOT': False,
                'MAGMOM': utl.get_magmom_string(structure)
            })
            incar_dict.pop('NPAR', None)
            Incar.from_dict(incar_dict).write_file('INCAR')

            if QUEUE_SYSTEM == 'pbs':
                utl.write_pbs_runjob(dir, 1, 8, '1000mb', '2:00:00',
                                     VASP_STD_BIN)
                submission_command = 'qsub runjob'

            elif QUEUE_SYSTEM == 'slurm':
                utl.write_slurm_runjob(dir, 8, '1000mb', '2:00:00',
                                       VASP_STD_BIN)
                submission_command = 'sbatch runjob'

            if submit:
                os.system(submission_command)

            os.chdir('../')

    os.chdir('../../')
Exemple #4
0
def run_gamma_calculations(submit=True, step_size=0.5):
    """
    Setup a 2D grid of static energy calculations to plot the Gamma
    surface between two layers of the 2D material. These calculations
    are run and stored in subdirectories under 'friction/lateral'.

    Args:
        submit (bool): Whether or not to submit the jobs.
        step_size (float): the distance between grid points in
            Angstroms.
    """

    if not os.path.isdir('friction'):
        os.mkdir('friction')
    os.chdir('friction')

    if not os.path.isdir('lateral'):
        os.mkdir('lateral')
    os.chdir('lateral')

    try:
        os.system('cp ../../CONTCAR POSCAR')
    except:
        try:
            os.system('cp ../../POSCAR .')
        except:
            raise IOError('No POSCAR or CONTCAR found in ' +
                          os.path.dirname(os.path.dirname(os.getcwd())))

    # Pad the bottom layer with 20 Angstroms of vacuum.
    utl.ensure_vacuum(Structure.from_file('POSCAR'), 20)
    structure = Structure.from_file('POSCAR')
    n_sites_per_layer = structure.num_sites

    n_divs_x = int(math.ceil(structure.lattice.a / step_size))
    n_divs_y = int(math.ceil(structure.lattice.b / step_size))

    # Get the thickness of the material.
    max_height = max([site.coords[2] for site in structure.sites])
    min_height = min([site.coords[2] for site in structure.sites])
    thickness = max_height - min_height

    # Make a new layer.
    species, coords = [], []
    for site in structure.sites:
        # Original site
        species.append(site.specie)
        coords.append(site.coords)
        # New layer site
        species.append(site.specie)
        coords.append(
            [site.coords[0], site.coords[1], site.coords[2] + thickness + 3.5])

    Structure(structure.lattice, species, coords).to('POSCAR', 'POSCAR')

    for x in range(n_divs_x):
        for y in range(n_divs_y):
            dir = '{}x{}'.format(x, y)

            if not os.path.isdir(dir):
                os.mkdir(dir)

            # Copy input files
            os.chdir(dir)
            if not os.path.exists('../../INCAR'):
                raise IOError('No INCAR found in ' +
                              os.path.dirname(os.path.dirname(os.getcwd())))

            if not os.path.exists('../../KPOINTS'):
                raise IOError('No KPOINTS found in ' +
                              os.path.dirname(os.path.dirname(os.getcwd())))
            os.system('cp ../../../INCAR .')
            os.system('cp ../../../KPOINTS .')
            os.system('cp ../POSCAR .')
            if VDW_KERNEL:
                os.system('cp {} .'.format(VDW_KERNEL))

            utl.write_potcar()
            incar_dict = Incar.from_file('INCAR').as_dict()
            incar_dict.update({
                'NSW':
                0,
                'LAECHG':
                False,
                'LCHARG':
                False,
                'LWAVE':
                False,
                'LVTOT':
                False,
                'MAGMOM':
                utl.get_magmom_string(Structure.from_file('POSCAR'))
            })
            incar_dict.pop('NPAR', None)
            Incar.from_dict(incar_dict).write_file('INCAR')

            # Shift the top layer
            poscar_lines = open('POSCAR').readlines()
            with open('POSCAR', 'w') as poscar:
                for line in poscar_lines[:8 + n_sites_per_layer]:
                    poscar.write(line)
                for line in poscar_lines[8 + n_sites_per_layer:]:
                    split_line = line.split()
                    new_coords = [
                        float(split_line[0]) + float(x) / float(n_divs_x),
                        float(split_line[1]) + float(y) / float(n_divs_y),
                        float(split_line[2])
                    ]
                    poscar.write(' '.join([str(i) for i in new_coords]) + '\n')
            sub_exe = True
            if VASP_STD_BIN == 'None':
                print 'Executable is missing in ' + os.getcwd() + '/runjob'
                print 'Configure mpint_config.yaml file with your executable!'
                sub_exe = False
            if QUEUE_SYSTEM == 'pbs':
                utl.write_pbs_runjob(dir, 1, 8, '1000mb', '2:00:00',
                                     VASP_STD_BIN)
                submission_command = 'qsub runjob'

            elif QUEUE_SYSTEM == 'slurm':
                utl.write_slurm_runjob(dir, 8, '1000mb', '2:00:00',
                                       VASP_STD_BIN)
                submission_command = 'sbatch runjob'

            if submit and sub_exe:
                os.system(submission_command)

            os.chdir('../')

    os.chdir('../../')
Exemple #5
0
def run_gamma_calculations(submit=True, step_size=0.5):
    """
    Setup a 2D grid of static energy calculations to plot the Gamma
    surface between two layers of the 2D material. These calculations
    are run and stored in subdirectories under 'friction/lateral'.

    Args:
        submit (bool): Whether or not to submit the jobs.
        step_size (float): the distance between grid points in
            Angstroms.
    """

    if not os.path.isdir('friction'):
        os.mkdir('friction')
    os.chdir('friction')

    if not os.path.isdir('lateral'):
        os.mkdir('lateral')
    os.chdir('lateral')

    os.system('cp ../../CONTCAR POSCAR')

    # Pad the bottom layer with 20 Angstroms of vacuum.
    utl.ensure_vacuum(Structure.from_file('POSCAR'), 20)
    structure = Structure.from_file('POSCAR')
    n_sites_per_layer = structure.num_sites

    n_divs_x = int(math.ceil(structure.lattice.a / step_size))
    n_divs_y = int(math.ceil(structure.lattice.b / step_size))

    # Get the thickness of the material.
    max_height = max([site.coords[2] for site in structure.sites])
    min_height = min([site.coords[2] for site in structure.sites])
    thickness = max_height - min_height

    # Make a new layer.
    species, coords = [], []
    for site in structure.sites:
        # Original site
        species.append(site.specie)
        coords.append(site.coords)
        # New layer site
        species.append(site.specie)
        coords.append([site.coords[0], site.coords[1],
                       site.coords[2] + thickness + 3.5])

    Structure(structure.lattice, species, coords,
              coords_are_cartesian=True).to('POSCAR', 'POSCAR')

    for x in range(n_divs_x):
        for y in range(n_divs_y):
            dir = '{}x{}'.format(x, y)

            if not os.path.isdir(dir):
                os.mkdir(dir)

            # Copy input files
            os.chdir(dir)
            os.system('cp ../../../INCAR .')
            os.system('cp ../../../KPOINTS .')
            os.system('cp ../POSCAR .')
            if VDW_KERNEL:
                os.system('cp {} .'.format(VDW_KERNEL))

            # Shift the top layer
            structure = Structure.from_file("POSCAR")
            all_z_coords = [s.coords[2] for s in structure.sites]
            top_layer = [s for s in structure.sites if s.coords[2] > np.mean(all_z_coords)]
            structure.remove_sites([i for i, s in enumerate(structure.sites) if s in top_layer])
            for site in top_layer:
                structure.append(
                    site.specie,
                    [site.coords[0]+float(x)/float(n_divs_x),
                     site.coords[1]+float(y)/float(n_divs_y),
                     site.coords[2]], coords_are_cartesian=True
                )

            structure = structure.get_sorted_structure()
            structure.to("POSCAR", "POSCAR")
            utl.write_potcar()
            incar_dict = Incar.from_file('INCAR').as_dict()
            incar_dict.update({'NSW': 0, 'LAECHG': False, 'LCHARG': False,
                               'LWAVE': False, 'LVTOT': False,
                               'MAGMOM': utl.get_magmom_string(structure)})
            incar_dict.pop('NPAR', None)
            Incar.from_dict(incar_dict).write_file('INCAR')

            if QUEUE_SYSTEM == 'pbs':
                utl.write_pbs_runjob(dir, 1, 8, '1000mb', '2:00:00', VASP_STD_BIN)
                submission_command = 'qsub runjob'

            elif QUEUE_SYSTEM == 'slurm':
                utl.write_slurm_runjob(dir, 8, '1000mb', '2:00:00', VASP_STD_BIN)
                submission_command = 'sbatch runjob'

            if submit:
                os.system(submission_command)

            os.chdir('../')

    os.chdir('../../')