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
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()
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
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
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()