def __init__(self, Ed, Ep, tpd, tpp, tppp): self.Ed = Ed self.Ep = Ep self.tpd = tpd self.tpp = tpp self.tppp = tppp dim_k = 2 dim_r = 2 lat = [(1,0), (0,1)] orb = [(0,0), (.5,0), (0,.5)] self.icorr_orbs = [0] # list of indices of correlated orbitals # composition: has-a relationship with tb_model self.model = ptb.tb_model(dim_k, dim_r, lat, orb) self.model.set_onsite([Ed,Ep,Ep]) # (amplitude, i, j, [latt. vector to cell containing j]) hoppings = [ ( tpd, 0, 1, (0,0)), # p-d hoppings (-tpd, 0, 2, (0,0)), (-tpd, 0, 1, (-1,0)), ( tpd, 0, 2, (0,-1)), (-tpp, 1, 2, (0,0)), # diagonal p-p hoppings (-tpp, 1, 2, (1,-1)), ( tpp, 1, 2, (1,0)), ( tpp, 1, 2, (0,-1)), ( tppp,1, 1, (1,0)), # tpp' ( tppp,2, 2, (0,1)), ] for amp,i,j,lat in hoppings: self.model.set_hop(amp, i, j, lat)
def HaldanePTB(delta,t1,hop2,phi): # define lattice vectors lat=[[1.0,0.0],[0.5,np.sqrt(3.0)/2.0]] # define coordinates of orbitals orb=[[1./3.,1./3.],[2./3.,2./3.]] # make two dimensional tight-binding Haldane model haldane=ptb.tb_model(2,2,lat,orb) # set model parameters t2=hop2*np.exp(1.j*phi) # set on-site energies haldane.set_onsite([-delta,delta]) # set hoppings (one for each connected pair of orbitals) # from j in R to i in 0 # (amplitude, i, j, [lattice vector to cell containing j]) haldane.set_hop(t1, 0, 1, [ 0, 0]) haldane.set_hop(t1, 1, 0, [ 1, 0]) haldane.set_hop(t1, 1, 0, [ 0, 1]) # add second neighbour complex hoppings haldane.set_hop(t2 , 0, 0, [ 0, -1]) haldane.set_hop(t2 , 0, 0, [ 1, 0]) haldane.set_hop(t2 , 0, 0, [ -1, 1]) haldane.set_hop(t2 , 1, 1, [ -1, 0]) haldane.set_hop(t2 , 1, 1, [ 1,-1]) haldane.set_hop(t2 , 1, 1, [ 0, 1]) return haldane
def test_1d(dt=0.0,t=1): E0=0.0 mymodel=pythtb.tb_model(dim_k=3,dim_r=3,lat=np.eye(3),orb=[[0,0,0],[0,0,0.1]]) mymodel.set_onsite(-E0,0) mymodel.set_onsite(E0,1) mymodel.set_hop(-t-dt,0,1,[0,0,0]) mymodel.set_hop(-t+dt,1,0,[0,0,1]) zs=np.arange(-1,1,0.01) #zs=[0.0] kpoints= [[0,0,x] for x in zs] evals=mymodel.solve_all(kpoints) #for i in range(evals.shape[0]): # plt.plot(zs,evals[i,:]) myanatb=anatb(mymodel,kpts=kpoints) myanatb.plot_COHP_fatband(k_x=zs) return #wks=np.abs(myanatb.get_cohp_block_pair([0],[1])) #wks=myanatb.get_cohp_block_pair([0],[1]) wks=myanatb.get_cohp_all_pair() wks=np.moveaxis(wks,0,-1) kslist=zs*2 ekslist=evals wkslist=wks print(wks) axis=plot_band_weight(kslist,ekslist,wkslist=wks,efermi=None,yrange=None,output=None,style='color',color='blue',axis=None,width=10,xticks=None) axis.set_xlabel('k ($\pi/a$)') plt.show()
def model1d(ep,ed,tzp,tzd,l1,l1z,l3,mp=1000.,md1=1000.,md2=1000.,tdiagp=0.,tdiagd1=0.,tdiagd2=0.,txy=0.,txydiag=0.,X=0.,Xz=0.,l1plane=0.,l1diag=0.,lWeyl=0.,l3plane1=0.,l3plane2=0.,l3xy=0.,l3x2y2=0.,kx=0.,ky=0.): my_model=tb_model(dim_r=1,dim_k=1,lat=[[1.0]],orb=[[0.],[0.],[0.]],nspin=2) ### diagonal terms #(1+kx^2+ky^2) my_model.set_onsite([ep,ed,ed]) my_model.set_onsite([(kx**2+ky**2)/(2*mp),kx**2/md1+ky**2/md2,kx**2/md2+ky**2/md1],mode="add") #(1+kx^2+ky^2)\cos kz my_model.set_hop(tzp,0,0,[1.]) my_model.set_hop(tdiagp*(kx**2+ky**2),0,0,[1.],mode="add") my_model.set_hop(tzd,1,1,[1.]) my_model.set_hop(tdiagd1*(kx**2)+tdiagd2*(ky**2),1,1,[1.],mode="add") my_model.set_hop(tzd,2,2,[1.]) my_model.set_hop(tdiagd2*(kx**2)+tdiagd1*(ky**2),2,2,[1.],mode="add") ### dxz dyz terms #kx ky my_model.set_hop(txy*kx*ky,1,2,[0.]) my_model.set_hop(txydiag*kx*ky,1,2,[1.],mode="add") my_model.set_hop(txydiag*kx*ky,1,2,[-1.],mode="add") #\sigma_z (1+kx^2+ky^2)(1+\cos kz) my_model.set_hop([0.,0.,0., (l1+l1plane*(kx**2+ky**2))*1.0j], 1, 2, [0.],mode="add") my_model.set_hop([0.,0.,0., (l1z+l1diag*(kx**2+ky**2))*1.0j], 1, 2, [1.],mode="add") my_model.set_hop([0.,0.,0., (l1z+l1diag*(kx**2+ky**2))*1.0j], 1, 2, [-1.],mode="add") #(\sigma_x kx +\sigma_y ky)\sin kz my_model.set_hop([0., lWeyl*kx*1.0j, lWeyl*ky*1.0j,0.],1,2,[1.],mode="add") my_model.set_hop([0.,-lWeyl*kx*1.0j,-lWeyl*ky*1.0j,0.],1,2,[-1.],mode="add") ### pz (dyz,dxz) terms #(kx,ky)(1+\cos kz) my_model.set_hop(X*ky*1.0j,0,1,[0.]) my_model.set_hop(Xz*ky*1.0j,0,1,[1.],mode="add") my_model.set_hop(Xz*ky*1.0j,0,1,[-1.],mode="add") my_model.set_hop(X *kx*1.0j,0,2,[0.]) my_model.set_hop(Xz*kx*1.0j,0,2,[1.],mode="add") my_model.set_hop(Xz*kx*1.0j,0,2,[-1.],mode="add") #\sigma_z(kx,ky)(1+\cos kz) my_model.set_hop([0.,0.,0., X*kx*1.0j],0,1,[0.],mode="add") my_model.set_hop([0.,0.,0., Xz*kx*1.0j],0,1,[1.],mode="add") my_model.set_hop([0.,0.,0., Xz*kx*1.0j],0,1,[-1.],mode="add") my_model.set_hop([0.,0.,0.,- X*ky*1.0j],0,2,[0.],mode="add") my_model.set_hop([0.,0.,0.,-Xz*ky*1.0j],0,2,[1.],mode="add") my_model.set_hop([0.,0.,0.,-Xz*ky*1.0j],0,2,[-1.],mode="add") #(\sigma_x,y)\sin kz my_model.set_hop([0., l3*1.0j,0.,0.],0,1,[1.],mode="add") my_model.set_hop([0.,-l3*1.0j,0.,0.],0,1,[-1.],mode="add") my_model.set_hop([0.,0.,-l3*1.0j,0.],0,2,[1.],mode="add") my_model.set_hop([0.,0., l3*1.0j,0.],0,2,[-1.],mode="add") my_model.set_hop([0., (l3plane1*kx**2+l3plane2*ky**2)*1.0j,0.,0.],0,1,[1.],mode="add") my_model.set_hop([0.,-(l3plane1*kx**2+l3plane2*ky**2)*1.0j,0.,0.],0,1,[-1.],mode="add") my_model.set_hop([0.,0.,-(l3plane2*kx**2+l3plane1*ky**2)*1.0j,0.],0,2,[1.],mode="add") my_model.set_hop([0.,0., (l3plane2*kx**2+l3plane1*ky**2)*1.0j,0.],0,2,[-1.],mode="add") #kx ky and kx2-ky2 my_model.set_hop([0., l3x2y2*(kx**2-ky**2)*1.0j,-l3xy*kx*ky*1.0j,0.],0,1,[1.],mode="add") my_model.set_hop([0.,-l3x2y2*(kx**2-ky**2)*1.0j, l3xy*kx*ky*1.0j,0.],0,1,[1.],mode="add") my_model.set_hop([0., l3xy*kx*ky*1.0j, l3x2y2*(kx**2-ky**2)*1.0j,0.],0,2,[1.],mode="add") my_model.set_hop([0.,-l3xy*kx*ky*1.0j,-l3x2y2*(kx**2-ky**2)*1.0j,0.],0,2,[1.],mode="add") return my_model
def test_TB_from_pythTB(self): try: from pythtb import tb_model except (ModuleNotFoundError): print( 'skipping pythTB test because module pythTB could not be imported' ) return # set up simple 1band model with NN and NNN hopping n_orb = 3 lattice = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] orbitals = [[0, 0, 0]] * n_orb d0 = 1.0 t0 = -0.5 ptb = tb_model(3, 3, lattice, orbitals) # set cfs and hoppings ptb.set_onsite([d0] * n_orb) ptb.set_hop(1 * t0, 0, 0, [1, 0, 0]) ptb.set_hop(2 * t0, 1, 1, [1, 0, 0]) ptb.set_hop(1 * t0, 0, 0, [0, 1, 0]) ptb.set_hop(4 * t0, 2, 2, [0, 1, 0]) ptb.set_hop(1 * t0, 1, 1, [0, 0, 1]) ptb.set_hop(8 * t0, 2, 2, [0, 0, 1]) tbl_ptb = TB_from_pythTB(ptb) # Check that hopping dict matches pythtb model above hr_0 = tbl_ptb.hoppings[(0, 0, 0)] self.assertTrue(hr_0[0, 0] == hr_0[1, 1] == hr_0[2, 2] == d0) hr_100 = tbl_ptb.hoppings[(1, 0, 0)] self.assertTrue(2 * hr_100[0, 0] == hr_100[1, 1] == 2 * t0) hr_010 = tbl_ptb.hoppings[(0, 1, 0)] self.assertTrue(4 * hr_010[0, 0] == hr_010[2, 2] == 4 * t0) hr_001 = tbl_ptb.hoppings[(0, 0, 1)] self.assertTrue(8 * hr_001[1, 1] == hr_001[2, 2] == 8 * t0) # Evaluate dispersion on k-space path Gamma = np.array([0.0, 0.0, 0.0]) M = np.array([0.5, 0.5, 0.0]) paths = [(Gamma, M)] kvecs, dist = k_space_path(paths, num=101, bz=tbl_ptb.bz) epsilon_k = tbl_ptb.dispersion(kvecs) self.assertTrue(epsilon_k.shape == (101, 3)) # Obtain H_k on same path and compare eigenvalues against dispersion H_k = tbl_ptb.fourier(kvecs) evals = np.linalg.eigvalsh(H_k) self.assertTrue(np.allclose(evals, epsilon_k)) # Obtain H_k as Gf H_k = tbl_ptb.fourier(tbl_ptb.get_kmesh(11)) self.assertTrue(H_k.data.shape == (1331, 3, 3))
def _set_up_tb_model(self): self.num_el = self.num_atoms - self.charge if not self.relax_multiplicity: if self.multiplicity % 2 == self.num_el % 2: raise Exception( "ERROR: Charge & multiplicity combination not allowed!") # determine spin populations self.num_spin_el = [ (self.num_el + (self.multiplicity - 1)) // 2, (self.num_el - (self.multiplicity - 1)) // 2, ] else: self.num_spin_el = [0, 0] lat = [[1.0, 0.0], [0.0, 1.0]] orb = [] for at in self.ase_geom: orb.append(at.position[:2]) self.model_a = pythtb.tb_model(0, 2, lat, orb, nspin=1) self.model_b = pythtb.tb_model(0, 2, lat, orb, nspin=1) for i_at in range(len(self.neighbors)): for d in range(len(self.t_list)): t = self.t_list[d] if t == 0.0: continue ns = self.neighbors[i_at][d] for n in ns: if n < i_at: self.model_a.set_hop(-t, i_at, n) self.model_b.set_hop(-t, i_at, n)
def test_compare_pythtb(): pt_model = pt.tb_model(1, 1, lat=[[1]], orb=[[0], [0.2]]) tb_model = tb.Model(dim=1, pos=[[0], [0.2]], uc=[[1]]) pt_model.set_hop(3j, 0, 1, [1]) tb_model.add_hop(3j, 0, 1, [1]) assert np.isclose(pt_model._gen_ham([0]), tb_model.hamilton([0])).all() assert np.isclose(pt_model._gen_ham([0]), tb_model.hamilton([0], convention=1)).all() assert np.isclose(pt_model._gen_ham([1]), tb_model.hamilton([1], convention=1)).all() assert np.isclose(pt_model._gen_ham([0.2]), tb_model.hamilton(0.2, convention=1)).all()
def __init__(self, dim_k, dim_r, lat, orb, basis_set=None, per=None, nspin=2, nel=None, width=0.2, verbose=True): #mytb.__init__(self,dim_k,dim_r,lat,orb,per=per,nspin=nspin,nel=nel,width=width,verbose=True) self._basis_set = basis_set self._dim_k = dim_k self._dim_r = dim_r self._norb = len(orb) self._tbmodel = tb_model(dim_k, dim_r, lat, orb, per=per, nspin=nspin) self._tbmodel0 = None self._eigenvals = None self._eigenvecs = None self._nspin = nspin self._nstate = self._norb * self._nspin # if fix_spin: _efermi is a tuple (ef_up,ef_dn) self._efermi = None self._occupations = None self._kpts = None # _kweight is a array [w1,w2,....]. self._kweights = None self._nel = nel self._U = None self._width = width self._verbose = verbose self._eps = 0.001 self._onsite_en = np.zeros(len(orb)) self._nbar = np.ndarray([len(orb), 2]) #self._fix_spin=fix_spin # U function index r,p,q,s include spin index or not. self._U_spin_indexed = None self._old_occupations = None self._occupations = None # self._rho: density matrix _nstate*_nstate self._rho = None #np.zeros((self._norb*self._nspin ,self._norb*self._nspin)) self._total_energy = None self._niter = 0
def test_compare_pythtb(): """ Compare a tight-binding model against a PythTB reference, using convention 1. """ pt_model = pt.tb_model(1, 1, lat=[[1]], orb=[[0], [0.2]]) tb_model = tb.Model(dim=1, pos=[[0], [0.2]], uc=[[1]]) pt_model.set_hop(3j, 0, 1, [1]) tb_model.add_hop(3j, 0, 1, [1]) # pylint: disable=protected-access assert np.isclose(pt_model._gen_ham([0]), tb_model.hamilton([0])).all() assert np.isclose(pt_model._gen_ham([0]), tb_model.hamilton([0], convention=1)).all() assert np.isclose(pt_model._gen_ham([1]), tb_model.hamilton([1], convention=1)).all() assert np.isclose(pt_model._gen_ham([0.2]), tb_model.hamilton(0.2, convention=1)).all()
def __init__(self, crystal): """ Create instance of the Tight binding model :type crystal: crystal object :param crystal: a crystal object containing atoms """ self.crystal = crystal self.crystal.brillouinZone.band_model = "Tight Binding" self.spg = (crystal.lattice, crystal.getAtomPositons(), crystal.getAtomNumbers()) self._orbital_positons = [] for atom in crystal.atoms: for orbital in atom.orbitals: self._orbital_positons.append(atom.position) self.setGrid() self.model = tb.tb_model(3, 3, self.crystal.lattice, self._orbital_positons)
def __init__(self, crystal): """ Create instance of the Parabolic Band model :type crystal: crystal object :param crystal: a crystal object containing atoms """ self._crystal = crystal self._crystal.brillouinzone.band_model = "Parabolic" self._spg = (crystal.lattice, crystal.get_atom_positons(), crystal.get_atom_numbers()) self._orbital_positons = [] for atom in crystal.atoms: for orbital in atom.orbitals: self._orbital_positons.append(atom.position) self.set_grid() self._model = tb.tb_model(3, 3, self._crystal.lattice, self._orbital_positons)
def make_model(self): if self.primitive_atoms is not None: atoms = self.primitive_atoms else: atoms = self.atoms lat = atoms.get_cell() apos = atoms.get_scaled_positions() masses = atoms.get_masses() orb = [] for pos in apos: for i in range(3): orb.append(pos) model = pythtb.tb_model(3, 3, lat=lat, orb=orb) atom_positions = atoms.get_positions() for ifce in self.ifc: #print ifce iatom = ifce['iatom'] jatom = ifce['jatom'] jpos = ifce['jpos'] R0 = atom_positions[ifce['jatom'] - 1] dis = R0 - jpos #print self.atoms.get_cell() R = np.linalg.solve(atoms.get_cell(), dis) #print R R = [int(round(x)) for x in R] #print R for a in range(3): for b in range(3): i = 3 * (iatom - 1) + a j = 3 * (jatom - 1) + b val = ifce['ifc'][a, b] * Hartree / np.sqrt( masses[iatom - 1] * masses[jatom - 1]) #print i,j,R if iatom == jatom and a == b and R == [0, 0, 0]: model.set_onsite(val * 2, ind_i=i) else: model.set_hop(val, i, j, R, allow_conjugate_pair=True) #print self.atoms.get_positions() self.model = model
def pythtb_Haldane(): lat=[[1.0,0.0],[0.5,np.sqrt(3.0)/2.0]] orb=[[1./3.,1./3.],[2./3.,2./3.]] my_model=pythtb.tb_model(2,2,lat,orb) delta=0.2 t=-1.0 t2 =0.15*np.exp((1.j)*np.pi/2.) t2c=t2.conjugate() my_model.set_onsite([-delta,delta]) my_model.set_hop(t, 0, 1, [ 0, 0]) my_model.set_hop(t, 1, 0, [ 1, 0]) my_model.set_hop(t, 1, 0, [ 0, 1]) my_model.set_hop(t2 , 0, 0, [ 1, 0]) my_model.set_hop(t2 , 1, 1, [ 1,-1]) my_model.set_hop(t2 , 1, 1, [ 0, 1]) my_model.set_hop(t2c, 1, 1, [ 1, 0]) my_model.set_hop(t2c, 0, 0, [ 1,-1]) my_model.set_hop(t2c, 0, 0, [ 0, 1]) return my_model
# by Sinisa Coh and David Vanderbilt (see gpl-pythtb.txt) #from pythtb import * # import TB model class import pythtb as tb # import TB model class import numpy as np import matplotlib.pyplot as plt #parameter############################################ # information used for title, figure name. info = ['triangular lattice model', 'TR'] # define lattice vectors lat=[[np.sqrt(3.0)/2.0,0.5], [0.,1.]] # define coordinates of orbitals orb=[[0,0], [2./3.,-1./3.], [1./3.,1./3.]] # make two dimensional tight-binding model my_model=tb.tb_model(2,2,lat,orb) # set model parameters t1 = 1.0 t2 = 1.0/4 phi = np.pi/3 # calculate bulk or edge spectrum glue_edgs = True #glue_edgs = False # set on-site energies my_model.set_onsite([0.0]*len(orb)) ###################################################### # set hoppings (one for each connected pair of orbitals)
import numpy as np from numpy import linalg as LA #set and solve the parton band model t, td = 1., 0.5j Lx, Ly = 6, 4 L = Lx * Ly * 2 chimax = 800 cutoff = 1e-10 # define lattice vectors lat = [[2.0, 0.0], [0.0, 1.0]] # define coordinates of orbitals orb = [[0.0, 0.0], [0.5, 0.0]] # make two dimensional tight-binding model parton = tb.tb_model(2, 2, lat, orb) # set model parameters # add first neighbour hoppings parton.set_hop(t, 0, 1, [0, 0]) parton.set_hop(t, 1, 0, [1, 0]) parton.set_hop(t, 0, 0, [0, 1]) parton.set_hop(-t, 1, 1, [0, 1]) # add second neighbour hoppings parton.set_hop(td, 0, 1, [0, 1]) parton.set_hop(td, 1, 0, [0, 1]) parton.set_hop(-td, 1, 0, [1, 1]) parton.set_hop(-td, 0, 1, [-1, 1]) #We first work with a finite system # cutout finite model first along direction x without PBC tmp_parton = parton.cut_piece(Lx, 0, glue_edgs=False)
def setup_model3d(M02=-0.012,M12=-3.8,M22=0.00425,M01=0.002,M11=2.4,M21=-0.006,M03=-0.002,M13=-0.2,M23=0.0001,A = -4.4*1.,B = 2.2*1.,C = 0.004*1.,X = 0.412*1.,L1=0.01,L2=0.001,L3=0.004): # define lattice vectors lat=[[1.0,0.0,0.0],[0.0,0.1,0.0],[0.0,0.0,0.1]] # define coordinates of orbitals orb=[[0.5,0.5,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] # make three dimensional tight-binding model my_model=tb_model(3,3,lat,orb,[0,1,2],2) # set model parameters # M01 = 0.04*1. # M11 = 2.4*1. # M21 = -0.2*1. # M02 = 0. # M12 = -3.8*1. # M22 = 0.14*1. # M03 = -0.002*-4. # M13 = -0.2*1. # M23 = 0.002*1. # A = -4.4*1. # B = 2.2*1. # C = 0.004*1. # X = 0.412*1. # L1 = 0.0105*1.0*scalefactor1 # L2 = 0.003*1.0*scalefactor2 # L3 = 0.019*1.0*scalefactor3 # Lsymbr = 0.000001 #LR = 0.005*0. #onsite my_model.set_onsite([M01+4.0*M11+2.0*M21,M02+4.0*M12+2.0*M22,M02+4.0*M12+2.0*M22,M03+4.0*M13+2.0*M23], mode ="reset") #my_model.set_onsite([0.,0.,0.,0.]) # set hoppings (one for each connected pair of orbitals) # (amplitude, i, j, [lattice vector to cell containing j]) #pz to pz my_model.set_hop(-M11, 0, 0, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M11, 0, 0, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M21, 0, 0, [ 0, 0, 1], mode ="reset") #dyz to dyz my_model.set_hop(-M12-B, 1, 1, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M12+B, 1, 1, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M22, 1, 1, [ 0, 0, 1], mode ="reset") #dxz to dxz my_model.set_hop(-M12+B, 2, 2, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M12-B, 2, 2, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M22, 2, 2, [ 0, 0, 1], mode ="reset") #dxy to dxy my_model.set_hop(-M13, 3, 3, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M13, 3, 3, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M23, 3, 3, [ 0, 0, 1], mode ="reset") #pz to dyz #n.b. to check the sign of the following term : hopping integral from orbital 1 at lattice [0,1,0] to orbital 0 at origin, and -ie^ikz +hc ~ 2sinkz my_model.set_hop(X/2.0, 0, 1, [ 0, -1, 0], mode ="reset") my_model.set_hop(-X/2.0, 0, 1, [ 0, 1, 0], mode ="reset") #pz to dxz my_model.set_hop(X/2.0, 0, 2, [ -1, 0, 0], mode ="reset") my_model.set_hop(-X/2.0, 0, 2, [ 1, 0, 0], mode ="reset") #dyz to dxz my_model.set_hop(-A/4.0, 1, 2, [ 1, 1, 0], mode ="reset") my_model.set_hop(-A/4.0, 1, 2, [-1,-1, 0], mode ="reset") my_model.set_hop( A/4.0, 1, 2, [ 1,-1, 0], mode ="reset") my_model.set_hop( A/4.0, 1, 2, [-1, 1, 0], mode ="reset") ##check these two terms #dyz to dxy my_model.set_hop(-C/4.0, 1, 3, [ 1, 0, 1], mode ="reset") my_model.set_hop(-C/4.0, 1, 3, [-1, 0,-1], mode ="reset") my_model.set_hop( C/4.0, 1, 3, [ 1, 0,-1], mode ="reset") my_model.set_hop( C/4.0, 1, 3, [-1, 0, 1], mode ="reset") #dxz to dxy my_model.set_hop(-C/4.0, 2, 3, [ 0, 1, 1], mode ="reset") my_model.set_hop(-C/4.0, 2, 3, [ 0,-1,-1], mode ="reset") my_model.set_hop( C/4.0, 2, 3, [ 0, 1,-1], mode ="reset") my_model.set_hop( C/4.0, 2, 3, [ 0,-1, 1], mode ="reset") # set SOC my_model.set_hop([0.,0.,0., L1*1.0j], 1, 2, [0.,0.,0.], mode="add") my_model.set_hop([0.,0.,-L2*1.0j,0.], 1, 3, [0.,0.,0.], mode="add") my_model.set_hop([0., L2*1.0j,0.,0.], 2, 3, [0.,0.,0.], mode="add") my_model.set_hop([0., L3*1.0j/2.0,0.,0.], 0, 1, [0.,0., 1.], mode="add") my_model.set_hop([0.,-L3*1.0j/2.0,0.,0.], 0, 1, [0.,0.,-1.], mode="add") my_model.set_hop([0.,0.,-L3*1.0j/2.0,0.], 0, 2, [0.,0., 1.], mode="add") my_model.set_hop([0.,0., L3*1.0j/2.0,0.], 0, 2, [0.,0.,-1.], mode="add") #set Rashba ... only implemented for x-hops now # my_model.set_hop([0.,0.,LR*1.j,0.], 0, 0, [1.,0.,0.] , mode="add") # my_model.set_hop([0.,0.,LR*1.j,0.], 1, 1, [1.,0.,0.] , mode="add") # my_model.set_hop([0.,0.,LR*1.j,0.], 2, 2, [1.,0.,0.] , mode="add") # my_model.set_hop([0.,0.,LR*1.j,0.], 3, 3, [1.,0.,0.] , mode="add") #small explicit sigma_y breaking term to separate # my_model.set_onsite([0.,0.,0.,-Lsymbr], 0, mode="add") # my_model.set_onsite([0.,0.,0.,-Lsymbr], 1, mode="add") # my_model.set_onsite([0.,0.,0.,-Lsymbr], 2, mode="add") # my_model.set_onsite([0.,0.,0.,-Lsymbr], 3, mode="add") # my_model.set_onsite([0.,0.,Lsymbr,0.], 0, mode="add") # my_model.set_onsite([0.,0.,Lsymbr,0.], 1, mode="add") # my_model.set_onsite([0.,0.,Lsymbr,0.], 2, mode="add") # my_model.set_onsite([0.,0.,Lsymbr,0.], 3, mode="add") return my_model
def setup_model3dwithevenL3(scalefactor,scalefactorhopp=1.,scalefactorhopd=1.,scalefactorgap=-5.,scalefactordxytop=1.): # define lattice vectors lat=[[1.0,0.0,0.0],[0.0,0.1,0.0],[0.0,0.0,0.1]] # define coordinates of orbitals orb=[[0.5,0.5,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] # make three dimensional tight-binding model my_model=tb_model(3,3,lat,orb,[0,1,2],2) # set model parameters M01 = 0.04*1.*scalefactor M11 = 2.4*1. M21 = -0.8*scalefactorhopp M02 = 0. M12 = -3.8*1. M22 = 0.14**scalefactorhopd M03 = -0.002*-4.*scalefactordxytop M13 = -0.2*1. M23 = 0.002*1. A = -4.4*1. B = 2.2*1. C = 0.004*1. X = 0.412*1. L1 = 0.0105*1. L2 = 0.003*1. L3 = 0.019*scalefactorgap #onsite my_model.set_onsite([M01+4.0*M11+2.0*M21,M02+4.0*M12+2.0*M22,M02+4.0*M12+2.0*M22,M03+4.0*M13+2.0*M23], mode ="reset") #my_model.set_onsite([0.,0.,0.,0.]) # set hoppings (one for each connected pair of orbitals) # (amplitude, i, j, [lattice vector to cell containing j]) #pz to pz my_model.set_hop(-M11, 0, 0, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M11, 0, 0, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M21, 0, 0, [ 0, 0, 1], mode ="reset") #dyz to dyz my_model.set_hop(-M12-B, 1, 1, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M12+B, 1, 1, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M22, 1, 1, [ 0, 0, 1], mode ="reset") #dxz to dxz my_model.set_hop(-M12+B, 2, 2, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M12-B, 2, 2, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M22, 2, 2, [ 0, 0, 1], mode ="reset") #dxy to dxy my_model.set_hop(-M13, 3, 3, [ 1, 0, 0], mode ="reset") my_model.set_hop(-M13, 3, 3, [ 0, 1, 0], mode ="reset") my_model.set_hop(-M23, 3, 3, [ 0, 0, 1], mode ="reset") #pz to dyz #n.b. to check the sign of the following term : hopping integral from orbital 1 at lattice [0,1,0] to orbital 0 at origin, and -ie^ikz +hc ~ 2sinkz my_model.set_hop(X/2.0, 0, 1, [ 0, -1, 0], mode ="reset") my_model.set_hop(-X/2.0, 0, 1, [ 0, 1, 0], mode ="reset") #pz to dxz my_model.set_hop(X/2.0, 0, 2, [ -1, 0, 0], mode ="reset") my_model.set_hop(-X/2.0, 0, 2, [ 1, 0, 0], mode ="reset") #dyz to dxz my_model.set_hop(-A/4.0, 1, 2, [ 1, 1, 0], mode ="reset") my_model.set_hop(-A/4.0, 1, 2, [-1,-1, 0], mode ="reset") my_model.set_hop( A/4.0, 1, 2, [ 1,-1, 0], mode ="reset") my_model.set_hop( A/4.0, 1, 2, [-1, 1, 0], mode ="reset") ##check these two terms #dyz to dxy my_model.set_hop(-C/4.0, 1, 3, [ 1, 0, 1], mode ="reset") my_model.set_hop(-C/4.0, 1, 3, [-1, 0,-1], mode ="reset") my_model.set_hop( C/4.0, 1, 3, [ 1, 0,-1], mode ="reset") my_model.set_hop( C/4.0, 1, 3, [-1, 0, 1], mode ="reset") #dxz to dxy my_model.set_hop(-C/4.0, 2, 3, [ 0, 1, 1], mode ="reset") my_model.set_hop(-C/4.0, 2, 3, [ 0,-1,-1], mode ="reset") my_model.set_hop( C/4.0, 2, 3, [ 0, 1,-1], mode ="reset") my_model.set_hop( C/4.0, 2, 3, [ 0,-1, 1], mode ="reset") # set SOC my_model.set_hop([0.,0.,0., L1*1.0j], 1, 2, [0.,0.,0.], mode="add") my_model.set_hop([0.,0.,-L2*1.0j,0.], 1, 3, [0.,0.,0.], mode="add") my_model.set_hop([0., L2*1.0j,0.,0.], 2, 3, [0.,0.,0.], mode="add") my_model.set_hop([0., L3*1.0/2.0,0.,0.], 0, 1, [0.,0., 1.], mode="add") my_model.set_hop([0., L3*1.0/2.0,0.,0.], 0, 1, [0.,0.,-1.], mode="add") my_model.set_hop([0.,0., L3*1.0/2.0,0.], 0, 2, [0.,0., 1.], mode="add") my_model.set_hop([0.,0., L3*1.0/2.0,0.], 0, 2, [0.,0.,-1.], mode="add") return my_model
import numpy as np import pythtb as ptb import matplotlib.pyplot as plt import time import wannierberri as wb SYM=wb.symmetry # Example for the interface PythTB-WannierBerri. Extracted from # http://www.physics.rutgers.edu/~dhv/pythtb-book-examples/ptb_samples.html # 3D model of Li on bcc lattice, with s orbitals only # define lattice vectors lat=[[-0.5, 0.5, 0.5],[ 0.5,-0.5, 0.5],[ 0.5, 0.5,-0.5]] # define coordinates of orbitals orb=[[0.0,0.0,0.0]] # make 3D model my_model=ptb.tb_model(3,3,lat,orb) # set model parameters # lattice parameter implicitly set to a=1 Es= 4.5 # site energy t =-1.4 # hopping parameter # set on-site energy my_model.set_onsite([Es]) # set hoppings along four unique bonds # note that neighboring cell must be specified in lattice coordinates for R in ([1,0,0],[0,1,0],[0,0,1],[1,1,1]): my_model.set_hop(t, 0, 0, R) system=wb.System_PythTB(my_model,berry=True)
# by Sinisa Coh and David Vanderbilt (see gpl-pythtb.txt) #from pythtb import * # import TB model class import pythtb as tb # import TB model class import numpy as np import matplotlib.pyplot as plt #parameter############################################ # information used for title, figure name. info = ['triangular lattice model', 'TR'] # define lattice vectors lat = [[np.sqrt(3.0) / 2.0, 0.5], [0., 1.]] # define coordinates of orbitals orb = [[0, 0], [2. / 3., -1. / 3.], [1. / 3., 1. / 3.]] # make two dimensional tight-binding model my_model = tb.tb_model(2, 2, lat, orb) # set model parameters t1 = 1.0 t2 = 1.0 / 4 phi = np.pi / 3 # calculate bulk or edge spectrum glue_edgs = True #glue_edgs = False # set on-site energies my_model.set_onsite([0.0] * len(orb)) ###################################################### # set hoppings (one for each connected pair of orbitals)