コード例 #1
0
def create_hkl_surface(lattice,
                       hkl,
                       layers,
                       vacuum=1.0,
                       center=False,
                       pbc=True):
    """
    Use ase.build.surface to build a surface with surface normal (hkl).

    Args:
        lattice (pyiron.atomistics.structure.atoms.Atoms/str): bulk Atoms
            instance or str, e.g. "Fe", from which to build the surface
        hkl (list): miller indices of surface to be created
        layers (int): # of atomic layers in the surface
        vacuum (float): vacuum spacing
        center (bool): shift all positions to center the surface
            in the cell

    Returns:
        pyiron.atomistics.structure.atoms.Atoms instance: Required surface
    """
    # https://gitlab.com/ase/ase/blob/master/ase/lattice/surface.py
    s.publication_add(publication_ase())

    surface = ase_surf(lattice, hkl, layers)
    z_max = np.max(surface.positions[:, 2])
    surface.cell[2, 2] = z_max + vacuum
    if center:
        surface.positions += 0.5 * surface.cell[2] - [0, 0, z_max / 2]
    surface.pbc = pbc
    return ase_to_pyiron(surface)
コード例 #2
0
ファイル: project.py プロジェクト: ashtonmv/sphinx_input
    def create_ase_bulk(
        name,
        crystalstructure=None,
        a=None,
        c=None,
        covera=None,
        u=None,
        orthorhombic=False,
        cubic=False,
    ):
        """Creating bulk systems using ASE bulk module.

            Crystal structure and lattice constant(s) will be guessed if not
            provided.

            name: str
                Chemical symbol or symbols as in 'MgO' or 'NaCl'.
            crystalstructure: str
                Must be one of sc, fcc, bcc, hcp, diamond, zincblende,
                rocksalt, cesiumchloride, fluorite or wurtzite.
            a: float
                Lattice constant.
            c: float
                Lattice constant.
            c_over_a: float
                c/a ratio used for hcp.  Default is ideal ratio: sqrt(8/3).
            u: float
                Internal coordinate for Wurtzite structure.
            orthorhombic: bool
                Construct orthorhombic unit cell instead of primitive cell
                which is the default.
            cubic: bool
                Construct cubic unit cell if possible.
            """
        s.publication_add(publication_ase())
        from ase.build import bulk

        return bulk(
            name=name,
            crystalstructure=crystalstructure,
            a=a,
            c=c,
            covera=covera,
            u=u,
            orthorhombic=orthorhombic,
            cubic=cubic,
        )
コード例 #3
0
def create_ase_bulk(
    name,
    crystalstructure=None,
    a=None,
    c=None,
    covera=None,
    u=None,
    orthorhombic=False,
    cubic=False,
):
    """
    Creating bulk systems using ASE bulk module. Crystal structure and lattice constant(s) will be guessed if not
    provided.

    name (str): Chemical symbol or symbols as in 'MgO' or 'NaCl'.
    crystalstructure (str): Must be one of sc, fcc, bcc, hcp, diamond, zincblende,
                            rocksalt, cesiumchloride, fluorite or wurtzite.
    a (float): Lattice constant.
    c (float): Lattice constant.
    c_over_a (float): c/a ratio used for hcp.  Default is ideal ratio: sqrt(8/3).
    u (float): Internal coordinate for Wurtzite structure.
    orthorhombic (bool): Construct orthorhombic unit cell instead of primitive cell which is the default.
    cubic (bool): Construct cubic unit cell if possible.

    Returns:

        pyiron.atomistics.structure.atoms.Atoms: Required bulk structure
    """
    s.publication_add(publication_ase())
    return ase_to_pyiron(
        bulk(
            name=name,
            crystalstructure=crystalstructure,
            a=a,
            c=c,
            covera=covera,
            u=u,
            orthorhombic=orthorhombic,
            cubic=cubic,
        ))
コード例 #4
0
ファイル: project.py プロジェクト: ashtonmv/sphinx_input
    def create_surface(element,
                       surface_type,
                       size=(1, 1, 1),
                       vacuum=1.0,
                       center=False,
                       **kwargs):
        """
        Generates surfaces instances based on the ase.build.surface module.
        Args:
            element (str): Element name
            surface_type (str): The string specifying the surface type generators available through ase (fcc111,
            hcp0001 etc.)
            size (turple): Size of the surface
            vacuum (float): Length of vacuum layer added to the surface along the z direction
            center (boolean): Tells if the surface layers have to be at the center or at one end along the z-direction
            **kwargs: Additional, arguments you would normally pass to the structure generator like 'a', 'b',
            'orthogonal' etc.

        Returns:
            surface (atomistics.structure.atoms.Atoms instance)

        """
        # https://gitlab.com/ase/ase/blob/master/ase/lattice/surface.py
        s.publication_add(publication_ase())
        from ase.build import (
            add_adsorbate,
            add_vacuum,
            bcc100,
            bcc110,
            bcc111,
            diamond100,
            diamond111,
            fcc100,
            fcc110,
            fcc111,
            fcc211,
            hcp0001,
            hcp10m10,
            mx2,
            hcp0001_root,
            fcc111_root,
            bcc111_root,
            root_surface,
            root_surface_analysis,
            surface,
        )

        for surface_class in [
                add_adsorbate,
                add_vacuum,
                bcc100,
                bcc110,
                bcc111,
                diamond100,
                diamond111,
                fcc100,
                fcc110,
                fcc111,
                fcc211,
                hcp0001,
                hcp10m10,
                mx2,
                hcp0001_root,
                fcc111_root,
                bcc111_root,
                root_surface,
                root_surface_analysis,
                surface,
        ]:
            if surface_type == surface_class.__name__:
                surface_type = surface_class
                break
        if isinstance(surface_type, types.FunctionType):
            if center:
                surface = surface_type(symbol=element,
                                       size=size,
                                       vacuum=vacuum,
                                       **kwargs)
            else:
                surface = surface_type(symbol=element, size=size, **kwargs)
                z_max = np.max(surface.positions[:, 2])
                surface.cell[2, 2] = z_max + vacuum
            return surface
        else:
            return None
コード例 #5
0
def create_surface(element,
                   surface_type,
                   size=(1, 1, 1),
                   vacuum=1.0,
                   center=False,
                   pbc=True,
                   **kwargs):
    """
    Generate a surface based on the ase.build.surface module.

    Args:
        element (str): Element name
        surface_type (str): The string specifying the surface type generators available through ase (fcc111,
        hcp0001 etc.)
        size (tuple): Size of the surface
        vacuum (float): Length of vacuum layer added to the surface along the z direction
        center (bool): Tells if the surface layers have to be at the center or at one end along the z-direction
        pbc (list/numpy.ndarray): List of booleans specifying the periodic boundary conditions along all three
                                  directions.
        **kwargs: Additional, arguments you would normally pass to the structure generator like 'a', 'b',
        'orthogonal' etc.

    Returns:
        pyiron.atomistics.structure.atoms.Atoms instance: Required surface

    """
    # https://gitlab.com/ase/ase/blob/master/ase/lattice/surface.py
    if pbc is None:
        pbc = True
    s.publication_add(publication_ase())
    for surface_class in [
            add_adsorbate,
            add_vacuum,
            bcc100,
            bcc110,
            bcc111,
            diamond100,
            diamond111,
            fcc100,
            fcc110,
            fcc111,
            fcc211,
            hcp0001,
            hcp10m10,
            mx2,
            hcp0001_root,
            fcc111_root,
            bcc111_root,
            root_surface,
            root_surface_analysis,
            ase_surf,
    ]:
        if surface_type == surface_class.__name__:
            surface_type = surface_class
            break
    if isinstance(surface_type, types.FunctionType):
        if center:
            surface = surface_type(symbol=element,
                                   size=size,
                                   vacuum=vacuum,
                                   **kwargs)
        else:
            surface = surface_type(symbol=element, size=size, **kwargs)
            z_max = np.max(surface.positions[:, 2])
            surface.cell[2, 2] = z_max + vacuum
        surface.pbc = pbc
        return ase_to_pyiron(surface)
    else:
        return None