Create Berry_curvature_distribution_of_graphene_under_broken_inversion_symmery_with_Wilson_loop.py
This commit is contained in:
parent
2052810a9d
commit
67f6b35a48
@ -0,0 +1,72 @@
|
||||
"""
|
||||
This code is supported by the website: https://www.guanjihuan.com
|
||||
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/20869
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from math import *
|
||||
import cmath
|
||||
|
||||
|
||||
def hamiltonian(k1, k2, t1=2.82*sqrt(3)/2, a=1/sqrt(3)): # 石墨烯哈密顿量(a为原子间距,不赋值的话默认为1/sqrt(3))
|
||||
h = np.zeros((2, 2))*(1+0j)
|
||||
h[0, 0] = 0.28/2
|
||||
h[1, 1] = -0.28/2
|
||||
h[1, 0] = t1*(cmath.exp(1j*k2*a)+cmath.exp(1j*sqrt(3)/2*k1*a-1j/2*k2*a)+cmath.exp(-1j*sqrt(3)/2*k1*a-1j/2*k2*a))
|
||||
h[0, 1] = h[1, 0].conj()
|
||||
return h
|
||||
|
||||
|
||||
def main():
|
||||
n1 = 1000 # small plaquettes精度
|
||||
n2 = 10 # Wilson loop精度
|
||||
delta = 2*pi/n1
|
||||
for band in range(2):
|
||||
F_all = [] # 贝里曲率
|
||||
for kx in np.linspace(-2*pi, 2*pi, n1):
|
||||
for ky in [0]: # 这里只考虑ky=0对称轴上的情况
|
||||
vector_array = []
|
||||
# line_1
|
||||
for i2 in range(n2+1):
|
||||
H_delta = hamiltonian(kx+delta/n2*i2, ky)
|
||||
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))[band]]
|
||||
vector_array.append(vector_delta)
|
||||
# line_2
|
||||
for i2 in range(n2):
|
||||
H_delta = hamiltonian(kx+delta, ky+delta/n2*(i2+1))
|
||||
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))[band]]
|
||||
vector_array.append(vector_delta)
|
||||
# line_3
|
||||
for i2 in range(n2):
|
||||
H_delta = hamiltonian(kx+delta-delta/n2*(i2+1), ky+delta)
|
||||
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))[band]]
|
||||
vector_array.append(vector_delta)
|
||||
# line_4
|
||||
for i2 in range(n2-1):
|
||||
H_delta = hamiltonian(kx, ky+delta-delta/n2*(i2+1))
|
||||
eigenvalue, eigenvector = np.linalg.eig(H_delta)
|
||||
vector_delta = eigenvector[:, np.argsort(np.real(eigenvalue))[band]]
|
||||
vector_array.append(vector_delta)
|
||||
Wilson_loop = 1
|
||||
for i0 in range(len(vector_array)-1):
|
||||
Wilson_loop = Wilson_loop*np.dot(vector_array[i0].transpose().conj(), vector_array[i0+1])
|
||||
Wilson_loop = Wilson_loop*np.dot(vector_array[len(vector_array)-1].transpose().conj(), vector_array[0])
|
||||
arg = np.log(Wilson_loop)/delta/delta*1j
|
||||
|
||||
F_all = np.append(F_all,[arg], axis=0)
|
||||
plt.plot(np.linspace(-2*pi, 2*pi, n1)/pi, np.real(F_all))
|
||||
plt.xlabel('k_x (pi)')
|
||||
plt.ylabel('Berry curvature')
|
||||
if band==0:
|
||||
plt.title('Valence Band')
|
||||
else:
|
||||
plt.title('Conductance Band')
|
||||
plt.show()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
x
Reference in New Issue
Block a user