vasp 系列 002. 通过 vaspkit 生成的 BNAD.dat 数据文本计算有效质量

1. 背景

  1. 现在使用 vasp 软件计算,基本都是用 vaspkit 数据后处理工具。vaspkit 工具有计算有效质量的功能,但是需要重新计算能带。
  2. 在计算每一个材料的时候,绝大多数情况都要计算能带,而能带的数据可以使用 vaspkit 来提取,得到一个 BAND.dat 的能带数据文件。

BAND.dat 长这样:

#K-Path      Energy-Level
# NKPTS & NBANDS: 240  96
# Band-Index    1
   0.00000    -12.501256
   0.01166    -12.500967
   .
   .
   .
   2.51673    -12.501256
 
 
# Band-Index    2
   2.51673    -12.500515
   2.50327    -12.500128
   .
   .
   .
   2.51673    -12.501256
....

2. 环境

安装 Anaconda (一个集成了 Python 绝大多数库的工具)




3. 有效质量相关理论

3.1 要明白:

只有 有带隙 的材料才能用这个脚本计算有效质量,最好是 绝缘体半导体 ,金属的价带和导带是有重叠的是没法用下面的脚本计算有效质量。

3.2 倒格矢
3.2.1. 正格矢

R n = n 1 a 1 + n 2 a 2 + n 3 a 3 \boldsymbol{R_n} = n_1 \boldsymbol{a_1} + n2 \boldsymbol{a_2} + n3 \boldsymbol{a_3} Rn=n1a1+n2a2+n3a3

下面例子的单位是 (1E-10 米)


网上最流行的二维 InSe 教程的 POSCAR

SYSTEM = InSe                           
   1.00000000000000     
     4.0927800000000003    0.0000000000000000    0.0000000000000000
    -2.0463909999999998    3.5444536547999999    0.0000000000000000
     0.0000000000000000    0.0000000000000000   20.0000000000000000
   Se   In
     2     2
Direct
 -0.0000000000000000  0.0000000000000000  0.6346282943308172
  0.0000000000000000 -0.0000000000000000  0.3653717056691828
  0.6666666870000029  0.3333333429999996  0.5704161898487420
  0.6666666870000029  0.3333333429999996  0.4295838101512581

a 1 = ( 4.09278 , 0 , 0 ) \boldsymbol{a_1} = (4.09278, 0, 0) a1=(4.09278,0,0)
a 2 = ( − 2.0463 , 3.5444536 , 0 ) \boldsymbol{a_2} = (-2.0463, 3.5444536, 0) a2=(2.0463,3.5444536,0)
a 3 = ( 0 , 0 , 20 ) \boldsymbol{a_3} = (0, 0, 20) a3=(0,0,20)
∣ a 2 ∣ = ( − 2.0463 ) 2 + ( 3.5444536 ) 2 = 4.0927824 | \boldsymbol{a_2} | = \sqrt{(-2.0463)^2 + (3.5444536)^2} = 4.0927824 a2=(2.0463)2+(3.5444536)2 =4.0927824

单位是 埃,编辑器打不出来。


3.2.2. 倒格矢(单位:1/正格矢单位,比如下面的例子:1/angstrom)

三维情况下:
G h = h 1 b 1 + h 2 b 2 + h 3 b 3 \boldsymbol{G_h} = h_1 \boldsymbol{b_1} + h_2 \boldsymbol{b_2} + h_3 \boldsymbol{b_3} Gh=h1b1+h2b2+h3b3


其中:
b 1 = 2 π ( a 2 × a 3 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_1} = 2 \pi \frac{\boldsymbol{(a_2 \times a_3)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b1=2πa1(a2×a3)(a2×a3),
b 2 = 2 π ( a 3 × a 1 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_2} = 2 \pi \frac{\boldsymbol{(a_3 \times a_1)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b2=2πa1(a2×a3)(a3×a1),
b 3 = 2 π ( a 1 × a 2 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_3} = 2 \pi \frac{\boldsymbol{(a_1 \times a_2)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b3=2πa1(a2×a3)(a1×a2),


或者(有的书是没有乘以 2 π 的,比如 原版 的黄昆的书):
b 1 = ( a 2 × a 3 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_1} = \frac{\boldsymbol{(a_2 \times a_3)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b1=a1(a2×a3)(a2×a3),
b 2 = ( a 3 × a 1 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_2} = \frac{\boldsymbol{(a_3 \times a_1)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b2=a1(a2×a3)(a3×a1),
b 3 = ( a 1 × a 2 ) a 1 ⋅ ( a 2 × a 3 ) , \boldsymbol{b_3} = \frac{\boldsymbol{(a_1 \times a_2)}}{\boldsymbol{a_1 \cdot (a_2 \times a_3)}}, b3=a1(a2×a3)(a1×a2),




下面以上面的 InSe 的 POSCAR 为例子,按照有 × 2π 的情况计算倒格矢
  1. 计算分母,也就是体积:
    V = a 1 ⋅ ( a 2 × a 3 ) V = \boldsymbol{a_1 \cdot (a_2 \times a_3)} V=a1(a2×a3)
In [10]: import numpy as np
In [11]: a1 = np.array([4.09278, 0, 0])
    ...: a2 = np.array([-2.04639, 3.54445365, 0])
    ...: a3 = np.array([0, 0, 20])
    ...: 
    ...: # 求分母,也就是体积
    ...: V = np.dot(a1, np.cross(a2, a3))
    ...: print(V)
290.13338019294
  1. 计算各个倒格矢
In [16]: a1 = np.array([4.09278, 0, 0])
    ...: a2 = np.array([-2.04639, 3.54445365, 0])
    ...: a3 = np.array([0, 0, 20])
    ...: 
    ...: # 求分母,也就是体积
    ...: V = np.dot(a1, np.cross(a2, a3))
    ...: 
    ...: b1 = 2 * np.pi * np.cross(a2, a3) / V
    ...: b2 = 2 * np.pi * np.cross(a3, a1) / V
    ...: # 二维情况不考虑 b3
    ...: # b3 = 2 * np.pi * np.cross(a1, a2) / V
    ...: 
    ...: # 打印倒格矢向量形式
    ...: print(b1)
    ...: print(b2)
    ...: # print(b3)
    ...: 
    ...: # 打印倒格矢向量的模(长度)
    ...: print(np.linalg.norm(b1))
    ...: print(np.linalg.norm(b2))
    ...: # print(np.linalg.norm(b3)
[ 1.53518765  0.88634045 -0.        ]
[0.         1.77268091 0.        ]
1.772681730317445
1.772680905893518

可以看到这个例子的倒格矢 b 1 , b 2 \boldsymbol{b_1}, \boldsymbol{b_2} b1,b2 的长度都是 1.77268 (1/angstrom)。

3.3 有效质量的定义(单位下面具体讲)

1 m ∗ = 1 ℏ 2 ∂ 2 E k ∂ k 2 \frac {1}{m^*} = \frac{1}{\hbar^2} \frac {\partial^2{{E_k}}} {\partial \boldsymbol{k}^2} m1=21k22Ek

解释:

在能带的极值处对 倒格矢坐标 求二阶导,然后代进公式计算,便可求得有效质量

其中:

如果计算的是电子有效质量,则取得能带是最低的导带,在极小值处附近取点做二阶拟合,或者求二阶导。

如果计算的是空穴有效质量,则取得能带是最高的价带,在极大值处附近取点做二阶拟合,或者求二阶导。

比如在 InSe 的例子中:(红圈的是求电子有效质量,最低的导带极小值附近;绿框的是求空穴有效质量,最高的价带极大值附近),那么计算的时候就是通过找到这几处地方求其二阶拟合(或二阶导数)。
vasp 系列 002. 通过 vaspkit 生成的 BNAD.dat 数据文本计算有效质量_第1张图片
单位(根据能带图):
ℏ : 1.0545 × 1 0 − 34 J ⋅ s {\hbar} : 1.0545 \times 10^{-34} J \cdot s :1.0545×1034Js
E k : e V E_k: eV Ek:eV
k : 1 / a n g s t r o m \boldsymbol{k}: 1/ angstrom k:1/angstrom



3.4 有效质量的单位:

1 m ∗ : e V a n g s t r o m 2 ( J 2 ⋅ s 2 ) \frac{1}{m^*} : \frac{eVangstrom^2}{(J^2 \cdot s^2)} m1:(J2s2)eVangstrom2

现在问题是为什么 E_k 对 k 的二阶导的单位不是分子分母都是平方,而是只有分母平方,而分子没有平方。
在这里举个加速度的例子:
a = d 2 x d t 2 a = \frac{d^2x}{dt^2} a=dt2d2x
和加速度的单位一样的道理:
a 的 加 速 度 不 为 m 2 s − 2 , 而 是 m s − 2 a 的加速度不为 m^2 s^{-2},而是 m s^{-2} am2s2ms2

所以, 有效质量的单位是:
m ∗ : J 2 ⋅ s 2 ( e V a n g s t r o m 2 ) − 1 m^* : J^2 \cdot s^2 (eVangstrom^2)^{-1} m:J2s2(eVangstrom2)1
这个单位比较难看,并且化简不方便。但是也可以化简:
J : k g ⋅ m 2 s − 2 J:kg\cdot m^2 s^{-2} J:kgm2s2
e V : 1.6 × 1 0 − 19 J eV: 1.6 \times 10^{-19}J eV:1.6×1019J
m ∗ : J 2 ⋅ s 2 ( e V a n g s t r o m 2 ) − 1 = J ⋅ ( k g ⋅ m 2 s − 2 ) s 2 1.6 × 1 0 − 19 J ⋅ ( 1 0 − 10 m ) 2 = ( ∗ ∗ ) k g m^* : J^2 \cdot s^2 (eVangstrom^2)^{-1} =\frac{ J \cdot(kg\cdot m^2 s^{-2}) s^2 }{1.6 \times 10^{-19}J \cdot (10^{-10}m)^2} = (**) kg m:J2s2(eVangstrom2)1=1.6×1019J(1010m)2J(kgm2s2)s2=()kg
最后得到的是质量单位 kg,但数值很复杂。


所以,在计算的时候,我们都是用 Hartree atomic units:

https://en.wikipedia.org/wiki/Hartree_atomic_units

R e d u c e d P l a n c k c o n s t a n t : ℏ = 1 h a r t r e e = 1.0545 × 1 0 − 34 J ⋅ s Reduced Planck constant: \hbar = 1 hartree = 1.0545 \times 10^{-34} J \cdot s ReducedPlanckconstant:=1hartree=1.0545×1034Js
E l e m e n t a r y c h a r g e : e = 1 h a r t r e e = 1.6 × 1 0 − 19 C Elementary charge: {\displaystyle e=1} hartree = 1.6 \times 10^{-19} C Elementarycharge:e=1hartree=1.6×1019C
B o h r r a d i u s : a 0 = 1 h a r t r e e = 5.29 × 1 0 − 11 m Bohr radius: {\displaystyle a_{0}=1} hartree = 5.29 \times 10^{-11} m Bohrradius:a0=1hartree=5.29×1011m
E l e c t r o n m a s s : m e = 1 h a r t r e e = 9.1 × 1 0 − 31 k g Electron mass: {\displaystyle m_{\text{e}}=1} hartree = 9.1 \times 10^{-31} kg Electronmass:me=1hartree=9.1×1031kg
E n e r g y : E h = 1 h a r t r e e = 27.21 e V Energy: E_h = 1 hartree = 27.21 eV Energy:Eh=1hartree=27.21eV


化简后(Hartree atomic units):
1 m ∗ = ∂ 2 E k ∂ k 2 \frac {1}{m^*} = \frac {\partial^2{{E_k}}} {\partial \boldsymbol{k}^2} m1=k22Ek

这时候,E_k 的单位是 Hartree,k 的单位也是 Hartree,h_bar 是 1 省略不写。所以最后得出的有效质
量单位是 Hartree,即单位为元电荷(这也是论文经常看见的): 1 H a r t r e e = 1 m e ( m 0 ) = 9.1 × 1 0 − 31 k g 1 Hartree = 1m_e(m_0) = 9.1 \times 10^{-31} kg 1Hartree=1me(m0)=9.1×1031kg



3.5 有效质量的求法(基于 Hartree atomic units):

1 m ∗ = ∂ 2 E k ∂ k 2 \frac {1}{m^*} = \frac {\partial^2{{E_k}}} {\partial \boldsymbol{k}^2} m1=k22Ek
单位是:
1 H a r t r e e = 1 m e ( m 0 ) = 9.1 × 1 0 − 31 k g 1 Hartree = 1m_e(m_0) = 9.1 \times 10^{-31} kg 1Hartree=1me(m0)=9.1×1031kg

  1. E_k 对 k 求二阶导,观察极值附近的数据点,可以近似是一条抛物线,可以对其进行二次拟合(为了对应 Origin ,二次系数用 c 表示):
    f ( x ) = c x 2 + b x + a ⇒ f ′ ′ ( x ) = 2 c f(x) = cx^2+bx+a \Rightarrow f^{''}(x)=2c f(x)=cx2+bx+af(x)=2c
    即:
    1 m ∗ = ∂ 2 E k ∂ k 2 = 2 c \frac {1}{m^*} = \frac {\partial^2{{E_k}}} {\partial \boldsymbol{k}^2} = 2c m1=k22Ek=2c
    m ∗ = 1 2 c , 单 位 : m e ( m 0 ) m^* = \frac{1}{2c} ,单位: m_e(m_0) m=2c1me(m0)
    这也是网上求有效质量的方法:

https://mp.weixin.qq.com/s?__biz=MzI2OTQ4OTExOA==&mid=2247484762&idx=1&sn=fff244bc64af036f52ccecb1bec28eef&chksm=eadec3ebdda94afd846972e5ae363107eacec316c8db7c3b328305451ea66d5870bcc597a516&token=1986072339&lang=zh_CN#rd

或者

https://zhuanlan.zhihu.com/p/62573921 点击转 “有效质量详细教程”

  1. 也可以使用插值法直接求解数据的二阶导。



4. BAND.dat 数据文件格式

vasp 系列 002. 通过 vaspkit 生成的 BNAD.dat 数据文本计算有效质量_第2张图片

数据格式(每一条带 240 个 K 点,一共 96 条带,能量单位是 eV,x 轴即 K-path 的单位是 1/A):

#K-Path      Energy-Level
# NKPTS & NBANDS: 240  96
# Band-Index    1
   0.00000    -12.501256
   0.01166    -12.500967
   .
   .
   .
   2.51673    -12.501256
 
 
# Band-Index    2
   2.51673    -12.500515
   2.50327    -12.500128
   .
   .
   .
   2.51673    -12.501256
....

这里要明白一点:

x 轴(K-PATH)的数值是如何来的!

先看 KPOINTS

K-Path Generated by VASPKIT.
   80
Line-Mode
Reciprocal
   0.0000000000   0.0000000000   0.0000000000     G       
   0.5000000000   0.0000000000   0.0000000000     M              
 
   0.5000000000   0.0000000000   0.0000000000     M              
   0.3333333333   0.3333333333   0.0000000000     K              
 
   0.3333333333   0.3333333333   0.0000000000     K              
   0.0000000000   0.0000000000   0.0000000000     G        

三段高对称点的路径,每一段路径 80 个 K 点,一共 240 个 K 点,所以看 BAND.dat 第 80 个 K 点的 K-PATH 的数值就是高对称点 M (0.5, 0, 0)。

从 3.2.2 的计算得出 b1 = 1.772681730317445 1/A
b1 / 2 = 0.8863408651587225 1/A

显然和 高对称点 M (0.5, 0, 0) 的值一样,所以可以判断出,vaspkit 导出的 K-path 的数据是采用 3.2.2 中有 × 2 π 的形式

vasp 系列 002. 通过 vaspkit 生成的 BNAD.dat 数据文本计算有效质量_第3张图片

5. Python 脚本及其使用见:

使用: Python 脚本通过 vaspkit 生成的能带数据文本 BAND.dat 计算有效质量

脚本链接: 脚本网页下载

你可能感兴趣的:(VASP,有效质量,Python,经验分享)