学术源码, 拓扑不变量

SSH模型的哈密顿量、能带图和卷绕数(附Python代码)

本篇内容主要参考这篇文献:A Short Course on Topological Insulators: Band-structure topology and edge states in one and two dimensions

1. 模型

SSH模型示意图如下[1]:

SSH(Su-Schrieffer-Heeger)模型的哈密顿量为:

H=v\sum\limits_{m=1}^{N}(|m, B\rangle \langle m, A|+h.c.)+w\sum\limits_{m=1}^{N-1}(|m+1, A\rangle \langle m,B|+h.c.)

当v=w时,该体系为一维的简单晶格链模型。

2. 能带图

SSH模型哈密顿量经过傅里叶变换后,得到:

H(k)=\begin{pmatrix}0 & \nu+w e^{-ik} \\\nu+w e^{ik} & 0\end{pmatrix}

该模型具有手征对称性。可参考这篇:手征对称性 Chiral Symmetry

画能带图的Python代码为:

"""
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/5025
"""

import numpy as np
import matplotlib.pyplot as plt
from math import *  
import cmath 


def hamiltonian(k):  # SSH模型
    v=0.6
    w=1
    matrix = np.zeros((2, 2), dtype=complex)
    matrix[0,1] = v+w*cmath.exp(-1j*k)
    matrix[1,0] = v+w*cmath.exp(1j*k)
    return matrix


def main():
    k = np.linspace(-pi, pi, 100)
    plot_bands_one_dimension(k, hamiltonian)


def plot_bands_one_dimension(k, hamiltonian):
    dim = hamiltonian(0).shape[0]
    dim_k = k.shape[0]
    eigenvalue_k = np.zeros((dim_k, dim))
    i0 = 0
    for k0 in k:
        matrix0 = hamiltonian(k0)
        eigenvalue, eigenvector = np.linalg.eig(matrix0)
        eigenvalue_k[i0, :] = np.sort(np.real(eigenvalue[:]))
        i0 += 1
    for dim0 in range(dim):
        plt.plot(k, eigenvalue_k[:, dim0], '-k')
    plt.show()


if __name__ == '__main__':
    main()

画出的能带为(该结果来源于文献[1]):

其中,两个极限的情况是w=0或v=0,如下图所示[1]:

3. 卷绕数

这里先给出结论:当v>w时,SSH模型的卷绕数为0;当v<w时,SSH模型的卷绕数为1。

对于具有手征对称性(chiral symmetry)的两带模型,卷绕数(Winding number)的公式为[1]:

计算的Python代码为:

"""
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/5025
"""


import numpy as np
import matplotlib.pyplot as plt
from math import * 
import cmath
import time

def hamiltonian(k):  # SSH模型
    v=0.6
    w=1
    matrix = np.zeros((2, 2), dtype=complex)
    matrix[0,1] = v+w*cmath.exp(-1j*k)
    matrix[1,0] = v+w*cmath.exp(1j*k)
    return matrix


def main():
    start_clock = time.perf_counter()
    delta_1 = 1e-9  # 求导的步长(求导的步长可以尽可能短)
    delta_2 = 1e-5  # 积分的步长(积分步长和计算时间相关,因此取一个合理值即可)
    W = 0  # Winding number初始化
    for k in np.arange(-pi, pi, delta_2):
        H = hamiltonian(k)
        log0 = cmath.log(H[0, 1])
    
        H_delta = hamiltonian(k+delta_1) 
        log1 = cmath.log(H_delta[0, 1])

        W = W + (log1-log0)/delta_1*delta_2 # Winding number
    print('Winding number = ', W/2/pi/1j)
    end_clock = time.perf_counter()
    print('CPU执行时间(min)=', (end_clock-start_clock)/60)


if __name__ == '__main__':
    main()

当v=0.6, w=1时,计算结果为(-1):

当v=1, w=0.6时,计算结果为(0):

参考资料:

[1] A Short Course on Topological Insulators: Band-structure topology and edge states in one and two dimensions

[2] Berry phase effects on electronic properties

[3] 知乎:winding number 的计算公式是怎么来的?

[4] 知乎:陈数(Chern number)与卷绕数(winding number)的区别与联系?

[5] https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%BB%95%E6%95%B0

【未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

6,114 次浏览

12 thoughts on “SSH模型的哈密顿量、能带图和卷绕数(附Python代码)”

    1. 从定义来看,是只适用于手对称的系统,但不一定是两能带系统。
      如果不满足手对称,可能有其他的拓扑不变量。

  1. 你好,算winding number 的时候选取 的是h(k),如果选取h(k)*的话计算结果是前者的相反数,请问应该选取哪一个?还是只关注其绝对值大小,选取任何一个都可以?

    1. 符号其实也跟积分的路径方向有关,一般会用来区分两个路径方向。其他时候只关注绝对值大小,负号影响不大。

  2. 你好,我在求解winding number时,加入了一个循环,看u对于winding number的影响,大多数据很正常,为什么中间会出现一个两千多的数字呢?

    1. 是v=w的位置吗,这时候带隙为零,能带相交的地方波函数不好区分开。

  3. 你好,我想问一下SSH模型那个哈密顿量您知道怎么推导出来的吗?一直很困惑

    1. 我谷歌找到了understanding basic concepts of topological insulators through SSH model这篇论文,还找了其中的参考文献[3]oxford solid state physics书,差不多弄懂了这个哈密顿量的来源。不用麻烦您了,打扰了。

发表评论

您的电子邮箱地址不会被公开。