Dear Wilson, The proposed solution I have commented* on was wrong and it does not work in your case since. **kwant.digest.uniform or **or random.uniform do provide different values for A and B sulattices even if we fix the seed*. In fact kwant defines the sublattice within the same tag with different site values. For this reason,* the proposed solution will not work* *even when including the sublattice condition in the onsite(site)* function depending on the site variable *The function **random.uniform will not work in your case anymore since you can not set the tag variable there.*
In fact, the situation is somehow tricky. *So you need to use a tag as a variable*. I have corrected your script and it is working now. You can use site_color=family_color in kwant.plot() to see the opposite onsite value with red and blue colors in your system. *You don't need to use low=0 and high=+1 since we will use kwant.digest.uniform.* *Here is the script and I hope it will be the correct solution looking for:* import kwant import numpy as np from math import sqrt import matplotlib.pyplot as plt from types import SimpleNamespace from ipywidgets import interact from mpl_toolkits import mplot3d import warnings warnings.filterwarnings('ignore') def onsite(site): #we define a value which will be assined to both a and sublattices v= 0.5 * kwant.digest.uniform(repr(site.tag)) + 0.5 return +v if site.family==sub_a else -v r = 10 a=1 syst = kwant.Builder() lat = kwant.lattice.honeycomb(a, norbs=1, name=['sub_a', 'sub_b']) sub_a, sub_b = lat.sublattices def circle(pos): x, y = pos return x ** 2 + y ** 2 < r ** 2 syst[lat.shape(circle, (0, 0))] = onsite syst[lat.neighbors()] = 1 fsyst=syst.finalized() # kwant.plot(fsyst) H = fsyst.hamiltonian_submatrix(params=dict()) Es = np.linalg.eigvalsh(H) plt.plot(Es, '.') plt.show() def family_color(site): v= 0.5 * kwant.digest.uniform(repr(site.tag)) + 0.5 return +v if site.family==sub_a else -v kwant.plot(syst, site_color=family_color, site_size=None, cmap='jet', colorbar=True,fig_size=(15, 10)) plt.show() best Le mer. 25 mai 2022 à 20:21, Adel Belayadi <adelp...@gmail.com> a écrit : > Dear Wilson, > You said *I want to add random potentials on graphene. Within each unit > cell, I want A site have the oppsite value to B site*. > In fact you just need to set in the onsite function the sublattice > dependence (I mean for instance *return +1 if site.family==a else -1.*) > > *SO in your case:* > a, b =lat.sublattices > def onsite(site,low, high): > return *+1**np.random.uniform(low, high) if ifsite.family==*a* else > -1*np.random.uniform(low, high) > > *or simply use the kwant.digest prebuilt function as* > sites =list(syst.sites()) > Random_sites = random.choices(sites, k = 10) > def onsite(site): > return *+*0.5 *kwant.digest.uniform(repr(Random_sites)) + 0.5 if if > site.family==aelse* -* 0.5 * kwant.digest.uniform(repr(Random_sites)) + > 0.5 > > I hope this will help. > > Best, Adel > > Le mer. 25 mai 2022 à 17:53, <wilson2...@outlook.com> a écrit : > >> Dear community, >> >> I want to add random potentials on graphene. Within each unit cell, I >> want A site have the oppsite value to B site. >> That is, random across unit cells, but symmetric respect to zero within >> every unit cell. How to achieve this? I have tried to do so, but cannot >> find a way. >> >> Below is my code: >> >> ``` >> import numpy as np >> import kwant >> >> low = 0 >> high = 1 >> def make_syst(a=1): >> syst = kwant.Builder() >> lat = kwant.lattice.honeycomb(a, norbs=1, name=['a', 'b']) >> >> r = 10 >> >> def circle(pos): >> x, y = pos >> return x ** 2 + y ** 2 < r ** 2 >> >> def onsite(site, low, high): >> return np.random.uniform(low, high) >> >> # first attempt using function, not working, also cannot gurantee a, >> b are truly opposite in value >> # syst[lat.a.shape(circle, (0, 0))] = onsite >> # syst[lat.b.shape(circle, (0, 0))] = -1*onsite # wrong >> >> # second attempt, still not right >> m = np.random.uniform(low, high) >> syst[lat.a.shape(circle, (0, 0))] = m >> syst[lat.b.shape(circle, (0, 0))] = -m >> >> syst[lat.neighbors()] = 1 >> return syst.finalized() >> >> >> fsyst = make_syst() >> # kwant.plot(fsyst) >> H = fsyst.hamiltonian_submatrix(params=dict(high=high, low=low)) >> Es = np.linalg.eigvalsh(H) >> plt.plot(Es, '.') >> plt.show() >> ``` >> >> Thanks for help! >> >