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
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
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
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
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)
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
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 } }
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
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, )
def si_pdos_kgrid_geom(): return sisl.Geometry([[0, 0, 0], [1, 1, 1]], sisl.Atom('Si', R=np.arange(13) + 1))
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
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
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
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, )
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]:
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