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)
예제 #2
0
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
예제 #3
0
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()
예제 #4
0
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
예제 #5
0
    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))
예제 #6
0
    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)
예제 #7
0
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()
예제 #8
0
 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
예제 #9
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()
예제 #10
0
    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)
예제 #11
0
    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)
예제 #12
0
 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
예제 #13
0
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
예제 #14
0
# 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)
예제 #15
0
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)
예제 #16
0
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
예제 #17
0
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
예제 #18
0
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)
예제 #19
0
# 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)