Hi,

I don't quite understand what 'having the same symmetry' means in this context.
For example, everything works fine for on-site random potential, which doesn't have the 1D translationnal symmetry in the unit cell, but Kwant makes the hamiltonian such that the symmetry with respect to the cells separated by a symmetry vector is valid.

So, this does work for on-site random term but not for the hoppings ? (it also doesn't work for random real nearest neighbors hopping terms)

I will try to fix it by hand, by specifying the hopping terms between the cells, and see if it works.

Best regards,
Alexandre


De: "Abbout Adel" <abbout.adel@gmail.com>
À: "alexandre bernard1" <alexandre.bernard1@u-psud.fr>
Cc: "kwant-discuss" <kwant-discuss@kwant-project.org>
Envoyé: Samedi 19 Mai 2018 23:21:02
Objet: Re: [Kwant] Hamiltonian not hermician for an infinite wire with random complex hopping

Dear Alexandre,

In the documentation, it is mentioned that the function defining the potential in the lead should have the same symmetry as the lead which is obviously not fulfilled with your random function.

Another thing, you need to be careful when you define your unit cell in the lead (or in your system with the translational symmetry). If you define a larger unit cell, the translational symmetry will make the sites doubled.

The last thing I would like to comment is that when you have a system with random sites, you can not pretend to have a continuous spectrum (or disjoint bands). In fact, from random matrix theory, we know that usually the eigenvalues are repelling each other and the probability to get two eigenvalues close to each other tends to zero. So, I suspect that, more likely you will have a spectrum composed by disjoint points rather than bands.

I hope this helps.
Adel 

On Fri, May 18, 2018 at 4:21 PM, <alexandre.bernard1@u-psud.fr> wrote:
Hello (again),

Everything is in the title.

I want to implement random (and complex) next nearest neighbors hopping in a Haldane infinite wire.

Without the random part, 'kwant.plotter.bands()' correctly plot the band structure of my system.
However, when I add a random contribution on the modulus of the NNN hopping term, I get an error from 'kwant.plotter.bands()' :

'The cell Hamiltonian is not Hermitian'

Which is strange because I red everywhere that the hermicity constraint is always fullfilled using Kwant.
The function for random NNN hopping works perfectly fine for a finite system.

So, is this comming from the inter-cell hopping terms ? If so, how to correct it ?
Kwant does not consider the hopping terms of both ends of the cell as being equal ? It should be because u_k(r) = u_k(r+R) is like periodic boundary conditions for u_k.

I add my script at the end so you can see for yourself (the NNN hopping randomness parameter is 'rand_nnn').

Best regards,

Alexandre BERNARD

----------------- my script ----------------------

from types import SimpleNamespace

import matplotlib
import math
from matplotlib import pyplot
from mpl_toolkits import mplot3d
import numpy as np
import random
import kwant


def random_uni(param):
    return param*(random.random() - 0.5)*2 # returns a random number between +param and -param

def onsite(site, p):
    # Here we affect a potential whose sign depends on which sublattice the atom lives in (breaking sublattice symmetry)
    if site.family == A: # sublattice A
        return p.m + random_uni(p.rand_os)
    else:                # sublattice B
        return -p.m + random_uni(p.rand_os)
    
def nn_hopping(site1, site2, params):
    return params.t_1 + random_uni(params.rand_nn)
    
def nnn_hopping(site1, site2, params):
    return (math.cos(params.phi) + 1j*math.sin(params.phi)) * (params.t_2 + random_uni(params.rand_nnn))

def ribbon_shape_armchair(pos):
    return (-1 <= pos[0] < w)

def hopping_color(site1, site2):
    if site1.family == A and site2.family == A:
        return 'b'
    elif site1.family == B and site2.family == B:
        return 'r'
    else:
        return '0.5'
    
def site_color(site):
    if site.family == A:
        return 'b'
    else:
        return 'r'

np.random.seed(271828) # Fixing the RNG seed for reproducibility (or not, because of how Kwant works)
    
# Graphene lattice "pointing up", with two sublattices
graphene = kwant.lattice.general([[1, 0], [1/2, np.sqrt(3)/2]], # Here are the vectors of the Bravais lattice
                                 [[0, 0], [0, 1/np.sqrt(3)]])   # Here are the positions of the atoms in the unit cell
A, B = graphene.sublattices
    
w = 29 # width of the ribbon
p = SimpleNamespace(t_1=1.0, t_2=0.1, m=0.0, phi=np.pi/2, rand_os=0., rand_nn=0., rand_nnn=0.1)

# Creation of the list of (oriented) bonds that will have the complex hopping term
nnn_hoppings_A = (((-1, 0), A, A), ((0, 1), A, A), ((1, -1), A, A)) # Bonds within the A sublattice
nnn_hoppings_B = (((1, 0), B, B), ((0, -1), B, B), ((-1, 1), B, B)) # Bonds within the B sublattice
nnn_hoppings = nnn_hoppings_A + nnn_hoppings_B

haldane_armchair = kwant.Builder(kwant.TranslationalSymmetry((0, 1*np.sqrt(3))))

haldane_armchair[graphene.shape(ribbon_shape_armchair, (0, 0))] = onsite
haldane_armchair[graphene.neighbors(1)] = nn_hopping
haldane_armchair[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings]] = nnn_hopping

kwant.plot(haldane_armchair, site_color=site_color, hop_color=hopping_color, fig_size=(6, 9));

kwant.plotter.bands(haldane_armchair.finalized(), args=[p], fig_size=(12, 8));



--
Abbout Adel