学术, 朗道能级

六角格子的佩尔斯替换和石墨烯条带的Hofstadter蝴蝶(附Python代码)

Peierls substitution[1]:

t_{ij} \to \mathrm{exp}(\frac{2\pi i}{\phi_0}\int_{i}^{j}d\vec{l}\cdot \vec{A}) t_{ij}

选取磁场为z方向,在朗道规范[2]下,磁势可以选为\vec{A}=(-yB, 0, 0),,于是有

t \to \mathrm{exp}[\frac{2\pi i}{\phi_0}(-yBL_x)] t

六角格子示意图:

考虑以下三个跃迁:

t_1 \to \mathrm{exp}[\frac{2\pi i}{\phi_0}(-y_1 B L_x)] t

t_2 \to \mathrm{exp}[\frac{2\pi i}{\phi_0}(-y_2 BL_x)] t

t_3 \to \mathrm{exp}[\frac{2\pi i}{\phi_0}(-y_3 BL_x)] t

变换得到:

t_1 \to \mathrm{exp}[-2\pi i \frac{B L_x L_y}{\phi_0} \frac{y_1}{L_y} ] t

t_2 \to \mathrm{exp}[-2\pi i \frac{B L_x L_y}{\phi_0}\frac{y_2}{L_y}] t

t_3 \to \mathrm{exp}[-2\pi i \frac{B L_x L_y}{\phi_0} \frac{y_3}{L_y}] t

假设这里的L_y还未定义,为任意值。

\frac{BS}{\phi_0}=\frac{B L_x L_y}{\phi_0}=1时,体系第一次进入到Hofstadter蝴蝶的循环状态。那么\frac{y_1}{L_y}\frac{y_3}{L_y}都应该取整数,即y_1y_3都是L_y的整数倍。L_y的最大值为|y_3-y_1|,这时所对应的磁场是最小的,为第一次进入循环。

也就是说如果某个元胞的某个跃迁的相位是零,那么在下一个元胞的相同的位置相位应该为2pi,这样整体体系才会完全重复。

L_x L_y为六角格子的面积,即元胞面积。

如果格子更加复杂,例如Kagome格子[3,4],需要考虑每个跃迁进入周期的情况,从而确定L_y的值,最终得到的L_x L_y是格子最小的封闭面积。

附:有限宽度石墨烯条带的Hofstadter蝴蝶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/12185
"""

import numpy as np
from math import *  
import cmath  
import functools 

def hamiltonian(B, k, N, M, t1, a):  # graphene哈密顿量(N是条带的宽度参数)
    # 初始化为零矩阵
    h00 = np.zeros((4*N, 4*N), dtype=complex)
    h01 = np.zeros((4*N, 4*N), dtype=complex)
    # 原胞内的跃迁h00
    for i in range(N):
        h00[i*4+0, i*4+0] = M
        h00[i*4+1, i*4+1] = -M
        h00[i*4+2, i*4+2] = M
        h00[i*4+3, i*4+3] = -M
        # 最近邻
        h00[i*4+0, i*4+1] = t1*cmath.exp(-2*pi*1j*B*(3*a*i+1/4*a)*(np.sqrt(3)/2*a))
        h00[i*4+1, i*4+0] = np.conj(h00[i*4+0, i*4+1])
        h00[i*4+1, i*4+2] = t1
        h00[i*4+2, i*4+1] = np.conj(h00[i*4+1, i*4+2])
        h00[i*4+2, i*4+3] = t1*cmath.exp(2*pi*1j*B*(3*a*i+7/4*a)*(np.sqrt(3)/2)*a)
        h00[i*4+3, i*4+2] = np.conj(h00[i*4+2, i*4+3])
    for i in range(N-1):
        # 最近邻
        h00[i*4+3, (i+1)*4+0] = t1
        h00[(i+1)*4+0, i*4+3] = t1
    # 原胞间的跃迁h01
    for i in range(N):
        # 最近邻
        h01[i*4+1, i*4+0] = t1*cmath.exp(-2*pi*1j*B*(3*a*i+1/4*a)*(np.sqrt(3)/2*a))
        h01[i*4+2, i*4+3] = t1*cmath.exp(-2*pi*1j*B*(3*a*i+7/4*a)*(np.sqrt(3)/2*a))
    matrix = h00 + h01*cmath.exp(1j*k) + h01.transpose().conj()*cmath.exp(-1j*k)
    return matrix

def main():
    N = 30
    a = 1
    hamiltonian_function0 = functools.partial(hamiltonian, k=0, N=N, M=0, t1=1, a=a)
    B_array = np.linspace(0, 1/(3*np.sqrt(3)/2*a*a), 100)
    BS_array = B_array*(3*np.sqrt(3)/2*a*a)
    eigenvalue_array = calculate_eigenvalue_with_one_parameter(B_array, hamiltonian_function0)
    plot(BS_array, eigenvalue_array, xlabel='Flux (BS/phi_0)', ylabel='E', title='Ny=%i'%N, filename='a', show=1, save=0, style='k.', y_min=None, y_max=None, markersize=3)
    
    # import guan
    # eigenvalue_array = guan.calculate_eigenvalue_with_one_parameter(B_array, hamiltonian_function0)
    # guan.plot(BS_array, eigenvalue_array, xlabel='Flux (BS/phi_0)', ylabel='E', title='Ny=%i'%N, filename='a', show=1, save=0, style='k.', y_min=None, y_max=None, markersize=3)

def calculate_eigenvalue_with_one_parameter(x_array, hamiltonian_function, print_show=0):
    dim_x = np.array(x_array).shape[0]
    i0 = 0
    if np.array(hamiltonian_function(0)).shape==():
        eigenvalue_array = np.zeros((dim_x, 1))
        for x0 in x_array:
            hamiltonian = hamiltonian_function(x0)
            eigenvalue_array[i0, 0] = np.real(hamiltonian)
            i0 += 1
    else:
        dim = np.array(hamiltonian_function(0)).shape[0]
        eigenvalue_array = np.zeros((dim_x, dim))
        for x0 in x_array:
            if print_show==1:
                print(x0)
            hamiltonian = hamiltonian_function(x0)
            eigenvalue, eigenvector = np.linalg.eigh(hamiltonian)
            eigenvalue_array[i0, :] = eigenvalue
            i0 += 1
    return eigenvalue_array

def plot(x_array, y_array, xlabel='x', ylabel='y', title='', fontsize=20, labelsize=20, show=1, save=0, filename='a', file_format='.jpg', dpi=300, style='', y_min=None, y_max=None, linewidth=None, markersize=None, adjust_bottom=0.2, adjust_left=0.2): 
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    plt.subplots_adjust(bottom=adjust_bottom, left=adjust_left) 
    ax.plot(x_array, y_array, style, linewidth=linewidth, markersize=markersize)
    ax.grid()
    ax.set_title(title, fontsize=fontsize, fontfamily='Times New Roman')
    ax.set_xlabel(xlabel, fontsize=fontsize, fontfamily='Times New Roman') 
    ax.set_ylabel(ylabel, fontsize=fontsize, fontfamily='Times New Roman') 
    if y_min!=None or y_max!=None:
        if y_min==None:
            y_min=min(y_array)
        if y_max==None:
            y_max=max(y_array)
        ax.set_ylim(y_min, y_max)
    ax.tick_params(labelsize=labelsize) 
    labels = ax.get_xticklabels() + ax.get_yticklabels()
    [label.set_fontname('Times New Roman') for label in labels]
    if save == 1:
        plt.savefig(filename+file_format, dpi=dpi) 
    if show == 1:
        plt.show()
    plt.close('all')

if __name__ == '__main__':
    main()

运行结果:

参考资料:

[1] 佩尔斯替换 Peierls substitution

[2] 磁场和磁势的选取

[3] Du et al. - 2018 - Floquet Hofstadter butterfly on the kagome and triangular lattices

[4] Zhang and Tong - 2019 - Staggered potential and magnetic field tunable electronic switch in a kagome nanoribbon junction

3,981 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

10 thoughts on “六角格子的佩尔斯替换和石墨烯条带的Hofstadter蝴蝶(附Python代码)”

  1. 请问为什么Hofstadter butterfly在中间空白处有几个小点呢,取更大的N也还是会出现,我看单层的graphene是没有的,PHYSICAL REVIEW B 88, 125426 (2013)。

    1. 这里是一维有限宽度的情况,存在边缘态,那些额外的点应该就是边缘态。如果是二维的情况,应该就没有了。

    1. 跃迁项在y方向上的投影坐标,我取在了跃迁中点的位置,所以是1/4*a。这个坐标的零点选取不唯一,是人为选定的,不影响最终的计算结果。

  2. 请问如果在三维非层状材料上面施加磁场计算朗道能级,这个Peierls substitution是要格外添加一个积分吗?

    1. 没有再添加积分呀,Peierls substitution只是在跃迁方向上做了一个路径的积分,对hopping项起作用。磁通也只是考虑某个平面区间上的。

  3. 请问这个y1 y2 y3是什么?这里的Lx是两个格点的x方向坐标的距离吗?

    1. y1 y2 y3是纵向的坐标,但纵向坐标的零点选取不唯一。
      嗯,对的,Lx是两个格点之间的距离在x方向上的投影。

    1. 是同一个。

      当磁场加到一定的值时,会进入下一个Hofstadter蝴蝶周期,这时候整个体系应该是完全一样的。在这个新周期,如果某个元胞的某个跃迁的相位是零,那么在下一个元胞的相同的位置相位应该为2pi,这样才会完全重复。

发表评论

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

Captcha Code