How to add magnetic field (Peierls substitution) for the continuum model
Dear kwanters, I am using kwant for handle a k.p Hamiltonian, for the conductance calculations. I start from a k.p model, and transform it to a tight-binding model using kwant.continuum tools [procedures listed here https://kwant-project.org/doc/1/tutorial/discretize]. Now I want to study the conductance of the system under magnetic field. I try to do Peierls substitution for hoppings between site i and site j (i-j being parallel to the lead). However, I find that using the kwant.continuum scheme, there are no information regarding the lattice information such as "lat = kwant.lattice.honeycomb() ". This prevents the application of Peierls substitution by the following way: _____________________________ def hopx(site1, site2, B): y = site1.pos[1] return - np.exp(-1j * B * y) syst[kwant.builder.HoppingKind((1, 0), lat.a, lat.b)] = hopx ____________________________ My question is how to add magnetic field during the calculations for the systems generated from a continuum model by kwant.continuum? Thank you very much!
Dear Zhao, Instead of doing the Peierls substitution, did you try to use the minimal coupling [1] directly in the kp Hamiltonian? Just change k----> k-eA , where A is the vector potential. (Make sure that you choose the correct gauge that fits the translational symmetry of the lead.) I hope this helps, Adel [1] https://ocw.tudelft.nl/course-readings/landau-levels-microscopic-model-quant... . On Sat, Jan 14, 2023 at 3:37 AM <dielectric_hjzhao@126.com> wrote:
Dear kwanters, I am using kwant for handle a k.p Hamiltonian, for the conductance calculations. I start from a k.p model, and transform it to a tight-binding model using kwant.continuum tools [procedures listed here https://kwant-project.org/doc/1/tutorial/discretize]. Now I want to study the conductance of the system under magnetic field. I try to do Peierls substitution for hoppings between site i and site j (i-j being parallel to the lead). However, I find that using the kwant.continuum scheme, there are no information regarding the lattice information such as "lat = kwant.lattice.honeycomb() ". This prevents the application of Peierls substitution by the following way:
_____________________________ def hopx(site1, site2, B): y = site1.pos[1] return - np.exp(-1j * B * y)
syst[kwant.builder.HoppingKind((1, 0), lat.a, lat.b)] = hopx ____________________________
My question is how to add magnetic field during the calculations for the systems generated from a continuum model by kwant.continuum? Thank you very much!
-- Abbout Adel
Dear Adel, Thanks a lot. Your suggestions are very helpful. Indeed, we can use k----> k-eA to implement the magnetic field. Regarding this, I have another question: Starting from the continuum Hamiltonian H=alpha*(k_x**2+k_y**2), I would like to add a magnetic field along z direction [with the gauge given by A=(-By, 0, 0)]. I am work with a Hamiltonian where k_x and k_y have a unit of Angstrum^-1 and energy have an unit of eV. By k----> k-eA substitution, I need to consider the Hamiltonian H=alpha*[(k_x-e/hbar*B*y)**2+k_y**2]. Here, e = -1.602176634e-19 C, hbar = 1.05457266e-34 J s. To let k_x - e/hbar*B*y have a unit of Angstrum^-1 (units of B and y are Tesla and Angstrum, respectively), the unit of the "e/hbar“ coefficient should be Tesla/Angstrum^2. In such sense, I have the "e/hbar“ coefficient as -1.519266e-05 Tesla/Angstrum^2. Now I generate a model with alpha = -8 eV Angstrum^2 and e/hbar = -1.519266e-05 Tesla/Angstrum^2. When doing the calculations, I found that when magnetic field is of the order of 10 Tesla, adding a magnetic field almost did nothing (i.e., the change of conductance is very small). When further increasing the magnetic field to e.g., 1000 T, indeed, the conductance changes much. I guess there may be something wrong when setting the coefficient "e/hbar“. But I do not know what happens. Could you please further help me with this issue? Thanks in advance!
Dear Zhao, In two dimensional electronic gases (2DEG) where the electrons are described by your hamiltonian, we have to use the effective mass of the electron and not the exact mass m_e: m*=0.067 me in semiconducting heterostructures giving 2DEG. with this value, the hopping parameter t =150 mev t=hbar^2/(2m* a^2) Usually in the simulation we take the Fermi energy typically EF=0.1 t But we know that EF=k^2 a^2 t (hbar^2 k^2/2m ), a is the lattice constant So, k^2 a^2= 0.1 => k=0.3/a The electronic wavelength lambda =2 pi/ k =21 a Typically, in SGM experiments, we have lambda around 20 nm this means that a=10 anstrom with 10 T, you have the magnetic length, L_b=100 angstrom=10 a., The wavelength has the same order as the magnetic length, which should be fine. You might have to look at the change induced in the band structure and not directly in the transmission because it might be sometimes misleading especially for uniform systems. Please check the development version of kwant [1] which has an interesting new feature for implementing the magnetic field. I hope this helps, Adel [1] https://kwant-project.org/doc/dev/tutorial/magnetic_field On Sun, Jan 15, 2023 at 9:11 AM <dielectric_hjzhao@126.com> wrote:
Dear Adel, Thanks a lot. Your suggestions are very helpful. Indeed, we can use k----> k-eA to implement the magnetic field. Regarding this, I have another question: Starting from the continuum Hamiltonian H=alpha*(k_x**2+k_y**2), I would like to add a magnetic field along z direction [with the gauge given by A=(-By, 0, 0)]. I am work with a Hamiltonian where k_x and k_y have a unit of Angstrum^-1 and energy have an unit of eV. By k----> k-eA substitution, I need to consider the Hamiltonian H=alpha*[(k_x-e/hbar*B*y)**2+k_y**2]. Here, e = -1.602176634e-19 C, hbar = 1.05457266e-34 J s. To let k_x - e/hbar*B*y have a unit of Angstrum^-1 (units of B and y are Tesla and Angstrum, respectively), the unit of the "e/hbar“ coefficient should be Tesla/Angstrum^2. In such sense, I have the "e/hbar“ coefficient as -1.519266e-05 Tesla/Angstrum^2. Now I generate a model with alpha = -8 eV Angstrum^2 and e/hbar = -1.519266e-05 Tesla/Angstrum^2. When doing the calculations, I found that when magnetic field is of the order of 10 Tesla, adding a magnetic field almost did nothing (i.e., the change of conductance is very small). When further increasing the magnetic field to e.g., 1000 T, indeed, the conductance changes much. I guess there may be something wrong when setting the coefficient "e/hbar“. But I do not know what happens. Could you please further help me with this issue? Thanks in advance!
-- Abbout Adel
Dear Adel, Many thanks for your kind help. Your suggestions indeed work quite well. Previously, the length scale in my calculation was too small. When increasing the length and the width, magnetic field plays an important role to modify the energy level and conductance. Before closing this thread, I have a final question that I need your help. I have tested a simply model, say H(k_x, k_y)=A * ((k_x+c*B*y)**2 + k_y**2) * sigma_0 [magnetic field along z direction, and the leads are parallel to x direction]. My question is: how to find the appropriate grid to discretize the model? I consider a system with length L = 2000 Ang, and width W = 500 Ang. When discretizing the effective Hamiltonian model, I use the grid a1 = 10 Ang and a2 = 20 Ang, respectively. I find that using a1 and a2 (to discretize the model) results in very different conductance. In my mind, this "strange" thing comes from the following facts: - Using a smaller grid value create more lattice sites along the width direction (e.g., a1=10 => 500/10=50 sites; a2=20 => 500/20 = 25 sites). More sites along the width direction imply more band channels for contributing to the conductance. - I also check the discretized Hamiltonian, and find that the onsite energies are very different for a1 = 10 and a2 = 20 grid. Consequently, the band structures for a1 and a2 cases look very different (for e.g., the energy scale, etc). - For a fixed concentration of carriers, the Fermi level for a1 and a2 cases should be different as well. In several tutorials, I find that people use a = 1 or a = 10 to discretize the continuum model. However, I do not know why these two values are meaningful. I was also trying to decrease the grid value a, so that the computed conductance can be converged. However, my guess is that the calculations seem not be converged with decreased a value, possibly because of the points mentioned above. Now, I feel quite confused about how to discretize the continuum model (for example, with which grid value). Could you please give me some hints to solve this issue? I appreciate it very much for your help. PS: I show below my python script Appendix I: Python script import numpy as np from matplotlib import pyplot import kwant import kwant.continuum import copy import ipywidgets from tqdm.notebook import tqdm import scipy.sparse.linalg as sla pi = np.pi def make_system(W = 500, L = 2000, a = 10.0): hamiltonian = """ + A * ((k_x+c*B*y)**2 + k_y**2) * sigma_0 """ hamiltonian = kwant.continuum.sympify(hamiltonian) print(hamiltonian) template = kwant.continuum.discretize(hamiltonian, grid=a) print(template) def scatter_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, scatter_shape, (a, a)) # We use the trick from the lecture setting Delta=0 in the leads lead_left = kwant.Builder(kwant.TranslationalSymmetry([-a, 0])) lead_left.fill(template.substituted(B='B_lead'), lead_shape, (0, a)) lead_right = kwant.Builder(kwant.TranslationalSymmetry([a, 0])) lead_right.fill(template.substituted(B='B_lead'), lead_shape, (0, a)) syst.attach_lead(lead_left) syst.attach_lead(lead_right) syst = syst.finalized() kwant.plot(syst); return syst,lead_left,lead_right syst1,left1,right1=make_system(W = 1000,L = 6000,a = 10.0) syst2,left2,right2=make_system(W = 1000,L = 6000,a = 20.0) kwant.plotter.bands(left1.finalized(), params=dict(A=3.8, c=-1.519266e-05, B_lead=0.0)) kwant.plotter.bands(left2.finalized(), params=dict(A=3.8, c=-1.519266e-05, B_lead=0.0)) pyplot.show() Bfield = np.linspace(0, 5, 501) Gs1=[] Gs2=[] paramsB=dict(A=3.8, c=-1.519266e-05) for B1 in tqdm(Bfield): Beff=dict(B=B1,B_lead=0) smat1 = kwant.smatrix(syst1, energy=0.02, params={**paramsB, **Beff}) Gs1.append(smat1.transmission(1, 0)) smat2 = kwant.smatrix(syst2, energy=0.02, params={**paramsB, **Beff}) Gs2.append(smat2.transmission(1, 0)) pyplot.plot(Bfield, Gs1, label='2') pyplot.plot(Bfield, Gs2, label='4') pyplot.legend() pyplot.ylabel("G [$e^2/h$]") pyplot.xlabel("B [T]") Appendix II: the onsite energy for models discretized with different grid values ______________for a1 = 10, we have the following output ______ _cache_0 = ( array([[1.+0.j, 0.+0.j], [0.+0.j, 1.+0.j]])) _cache_1 = ( array([[0.04+0.j, 0. +0.j], [0. +0.j, 0.04+0.j]])) _cache_2 = ( array([[0.+0.j, 0.+0.j], [0.+0.j, 0.+0.j]])) def onsite(site, A, B, c): (x, y, ) = site.pos return (A*B**2*c**2*y**2) * (_cache_0) + (A) * (_cache_1) + (1) * (_cache_2) ______________for a2 = 20, we have the following output ______ _cache_0 = ( array([[1.+0.j, 0.+0.j], [0.+0.j, 1.+0.j]])) _cache_1 = ( array([[0.01+0.j, 0. +0.j], [0. +0.j, 0.01+0.j]])) _cache_2 = ( array([[0.+0.j, 0.+0.j], [0.+0.j, 0.+0.j]])) def onsite(site, A, B, c): (x, y, ) = site.pos return (A*B**2*c**2*y**2) * (_cache_0) + (A) * (_cache_1) + (1) * (_cache_2)
Hi, I noticed that no one ever replied to the following message... dielectric_hjzhao@126.com wrote:
Dear kwanters, I am using kwant for handle a k.p Hamiltonian, for the conductance calculations. I start from a k.p model, and transform it to a tight-binding model using kwant.continuum tools [procedures listed here https://kwant-project.org/doc/1/tutorial/discretize]. Now I want to study the conductance of the system under magnetic field. I try to do Peierls substitution for hoppings between site i and site j (i-j being parallel to the lead). However, I find that using the kwant.continuum scheme, there are no information regarding the lattice information such as "lat = kwant.lattice.honeycomb() ". This prevents the application of Peierls substitution by the following way:
_____________________________ def hopx(site1, site2, B): y = site1.pos[1] return - np.exp(-1j * B * y)
syst[kwant.builder.HoppingKind((1, 0), lat.a, lat.b)] = hopx ____________________________
My question is how to add magnetic field during the calculations for the systems generated from a continuum model by kwant.continuum?
I can think of several possible solutions: • If the magnetic field you want is constant, you may be able to incorporate an appropriate vector potential (using an appropriate gauge) into the Hamiltonian that you discretize. I haven’t tried this, but I don’t see why this shouldn’t work. • This is a bit of a hidden functionality (you can discover it by having a glimpse at the source of the discretizer module), but you can actually print a builder returned by the discretizer. This should allow to reimplement the same model with added magnetic field. You can also look at the output of discretize_symbolic. (This should be similar to printing the builder.) • Kwant actually has functionality for adding an arbitrary magnetic field to a system: https://kwant-project.org/doc/1/pre/whatsnew/1.4#automatic-peierls-phase-cal... However this is most likely overkill if you are only interested in a constant magnetic field. Christoph
participants (3)
-
Abbout Adel -
Christoph Groth -
dielectric_hjzhao@126.com