Dear Professors,
I want to put a transverse electric field on this example. So Imodify the onsite energy as follows,
def onsite(site, p): x, y = site.pos E = 0.15 # the magnitude of electrical field in y direction return tau_z * (p.mu - 2 * p.t) + sigma_z * p.B + tau_x * p.Delta + E* y* s_0
s_0 = numpy.identity(2). However, the program crashed to UserCodeError: Error occurred in user-supplied value function "onsite".
The same error also occur when I put a perpendicular magnetic field and modify the hopping energy as
def hopping(sitei, sitej, phi, salt): xi, yi = sitei.pos xj, yj = sitej.pos return t0 * exp(-0.5j * phi * (xi - xj) * (yi + yj))
where t0 is the hopping matrix before put magnetic field.
Would you like help me in this issue?
Happy Kwant!
QC HNIE
__________The full code _____________________ from matplotlib import pyplot import kwant from kwant.digest import gauss import numpy import tinyarray import scipy.sparse.linalg
# Python >= 3.3 provides SimpleNamespace in the # standard library so we can simply import it: # >>> from types import SimpleNamespace # (Kwant does not yet support Python 3.) class SimpleNamespace(object): """A simple container for parameters.""" def __init__(self, **kwargs): self.__dict__.update(kwargs)
s_0 = numpy.identity(2) s_z = numpy.array([[1, 0], [0, -1]]) s_x = numpy.array([[0, 1], [1, 0]]) s_y = numpy.array([[0, -1j], [1j, 0]])
tau_z = tinyarray.array(numpy.kron(s_z, s_0)) tau_x = tinyarray.array(numpy.kron(s_x, s_0)) sigma_z = tinyarray.array(numpy.kron(s_0, s_z)) tau_zsigma_x = tinyarray.array(numpy.kron(s_z, s_x))
def onsite(site, p): x, y = site.pos Electric = 0.15 # the magnitude of electrical field in y direction return tau_z * (p.mu - 2 * p.t) + sigma_z * p.B + tau_x * p.Delta + Eeletric * y* s_0
def hopping(site0, site1, p): return tau_z * p.t + 1j * tau_zsigma_x * p.alpha
def make_system(l=70): sys = kwant.Builder() lat = kwant.lattice.chain() sys[(lat(x) for x in range(l))] = onsite sys[lat.neighbors()] = hopping return sys.finalized()
sys = make_system()
# Calculate and plot lowest eigenenergies in B-field. B_values = numpy.linspace(0, 0.6, 80) energies = [] params = SimpleNamespace( t=1, mu=-0.1, alpha=0.05, Delta=0.2) for params.B in B_values: H = sys.hamiltonian_submatrix( args=[params], sparse=True) H = H.tocsc() eigs = scipy.sparse.linalg.eigsh(H, k=20, sigma=0) energies.append(numpy.sort(eigs[0])) pyplot.plot(B_values, energies) pyplot.show()
Hi,
def onsite(site, p): x, y = site.pos E = 0.15 # the magnitude of electrical field in y direction return tau_z * (p.mu - 2 * p.t) + sigma_z * p.B + tau_x * p.Delta + E* y* s_0
s_0 = numpy.identity(2). However, the program crashed to UserCodeError: Error occurred in user-supplied value function "onsite".
An error occurred in the onsite function that you provided. Kwant can't do anything about this, so it raises an error. If you look at the traceback it will show you what error was raised by your function, and you can fix it.
Happy Kwanting,
Joe