Dear Sir,

I am trying to plot the energy as a function of magnetic field for a 3D case, but I am getting tedious results. The system is infinite in two directions and has some width in the third direction. Please have a look at the code attached below. I tried a lot but failed. Is the code correct or I am wrong somewhere.
Thank you.


import kwant
import scipy.sparse.linalg as sla
import matplotlib.pyplot as plt
import tinyarray
import numpy as np
from numpy import cos, sin, pi
import cmath
from cmath import exp

sigma_0 = tinyarray.array([[1, 0], [0, 1]])
sigma_x = tinyarray.array([[0, 1], [1, 0]])
sigma_y = tinyarray.array([[0, -1j], [1j, 0]])
sigma_z = tinyarray.array([[1, 0], [0, -1]])


def make_system(a=1, L=30, W=10, H=10, t=1.0, t_x=1.0, t_y=1.0, t_z=1.0, lamda=0.1, beta=1.05):
    def onsite(site):
        return (t_z * cos(beta) + 2 * t) * sigma_z
   
    def hoppingx(site0, site1):
        return (-0.5 * t * sigma_z - 0.5 * 1j * t_x * sigma_x)

    def hoppingy(site0, site1):
        return -0.5 * t * sigma_z - 0.5 * 1j * t_y * sigma_y

    def hoppingz(site0, site1, B):
        y = site1.pos[1]
        return (-0.5 * t_z * sigma_z - 0.5 * 1j * lamda * sigma_0) * exp(2 * pi * 1j * B * a * (y-40))
   
   
    syst = kwant.Builder()
    lat = kwant.lattice.cubic(a)
    syst[(lat(z, y, x) for z in range(H) for y in range(W) for x in range(L))] = onsite
    syst[kwant.builder.HoppingKind((1, 0, 0), lat, lat)] = hoppingz
    syst[kwant.builder.HoppingKind((0, 1, 0), lat, lat)] = hoppingy
    syst[kwant.builder.HoppingKind((0, 0, 1), lat, lat)] = hoppingx
   
    lead1=kwant.Builder(kwant.TranslationalSymmetry((0,-a,0)))
    lead1[(lat(z,y,x)  for z in range(H)for y in range(W)for x in range(L))]=onsite
    lead1[kwant.builder.HoppingKind((1, 0, 0), lat, lat)] = hoppingz
    lead1[kwant.builder.HoppingKind((0, 1, 0), lat, lat)] = hoppingy
    lead1[kwant.builder.HoppingKind((0, 0, 1), lat, lat)] = hoppingx

    syst.attach_lead(lead1)
    syst.attach_lead(lead1.reversed())
   
    lead2=kwant.Builder(kwant.TranslationalSymmetry((-a,0,0)))
    lead2[(lat(z,y,x)  for z in range(H)for y in range(W)for x in range(L))]=onsite
    lead2[kwant.builder.HoppingKind((1, 0, 0), lat, lat)] = hoppingz
    lead2[kwant.builder.HoppingKind((0, 1, 0), lat, lat)] = hoppingy
    lead2[kwant.builder.HoppingKind((0, 0, 1), lat, lat)] = hoppingx

    syst.attach_lead(lead2)
    syst.attach_lead(lead2.reversed())
    syst = syst.finalized()
    return syst

def analyze_system():
    syst = make_system()
    kwant.plot(syst)
    Bfields = np.linspace(0, 0.002, 100)
    energies = []
    for B in Bfields:
        ham_mat = syst.hamiltonian_submatrix(params=dict(B=B), sparse=True)
        ev, evec = sla.eigsh(ham_mat.tocsc(), k=20, sigma=0)
        energies.append(ev)
    #print(energies)
   
    plt.figure()
    plt.plot(Bfields, energies)
    plt.xlabel("magnetic field [${10^-3 h/e}$]")
    plt.ylabel("energy [t]")

    plt.ylim(0, 0.11)
    plt.show
def main():
    syst = make_system()
    analyze_system()
main()




--


With Best Regards
NAVEEN YADAV
Ph.D Research Scholar
Deptt. Of Physics & Astrophysics
University Of Delhi.