Dear Professor,

I use the follow code to calculate the LDOS of MoS2 ribbon with armchair edge, 
however the error occur as 

LinAlgError: QZ iteration failed to converge in zgges

Regards,
Qiao Chen 
HNIE



from __future__ import division  # so that 1/2 == 0.5, and not 0
import kwant
import numpy as np
from matplotlib import pyplot as plt
import math
from math import pi
import tinyarray

#lamad_M = 0.075
#lamad_X = 0.052

lamad_M = 0.075
lamad_X = 0.052

e0, e2, ep, ez = -1.094, -1.512, -3.560, -6.886
V_pdd, V_pdp = 3.689, -1.241
V_ddd, V_ddp, V_ddde = -0.895, 0.252, 0.228
V_ppd, V_ppp = 1.225, -0.467
a0=0.316
sqrt_3=math.sqrt(3)

# Define the MoS2 lattice
lat=kwant.lattice.general([(0.5472, 0), (0.0, a0)],
                          [(0.0, 0.0),(0.0912, 0.15796),(0.2736, 
0.1576),(0.3648,0.0)])

M1,S1,M2,S2=lat.sublattices

sz = 1.0 # 
s=1j

E_M=tinyarray.array([[e0,    0,                         0,0,0,0],
                     [ 0,    e2,             -s*lamad_M*sz,0,0,0],
                     [ 0,    s*lamad_M*sz,             e2,0,0,0],
                     [0,0,0,e0,0,0],
                     [0,0,0,0,e2,s*lamad_M*sz],
                     [0,0,0,0,-s*lamad_M*sz,e2]]);

E_X=tinyarray.array([[ep+V_ppp,          -s*lamad_X/2*sz,       0,0,0,0],
                     [s*lamad_X/2*sz,     ep+V_ppp,             0,0,0,0],
                     [0,                  0,             ez-V_ppd,0,0,0],
                     [0,0,0,ep+V_ppp,          s*lamad_X/2*sz,       0],
                     [0,0,0,-s*lamad_X/2*sz,     ep+V_ppp,             0],
                     [0,0,0,0,                  0,             ez-V_ppd]]);

# hoppings between Mo-Mo
t1_MM=1/4*tinyarray.array([[3*V_ddde+V_ddd,             
sqrt_3/2*(-V_ddde+V_ddd),          -3/2*(V_ddde-V_ddd),0,0,0],
                           [sqrt_3/2*(-V_ddde+V_ddd),   
1/4*(V_ddde+12*V_ddp+3*V_ddd),      sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),0,0,0],
                           [-3/2*(V_ddde-V_ddd),        
sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),  1/4*(3*V_ddde+4*V_ddp+9*V_ddd),0,0,0],
                           [0,0,0,3*V_ddde+V_ddd,             
sqrt_3/2*(-V_ddde+V_ddd),          -3/2*(V_ddde-V_ddd)],
                            [0,0,0,sqrt_3/2*(-V_ddde+V_ddd),   
1/4*(V_ddde+12*V_ddp+3*V_ddd),      sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd)],
                             [0,0,0,-3/2*(V_ddde-V_ddd),        
sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),  1/4*(3*V_ddde+4*V_ddp+9*V_ddd)]])

t2_MM=1/4*tinyarray.array([[3*V_ddde+V_ddd,          sqrt_3*(V_ddde-V_ddd),     
    0,0,0,0],
                          [sqrt_3*(V_ddde-V_ddd),    V_ddde+3*V_ddd,            
    0,0,0,0],
                          [0,                        0,                       
4*V_ddp,0,0,0],
                          [0,0,0,3*V_ddde+V_ddd,          
sqrt_3*(V_ddde-V_ddd),0],
                          [0,0,0,sqrt_3*(V_ddde-V_ddd),    V_ddde+3*V_ddd,0],
                          [0,0,0,0,                        0,                   
    4*V_ddp]])

t3_MM=1/4*tinyarray.array([[3*V_ddde+V_ddd,            
sqrt_3/2*(-V_ddde+V_ddd),            3/2*(V_ddde-V_ddd),0,0,0],
                           [sqrt_3/2*(-V_ddde+V_ddd),  
1/4*(V_ddde+12*V_ddp+3*V_ddd),      -sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),0,0,0],
                           [3/2*(V_ddde-V_ddd),        
-sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),  1/4*(3*V_ddde+4*V_ddp+9*V_ddd),0,0,0],
                           [0,0,0,3*V_ddde+V_ddd,            
sqrt_3/2*(-V_ddde+V_ddd),            3/2*(V_ddde-V_ddd)],
                           [0,0,0,sqrt_3/2*(-V_ddde+V_ddd),  
1/4*(V_ddde+12*V_ddp+3*V_ddd),      -sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd)],
                           [0,0,0,3/2*(V_ddde-V_ddd),        
-sqrt_3/4*(V_ddde-4*V_ddp+3*V_ddd),  1/4*(3*V_ddde+4*V_ddp+9*V_ddd)]])

# hoppings between S-S
t1_XX=1/4*tinyarray.array([[3*V_ppp+V_ppd,           sqrt_3*(V_ppp-V_ppd),      
     0,0,0,0],
                           [sqrt_3*(V_ppp-V_ppd),    V_ppp+3*V_ppd,             
     0,0,0,0],
                           [0,                       0,                        
4*V_ppp,0,0,0],
                           [0,0,0,3*V_ppp+V_ppd,           
sqrt_3*(V_ppp-V_ppd),           0],
                           [0,0,0,sqrt_3*(V_ppp-V_ppd),    V_ppp+3*V_ppd,       
           0],
                           [0,0,0,0,                       0,                   
     4*V_ppp]])

t2_XX=tinyarray.array([[V_ppd,  0,       0,0,0,0],
                       [0    ,  V_ppp,   0,0,0,0],
                       [0,  0,       V_ppp,0,0,0],
                       [0,0,0,V_ppd,  0,       0],
                       [0,0,0,0    ,  V_ppp,   0],
                       [0,0,0,0,  0,       V_ppp]])

t3_XX=1/4*tinyarray.array([[3*V_ppp+V_ppd,            -sqrt_3*(V_ppp-V_ppd),    
   0,0,0,0],
                           [-sqrt_3*(V_ppp-V_ppd),     V_ppp+3*V_ppd,           
   0,0,0,0],
                           [0,                         0,                    
4*V_ppp,0,0,0],
                           [0,0,0,3*V_ppp+V_ppd,            
-sqrt_3*(V_ppp-V_ppd),       0],
                           [0,0,0,-sqrt_3*(V_ppp-V_ppd),     V_ppp+3*V_ppd,     
         0],
                           [0,0,0,0,                         0,                 
   4*V_ppp]])

t1_MX=1/7*math.sqrt(2/7)*tinyarray.array([[-9*V_pdp+sqrt_3*V_pdd,     
3*sqrt_3*V_pdp-V_pdd,     12*V_pdp+sqrt_3*V_pdd,0,0,0],
                                          [5*sqrt_3*V_pdp+3*V_pdd,    
9*V_pdp-sqrt_3*V_pdd,   -2*sqrt_3*V_pdp+3*V_pdd,0,0,0],
                                          [-V_pdp-3*sqrt_3*V_pdd,     
5*sqrt_3*V_pdp+3*V_pdd,  6*V_pdp-3*sqrt_3*V_pdd,0,0,0],
                                          [0,0,0,-9*V_pdp+sqrt_3*V_pdd,     
3*sqrt_3*V_pdp-V_pdd,     12*V_pdp+sqrt_3*V_pdd],
                                          [0,0,0,5*sqrt_3*V_pdp+3*V_pdd,    
9*V_pdp-sqrt_3*V_pdd,   -2*sqrt_3*V_pdp+3*V_pdd],
                                          [0,0,0,-V_pdp-3*sqrt_3*V_pdd,     
5*sqrt_3*V_pdp+3*V_pdd,  6*V_pdp-3*sqrt_3*V_pdd]])

t2_MX=1/7*math.sqrt(2/7)*tinyarray.array([[0,         -6*sqrt_3*V_pdp+2*V_pdd,  
 12*V_pdp+sqrt_3*V_pdd,0,0,0 ],
                                          [0,         -6*V_pdp-4*sqrt_3*V_pdd,  
 4*sqrt_3*V_pdp-6*V_pdd,0,0,0],
                                          [14*V_pdp,   0,                       
 0,0,0,0],
                                          [0,0,0,0,         
-6*sqrt_3*V_pdp+2*V_pdd,   12*V_pdp+sqrt_3*V_pdd],
                                          [0,0,0,0,         
-6*V_pdp-4*sqrt_3*V_pdd,   4*sqrt_3*V_pdp-6*V_pdd],
                                          [0,0,0,14*V_pdp,   0,                 
       0]])

t3_MX=1/7*math.sqrt(2/7)*tinyarray.array([[9*V_pdp-sqrt_3*V_pdd,         
3*sqrt_3*V_pdp-V_pdd,     12*V_pdp+sqrt_3*V_pdd,0,0,0],
                                          [-5*sqrt_3*V_pdp-3*V_pdd,      
9*V_pdp-sqrt_3*V_pdd,   -2*sqrt_3*V_pdp+3*V_pdd,0,0,0],
                                          [-V_pdp-3*sqrt_3*V_pdd,       
-5*sqrt_3*V_pdp-3*V_pdd, -6*V_pdp+3*sqrt_3*V_pdd,0,0,0],
                                          [0,0,0,9*V_pdp-sqrt_3*V_pdd,         
3*sqrt_3*V_pdp-V_pdd,     12*V_pdp+sqrt_3*V_pdd],
                                          [0,0,0,-5*sqrt_3*V_pdp-3*V_pdd,      
9*V_pdp-sqrt_3*V_pdd,   -2*sqrt_3*V_pdp+3*V_pdd],
                                          [0,0,0,-V_pdp-3*sqrt_3*V_pdd,       
-5*sqrt_3*V_pdp-3*V_pdd, -6*V_pdp+3*sqrt_3*V_pdd]])





def make_system(s_length, s_width, lead_wid):
    # Define the scattering region 
    # Rectangle scattering region -Ribbon
    def system_shape(pos):
        x,y = pos
        scatter_region = -s_length/2 <= x <= s_length/2 and -s_width/2 <= y <= 
s_width/2
        return scatter_region

    def onsite(site):
        return E_M if (site.family == M1 or site.family == M2) else E_X


    sys = kwant.Builder()
    sys[lat.shape(system_shape, (0,-1.0))] = onsite


    sys[kwant.builder.HoppingKind(( 0,  0), M2, M1)] = t1_MM
    sys[kwant.builder.HoppingKind(( 0,  0), S1, S2)] = t3_XX
    sys[kwant.builder.HoppingKind(( 0,  0), M1, S1)] = t1_MX
    sys[kwant.builder.HoppingKind(( 0,  0), M2, S1)] = t2_MX
    sys[kwant.builder.HoppingKind(( 0,  0), M2, S2)] = t3_MX    

    sys[kwant.builder.HoppingKind((  1,  0), M1, S2)] = t2_MX
    sys[kwant.builder.HoppingKind((  1,  0), S1, S2)] = t1_XX
    sys[kwant.builder.HoppingKind(( -1,  0), M2, M1)] = t3_MM

#    
    sys[kwant.builder.HoppingKind(( 1,   1), M1, M2)] = t1_MM

    sys[kwant.builder.HoppingKind(( 0,   -1), S1, S1)] = t2_XX
    sys[kwant.builder.HoppingKind(( 0,   -1), S2, S2)] = t2_XX
    sys[kwant.builder.HoppingKind(( 0,   -1), M1, M1)] = t2_MM
    sys[kwant.builder.HoppingKind(( 0,   -1), M2, M2)] = t2_MM
    sys[kwant.builder.HoppingKind(( 0,    1), M1, M2)] = t3_MM
    sys[kwant.builder.HoppingKind(( 0,    1), S2, S1)] = t3_MM
    sys[kwant.builder.HoppingKind(( 0,    1), M1, S1)] = t3_MX
    sys[kwant.builder.HoppingKind(( 0,   -1), M2, S2)] = t1_MX

    sys[kwant.builder.HoppingKind((-1,    1), S2, S1)] = t3_XX


    # Define the leads 
    # left lead
    left_symmetry=kwant.TranslationalSymmetry(lat.vec((-1,0)))
    lead0=kwant.Builder(left_symmetry)


    def lead0_shape(pos):
        x,y = pos
        in_lead = -lead_wid/2 <= y <= lead_wid/2 
        return in_lead

    lead0[lat.shape(lead0_shape, (0, 0))] = onsite

    # Specify the hoppings in lead0

    lead0[kwant.builder.HoppingKind(( 0,  0), M2, M1)] = t1_MM
    lead0[kwant.builder.HoppingKind(( 0,  0), S1, S2)] = t3_XX
    lead0[kwant.builder.HoppingKind(( 0,  0), M1, S1)] = t1_MX
    lead0[kwant.builder.HoppingKind(( 0,  0), M2, S1)] = t2_MX
    lead0[kwant.builder.HoppingKind(( 0,  0), M2, S2)] = t3_MX    

    lead0[kwant.builder.HoppingKind((  1,  0), M1, S2)] = t2_MX
    lead0[kwant.builder.HoppingKind((  1,  0), S1, S2)] = t1_XX
    lead0[kwant.builder.HoppingKind(( -1,  0), M2, M1)] = t3_MM

#    
    lead0[kwant.builder.HoppingKind(( 1,   1), M1, M2)] = t1_MM

    lead0[kwant.builder.HoppingKind(( 0,   -1), S1, S1)] = t2_XX
    lead0[kwant.builder.HoppingKind(( 0,   -1), S2, S2)] = t2_XX
    lead0[kwant.builder.HoppingKind(( 0,   -1), M1, M1)] = t2_MM
    lead0[kwant.builder.HoppingKind(( 0,   -1), M2, M2)] = t2_MM
    lead0[kwant.builder.HoppingKind(( 0,    1), M1, M2)] = t3_MM
    lead0[kwant.builder.HoppingKind(( 0,    1), S2, S1)] = t1_XX
    lead0[kwant.builder.HoppingKind(( 0,    1), M1, S1)] = t3_MX
    lead0[kwant.builder.HoppingKind(( 0,   -1), M2, S2)] = t1_MX

    lead0[kwant.builder.HoppingKind((-1,    1), S2, S1)] = t3_XX

#
#             
    # right lead
    right_symmetry=kwant.TranslationalSymmetry(lat.vec((1,0)))
    lead1=kwant.Builder(right_symmetry)

    def lead1_shape(pos):
        x,y = pos
        in_lead = -lead_wid/2 <= y <= lead_wid/2 
        return in_lead

    lead1[lat.shape(lead1_shape, ( 0, 0))] = onsite

    # Specify the hoppings in lead1
    lead1[kwant.builder.HoppingKind(( 0,  0), M2, M1)] = t1_MM
    lead1[kwant.builder.HoppingKind(( 0,  0), S1, S2)] = t3_XX
    lead1[kwant.builder.HoppingKind(( 0,  0), M1, S1)] = t1_MX
    lead1[kwant.builder.HoppingKind(( 0,  0), M2, S1)] = t2_MX
    lead1[kwant.builder.HoppingKind(( 0,  0), M2, S2)] = t3_MX    

    lead1[kwant.builder.HoppingKind((  1,  0), M1, S2)] = t2_MX
    lead1[kwant.builder.HoppingKind((  1,  0), S1, S2)] = t1_XX
    lead1[kwant.builder.HoppingKind(( -1,  0), M2, M1)] = t3_MM

#    
    lead1[kwant.builder.HoppingKind(( 1,   1), M1, M2)] = t1_MM

    lead1[kwant.builder.HoppingKind(( 0,   -1), S1, S1)] = t2_XX
    lead1[kwant.builder.HoppingKind(( 0,   -1), S2, S2)] = t2_XX
    lead1[kwant.builder.HoppingKind(( 0,   -1), M1, M1)] = t2_MM
    lead1[kwant.builder.HoppingKind(( 0,   -1), M2, M2)] = t2_MM
    lead1[kwant.builder.HoppingKind(( 0,    1), M1, M2)] = t3_MM
    lead1[kwant.builder.HoppingKind(( 0,    1), S2, S1)] = t3_MM
    lead1[kwant.builder.HoppingKind(( 0,    1), M1, S1)] = t3_MX
    lead1[kwant.builder.HoppingKind(( 0,   -1), M2, S2)] = t1_MX

    lead0[kwant.builder.HoppingKind((-1,    1), S2, S1)] = t3_XX


    # attach the leads to the scattering region
    sys.attach_lead(lead0)
    sys.attach_lead(lead1)
    return sys, [lead0, lead1]


# calculate the LDOS
def plot_ldos(sys,energy):
    ldos = kwant.ldos(sys, energy)
    ldos_site  = np.sum(ldos.reshape(-1, 6), axis=1) 
    kwant.plot(sys, site_size=ldos_site/ldos_site.max(),num_lead_cells = 
0,hop_lw = 0.0,
               hop_color = 'orange',site_color = 'r',cmap='Reds')



def main():
    s_width = 5.6
    s_length = 12.0
    lead_wid = 5.6
    sys,leads = make_system(s_length, s_width, lead_wid)

    def family_color(site):
        return 'blue' if site.family == M1 or site.family == M2 else 'red'

    def hopping_lw(site1,site2):
        return 0.1 if ((site1.family == M1 and site2.family == S2) or 
(site1.family == M2 and site2.family==S1) or (site1.family == M2 and 
site2.family==S2) or (site2.family==M2 and site1.family == S2) or 
(site2.family==S1 and site1.family == M1)) else 0.0
    kwant.plot(sys,site_color = family_color,hop_lw = hopping_lw,num_lead_cells 
= 0)
 # calculate the LDOS
    sys = sys.finalized()
    plot_ldos(sys,0.0)


if __name__ == '__main__':
    main()

------------------------------------------------------------------
发件人:Joseph Weston <joseph.westo...@gmail.com>
发送时间:2018年8月11日(星期六) 18:01
收件人:cqhy1127 <cqhy1...@aliyun.com>; kwant-discuss 
<kwant-discuss@kwant-project.org>
主 题:Re: [Kwant] About MoS2 ribbon

Hi, 
When I use kwant to calculate the conductance for MoS2 ribbon, zigzag edge is 
right, however, for armchair edge ribbon, errors occure as follows,

LinAlgError: QZ iteration failed to converge in zgges.

I am very comfused about this. Thanks! 

 Thanks for the report, other people have already reported a similar problem:

https://gitlab.kwant-project.org/kwant/kwant/issues/176

 Can you post a minimal example that demonstrates the error?

 Happy Kwanting,

 Joe

Reply via email to