Dear all,

i used a slightly modified "discretize.py" code of
https://kwant-project.org/doc/1/tutorial/discretize  (see attached file)

and added the term

""" + kappa * kron(sigma_z,sigma_0)  """

to the hamiltonian (splitting up the different spins). When checking the
unitarity of the scattering matrix at energy=0 by applying the function
"check_unitarity(matrix)" for

kappa=0 and kappa=10**(-9) the unitarity-error is increasing from order
10**(-13) to 10**(-6)  !

Why is the error of $ S^\dagger S$ getting so high?


Thanks in advance!

Andreas Bereczuk

# Tutorial 2.9. Processing continuum Hamiltonians with discretize
# ===============================================================
#
# Physics background
# ------------------
#  - tight-binding approximation of continuous Hamiltonians
#
# Kwant features highlighted
# --------------------------
#  - kwant.continuum.discretize


import kwant
import kwant.continuum
import scipy.sparse.linalg
import scipy.linalg
import numpy as np

# For plotting
import matplotlib as mpl
from matplotlib import pyplot as plt


def qsh_system(a=30, L=60, W=3000):
    hamiltonian = """
       + C * identity(4) + M * kron(sigma_0, sigma_z)
       - B * (k_x**2 + k_y**2) * kron(sigma_0, sigma_z)
       - D * (k_x**2 + k_y**2) * kron(sigma_0, sigma_0)
       + A * k_x * kron(sigma_z, sigma_x)
       - A * k_y * kron(sigma_0, sigma_y)
       + kappa * kron(sigma_z,sigma_0)
    """

    template = kwant.continuum.discretize(hamiltonian, grid=a)

    def shape(site):
        (x, y) = site.pos
        return (0 <= y < W and 0 <= x < L)

    def lead_shape(site):
        (x, y) = site.pos
        return (0 <= y < W)

    syst = kwant.Builder()
    syst.fill(template, shape, (0, 0))

    lead = kwant.Builder(kwant.TranslationalSymmetry([-a, 0]))
    lead.fill(template, lead_shape, (0, 0)  )

    syst.attach_lead(lead)
    syst.attach_lead(lead.reversed())

    syst = syst.finalized()
    #kwant.plot(syst,num_lead_cells=15,show=True)
    return syst

def check_unitarity(matrix):
        Mdagger=np.transpose(np.conjugate(matrix))
        MdM=np.matmul(Mdagger,matrix)
        absMdM=np.absolute(MdM)
        shape=np.shape(MdM)[0]
        identity=np.eye(shape)
        errorMatrix=np.absolute(identity-absMdM)
        maxError=errorMatrix.max()
        error=10**(-7)
        return np.allclose(absMdM,identity,atol=error),"max error= ", maxError

def SMatrix_properties(syst,energy,params):
        SMatrix=kwant.smatrix(syst,energy,params=params)
        S=SMatrix.data

        print("S-Matrix unitarity= ",check_unitarity(S))



def analyze_qsh():
    params = dict(A=3.65, B=-68.6, D=-51.1, M=-0.01, C=0 , kappa=0)
    print("kappa= 0:")
    syst = qsh_system()
    kwant.plotter.bands(syst.leads[0], params=params,
                        momenta=np.linspace(-0.3, 0.3, 201), show=False)

    plt.grid()
    plt.xlim(-.3, 0.3)
    plt.ylim(-0.05, 0.05)
    plt.xlabel('momentum [1/A]')
    plt.ylabel('energy [eV]')
    #plt.show()
    SMatrix_properties(syst,energy=0,params=params)

    params = dict(A=3.65, B=-68.6, D=-51.1, M=-0.01, C=0 , kappa=10**(-9))
    print("kappa= 10**(-9):")
    syst = qsh_system()
    SMatrix_properties(syst,energy=0,params=params)

def main():

    analyze_qsh()


# Call the main function if the script gets executed (as opposed to imported).
# See <http://docs.python.org/library/__main__.html>.
if __name__ == '__main__':
    main()

Reply via email to