import json import numpy as np SX=np.array([[0,1],[1,0]],complex) SY=np.array([[0,-1j],[1j,0]],complex) SZ=np.array([[1,0],[0,-1]],complex) I2=np.eye(2,dtype=complex) def H(kx,ky,m,q=1.): return q*np.sin(kx)*SX + q*np.sin(ky)*SY + (m+np.cos(kx)+np.cos(ky))*SZ def drift(kx,ky,m,gamma,q=1.): return -gamma*I2-1j*H(kx,ky,m,q) def spectrum(kx,ky,m,gamma,omega=0.8,noise=1.,q=1.): A=drift(kx,ky,m,gamma,q) G=np.linalg.inv(-1j*omega*I2-A) return G@(noise*I2)@G.conj().T def link(a,b): z=np.vdot(a,b) return z/(abs(z)+1e-30) def fukui_chern(m,gamma=.7,omega=.8,n=41,band=0): us=np.empty((n,n,2),complex) for ix in range(n): for iy in range(n): w,v=np.linalg.eigh(spectrum(2*np.pi*ix/n,2*np.pi*iy/n,m,gamma,omega)) us[ix,iy]=v[:,::-1][:,band] total=0. for ix in range(n): for iy in range(n): u=us[ix,iy]; ux=us[(ix+1)%n,iy]; uy=us[ix,(iy+1)%n] uxy=us[(ix+1)%n,(iy+1)%n] plaquette=link(u,ux)*link(ux,uxy)*link(uxy,uy)*link(uy,u) total += np.angle(plaquette) return total/(2*np.pi) def min_gap(m,gamma=.7,omega=.8,n=81,noise=1.): gaps=[] for kx in np.linspace(-np.pi,np.pi,n,endpoint=False): for ky in np.linspace(-np.pi,np.pi,n,endpoint=False): w=np.linalg.eigvalsh(spectrum(kx,ky,m,gamma,omega,noise)) gaps.append(w[1]-w[0]) return float(np.min(gaps)) def max_h2(m,n=81): return max(np.linalg.eigvalsh(H(x,y,m)).max()**2 for x in np.linspace(-np.pi,np.pi,n,endpoint=False) for y in np.linspace(-np.pi,np.pi,n,endpoint=False)) def euler_radius(dt,m,gamma,n=41): r=0. for x in np.linspace(-np.pi,np.pi,n,endpoint=False): for y in np.linspace(-np.pi,np.pi,n,endpoint=False): ev=np.linalg.eigvals(I2+dt*drift(x,y,m,gamma)) r=max(r,float(np.max(np.abs(ev)))) return r def strip_edge(m,gamma=.18,nx=40,ny=20,q=1.): best=[] chi=q for kx in 2*np.pi*np.arange(nx)/nx: M=np.zeros((2*ny,2*ny),complex) for y in range(ny): M[2*y:2*y+2,2*y:2*y+2]=(m+np.cos(kx))*SZ+chi*np.sin(kx)*SX if y+1edge_triv[0]*2 and edge_top[1]>edge_triv[1]*1.3} },'parameters':{'gamma':gamma,'omega':omega,'grid':31}} print(json.dumps(out,indent=2)) if __name__=='__main__': main()