学术, 电子态密度

格林函数计算的总态密度在能量积分上的确定性

这是之前的几篇:

在真实体系中,​态密度(DOS)的严格数学定义是一个无展宽的分布(如 δ 函数求和),但在实际计算或实验中,由于物理效应和测量限制,总会存在一定的能量展宽。数值计算中引入的虚部 η 正是为了模拟这些展宽效应,同时也可以确保数值计算的稳定性。

在引入能量虚部后,态密度在能量上存在一定的展宽。展宽越宽,态密度的峰值越低;展宽越窄,态密度的峰值越高。这导致了计算的结果除了归一化后的分布具有一定的意义,而具体数值并不代表任何含义。本篇主要做数值验证,并指出:虽然在某个能量或者某个空间位置的具体态密度数值没有意义,但是其在能量维度上的积分是具有确定性的,即为体系的总状态数。

同样以方格子为例,代码为:

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

import numpy as np

def hamiltonian(width=2, length=2):   # 方格子哈密顿量
    h = np.zeros((width*length, width*length))
    # y方向的跃迁
    for x in range(length):
        for y in range(width-1):
            h[x*width+y, x*width+y+1] = 1
            h[x*width+y+1, x*width+y] = 1
    # x方向的跃迁
    for x in range(length-1):
        for y in range(width):
            h[x*width+y, (x+1)*width+y] = 1
            h[(x+1)*width+y, x*width+y] = 1
    return h

# from numba import jit
# @jit(nopython=True)
def total_DOS_for_Fermi_energy_array(Fermi_energy_array, h, broadening):
    dim_energy = Fermi_energy_array.shape[0]
    dim = h.shape[0]
    total_DOS_array = np.zeros((dim_energy))
    i0 = 0
    for Fermi_energy in Fermi_energy_array:
        green = np.linalg.inv((Fermi_energy+broadening*1j)*np.eye(dim)-h)
        total_DOS = -np.trace(np.imag(green))/np.pi # 通过格林函数求得总态密度
        total_DOS_array[i0] = total_DOS
        i0 += 1
    return total_DOS_array

def main():
    plot_precision = 0.0001 # 画图的精度/积分的精度
    Fermi_energy_array = np.arange(-5, 5, plot_precision)
    h = hamiltonian()
    # import time
    # begin_time = time.time()
    for broadening in [0.5, 0.1, 0.01, 0.001, 0.0001]:
        total_DOS_array = total_DOS_for_Fermi_energy_array(Fermi_energy_array, h, broadening)
        sum_up = np.sum(total_DOS_array)*plot_precision
        print(f'Broadening为{broadening}时的积分结果:{sum_up}')
        # import matplotlib.pyplot as plt
        # plt.plot(Fermi_energy_array, total_DOS_array/sum_up, '-o')
        # plt.plot(Fermi_energy_array, total_DOS_array, '-o')  
        # plt.xlabel('Fermi energy')
        # plt.ylabel('Total DOS')
        # plt.show()
    # end_time = time.time()
    # print(end_time-begin_time)

if __name__ == '__main__':
    main()

运行结果(plot_precision = 0.0001 # 画图的精度/积分的精度):

Broadening为0.5时的积分结果:3.722565274835012
Broadening为0.1时的积分结果:3.944231849213829
Broadening为0.01时的积分结果:3.9944220100670997
Broadening为0.001时的积分结果:3.9994421998396357
Broadening为0.0001时的积分结果:4.014911712780062

运行结果(plot_precision = 0.001 # 画图的精度/积分的精度):

Broadening为0.5时的积分结果:3.72256527200912
Broadening为0.1时的积分结果:3.9442318486167713
Broadening为0.01时的积分结果:3.994422009997701
Broadening为0.001时的积分结果:4.014409692612366
Broadening为0.0001时的积分结果:13.148488227594502

运行结果(plot_precision = 0.01 # 画图的精度/积分的精度):

Broadening为0.5时的积分结果:3.7225649903254823
Broadening为0.1时的积分结果:3.944231789945488
Broadening为0.01时的积分结果:4.009389496911136
Broadening为0.001时的积分结果:13.147986206850222
Broadening为0.0001时的积分结果:127.36578383963219

结论:

  • 格林函数计算的总态密度在能量积分上具有确定性,为体系的总状态数,这里状态数为 4。
  • 当 broadening 太小时,这时候需要比较高的积分精度才可以算到准确的数值。
  • 当 broadening 太大时,即使有比较高的积分精度也算不到准确的数值,这是因为不同能级的展宽之间出现交叠,具体参考:用格林函数计算态密度时费米能中虚部的取值
  • 在实际计算中,可以把这个总态密度在能量上积分结果作为判断能量虚部 η 大小选取的合理性。
33 次浏览

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

发表评论

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

Captcha Code