Armchair/zig-zag Haldane model

Dear all, I am trying to implement a transport calculation for the Haldane model on armchair and zig-zag graphene nanoribbons (with open boundary conditions along the y-direction and periodic boundary conditions along the x-direction, i.e., the transport direction). In particular, my system consists of a finite-sized scatterer attached to two semi-infinite leads. The system is "homogeneous," meaning that all three components (left lead, scatterer, and right lead) share the same Haldane Hamiltonian (https://doi.org/10.1103/PhysRevLett.61.2015). I am writing to seek assistance because I am encountering two major problems when extracting the eigenstates of the scatterer at a fixed energy: 1)When the system is constructed with zig-zag edges, I find a limit on the width of the sample in the y-direction, beyond which the wave functions cannot be calculated using the kwant.wave_function() method. Specifically, if the ribbon exceeds this width, for certain energy values, calling kwant.wave_function(sys, energy) produces the following error: "RuntimeError: Numbers of left- and right-propagating modes differ, possibly due to a numerical instability." This appears to result from an accumulation of lead bands, which makes the identification of propagating modes inaccurate. 2)When the system is constructed with armchair edges, the kwant.wave_function(system, energy) method again fails to properly return the eigenstates of the scatterer. However, in this case, the error occurs for all ribbon widths (in the y-direction) and seems unrelated to the energy value. The error is: "LinAlgError: Reordering failed; problem is very ill-conditioned." I have not been able to resolve these issues and would greatly appreciate any insights or suggestions you might have for addressing them. Thank you for your time. Best regards, Lorenzo Cavicchi

Dear Lorenzo, See the solution posted on the link below 👇 https://www.mail-archive.com/kwant-discuss@python.org/msg00278.html Hope this helps On Tue, Nov 19, 2024, 17:02 Lorenzo CAVICCHI <lorenzo.cavicchi@sns.it> wrote:
Dear all,
I am trying to implement a transport calculation for the Haldane model on armchair and zig-zag graphene nanoribbons (with open boundary conditions along the y-direction and periodic boundary conditions along the x-direction, i.e., the transport direction). In particular, my system consists of a finite-sized scatterer attached to two semi-infinite leads. The system is "homogeneous," meaning that all three components (left lead, scatterer, and right lead) share the same Haldane Hamiltonian ( https://doi.org/10.1103/PhysRevLett.61.2015). I am writing to seek assistance because I am encountering two major problems when extracting the eigenstates of the scatterer at a fixed energy:
1)When the system is constructed with zig-zag edges, I find a limit on the width of the sample in the y-direction, beyond which the wave functions cannot be calculated using the kwant.wave_function() method. Specifically, if the ribbon exceeds this width, for certain energy values, calling kwant.wave_function(sys, energy) produces the following error: "RuntimeError: Numbers of left- and right-propagating modes differ, possibly due to a numerical instability." This appears to result from an accumulation of lead bands, which makes the identification of propagating modes inaccurate. 2)When the system is constructed with armchair edges, the kwant.wave_function(system, energy) method again fails to properly return the eigenstates of the scatterer. However, in this case, the error occurs for all ribbon widths (in the y-direction) and seems unrelated to the energy value. The error is: "LinAlgError: Reordering failed; problem is very ill-conditioned."
I have not been able to resolve these issues and would greatly appreciate any insights or suggestions you might have for addressing them. Thank you for your time.
Best regards, Lorenzo Cavicchi

Dear Adel, Thank you very much for pointing out the thread https://www.mail-archive.com/kwant-discuss@python.org/msg00278.html, I completely missed it. I studied the Silicene code by Koustav that had the same problem of my point 1): RuntimeError("Numbers of left- and right-propagating " RuntimeError: Numbers of left- and right-propagating modes differ, possibly due to a numerical instability. Despite Koustav replied that the proposed solution works, I find that his code (plus the sym.add_site_family(graphene.sublattices[1], other_vectors=[(-1, 2)]) corrections) does not give consistent results. In particular KWANT cannot calculate the local density of states for every choice of the dimensions of the system and for every energy. The error it gives is the same, i.e. the numbers of left- and right-propagating modes differ. I also tried implementig the add_site_family in my calculation and, as in the Silicene code by Koustav, running the code gives inconsistent results in evaluating the wave function. My conclusion is that the suggested solution might work for certain cases but it does not scale well with the dimensions of the system. There should be another way to overcome this problem, but I couldn't find it. For reference and convenience, I attach the code I'm using at the end of this message. Thank you again for you help! All the best, Lorenzo ############################################################## import kwant import numpy as np import math from tqdm import tqdm import matplotlib.pyplot as plt import plotly from mpl_toolkits.mplot3d import Axes3D from boiadeh import * from matplotlib import colormaps from matplotlib.colors import Normalize #Definition of the primitive vectors lattice_constant= 1#0.246 #2.46 \Angstrom armchair = False zigzag = False FF = True if armchair: a1, a2, d1 = [ lattice_constant*np.array([np.sqrt(3)/2,1./2]), lattice_constant*np.array([np.sqrt(3)/2,-1./2]), (lattice_constant/np.sqrt(3))*np.array([1./2,-np.sqrt(3)/2])] elif zigzag: #ZIGZAG a1, a2, d1 = [ lattice_constant*np.array([1.,0]), lattice_constant*np.array([1/2, np.sqrt(3)/2]), (lattice_constant/np.sqrt(3))*np.array([0,1])] elif FF: a1, a2, d1 = [ lattice_constant*np.array([np.sqrt(3)/2,1./2]), lattice_constant*np.array([np.sqrt(3)/2,-1./2]), (lattice_constant/np.sqrt(3))*np.array([1,0])] # Define the graphene lattice graphene = kwant.lattice.general([a1,a2],[(0,0), d1], norbs=1) A1, B1 = graphene.sublattices sublattices = { (1,0): A1, (1,1): B1 } nnn_hoppings_a = (((-1, 0), A1, A1), ((0, 1), A1, A1), ((1, -1), A1, A1)) nnn_hoppings_b = (((1, 0), B1, B1), ((0, -1), B1, B1), ((-1, 1), B1, B1)) sys = kwant.Builder() #On site and hopping energies on_site_sc = 0 on_site_lead = 0. t=10#2.7 print('On site and hopping energies: \n') print('Scatterer on site energy: ' + str(on_site_sc) + ' \n') print('Leads on site energy: ' + str(on_site_lead) + ' \n') print('NN hopping graphene: ' + str(t) + ' \n') #Intra layer parameters SOC lambda0= 0.1 # SOC A1-B1 intralayer #Print selected SOC parameters print('SOC Hamiltonian parameters:\n') print('lambda_0 = ' + str(lambda0) +'\n') #Print selected legth parameters print('Length scales parameters:\n') print('lattice constant = ' + str(lattice_constant) +'\n') L=30*lattice_constant W=20*lattice_constant#/np.sqrt(3) #Definition of the shape def rectangle(pos): x, y = pos return np.abs(x) <= L/2 and np.abs(y) <= W/2 #Define the sites of the ribbon on_site_sc = 0.1*np.sqrt(3)*3*(0)*t def onsite(site): if site.family == A1: return on_site_sc elif site.family == B1: return - on_site_sc sys[graphene.shape(rectangle, (0, 0))]= onsite #on-site energy, fermi level def family_colors(site): if site.family == A1: return 'r' elif site.family == B1: return 'g' #nearest-neighbor hopping sys[graphene.neighbors(1)] = t/2 #+ 0.5*1j*lambda0*(sigma_x-1j*sigma_y) sys.eradicate_dangling() t2=0.1*t phi = -1*np.pi/4 #second nearest-neighbor hopping sys[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_a]] = t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#np.exp(-1j*phi) sys[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_b]] = t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#np.exp(1j*phi) #Plot the system with attached leads kwant.plot(sys, site_size=0.18, site_lw=0.01, hop_lw=0.05, site_color=family_colors, fig_size = (8,8), dpi=300 ); def lead_shape(pos): x, y = pos return np.abs(x) <= L/2 #### Define the leads #### sym_left = kwant.TranslationalSymmetry(graphene.vec((1,-1))) sym_right = kwant.TranslationalSymmetry(graphene.vec((-1,1))) sym_left.add_site_family(graphene.sublattices[0],other_vectors=[(1, 1)]) sym_left.add_site_family(graphene.sublattices[1],other_vectors=[(1, 1)]) sym_right.add_site_family(graphene.sublattices[0],other_vectors=[(1, 1)]) sym_right.add_site_family(graphene.sublattices[1],other_vectors=[(1, 1)]) left_lead = kwant.Builder(sym_left)#, conservation_law=-sigma_z) right_lead = kwant.Builder(sym_right)#, conservation_law=-sigma_z) left_lead[graphene.shape(lead_shape, (0, 0))] = onsite # 4 * t*sigma_0 right_lead[graphene.shape(lead_shape, (0, 0))] = onsite # 4 * t*sigma_0 left_lead[graphene.neighbors(1)] = +t/2 #+ 0.5*1j*lambda0*(sigma_x-1j*sigma_y) right_lead[graphene.neighbors(1)] = +t/2 #+ 0.5*1j*lambda0*(sigma_x-1j*sigma_y) left_lead.eradicate_dangling() right_lead.eradicate_dangling() left_lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_a]] = +t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#1j*phi#np.exp(-1j*phi) left_lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_b]] = +t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#1j*phi#np.exp(1j*phi) right_lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_a]] = +t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#1j*phi#np.exp(-1j*phi) right_lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings_b]] = +t2/2*np.cos(phi) + 1j*t2/2*np.sin(phi)#1j*phi#np.exp(1j*phi) #Attach every lead sys.attach_lead(left_lead); sys.attach_lead(right_lead); #System finalization syst = sys.finalized() #Plot the system with attached leads kwant.plot(sys, site_size=0.18, site_lw=0.01, hop_lw=0.05, site_color=family_colors, fig_size = (8,8), dpi=300 ); #Extract the wave function at fixed energy wf_en = kwant.wave_function(syst, energy=-3) wf_en(0).shape ##############################################################
participants (2)
-
Adel Belayadi
-
Lorenzo CAVICCHI