Beispiel #1
0
def geometry_film(g, nz=1):
    """Create the geometry of a film"""
    go = g.supercell([1, 1, nz])  # create the supercell
    go.dimensionality = 2  # reduce dimensionality
    go = sculpt.set_xy_plane(go)  # put in the xy plane
    go.real2fractional()
    go.fractional2real()
    return go
Beispiel #2
0
def interface(h1,
              h2,
              energies=np.linspace(-1., 1., 100),
              operator=None,
              delta=0.01,
              kpath=None):
    """Get the surface DOS of an interface"""
    from scipy.sparse import csc_matrix, bmat
    if kpath is None:
        if h1.dimensionality == 3:
            g2d = h1.geometry.copy()  # copy Hamiltonian
            import sculpt
            g2d = sculpt.set_xy_plane(g2d)
            kpath = klist.default(g2d, nk=100)
        elif h1.dimensionality == 2:
            kpath = [[k, 0., 0.] for k in np.linspace(0., 1., 40)]
        else:
            raise
    fo = open("KDOS_INTERFACE.OUT", "w")
    fo.write("# k, E, Bulk1, Surf1, Bulk2, Surf2, interface\n")
    tr = timing.Testimator("KDOS")  # generate object
    ik = 0
    h1 = h1.get_multicell()  # multicell Hamiltonian
    h2 = h2.get_multicell()  # multicell Hamiltonian
    for k in kpath:
        tr.remaining(ik, len(kpath))  # generate object
        ik += 1
        #    for energy in energies:
        #  (b1,s1,b2,s2,b12) = green.interface(h1,h2,k=k,energy=energy,delta=delta)
        #      out = green.interface(h1,h2,k=k,energy=energy,delta=delta)
        outs = green.interface_multienergy(h1,
                                           h2,
                                           k=k,
                                           energies=energies,
                                           delta=delta)
        for (energy, out) in zip(energies, outs):
            if operator is None:
                op = np.identity(h1.intra.shape[0] * 2)  # normal cell
                ops = np.identity(h1.intra.shape[0])  # supercell


#      elif callable(operator): op = callable(op)
            else:
                op = operator  # normal cell
                ops = bmat([[csc_matrix(operator), None],
                            [None, csc_matrix(operator)]])
            # write everything
            fo.write(str(ik) + "   " + str(energy) + "   ")
            for g in out:  # loop
                if g.shape[0] == op.shape[0]:
                    d = -(g * op).trace()[0, 0].imag  # bulk
                else:
                    d = -(g * ops).trace()[0, 0].imag  # interface
                fo.write(str(d) + "   ")
            fo.write("\n")
            fo.flush()  # flush
    fo.close()
Beispiel #3
0
def build(h, nz=1):
    """Create Hamiltonian of a film from a 3d geometry"""
    #  if not h.dimensionality==3: raise
    ho = multicell.supercell(h, nsuper=[1, 1, nz], sparse=False, ncut=3)
    ho.dimensionality = 2  # reduce dimensionality
    ho.geometry.dimensionality = 2  # reduce dimensionality
    ho.geometry = sculpt.set_xy_plane(ho.geometry)  # put in the xy plane
    hoppings = []  # empty list
    for t in ho.hopping:  # loop over hoppings
        if t.dir[2] == 0: hoppings.append(t)  # remove in the z direction
    ho.hopping = hoppings  # overwrite hoppings
    return ho
Beispiel #4
0
def hamiltonian_film(hin, nz=10):
    """Return the Hamiltonian of a film"""
    h = hin.copy()  # copy Hamiltonian
    import multicell
    h = multicell.supercell_hamiltonian(h, nsuper=[1, 1, nz])
    hopout = []  # list
    for i in range(len(h.hopping)):  # loop over hoppings
        if abs(h.hopping[i].dir[2]) < 0.1:
            hopout.append(h.hopping[i])
    h.hopping = hopout
    h.dimensionality = 2
    h.geometry.dimensionality = 2
    import sculpt
    h.geometry = sculpt.set_xy_plane(h.geometry)
    return h
Beispiel #5
0
def surface(h1,
            energies=np.linspace(-1., 1., 100),
            operator=None,
            delta=0.01,
            kpath=None,
            hs=None):
    """Get the surface DOS of an interface"""
    from scipy.sparse import csc_matrix, bmat
    if kpath is None:
        if h1.dimensionality == 3:
            g2d = h1.geometry.copy()  # copy Hamiltonian
            import sculpt
            g2d = sculpt.set_xy_plane(g2d)
            kpath = klist.default(g2d, nk=100)
        elif h1.dimensionality == 2:
            kpath = [[k, 0., 0.] for k in np.linspace(0., 1., 40)]
        else:
            raise
    fo = open("KDOS.OUT", "w")
    fo.write("# k, E, Surface, Bulk\n")
    tr = timing.Testimator("KDOS")  # generate object
    ik = 0
    h1 = h1.get_multicell()  # multicell Hamiltonian
    for k in kpath:
        tr.remaining(ik, len(kpath))  # generate object
        ik += 1
        outs = green.surface_multienergy(h1,
                                         k=k,
                                         energies=energies,
                                         delta=delta,
                                         hs=hs)
        for (energy, out) in zip(energies, outs):
            # write everything
            fo.write(str(ik) + "   " + str(energy) + "   ")
            for g in out:  # loop
                if operator is None:
                    d = -g.trace()[0, 0].imag  # only the trace
                elif callable(operator):
                    d = operator(g, k=k)  # call the operator
                else:
                    d = -(g *
                          operator).trace()[0, 0].imag  # assume it is a matrix
                fo.write(str(d) + "   ")  # write in a file
            fo.write("\n")  # next line
            fo.flush()  # flush
    fo.close()