Beispiel #1
0
def pre_prepare_ase_after_relax_AB(initial_XV, final_XV, Ghost):
    """
    """
    import sisl
    trace_atom_A_initial = sisl.Geometry(initial_XV.xyz[-2],
                                         atoms=initial_XV.atoms.Z[-2])
    trace_atom_B_initial = sisl.Geometry(initial_XV.xyz[-1],
                                         atoms=initial_XV.atoms.Z[-1])
    #trace_atom_A_final = sisl.Geometry(final_XV.xyz[-2],
    #                                       atoms = final_XV.atoms.Z[-2])
    trace_atom_B_final = sisl.Geometry(final_XV.xyz[-1],
                                       atoms=final_XV.atoms.Z[-1])

    initial_XV = initial_XV.remove([-1])
    #initial_XV = initial_XV.remove([-1])
    final_XV = final_XV.remove([-1])
    #final_XV = final_XV.remove([-2])

    info_sisl = {
        'initial': initial_XV,
        'final': final_XV,
        'trace_atom_A_initial': trace_atom_A_initial,
        'trace_atom_B_initial': trace_atom_B_initial,
        #'trace_atom_A_final' : trace_atom_A_final,
        'trace_atom_B_final': trace_atom_B_final,
    }

    return info_sisl
Beispiel #2
0
def pre_prepare_ase_after_relax_to_be_deleted(initial_XV,final_XV):
    """
    """
    import sisl
    trace_atom_A_initial = sisl.Geometry(initial_XV.xyz[-2],
                                      atoms = initial_XV.atoms.Z[-2])
    trace_atom_A_final = sisl.Geometry( final_XV.xyz[-2],
                                    atoms =  final_XV.atoms.Z[-2])
    trace_atom_B_initial = sisl.Geometry( initial_XV.xyz[-1],
                                    atoms=  initial_XV.atoms.Z[-1])
    trace_atom_B_kicked = sisl.Geometry(final_XV.xyz[-1],
                                    atoms=  final_XV.atoms.Z[-1])

    #trace_atom_A_initial = sisl.Geometry(initial_XV.xyz[-2],
    #                                  atoms =  initial_XV.atoms.Z[-2])
    #trace_atom_B_initial = sisl.Geometry(initial_XV.xyz[-1],
    #                                atoms = initial_XV.atoms.Z[-1])
    initial_XV = initial_XV.remove([-1])
    final_XV = final_XV.remove([-1])
       
    info_sisl = {'initial' : initial_XV,
                 'final' : final_XV,
                 'trace_atom_A_initial' : trace_atom_A_initial,
                 'trace_atom_A_final' : trace_atom_A_final,
                 'trace_atom_B_initial' : trace_atom_B_initial,
                 'trace_atom_B_kicked' : trace_atom_B_kicked,
                 }

    return info_sisl
Beispiel #3
0
def pre_prepare_ase_after_relax(initial_XV,final_XV,Ghost):
    """
    """
    import sisl
    if Ghost ==True:
        print ('Finding Ghosts in XV')
        #Ghost_initial = sisl.Geometry(initial_XV.xyz[-2],
        #                              atoms =  initial_XV.atoms.Z[-2])
        #Ghost_final = sisl.Geometry(initial_XV.xyz[-1],
        #                            atoms = initial_XV.atoms.Z[-1])

        Ghost_initial_Info = sisl.Atom(-1 * initial_XV.atoms[-2].Z)
        Ghost_initial = sisl.Geometry( initial_XV.xyz[-2],
                                          atoms= sisl.Atom( -1* Ghost_initial_Info.Z , tag=Ghost_initial_Info.symbol+"_ghost"))
            
        Ghost_final_Info = sisl.Atom(-1 * initial_XV.atoms[-1].Z)
        Ghost_final = sisl.Geometry( initial_XV.xyz[-1],
                                        atoms=sisl.Atom( -1* Ghost_final_Info.Z,tag = Ghost_final_Info.symbol+"_ghost" ))


        trace_atom_initial = sisl.Geometry(initial_XV.xyz[-3],
                                           atoms = initial_XV.atoms.Z[-3])
        trace_atom_final =  sisl.Geometry(final_XV.xyz[-3],
                                          atoms = final_XV.atoms.Z[-3])
        initial_XV = initial_XV.remove([-1])
        initial_XV = initial_XV.remove([-1])
        final_XV = final_XV.remove([-1])
        final_XV = final_XV.remove([-1])
       
        info_sisl = {'initial' : initial_XV,
                 'final' : final_XV,
                 'trace_atom_initial' : trace_atom_initial,
                 'trace_atom_final' : trace_atom_final,
                 'Ghost_initial' : Ghost_initial,
                 'Ghost_final' : Ghost_final,
                 }

    else:
        trace_atom_initial = initial_XV[-1]
        trace_atom_final = final_XV[-1]

        info_sisl ={'initial' : initial_XV,
                    'final' : final_XV,
                    'trace_atom_initial' : trace_atom_initial,
                    'trace_atom_final' : trace_atom_final,
                    }

    return info_sisl
Beispiel #4
0
def test_tshs_error(sisl_files, sisl_tmp):
    si = sisl.get_sile(sisl_files(_dir, 'si_pdos_kgrid.TSHS'))

    # check number of orbitals
    geom = si.read_geometry()
    geom = sisl.Geometry(np.random.rand(geom.na + 1, 3))
    si.read_hamiltonian(geometry=geom)
def GrapheneSheet(nx, ny):
    Graphene = si.Geometry([[0.62, 3.55, 25], [0.62, 0.71, 25],
                            [1.85, 2.84, 25], [1.85, 1.42, 25]], [Atom('C')],
                           [2.46, 4.26, 0])
    Graphene = Graphene.tile(nx, 0).tile(ny, 1)
    # Graphene = Graphene.sort(axes=(1, 0, 2))
    return Graphene
Beispiel #6
0
def test_tshs_error(sisl_files):
    # reading with a wrong geometry
    si = sisl.get_sile(sisl_files(_dir, 'si_pdos_kgrid.TSHS'))

    # check number of orbitals
    geom = si.read_geometry()
    geom = sisl.Geometry(np.random.rand(geom.na + 1, 3))
    with pytest.raises(sisl.SileError):
        si.read_hamiltonian(geometry=geom)
Beispiel #7
0
    def init_func_and_attrs(self, request, siesta_test_files):
        name = request.param

        if name.startswith("siesta_PDOS_file"):

            spin_type = name.split("_")[-1]

            n_spin, filename = {
                "unpolarized": (1, "SrTiO3.PDOS"),
                "polarized": (2, "SrTiO3_polarized.PDOS"),
                "noncollinear": (4, "SrTiO3_noncollinear.PDOS")
            }[spin_type]

            init_func = sisl.get_sile(siesta_test_files(filename)).plot
            attrs = {
                "na": 5,
                "no": 72,
                "n_spin": n_spin,
                "species": ('Sr', 'Ti', 'O')
            }
        elif name.startswith("sisl_H"):
            gr = sisl.geom.graphene()
            H = sisl.Hamiltonian(gr)
            H.construct([(0.1, 1.44), (0, -2.7)])

            spin_type = name.split("_")[-1]

            n_spin, H = {
                "unpolarized": (1, H),
                "polarized": (2, H.transform(spin=sisl.Spin.POLARIZED)),
                "noncolinear": (4, H.transform(spin=sisl.Spin.NONCOLINEAR)),
                "spinorbit": (4, H.transform(spin=sisl.Spin.SPINORBIT))
            }[spin_type]

            init_func = partial(H.plot.pdos, Erange=[-5, 5])
            attrs = {"na": 2, "no": 2, "n_spin": n_spin, "species": ('C', )}
        elif name == "wfsx_file":
            # From a siesta .WFSX file
            # Since there is no hamiltonian for bi2se3_3ql.fdf, we create a dummy one
            wfsx = sisl.get_sile(siesta_test_files("bi2se3_3ql.bands.WFSX"))

            geometry = sisl.get_sile(
                siesta_test_files("bi2se3_3ql.fdf")).read_geometry()
            geometry = sisl.Geometry(geometry.xyz, atoms=wfsx.read_basis())

            H = sisl.Hamiltonian(geometry, dim=4)

            init_func = partial(H.plot.pdos,
                                wfsx_file=wfsx,
                                entry_points_order=["wfsx file"])

            attrs = {"na": 15, "no": 195, "n_spin": 4, "species": ('Bi', 'Se')}

        return init_func, attrs
Beispiel #8
0
class TestGeometryPlot(GeometryPlotTester):

    run_for = {
        "sisl_geom": {
            "init_func": sisl.geom.graphene(orthogonal=True).plot
        },
        "ghost_atoms": {
            "init_func":
            sisl.Geometry([[0, 0, 1], [1, 0, 0]],
                          atoms=[sisl.Atom(6), sisl.Atom(-6)]).plot
        }
    }
Beispiel #9
0
    def init_func_and_attrs(self, request):
        name = request.param

        if name == "sisl_geom":
            init_func = sisl.geom.graphene(orthogonal=True).plot
        elif name == "ghost_atoms":
            init_func = sisl.Geometry([[0, 0, 1], [1, 0, 0]],
                                      atoms=[sisl.Atom(6),
                                             sisl.Atom(-6)]).plot

        attrs = {}

        return init_func, attrs
def Import(nx, contactrep
           ):  # Function takes in number of device and contact repitition
    filename = input('Enter filename: ')  # Filename of fdf structure
    filename = filename + '.fdf'  # Add file ending
    fdf = si.get_sile(filename)  # Import the system
    geom = fdf.read_geometry(output=False)  # Load geometry from fdf file
    C_list = (geom.atoms.Z == 6).nonzero()[0]  # List of carbon atoms
    O_list = (geom.atoms.Z == 8).nonzero()[0]  # List of oxygen atoms
    C_O_list = np.concatenate((C_list, O_list))  # Add lists
    Subbed = geom.sub(C_O_list)  # Keep only C or O atoms in geometry
    Subbed.reduce()  # Remove "empty" atom places
    geom = Subbed
    cellsize = geom.xyz.shape[0]  # Determine number of atoms
    geom = geom.tile(nx + 4 * contactrep, 1)  # Repeat structure
    geom = geom.rotate(270, v=[0, 0, 1],
                       origo=geom.center(what='xyz'))  # Rotate structure
    xyz = geom.xyz
    xyz = np.round(xyz, decimals=1)  # Round off coordinates

    # Create geometry based on coordinates
    geom = si.Geometry(xyz, [Atom('C')], [2.46, 4.26, 0])
    # geom = geom.sort(axes=(2,1,0))
    LatticeVectors = fdf.get('LatticeVectors')  # Gather lattice vectors
    UY = np.fromstring(LatticeVectors[0], dtype=float, sep=' ')[0]  # ... in Y
    UX = np.fromstring(LatticeVectors[1], dtype=float, sep=' ')[1]  # ... in X
    print('Unit Cell x: {}'.format(UX))
    print('Unit Cell y: {}'.format(UY))
    xyz = geom.xyz
    dgeom = geom
    plt.scatter(xyz[:, 0], xyz[:, 1])
    plt.axis('equal')
    for i in range(xyz[:, 0].shape[0]):
        s = i
        xy = (xyz[i, 0], xyz[i, 1])
        plt.annotate(s, xy)
    plt.grid(b=True, which='both', axis='both')
    plt.show()
    return xyz, UX, UY, filename, dgeom, cellsize
Beispiel #11
0
    def Generate_Kick_Images(self):
        """

        """
        from .Utils.utils_siesta import read_siesta_fdf, read_siesta_XV, FixingSislImages
        from .Utils.utils_kick import pre_prepare_sisl, is_frac_or_cart_or_index, pre_prepare_ase_after_relax
        import os
        import glob, shutil
        import numpy as np
        import sys
        from .BarriersIO import SiestaBarriersIO

        import sisl
        from ase.neb import NEB
        if self.relaxed == True:
            print("=================================================")
            print("     The Relaxed Kick Image Generation ...   ")
            print("=================================================")
            if self.initial_relaxed_path == None or self.final_relaxed_path == None:
                sys.exit("intial/final relaxed path not provided")
            if self.initial_relaxed_fdf_name == None or self.final_relaxed_fdf_name == None:
                sys.exit("intial/final relaxed fdf not provided")

            #self.host_structure = read_siesta_fdf(self.host_path,self.host_fdf_name)
            self.initial_structure = read_siesta_XV(
                self.initial_relaxed_path, self.initial_relaxed_fdf_name)
            self.final_structure = read_siesta_XV(self.final_relaxed_path,
                                                  self.final_relaxed_fdf_name)

            self.test = pre_prepare_ase_after_relax(
                self.initial_structure['XV'], self.final_structure['XV'])

            initial = sisl.Geometry.toASE(self.test['initial'])
            final = sisl.Geometry.toASE(self.test['final'])

        else:
            print("=================================================")
            print("     The Initial Kick Image Generation ...   ")
            print("=================================================")
            #self.host_structure = read_siesta_fdf(self.host_path,self.host_fdf_name)
            frac_or_cart_or_index = is_frac_or_cart_or_index(
                self.trace_atom_initial_position)
            self.test = pre_prepare_sisl(
                frac_or_cart_or_index,
                #self.host_structure['Geometry'],
                self.host_structure,
                self.trace_atom_initial_position,
                self.trace_atom_final_position,
                self.kicked_atom_final_position,
                self.rtol,
                self.atol,
            )
            initial = sisl.Geometry.toASE(self.test['initial'])
            final = sisl.Geometry.toASE(self.test['final'])

        #%%*****************************************************************
        #%% Do the Image Creation with ASE Here
        #%%*****************************************************************
        if self.relaxed == True:
            print("NEB Interpolation for : Relaxed Structures")
        else:
            print("NEB Interpolation for : UnRelaxed Structures")

        print("Copying ASE For NEB Image 0 : initial image ")
        self.images = [initial]
        for i in range(self.number_of_images):
            print("Copying ASE For NEB Image {} : images ".format(i + 1))
            self.images.append(initial.copy())
        self.images.append(final)
        print("Copying ASE For NEB Image {} : final image".format(i + 2))
        #%%
        self.neb = NEB(self.images)
        self.neb.interpolate(self.interpolation_method)

        self.sisl_images = []
        for i in range(self.number_of_images + 2):
            #self.sisl_images.append(sisl.Geometry.fromASE(self.images[i]))
            temp = sisl.Geometry.fromASE(self.images[i])
            self.sisl_images.append(
                FixingSislImages(self.test['initial'], temp, "ghost",
                                 self.relaxed))
        #-------------------------------------------------------------------
        # For Kick
        #-------------------------------------------------------------------
        if self.relaxed == True:
            #d = self.test['trace_atom_A_final'] - self.test[]
            d = self.trace_atom_final_position - self.trace_atom_initial_position
        else:
            d = self.trace_atom_final_position - self.trace_atom_initial_position
        Steps = d / (self.number_of_images + 1)

        if self.relaxed == True:
            FinalAtomPositionKick = self.test['trace_atom_B_initial'].xyz[0]
        else:
            FinalAtomPositionKick = self.trace_atom_final_position
        MovingAtomIndex = len(self.neb.images[0].get_positions())
        MovingAtomKick = np.array([])
        for l in range(self.neb.nimages):
            if l == 0:
                MovingAtomKick = np.append(MovingAtomKick,
                                           FinalAtomPositionKick)
            if l > 0:
                MovingAtomKick = np.append(MovingAtomKick,
                                           FinalAtomPositionKick + Steps)
                FinalAtomPositionKick = FinalAtomPositionKick + Steps
        MovingAtomKick = MovingAtomKick.reshape(self.number_of_images + 2, 3)

        if self.relaxed == True:
            steps_x = np.divide(
                self.test['trace_atom_B_kicked'].xyz[0][0] -
                MovingAtomKick[0][0], len(MovingAtomKick))
            steps_y = np.divide(
                self.test['trace_atom_B_kicked'].xyz[0][1] -
                MovingAtomKick[0][1], len(MovingAtomKick))
            steps_z = np.divide(
                self.test['trace_atom_B_kicked'].xyz[0][2] -
                MovingAtomKick[0][2], len(MovingAtomKick))

        else:
            steps_x = np.divide(
                self.kicked_atom_final_position[0] - MovingAtomKick[0][0],
                len(MovingAtomKick))
            steps_y = np.divide(
                self.kicked_atom_final_position[1] - MovingAtomKick[0][1],
                len(MovingAtomKick))
            steps_z = np.divide(
                self.kicked_atom_final_position[2] - MovingAtomKick[0][2],
                len(MovingAtomKick))
        print(steps_x)
        print(steps_y)
        print(steps_z)
        #Offset
        Offset = np.array([])
        for l in range(len(MovingAtomKick)):
            if l == 0:
                Offset = np.append(Offset, 0.0)
                Offset = np.append(Offset, 0.0)
                Offset = np.append(Offset, 0.0)
            else:
                Offset = np.append(Offset, steps_x * l + steps_x)
                Offset = np.append(Offset, steps_y * l + steps_y)
                Offset = np.append(Offset, steps_z * l + steps_z)
        Offset = Offset.reshape(len(MovingAtomKick), 3)

        MovingAtomKick = Offset + MovingAtomKick[0]
        self.MovingAtomKick = MovingAtomKick
        print("DEBUG: {}".format(self.MovingAtomKick))
        sisl_moving = []

        # Fixing the Tag
        self.KickedAtomInfo = self.test['trace_atom_B_kicked']
        print("DEBUG: {}".format(self.KickedAtomInfo))
        #KickedAtomInfo = sisl.Atom(self.test['trace_atom_B_kicked'].atoms.Z)

        for i in range(self.number_of_images + 2):
            #sisl_moving.append(sisl.Geometry(MovingAtomKick[i],atoms= sisl.Atom (KickedAtomInfo.Z,tag=KickedAtomInfo.symbol+"_kicked")))
            sisl_moving.append(
                sisl.Geometry(
                    xyz=self.MovingAtomKick[i],
                    atoms=sisl.Atom(
                        Z=self.KickedAtomInfo.atom[0].Z,
                        tag=self.KickedAtomInfo.atoms.atom[0].symbol +
                        "_kicked")))
            #sisl_moving.append(sisl.Geometry(MovingAtomKick[i],atoms=self.test['trace_atom_B_kicked'].atoms.Z))
        print(" Putting Kicked Specie in Sisl Geometry Object ")

        for i in range(self.number_of_images + 2):
            self.sisl_images[i] = self.sisl_images[i].add(sisl_moving[i])
        #    self.sisl_images[i] = self.sisl_images[i].add(moving_specie_B[i])

        self.IO = SiestaBarriersIO(
            neb_type='kick',
            sisl_images=self.sisl_images,
            flos_path=self.flos_path,
            flos_file_name_relax=self.flos_file_name_relax,
            flos_file_name_neb=self.flos_file_name_neb,
            number_of_images=self.number_of_images,
            initial_relaxed_path=self.initial_relaxed_path,
            final_relaxed_path=self.final_relaxed_path,
            initial_relaxed_fdf_name=self.final_relaxed_path,
            final_relaxed_fdf_name=self.final_relaxed_fdf_name,
            relax_engine=self.relax_engine,
            relaxed=self.relaxed,
            ghost=self.ghost,
        )
Beispiel #12
0
def si_pdos_kgrid_geom():
    return sisl.Geometry([[0, 0, 0], [1, 1, 1]],
                         sisl.Atom('Si', R=np.arange(13) + 1))
Beispiel #13
0
def pre_prepare_sisl(frac_or_cart_or_index, Initial_Geom, InitialAtomPosition,
                     FinalAtomPosition, rtol, atol):
    """
    
    """
    import sisl

    if frac_or_cart_or_index == 'cartesian':
        print("Cartesian ...")
        #Initial_Geom = Fdf.read_geometry()
        XYZ = Initial_Geom.xyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print("Removing Vacancies Ang/Bohr")
        print("Removing Index for Initial Atom:{}".format(
            AtomIndex(XYZ, InitialAtomPosition, rtol, atol)))
        print("Removing Index for Final Atom:{}".format(
            AtomIndex(XYZ, FinalAtomPosition, rtol, atol)))
        trace_atom_initial = sisl.Geometry(
            Initial_Geom.xyz[AtomIndex(XYZ, InitialAtomPosition, rtol, atol)],
            atoms=Initial_Geom.atoms.Z[AtomIndex(XYZ, InitialAtomPosition,
                                                 rtol, atol)])
        trace_atom_final = sisl.Geometry(
            Initial_Geom.xyz[AtomIndex(XYZ, FinalAtomPosition, rtol, atol)],
            atoms=Initial_Geom.atoms.Z[AtomIndex(XYZ, FinalAtomPosition, rtol,
                                                 atol)])
        InitialASEXYZ = InitialASEXYZ.remove(
            AtomIndex(XYZ, InitialAtomPosition, rtol, atol))
        FinalASEXYZ = FinalASEXYZ.remove(
            AtomIndex(XYZ, FinalAtomPosition, rtol, atol))
        if AtomIndex(XYZ, FinalAtomPosition, rtol, atol) > AtomIndex(
                XYZ, InitialAtomPosition, rtol, atol):
            print("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(
                AtomIndex(XYZ, FinalAtomPosition, rtol, atol) - 1)
            FinalASEXYZ = FinalASEXYZ.remove(
                AtomIndex(XYZ, InitialAtomPosition, rtol, atol))
        if AtomIndex(XYZ, FinalAtomPosition, rtol, atol) < AtomIndex(
                XYZ, InitialAtomPosition, rtol, atol):
            print("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(
                AtomIndex(XYZFull, FinalAtomPosition, rtol, atol))
            FinalASEXYZ = FinalASEXYZ.remove(
                AtomIndex(XYZFull, InitialAtomPosition, rtol, atol) - 1)
    elif frac_or_cart_or_index == 'frac':
        #print ("Removing Vacancies Fractional NOT Implemented")
        print("Fractional ...")
        Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print("Removing Vacancies Ang/Bohr")
        print("Removing Index for Initial Atom:{}".format(
            AtomIndex(Frac, InitialAtomPosition, rtol, atol)))
        print("Removing Index for Final Atom:{}".format(
            AtomIndex(Frac, FinalAtomPosition, rtol, atol)))
        trace_atom_initial = sisl.Geometry(
            Initial_Geom.xyz[AtomIndex(Frac, InitialAtomPosition, rtol, atol)],
            atoms=Initial_Geom.atoms.Z[AtomIndex(Frac, InitialAtomPosition,
                                                 rtol, atol)])
        trace_atom_final = sisl.Geometry(
            Initial_Geom.xyz[AtomIndex(Frac, FinalAtomPosition, rtol, atol)],
            atoms=Initial_Geom.atoms.Z[AtomIndex(Frac, FinalAtomPosition, rtol,
                                                 atol)])

        InitialASEXYZ = InitialASEXYZ.remove(
            AtomIndex(Frac, InitialAtomPosition, rtol, atol))
        FinalASEXYZ = FinalASEXYZ.remove(
            AtomIndex(Frac, FinalAtomPosition, rtol, atol))
        if AtomIndex(Frac, FinalAtomPosition, rtol, atol) > AtomIndex(
                Frac, InitialAtomPosition, rtol, atol):
            print("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(
                AtomIndex(Frac, FinalAtomPosition, rtol, atol) - 1)
            FinalASEXYZ = FinalASEXYZ.remove(
                AtomIndex(Frac, InitialAtomPosition, rtol, atol))
        if AtomIndex(Frac, FinalAtomPosition, rtol, atol) < AtomIndex(
                Frac, InitialAtomPosition, rtol, atol):
            print("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(
                AtomIndex(Frac, FinalAtomPosition, rtol, atol))
            FinalASEXYZ = FinalASEXYZ.remove(
                AtomIndex(Frac, InitialAtomPosition, rtol, atol) - 1)
    else:
        print('index')
        #Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print("Removing Vacancies Ang/Bohr")
        print("Removing Index for Initial Atom:{}".format(InitialAtomPosition -
                                                          1))
        print("Removing Index for Final Atom:{}".format(FinalAtomPosition - 1))

        #trace_atom_A_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
        #                                   atoms= Initial_Geom.atoms.Z[InitialAtomPosition-1])
        #trace_atom_B_final = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
        #                                 atoms=  Initial_Geom.atoms.Z[FinalAtomPosition-1])
        trace_atom_A_initial = sisl.Geometry(
            Initial_Geom.xyz[InitialAtomPosition - 1],
            atoms=Initial_Geom.atoms.Z[InitialAtomPosition - 1])
        trace_atom_A_final = sisl.Geometry(
            Initial_Geom.xyz[FinalAtomPosition - 1],
            atoms=Initial_Geom.atoms.Z[InitialAtomPosition - 1])
        trace_atom_B_initial = sisl.Geometry(
            Initial_Geom.xyz[FinalAtomPosition - 1],
            atoms=Initial_Geom.atoms.Z[FinalAtomPosition - 1])
        trace_atom_B_final = sisl.Geometry(
            Initial_Geom.xyz[InitialAtomPosition - 1],
            atoms=Initial_Geom.atoms.Z[FinalAtomPosition - 1])

        InitialASEXYZ = InitialASEXYZ.remove(InitialAtomPosition - 1)
        FinalASEXYZ = FinalASEXYZ.remove(FinalAtomPosition - 1)
        if (FinalAtomPosition - 1) > (InitialAtomPosition - 1):
            print("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition - 2)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition - 1)
        if (FinalAtomPosition - 1) < (InitialAtomPosition - 1):
            print("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition - 1)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition - 2)

    InitialASEXYZ = InitialASEXYZ.add(trace_atom_A_final)
    FinalASEXYZ = FinalASEXYZ.add(trace_atom_A_initial)

    info_sisl = {
        'initial': InitialASEXYZ,
        'final': FinalASEXYZ,
        'trace_atom_A_initial': trace_atom_A_initial,
        'trace_atom_A_final': trace_atom_A_final,
        'trace_atom_B_initial': trace_atom_B_initial,
        'trace_atom_B_final': trace_atom_B_final,
    }

    return info_sisl
Beispiel #14
0
    def init_func_and_attrs(self, request, siesta_test_files):
        name = request.param

        if name.startswith("sisl_H"):
            gr = sisl.geom.graphene()
            H = sisl.Hamiltonian(gr)
            H.construct([(0.1, 1.44), (0, -2.7)])

            spin_type = name.split("_")[2]
            n_spin, H = {
                "unpolarized": (1, H),
                "polarized": (2, H.transform(spin=sisl.Spin.POLARIZED)),
                "noncolinear": (1, H.transform(spin=sisl.Spin.NONCOLINEAR)),
                "spinorbit": (1, H.transform(spin=sisl.Spin.SPINORBIT))
            }.get(spin_type)

            n_states = 2
            if H.spin.is_spinorbit or H.spin.is_noncolinear:
                n_states *= 2

            # Directly creating a BandStructure object
            if name.endswith("jump"):
                names = ["Gamma", "M", "M", "K"]
                bz = sisl.BandStructure(H, [[0, 0, 0], [2 / 3, 1 / 3, 0], None,
                                            [2 / 3, 1 / 3, 0], [1 / 2, 0, 0]],
                                        6, names)
                nk = 7
                tickvals = [0., 1.70309799, 1.83083034, 2.68237934]
            else:
                names = ["Gamma", "M", "K"]
                bz = sisl.BandStructure(
                    H, [[0, 0, 0], [2 / 3, 1 / 3, 0], [1 / 2, 0, 0]], 6, names)
                nk = 6
                tickvals = [0., 1.70309799, 2.55464699]
            init_func = bz.plot.fatbands

            attrs = {
                "bands_shape":
                (nk, n_spin, n_states) if H.spin.is_polarized else
                (nk, n_states),
                "weights_shape":
                (n_spin, nk, n_states, 2) if H.spin.is_polarized else
                (nk, n_states, 2),
                "ticklabels":
                names,
                "tickvals":
                tickvals,
                "gap":
                0,
                "spin_texture":
                not H.spin.is_diagonal,
                "spin":
                H.spin
            }
        elif name == "wfsx file":
            # From a siesta bands.WFSX file
            # Since there is no hamiltonian for bi2se3_3ql.fdf, we create a dummy one
            wfsx = sisl.get_sile(siesta_test_files("bi2se3_3ql.bands.WFSX"))

            geometry = sisl.get_sile(
                siesta_test_files("bi2se3_3ql.fdf")).read_geometry()
            geometry = sisl.Geometry(geometry.xyz, atoms=wfsx.read_basis())

            H = sisl.Hamiltonian(geometry, dim=4)

            init_func = partial(H.plot.fatbands,
                                wfsx_file=wfsx,
                                E0=-51.68,
                                entry_points_order=["wfsx file"])
            attrs = {
                "bands_shape": (16, 8),
                "weights_shape": (16, 8, 195),
                "ticklabels": None,
                "tickvals": None,
                "gap": 0.0575,
                "spin_texture": False,
                "spin": sisl.Spin("nc")
            }

        return init_func, attrs
def pre_prepare_sisl (frac_or_cart_or_index,Initial_Geom,InitialAtomPosition,FinalAtomPosition,rtol,atol,Ghost):

    """
    
    """
    import sisl

    if frac_or_cart_or_index == 'cartesian':
        print ("Cartesian ...(BUGGGGGGGG! SHOULD FIX)")
        #Initial_Geom = Fdf.read_geometry()
        XYZ = Initial_Geom.xyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(AtomIndex(XYZ,InitialAtomPosition,rtol,atol)))
        print ("Removing Index for Final Atom:{}".format(AtomIndex(XYZ,FinalAtomPosition,rtol,atol)))
        if Ghost == True:
            Ghost_initial = sisl.Geometry(Initial_Geom.xyz[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)],
                                          atoms= -1* Initial_Geom.atoms.Z[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)]
                                          )
            Ghost_final = sisl.Geometry(Initial_Geom.xyz[AtomIndex(XYZ,FinalAtomPosition,rtol,atol)],
                                        atoms= -1* Initial_Geom.atoms.Z[AtomIndex(XYZ,FinalAtomPosition,rtol,atol)]
                                         )       
        trace_atom_initial = sisl.Geometry(Initial_Geom.xyz[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)],
                                      atoms= Initial_Geom.atoms.Z[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)]
                                     )
        trace_atom_final = sisl.Geometry(Initial_Geom.xyz[AtomIndex(XYZ,FinalAtomPosition,rtol,atol)],
                                    atoms=  Initial_Geom.atoms.Z[AtomIndex(XYZ,FinalAtomPosition,rtol,atol)]
                                     )       
        InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(XYZ,InitialAtomPosition,rtol,atol))
        FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(XYZ,FinalAtomPosition,rtol,atol))
        if AtomIndex(XYZ,FinalAtomPosition,rtol,atol) > AtomIndex(XYZ,InitialAtomPosition,rtol,atol):
            print ("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(XYZ,FinalAtomPosition,rtol,atol)-1)
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(XYZ,InitialAtomPosition,rtol,atol))
        if AtomIndex(XYZ,FinalAtomPosition,rtol,atol) < AtomIndex(XYZ,InitialAtomPosition,rtol,atol):
            print ("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(XYZ,FinalAtomPosition,rtol,atol))
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(XYZ,InitialAtomPosition,rtol,atol)-1)   
    elif frac_or_cart_or_index  == 'frac':
        #print ("Removing Vacancies Fractional NOT Implemented")
        print ("Fractional ... (BUGGGGGGGG SHOULD FIX)")
        Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(AtomIndex(Frac,InitialAtomPosition,rtol,atol)))
        print ("Removing Index for Final Atom:{}".format(AtomIndex(Frac,FinalAtomPosition,rtol,atol)))
        if Ghost == True:
            Ghost_initial = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,InitialAtomPosition,rtol,atol)],
                                          atoms= -1* Initial_Geom.atoms.Z[AtomIndex(Frac,InitialAtomPosition,rtol,atol)]
                                          )
            Ghost_final = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,FinalAtomPosition,rtol,atol)],
                                        atoms= -1* Initial_Geom.atoms.Z[AtomIndex(Frac,FinalAtomPosition,rtol,atol)]
                                       )    
        trace_atom_initial = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,InitialAtomPosition,rtol,atol)],
                                      atoms= Initial_Geom.atoms.Z[AtomIndex(Frac,InitialAtomPosition,rtol,atol)]
                                      )
        trace_atom_final = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,FinalAtomPosition,rtol,atol)],
                                        atoms= Initial_Geom.atoms.Z[AtomIndex(Frac,FinalAtomPosition,rtol,atol)]
                                       )    

        InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol))
        FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol))
        if AtomIndex(Frac,FinalAtomPosition,rtol,atol) > AtomIndex(Frac,InitialAtomPosition,rtol,atol):
            print ("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol)-1)
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol))
        if AtomIndex(Frac,FinalAtomPosition,rtol,atol) < AtomIndex(Frac,InitialAtomPosition,rtol,atol):
            print ("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol))
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol)-1)
    else:
        print('index')
        #Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(InitialAtomPosition-1))
        print ("Removing Index for Final Atom:{}".format(FinalAtomPosition-1))
        if Ghost == True:
            #Ghost_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
            #                              atoms= -1* Initial_Geom.atoms.Z[InitialAtomPosition-1]
            #                              )
            #Ghost_final = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
            #                            atoms= -1* Initial_Geom.atoms.Z[FinalAtomPosition-1]
            #                             )       

            Ghost_initial_Info = sisl.Atom(Initial_Geom.atoms.Z[InitialAtomPosition-1])
            Ghost_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
                                          atoms= sisl.Atom( -1* Ghost_initial_Info.Z , tag=Ghost_initial_Info.symbol+"_ghost"))
            
            Ghost_final_Info = sisl.Atom(Initial_Geom.atoms.Z[FinalAtomPosition-1])
            Ghost_final = sisl.Geometry(Initial_Geom.xyz[ FinalAtomPosition-1 ],
                                        atoms=sisl.Atom( -1* Ghost_final_Info.Z,tag = Ghost_final_Info.symbol+"_ghost" ))
        trace_atom_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
                                      atoms= Initial_Geom.atoms.Z[InitialAtomPosition-1]
                                     )
        trace_atom_final = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
                                    atoms=  Initial_Geom.atoms.Z[FinalAtomPosition-1]
                                     )       
        InitialASEXYZ = InitialASEXYZ.remove(InitialAtomPosition-1)
        FinalASEXYZ = FinalASEXYZ.remove(FinalAtomPosition-1)
        if (FinalAtomPosition-1) > (InitialAtomPosition-1):
            print ("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition-2)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition-1)
        if (FinalAtomPosition-1) < (InitialAtomPosition-1):
            print ("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition-1)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition-2)   

    
    InitialASEXYZ = InitialASEXYZ.add(trace_atom_final)
    FinalASEXYZ = FinalASEXYZ.add(trace_atom_initial)

    if Ghost == True:
        info_sisl = {'initial' : InitialASEXYZ, 
                 'final' : FinalASEXYZ,
                 'trace_atom_initial' : trace_atom_initial,
                 'trace_atom_final' : trace_atom_final,
                 'Ghost_initial' : Ghost_initial,
                 'Ghost_final' : Ghost_final,
                 }
    else:
        info_sisl = {'initial' : InitialASEXYZ,
                    'final' : FinalASEXYZ,
                    'trace_atom_initial' : trace_atom_initial,
                    'trace_atom_final' : trace_atom_final,
                    }


    return info_sisl
Beispiel #16
0
def pre_prepare_sisl (frac_or_cart_or_index,Initial_Geom,InitialAtomPosition,FinalAtomPosition,KickedAtomPosition,rtol=1e-2,atol=1e-2):

    """
    
    """
    import sisl
    from sisl import Atom
    if frac_or_cart_or_index == 'cartesian':
        print ("Cartesian ...")
        #Initial_Geom = Fdf.read_geometry()
        XYZ = Initial_Geom.xyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(AtomIndex(XYZ,InitialAtomPosition,rtol,atol)))
        print ("Removing Index for Final Atom:{}".format(AtomIndex(XYZ,FinalAtomPosition,rtol,atol)))
        

        # Fixing tags
        TraceAtom_Initial_Info = sisl.Atom(Initial_Geom.atoms.Z[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)])
        TraceAtom_Initial = sisl.Geometry(xyz=Initial_Geom.xyz[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)],
                                           atoms= sisl.Atom(TraceAtom_Initial_Info.Z,tag=TraceAtom_Initial_Info.symbol+'_i' ))
        Ghost_initial = sisl.Geometry(xyz=Initial_Geom.xyz[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)],
                                           atoms= sisl.Atom(TraceAtom_Initial_Info.Z,tag=TraceAtom_Initial_Info.symbol+'_ghost' ))
        TraceAtom_Final_Info  = sisl.Atom(Initial_Geom.atoms.Z[AtomIndex(XYZ,InitialAtomPosition,rtol,atol)])
        TraceAtom_Final = sisl.Geometry(xyz = FinalAtomPosition ,
                                    atoms= sisl.Atom(TraceAtom_Final_Info.Z,tag=TraceAtom_Final_Info.symbol+'_i'))       
        Ghost_final = sisl.Geometry(xyz = FinalAtomPosition ,
                                    atoms= sisl.Atom(TraceAtom_Final_Info.Z,tag=TraceAtom_Final_Info.symbol+'_ghost'))
        
        InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(XYZ,InitialAtomPosition,rtol,atol))
        FinalASEXYZ =  InitialASEXYZ  
        
    elif frac_or_cart_or_index  == 'frac':
        #print ("Removing Vacancies Fractional NOT Implemented")
        print ("Fractional ...")
        Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(AtomIndex(Frac,InitialAtomPosition,rtol,atol)))
        print ("Removing Index for Final Atom:{}".format(AtomIndex(Frac,FinalAtomPosition,rtol,atol)))
        trace_atom_initial = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,InitialAtomPosition,rtol,atol)],
                                      atoms= Initial_Geom.atoms.Z[AtomIndex(Frac,InitialAtomPosition,rtol,atol)])
        trace_atom_final = sisl.Geometry(Initial_Geom.xyz[AtomIndex(Frac,FinalAtomPosition,rtol,atol)],
                                        atoms= Initial_Geom.atoms.Z[AtomIndex(Frac,FinalAtomPosition,rtol,atol)])    

        InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol))
        FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol))
        if AtomIndex(Frac,FinalAtomPosition,rtol,atol) > AtomIndex(Frac,InitialAtomPosition,rtol,atol):
            print ("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol)-1)
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol))
        if AtomIndex(Frac,FinalAtomPosition,rtol,atol) < AtomIndex(Frac,InitialAtomPosition,rtol,atol):
            print ("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(AtomIndex(Frac,FinalAtomPosition,rtol,atol))
            FinalASEXYZ = FinalASEXYZ.remove(AtomIndex(Frac,InitialAtomPosition,rtol,atol)-1)
    else:
        print('index')
        #Frac = Initial_Geom.fxyz
        InitialASEXYZ = Initial_Geom
        FinalASEXYZ = Initial_Geom
        print ("Removing Vacancies Ang/Bohr")
        print ("Removing Index for Initial Atom:{}".format(InitialAtomPosition-1))
        print ("Removing Index for Final Atom:{}".format(FinalAtomPosition-1))
        
        #trace_atom_A_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
        #                                   atoms= Initial_Geom.atoms.Z[InitialAtomPosition-1])
        #trace_atom_B_final = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
        #                                 atoms=  Initial_Geom.atoms.Z[FinalAtomPosition-1])       
        trace_atom_A_initial = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
                                      atoms= Initial_Geom.atoms.Z[InitialAtomPosition-1])
        trace_atom_A_final = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
                                      atoms= Initial_Geom.atoms.Z[InitialAtomPosition-1])
        trace_atom_B_initial = sisl.Geometry(Initial_Geom.xyz[FinalAtomPosition-1],
                                      atoms= Initial_Geom.atoms.Z[FinalAtomPosition-1])
        trace_atom_B_final = sisl.Geometry(Initial_Geom.xyz[InitialAtomPosition-1],
                                      atoms= Initial_Geom.atoms.Z[FinalAtomPosition-1])


        InitialASEXYZ = InitialASEXYZ.remove(InitialAtomPosition-1)
        FinalASEXYZ = FinalASEXYZ.remove(FinalAtomPosition-1)
        if (FinalAtomPosition-1) > (InitialAtomPosition-1):
            print ("Order : Final Atom Position > Initial Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition-2)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition-1)
        if (FinalAtomPosition-1) < (InitialAtomPosition-1):
            print ("Order : Initial Atom Position > Final Atom Position")
            InitialASEXYZ = InitialASEXYZ.remove(FinalAtomPosition-1)
            FinalASEXYZ = FinalASEXYZ.remove(InitialAtomPosition-2)   

    
    

    InitialASEXYZ = InitialASEXYZ.add(TraceAtom_Initial)
    FinalASEXYZ = FinalASEXYZ.add(TraceAtom_Final)

    info_sisl = {'initial' : InitialASEXYZ,
                 'final' : FinalASEXYZ,
                 'trace_atom_initial' : TraceAtom_Initial,
                 'trace_atom_final' : TraceAtom_Final,
                 'Ghost_initial' : Ghost_initial,
                 'Ghost_final' : Ghost_final,
                 }


    return info_sisl
Beispiel #17
0
    def Generate_Exchange_Images(self):
        """

        """
        from .Utils.utils_siesta import read_siesta_fdf, read_siesta_XV
        from .Utils.utils_exchange import pre_prepare_sisl, is_frac_or_cart_or_index, pre_prepare_ase_after_relax_AA, pre_prepare_ase_after_relax_AB, pre_prepare_ase_after_relax_A, pre_prepare_ase_after_relax_B

        import os
        import glob, shutil
        import numpy as np
        import sys
        from .BarriersIO import SiestaBarriersIO
        import sisl
        from ase.neb import NEB

        if self.relaxed == True:
            print("=================================================")
            print("     The Relaxed Exchange Image Generation ...   ")
            print("=================================================")

            #self.host_structure = read_siesta_fdf(self.host_path,self.host_fdf_name)
            self.initial_structure = read_siesta_XV(
                self.initial_relaxed_path, self.initial_relaxed_fdf_name)
            self.final_structure = read_siesta_XV(self.final_relaxed_path,
                                                  self.final_relaxed_fdf_name)

            if self.check_AA_or_AB() == True:
                self.test_A = pre_prepare_ase_after_relax_A(
                    self.initial_structure['XV'], self.final_structure['XV'])
                self.test_B = pre_prepare_ase_after_relax_B(
                    self.initial_structure['XV'], self.final_structure['XV'])
            else:
                #print ("Not Implemented Yet!")
                self.test_A = pre_prepare_ase_after_relax_A(
                    self.initial_structure['XV'], self.final_structure['XV'])
                self.test_B = pre_prepare_ase_after_relax_B(
                    self.initial_structure['XV'], self.final_structure['XV'])
            initial_A = sisl.Geometry.toASE(self.test_A['initial'])
            final_A = sisl.Geometry.toASE(self.test_A['final'])
            initial_B = sisl.Geometry.toASE(self.test_B['initial'])
            final_B = sisl.Geometry.toASE(self.test_B['final'])

        else:
            print("=================================================")
            print("     The Initial Exchange Image Generation ...   ")
            print("=================================================")

            frac_or_cart_or_index = is_frac_or_cart_or_index(
                self.trace_atom_initial_position)

            self.test = pre_prepare_sisl(
                frac_or_cart_or_index,
                self.host_structure,
                self.trace_atom_initial_position,
                self.trace_atom_final_position,
                self.rtol,
                self.atol,
            )
            initial = sisl.Geometry.toASE(self.test['initial'])
            final = sisl.Geometry.toASE(self.test['final'])

            self.initial_structure = {}
            self.final_structure = {}
            self.initial_structure['XV'] = self.test['initial']
            self.final_structure['XV'] = self.test['final']
            self.check_AA_or_AB()

        #%%*****************************************************************
        #%% Do the Image Creation with ASE Here
        #%%*****************************************************************
        if self.relaxed == True:
            print("NEB Interpolation for : Relaxed Structures")
            print("Copying ASE For NEB Image 0 : initial image ")
            self.images_A = [initial_A]
            self.images_B = [initial_B]
            for i in range(self.number_of_images):
                print("Copying ASE For NEB Image {} : images ".format(i + 1))
                self.images_A.append(initial_A.copy())
                self.images_B.append(initial_B.copy())
            self.images_A.append(final_A)
            self.images_B.append(final_B)
            print("Copying ASE For NEB Image {} : final image".format(i + 2))
            #%%
            self.neb_A = NEB(self.images_A)
            self.neb_B = NEB(self.images_B)
            self.neb_A.interpolate(self.interpolation_method)
            self.neb_B.interpolate(self.interpolation_method)

            self.sisl_images_A = []
            self.sisl_images_B = []
            for i in range(self.number_of_images + 2):
                self.sisl_images_A.append(
                    sisl.Geometry.fromASE(self.images_A[i]))
                self.sisl_images_B.append(
                    sisl.Geometry.fromASE(self.images_B[i]))
            #-------------------------------------------------------------------
            # For Exchange
            #-------------------------------------------------------------------

            moving_specie_A = {}
            moving_specie_B = {}
            for i in range(len(self.sisl_images_A)):
                moving_specie_A[i] = sisl.Geometry(
                    self.sisl_images_A[i].xyz[-1],
                    atoms=self.sisl_images_A[i].atoms.Z[-1])
                moving_specie_B[i] = sisl.Geometry(
                    self.sisl_images_B[i].xyz[-1],
                    atoms=self.sisl_images_B[i].atoms.Z[-1])
            ni_list = []
            for i in range(self.number_of_images + 2):
                ni_list.append(int(i))
            ni_list.sort(reverse=True)
            j = 0
            #for i in ni_list:
            #    #moving_specie_B[j] = sisl.Geometry(moving_specie_A[i].xyz,atoms=self.test['trace_atom_B_initial'].atoms.Z)
            #    moving_specie_B[j] = sisl.Geometry(moving_specie_A[i].xyz,atoms=self.test_B['trace_atom_B_initial'].atoms.Z)
            #    j = j+1
            #moving_specie_B[0].xyz = self.test_B['trace_atom_B_initial'].xyz
            #moving_specie_B[self.number_of_images+2] =  self.test['trace_atom_B_final'].xyz
            d = moving_specie_B[0].xyz - moving_specie_A[0].xyz
            d = d.reshape(3, )
            dsq = d**2
            dsum = np.sum(dsq)
            dsum = np.sqrt(dsum)
            ToleranceRadius = self.tolerance_radius
            #ToleranceRadius= np.array([-1.5,1.5,0.0])  #Ang
            print("d", d)
            print("dsum", dsum)
            print("Tolernace Radius :{}".format(self.tolerance_radius))
            Migration_Direction = self.exchange_direction
            NumberOfImages = self.number_of_images

            if Migration_Direction.lower() == "x":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: x")
            if Migration_Direction.lower() == "y":
                d[1] = d[1] + dsum + ToleranceRadius[1]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: y")
            if Migration_Direction.lower() == "z":
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: z")
            if Migration_Direction.lower() == "xy":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[1] = d[1] + dsum + ToleranceRadius[1]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: xy")
            if Migration_Direction.lower() == "xz":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: xz")
            if Migration_Direction.lower() == "yz":
                d[1] = d[1] + dsum + ToleranceRadius[1]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: yz")
            if Migration_Direction.lower() == "xyz":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[1] = d[1] + dsum + ToleranceRadius[1]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Volume: xyz")

            for l in range(1, NumberOfImages + 1):
                print("Atom A ", l, moving_specie_A[l].xyz + Steps)
                moving_specie_A[l].xyz = moving_specie_A[l].xyz + Steps
            for l in range(1, NumberOfImages + 1):
                print("Atom B ", l, moving_specie_B[l].xyz - Steps)
                moving_specie_B[l].xyz = moving_specie_B[l].xyz - Steps

            #print("DEBUG: {}".format(moving_specie_B[self.number_of_images+2]))
            #moving_specie_B[self.number_of_images+2] = self.test['trace_atom_B_final'].xyz
            #print("DEBUG: {}".format(moving_specie_B[self.number_of_images+2]))

            for k in range(self.number_of_images + 2):
                self.sisl_images_A[k] = self.sisl_images_A[k].remove([-1])

            print(" Putting Specie A & B in Sisl Geometry Object ")

            for i in range(self.number_of_images + 2):
                self.sisl_images_A[i] = self.sisl_images_A[i].add(
                    moving_specie_A[i])
                self.sisl_images_A[i] = self.sisl_images_A[i].add(
                    moving_specie_B[i])

            self.sisl_images = self.sisl_images_A
        else:
            print("NEB Interpolation for : UnRelaxed Structures")

            print("Copying ASE For NEB Image 0 : initial image ")
            self.images = [initial]
            for i in range(self.number_of_images):
                print("Copying ASE For NEB Image {} : images ".format(i + 1))
                self.images.append(initial.copy())
            self.images.append(final)
            print("Copying ASE For NEB Image {} : final image".format(i + 2))
            #%%
            self.neb = NEB(self.images)
            self.neb.interpolate(self.interpolation_method)

            self.sisl_images = []
            for i in range(self.number_of_images + 2):
                self.sisl_images.append(sisl.Geometry.fromASE(self.images[i]))
            #-------------------------------------------------------------------
            # For Exchange
            #-------------------------------------------------------------------

            moving_specie_A = {}
            moving_specie_B = {}
            for i in range(len(self.sisl_images)):
                moving_specie_A[i] = sisl.Geometry(
                    self.sisl_images[i].xyz[-1],
                    atoms=self.sisl_images[i].atoms.Z[-1])
            ni_list = []
            for i in range(self.number_of_images + 2):
                ni_list.append(int(i))
            ni_list.sort(reverse=True)
            j = 0
            for i in ni_list:
                moving_specie_B[j] = sisl.Geometry(
                    moving_specie_A[i].xyz,
                    atoms=self.test['trace_atom_B_initial'].atoms.Z)
                #moving_specie_B[j] = sisl.Geometry(moving_specie_A[i].xyz,atoms=self.test['trace_atom_B_initial'].atoms.Z)
                j = j + 1
            #moving_specie_B[0].xyz = self.test['trace_atom_B_initial'].xyz
            #moving_specie_B[self.number_of_images+2] =  self.test['trace_atom_B_final'].xyz
            d = moving_specie_B[0].xyz - moving_specie_A[0].xyz
            d = d.reshape(3, )
            dsq = d**2
            dsum = np.sum(dsq)
            dsum = np.sqrt(dsum)
            ToleranceRadius = self.tolerance_radius
            #ToleranceRadius= np.array([-1.5,1.5,0.0])  #Ang
            print("d", d)
            print("dsum", dsum)
            print("Tolernace Radius :{}".format(self.tolerance_radius))
            Migration_Direction = self.exchange_direction
            NumberOfImages = self.number_of_images

            if Migration_Direction.lower() == "x":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: x")
            if Migration_Direction.lower() == "y":
                d[1] = d[1] + dsum + ToleranceRadius[1]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: y")
            if Migration_Direction.lower() == "z":
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Axis: z")
            if Migration_Direction.lower() == "xy":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[1] = d[1] + dsum + ToleranceRadius[1]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: xy")
            if Migration_Direction.lower() == "xz":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: xz")
            if Migration_Direction.lower() == "yz":
                d[1] = d[1] + dsum + ToleranceRadius[1]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Plane: yz")
            if Migration_Direction.lower() == "xyz":
                d[0] = d[0] + dsum + ToleranceRadius[0]
                d[1] = d[1] + dsum + ToleranceRadius[1]
                d[2] = d[2] + dsum + ToleranceRadius[2]
                Steps = d / NumberOfImages
                print("Migration Direction Volume: xyz")
            for l in range(1, NumberOfImages + 1):
                print("Atom A ", l, moving_specie_A[l].xyz + Steps)
                moving_specie_A[l].xyz = moving_specie_A[l].xyz + Steps
            for l in range(1, NumberOfImages + 1):
                print("Atom B ", l, moving_specie_B[l].xyz - Steps)
                moving_specie_B[l].xyz = moving_specie_B[l].xyz - Steps

            #print("DEBUG: {}".format(moving_specie_B[self.number_of_images+2]))
            #moving_specie_B[self.number_of_images+2] = self.test['trace_atom_B_final'].xyz
            #print("DEBUG: {}".format(moving_specie_B[self.number_of_images+2]))

            for k in range(self.number_of_images + 2):
                self.sisl_images[k] = self.sisl_images[k].remove([-1])

            print(" Putting Specie A & B in Sisl Geometry Object ")

            for i in range(self.number_of_images + 2):
                self.sisl_images[i] = self.sisl_images[i].add(
                    moving_specie_A[i])
                self.sisl_images[i] = self.sisl_images[i].add(
                    moving_specie_B[i])

        self.IO = SiestaBarriersIO(
            neb_type='exchange',
            sisl_images=self.sisl_images,
            flos_path=self.flos_path,
            flos_file_name_relax=self.flos_file_name_relax,
            flos_file_name_neb=self.flos_file_name_neb,
            number_of_images=self.number_of_images,
            initial_relaxed_path=self.initial_relaxed_path,
            initial_relaxed_fdf_name=self.initial_relaxed_fdf_name,
            final_relaxed_path=self.final_relaxed_path,
            final_relaxed_fdf_name=self.final_relaxed_fdf_name,
            relax_engine=self.relax_engine,
            relaxed=self.relaxed,
            ghost=self.ghost,
        )
Beispiel #18
0
from hubbard import HubbardHamiltonian, sp2
import numpy as np
import sisl

for w in range(1, 25, 2):
    g = sisl.geom.agnr(w)
    H0 = sp2(g)
    H = HubbardHamiltonian(H0, U=0)
    zak = H.get_Zak_phase()
    print(f'width={w:3}, zak={zak:7.3f}')

# SSH model, topological cell
g = sisl.Geometry([[0, 0, 0], [0, 1.65, 0]],
                  sisl.Atom(6, 1.001),
                  sc=[10, 3, 10])
g.set_nsc([1, 3, 1])
H0 = sp2(g)
H = HubbardHamiltonian(H0, U=0)
zak = H.get_Zak_phase(axis=1)
print(f'SSH topo : zak={zak:7.3f}')

# SSH model, trivial cell
g = sisl.Geometry([[0, 0, 0], [0, 1.42, 0]],
                  sisl.Atom(6, 1.001),
                  sc=[10, 3, 10])
g.set_nsc([1, 3, 1])
H0 = sp2(g)
H = HubbardHamiltonian(H0, U=0)
zak = H.get_Zak_phase(axis=1)
print(f'SSH triv : zak={zak:7.3f}')
    def copy(self, *args, **kwargs):
        copy = super().copy(*args, **kwargs)
        copy.U = self.U
        return copy


# Multi-orbital tight-binding Hamiltonian, set U in the geometry
pz = OrbitalU(1.42, q0=1.0, U=3.)
s = OrbitalU(1.42, q0=0, U=0.)
C = sisl.Atom(6, orbitals=[pz, s])
g = geom.zgnr(W, atoms=C)

# Add another atom to have heterogeneous number of orbitals per atoms
C2 = sisl.Atom(6, orbitals=[pz])
G_C2 = sisl.Geometry(g.xyz[0], atoms=C2)
g = g.replace(0, G_C2)

# Identify index for atoms
idx = g.a2o(range(len(g)))

# Build U for each orbital in each atom
#U = np.zeros(g.no)
#U[idx] = 3.

# Build TB Hamiltonian, zeroes for non-pz orbitals
TBham = sisl.Hamiltonian(g, spin='polarized')
for ia in g:
    ib = g.close(ia, R=[0, 1.42 + 0.1])
    io_a = g.a2o(ia, all=True)
    for iib in ib[1]:
Beispiel #20
0
def FixingSislImages(initial,
                     SislStructure,
                     ghost_suffix='ghost',
                     relaxed=False,
                     moving_specie="initial"):
    """
    """
    import sisl
    AtomIndex = np.array([])
    AtomSymbol = np.array([])
    for i in range(SislStructure.na):
        AtomIndex = np.append(AtomIndex, SislStructure.atoms.Z[i])
        AtomSymbol = np.append(AtomSymbol, initial.atoms[i].tag)
    for i in range(SislStructure.na):

        if i == 0:
            #print(i)
            if AtomIndex[i] < 0:
                ghost_name = sisl.Atom(-1 * AtomIndex[i])
                Test = sisl.Geometry(
                    xyz=SislStructure.xyz[i],
                    #atoms=sisl.Atom(ghost_name,tag=ghost_name.symbol+"_"+ghost_suffix), Bug!
                    atoms=sisl.Atom(int(AtomIndex[i]),
                                    tag=ghost_name.symbol + "_" +
                                    ghost_suffix),
                    sc=SislStructure.cell)
            else:
                Test = sisl.Geometry(xyz=SislStructure.xyz[i],
                                     atoms=sisl.Atom(AtomIndex[i],
                                                     tag=AtomSymbol[i]),
                                     sc=SislStructure.cell)
        #if i>0 and i<= SislStructure.na-2:
        if 0 < i <= SislStructure.na - 2:
            #print(i)
            if AtomIndex[i] < 0:
                ghost_name = sisl.Atom(-1 * AtomIndex[i])
                Test += sisl.Geometry(
                    xyz=SislStructure.xyz[i],
                    #atoms=sisl.Atom(ghost_name,tag=ghost_name.symbol+"_"+ghost_suffix), Bug!!
                    atoms=sisl.Atom(int(AtomIndex[i]),
                                    tag=ghost_name.symbol + "_" +
                                    ghost_suffix),
                    sc=SislStructure.cell)
            else:
                Test += sisl.Geometry(xyz=SislStructure.xyz[i],
                                      atoms=sisl.Atom(AtomIndex[i],
                                                      tag=AtomSymbol[i]),
                                      sc=SislStructure.cell)
        if SislStructure.na - 2 < i < SislStructure.na:
            #print(i)
            if relaxed:
                Test += sisl.Geometry(
                    xyz=SislStructure.xyz[i],
                    #atoms=sisl.Atom(AtomIndex[i],tag=AtomSymbol[i]+suffix),
                    atoms=sisl.Atom(AtomIndex[i], tag=AtomSymbol[i]),
                    sc=SislStructure.cell)
            else:
                Test += sisl.Geometry(
                    xyz=SislStructure.xyz[i],
                    #atoms=sisl.Atom(AtomIndex[i],tag=AtomSymbol[i]+suffix),
                    atoms=sisl.Atom(AtomIndex[i],
                                    tag=AtomSymbol[i] + "_" + moving_specie),
                    sc=SislStructure.cell)
    return Test