1. 文献分享
  2. 物理模型

反铁磁量子反常霍尔效应模型

今天分享一篇arxiv上的文章:Guo P J, Liu Z X, Lu Z Y. Quantum anomalous Hall effect in antiferromagnetism[J]. arXiv preprint arXiv:2205.06702, 2022,揭示了反铁磁CrO中的量子反常霍尔效应,并给出了一个反铁磁的物理模型。我们来推导一下这个模型的结果。
在这个结构中,每个晶胞中有两个格点,考虑最简单的情况,每个格点仅有一个轨道。考虑到次近邻的紧束缚模型,公式可写为如下形式:
首先,我们不考虑自旋轨道耦合的效应,哈密顿量是一个2*2的矩阵:
我们可以代入参数:
使用python可以画出能带,结果如图所示:
写出基本的哈密顿矩阵之后,我们可以考虑自旋,将每一个元素叉乘一个2*2的单位矩阵,哈密顿量变为如下形式:
如果是反铁磁,只需要让不同原子的磁矩相反:
考虑自旋轨道耦合及赛曼场作用后,
将哈密顿量对角化,可得能带图如下:
具体代码如下:
不考虑自旋,
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from math import *
import math
import sys
from numpy import *
import matplotlib.pyplot as pl
# init K vector of random value
num = 2
knum = 241
lat_constant=1
Ham = [[0 for i in range(num)] for j in range(num)]
# print Ham
# exit()
mu = 0.6
t1=1
t2=0.6
t3=0.6
def H(kx, ky):
# lattice
Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant)))
Ham[0][1] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5)))
Ham[1][0] = Ham[0][1].conjugate()
Ham[1][1] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant)))
e, w = linalg.eig(Ham)
e = [real(e[y]) for y in range(num)]
e = sort(e)
return e
# for y in range(num):
# print real(e[y])
# H(0.01,0.03)
# exit()
ens = zeros((num, knum), dtype=float64)
a1 = open("kpoints", 'r+') #Using Fractional coordinates
for m in range(knum):
Kq = a1.readline().strip().split()
kx,ky=[float(Kq[n]) for n in range(2)]
e=H(kx,ky)
for y in range(num):
ens[y, m] = real(e[y])
print(ens)
pl.figure(figsize=(16.0, 12.4))
pl.subplots_adjust(wspace=0.35)
pl.ylim(-5,5)
pl.xlim(0, knum)
pl.grid(True)
# print(nOrbits)
for i in range(num):
# print i
# pl.plot(ens[i], 'go', ms=5, mew=1)
pl.plot(ens[i], 'g-', ms=5, mew=1)
# pl.plot(evals[i], 'ro', ms=5, mew=1)
pl.title(r'$\Gamma$')
pl.ylabel("Energy")
vline_indx = [60,120,180,240]
pl.vlines(vline_indx, -100, 100, colors='r', linestyles='dashed', label='垂直线')
pl.show()
print('Done.\n')
from math import * import math import sys from numpy import * import matplotlib.pyplot as pl # init K vector of random value num = 2 knum = 241 lat_constant=1 Ham = [[0 for i in range(num)] for j in range(num)] # print Ham # exit() mu = 0.6 t1=1 t2=0.6 t3=0.6 def H(kx, ky): # lattice Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) Ham[0][1] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) Ham[1][0] = Ham[0][1].conjugate() Ham[1][1] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) e, w = linalg.eig(Ham) e = [real(e[y]) for y in range(num)] e = sort(e) return e # for y in range(num): # print real(e[y]) # H(0.01,0.03) # exit() ens = zeros((num, knum), dtype=float64) a1 = open("kpoints", 'r+') #Using Fractional coordinates for m in range(knum): Kq = a1.readline().strip().split() kx,ky=[float(Kq[n]) for n in range(2)] e=H(kx,ky) for y in range(num): ens[y, m] = real(e[y]) print(ens) pl.figure(figsize=(16.0, 12.4)) pl.subplots_adjust(wspace=0.35) pl.ylim(-5,5) pl.xlim(0, knum) pl.grid(True) # print(nOrbits) for i in range(num): # print i # pl.plot(ens[i], 'go', ms=5, mew=1) pl.plot(ens[i], 'g-', ms=5, mew=1) # pl.plot(evals[i], 'ro', ms=5, mew=1) pl.title(r'$\Gamma$') pl.ylabel("Energy") vline_indx = [60,120,180,240] pl.vlines(vline_indx, -100, 100, colors='r', linestyles='dashed', label='垂直线') pl.show() print('Done.\n')
from math import *
import math
import sys

from numpy import *

import matplotlib.pyplot as pl

# init K vector of random value

num = 2
knum = 241

lat_constant=1

Ham = [[0 for i in range(num)] for j in range(num)]

# print Ham
# exit()

mu = 0.6
t1=1
t2=0.6
t3=0.6


def H(kx, ky):
    # lattice
    Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant)))
    Ham[0][1] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5)))

    Ham[1][0] = Ham[0][1].conjugate()
    Ham[1][1] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant)))


    e, w = linalg.eig(Ham)
    e = [real(e[y]) for y in range(num)]
    e = sort(e)
    return e
    # for y in range(num):
    #     print real(e[y])
# H(0.01,0.03)
# exit()

ens = zeros((num, knum), dtype=float64)
a1 = open("kpoints", 'r+')      #Using Fractional coordinates
for m in range(knum):
    Kq = a1.readline().strip().split()
    kx,ky=[float(Kq[n]) for n in range(2)]
    e=H(kx,ky)
    for y in range(num):
      ens[y, m] = real(e[y])
print(ens)


pl.figure(figsize=(16.0, 12.4))
pl.subplots_adjust(wspace=0.35)
pl.ylim(-5,5)
pl.xlim(0, knum)
pl.grid(True)

# print(nOrbits)
for i in range(num):
    # print i
    # pl.plot(ens[i], 'go', ms=5, mew=1)
    pl.plot(ens[i], 'g-', ms=5, mew=1)
    # pl.plot(evals[i], 'ro', ms=5, mew=1)
pl.title(r'$\Gamma$')

pl.ylabel("Energy")
vline_indx = [60,120,180,240]
pl.vlines(vline_indx, -100, 100, colors='r', linestyles='dashed', label='垂直线')

pl.show()

print('Done.\n')
考虑SOC及赛曼场的作用,
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from math import *
import math
import sys
from numpy import *
import matplotlib.pyplot as pl
from mpl_toolkits.mplot3d import Axes3D
# init K vector of random value
num = 4
knum = 241
lat_constant=1
Ham = [[0 for i in range(num)] for j in range(num)]
# print Ham
# exit()
mu = 0.6
t1=1
t2=0.6
t3=0.6
lam=0.3
mz=1.1
def H(kx, ky):
# lattice
Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz
Ham[1][1] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz
Ham[0][1]=0
Ham[1][0]=0
Ham[0][2] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) + complex(0,lam)
Ham[1][3] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) - complex(0,lam)
Ham[0][3] = 0
Ham[1][2] = 0
Ham[2][0] = Ham[0][2].conjugate()
Ham[2][1] = 0
Ham[3][0] = 0
Ham[3][1] = Ham[1][3].conjugate()
Ham[2][2] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz
Ham[3][3] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz
Ham[2][3] = 0
Ham[3][2] = 0
e, w = linalg.eig(Ham)
e = [real(e[y]) for y in range(num)]
e = sort(e)
return e
# for y in range(num):
# print real(e[y])
# H(0.01,0.03)
# exit()
ens = zeros((num, knum), dtype=float64)
a1 = open("kpoints", 'r+') #Using Fractional coordinates
for m in range(knum):
Kq = a1.readline().strip().split()
kx,ky=[float(Kq[n]) for n in range(2)]
e=H(kx,ky)
for y in range(num):
ens[y, m] = real(e[y])
print(ens)
pl.figure(figsize=(16.0, 12.4))
pl.subplots_adjust(wspace=0.35)
pl.ylim(-5,5)
pl.xlim(0, knum)
pl.grid(True)
# print(nOrbits)
for i in range(num):
# print i
# pl.plot(ens[i], 'go', ms=5, mew=1)
pl.plot(ens[i], 'g-', ms=5, mew=1)
# pl.plot(evals[i], 'ro', ms=5, mew=1)
pl.title(r'$\Gamma$')
pl.ylabel("Energy")
# pl.show()
# print('Done.\n')
fig = pl.figure() # 创建一个画布figure,然后在这个画布上加各种元素。
ax = Axes3D(fig) # 将画布作用于 Axes3D 对象上。
a=arange(-0.5,0.5,0.01)
x=zeros((1, 100),dtype=float64)
y=zeros((1, 100),dtype=float64)
z0=zeros((1,100),dtype=float64)
z1=zeros((1,100),dtype=float64)
z2=zeros((1,100),dtype=float64)
z3=zeros((1,100),dtype=float64)
for i in range(len(a)):
kx=a[i]
x[0,]=kx
for j in range(len(a)):
ky=a[j]
y[0,j]=ky
e=H(kx,ky)
z0[0, j] = real(e[0])
z1[0, j] = real(e[1])
z2[0, j] = real(e[2])
z3[0, j] = real(e[3])
ax.scatter(x,y,z0,c='r') # 画出(xs1,ys1,zs1)的散点图。
ax.scatter(x,y,z1,c='r') # 画出(xs1,ys1,zs1)的散点图。
ax.scatter(x,y,z2,c='r') # 画出(xs1,ys1,zs1)的散点图。
ax.scatter(x,y,z3,c='r') # 画出(xs1,ys1,zs1)的散点图。
ax.set_xlabel('X label') # 画出坐标轴
ax.set_ylabel('Y label')
ax.set_zlabel('Z label')
pl.show()
from math import * import math import sys from numpy import * import matplotlib.pyplot as pl from mpl_toolkits.mplot3d import Axes3D # init K vector of random value num = 4 knum = 241 lat_constant=1 Ham = [[0 for i in range(num)] for j in range(num)] # print Ham # exit() mu = 0.6 t1=1 t2=0.6 t3=0.6 lam=0.3 mz=1.1 def H(kx, ky): # lattice Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz Ham[1][1] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz Ham[0][1]=0 Ham[1][0]=0 Ham[0][2] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) + complex(0,lam) Ham[1][3] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) - complex(0,lam) Ham[0][3] = 0 Ham[1][2] = 0 Ham[2][0] = Ham[0][2].conjugate() Ham[2][1] = 0 Ham[3][0] = 0 Ham[3][1] = Ham[1][3].conjugate() Ham[2][2] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz Ham[3][3] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz Ham[2][3] = 0 Ham[3][2] = 0 e, w = linalg.eig(Ham) e = [real(e[y]) for y in range(num)] e = sort(e) return e # for y in range(num): # print real(e[y]) # H(0.01,0.03) # exit() ens = zeros((num, knum), dtype=float64) a1 = open("kpoints", 'r+') #Using Fractional coordinates for m in range(knum): Kq = a1.readline().strip().split() kx,ky=[float(Kq[n]) for n in range(2)] e=H(kx,ky) for y in range(num): ens[y, m] = real(e[y]) print(ens) pl.figure(figsize=(16.0, 12.4)) pl.subplots_adjust(wspace=0.35) pl.ylim(-5,5) pl.xlim(0, knum) pl.grid(True) # print(nOrbits) for i in range(num): # print i # pl.plot(ens[i], 'go', ms=5, mew=1) pl.plot(ens[i], 'g-', ms=5, mew=1) # pl.plot(evals[i], 'ro', ms=5, mew=1) pl.title(r'$\Gamma$') pl.ylabel("Energy") # pl.show() # print('Done.\n') fig = pl.figure() # 创建一个画布figure,然后在这个画布上加各种元素。 ax = Axes3D(fig) # 将画布作用于 Axes3D 对象上。 a=arange(-0.5,0.5,0.01) x=zeros((1, 100),dtype=float64) y=zeros((1, 100),dtype=float64) z0=zeros((1,100),dtype=float64) z1=zeros((1,100),dtype=float64) z2=zeros((1,100),dtype=float64) z3=zeros((1,100),dtype=float64) for i in range(len(a)): kx=a[i] x[0,]=kx for j in range(len(a)): ky=a[j] y[0,j]=ky e=H(kx,ky) z0[0, j] = real(e[0]) z1[0, j] = real(e[1]) z2[0, j] = real(e[2]) z3[0, j] = real(e[3]) ax.scatter(x,y,z0,c='r') # 画出(xs1,ys1,zs1)的散点图。 ax.scatter(x,y,z1,c='r') # 画出(xs1,ys1,zs1)的散点图。 ax.scatter(x,y,z2,c='r') # 画出(xs1,ys1,zs1)的散点图。 ax.scatter(x,y,z3,c='r') # 画出(xs1,ys1,zs1)的散点图。 ax.set_xlabel('X label') # 画出坐标轴 ax.set_ylabel('Y label') ax.set_zlabel('Z label') pl.show()
from math import *
import math
import sys

from numpy import *

import matplotlib.pyplot as pl
from mpl_toolkits.mplot3d import Axes3D

# init K vector of random value

num = 4
knum = 241

lat_constant=1

Ham = [[0 for i in range(num)] for j in range(num)]

# print Ham
# exit()

mu = 0.6
t1=1
t2=0.6
t3=0.6
lam=0.3
mz=1.1

def H(kx, ky):
    # lattice
    Ham[0][0] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz
    Ham[1][1] = mu + t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) + t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz
    Ham[0][1]=0
    Ham[1][0]=0


    Ham[0][2] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) + complex(0,lam)
    Ham[1][3] = t1*(exp(2*pi*complex(0,kx*0.5+ky*0.5)) + exp(2*pi*complex(0,kx*0.5-ky*0.5)) + exp(2*pi*complex(0,-kx*0.5+ky*0.5)) + exp(2*pi*complex(0,-kx*0.5-ky*0.5))) - complex(0,lam)
    Ham[0][3] = 0
    Ham[1][2] = 0

    Ham[2][0] = Ham[0][2].conjugate()
    Ham[2][1] = 0
    Ham[3][0] = 0
    Ham[3][1] = Ham[1][3].conjugate()


    
    Ham[2][2] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) -mz
    Ham[3][3] = -mu -t2*(exp(2*pi*complex(0,kx*lat_constant))+exp(2*pi*complex(0,-kx*lat_constant))) - t3*(exp(2*pi*complex(0,ky*lat_constant))+exp(2*pi*complex(0,-ky*lat_constant))) +mz
    Ham[2][3] = 0
    Ham[3][2] = 0


    e, w = linalg.eig(Ham)
    e = [real(e[y]) for y in range(num)]
    e = sort(e)
    return e
    # for y in range(num):
    #     print real(e[y])
# H(0.01,0.03)
# exit()

ens = zeros((num, knum), dtype=float64)
a1 = open("kpoints", 'r+')      #Using Fractional coordinates
for m in range(knum):
    Kq = a1.readline().strip().split()
    kx,ky=[float(Kq[n]) for n in range(2)]
    e=H(kx,ky)
    for y in range(num):
      ens[y, m] = real(e[y])
print(ens)


pl.figure(figsize=(16.0, 12.4))
pl.subplots_adjust(wspace=0.35)
pl.ylim(-5,5)
pl.xlim(0, knum)
pl.grid(True)

# print(nOrbits)
for i in range(num):
    # print i
    # pl.plot(ens[i], 'go', ms=5, mew=1)
    pl.plot(ens[i], 'g-', ms=5, mew=1)
    # pl.plot(evals[i], 'ro', ms=5, mew=1)
pl.title(r'$\Gamma$')

pl.ylabel("Energy")


# pl.show()

# print('Done.\n')

fig = pl.figure() # 创建一个画布figure,然后在这个画布上加各种元素。
ax = Axes3D(fig) # 将画布作用于 Axes3D 对象上。


a=arange(-0.5,0.5,0.01)
x=zeros((1, 100),dtype=float64)
y=zeros((1, 100),dtype=float64)
z0=zeros((1,100),dtype=float64)
z1=zeros((1,100),dtype=float64)
z2=zeros((1,100),dtype=float64)
z3=zeros((1,100),dtype=float64)
for i in range(len(a)):
    kx=a[i]
    x[0,]=kx
    for j in range(len(a)):
        ky=a[j]
        y[0,j]=ky
        e=H(kx,ky)
        z0[0, j] = real(e[0])
        z1[0, j] = real(e[1])
        z2[0, j] = real(e[2])
        z3[0, j] = real(e[3])
    ax.scatter(x,y,z0,c='r') # 画出(xs1,ys1,zs1)的散点图。
    ax.scatter(x,y,z1,c='r') # 画出(xs1,ys1,zs1)的散点图。
    ax.scatter(x,y,z2,c='r') # 画出(xs1,ys1,zs1)的散点图。
    ax.scatter(x,y,z3,c='r') # 画出(xs1,ys1,zs1)的散点图。

ax.set_xlabel('X label') # 画出坐标轴
ax.set_ylabel('Y label')
ax.set_zlabel('Z label')

pl.show()
Comments to: 反铁磁量子反常霍尔效应模型

您的邮箱地址不会被公开。 必填项已用 * 标注