VASP教程:计算Si声子谱

有限位移法计算硅的声子谱与声子态密度

计算声子谱和态密度,目前有两种常用的方法:有限位移法(Finite Displacement) 和 DFPT(密度泛函微扰理论)。

  • 有限位移法:简单粗暴。把超胞里的某一个原子人为推开一点点,用VASP计算其他所有原子受到的力,从而推导出力常数。必须用超胞。
  • DFPT(密度泛函微扰理论):更高级的量子力学方法,直接在倒空间算。理论上是原胞即可,但为了兼容Phonopy,有时也需要结合超胞。计算量较大,但精度高。

如果要使用VASP计算整个声子谱或者声子态密度,则需要借助辅助软件,如Phonopy、PHON、Phonon等。这里以Phonopy为例,计算硅的声子谱和声子态密度。

上述软件都是用超元胞方法来计算声子色散关系,但首先第一步结构优化是一样的。

第一步 结构优化

同使用VASP计算能带一样,需要进行结构优化(OPT)。

需要额外注意的几点:

  1. 要进行高精度的结构优化,即参数 ISIF = 3。
  2. 由于声子频率对原子受力的精确度非常敏感,后续所有计算都要保持相同的截断能(ENCUT)和精度(EDIFF),确保力常数计算的准确性。

文件参数示例

以下是我进行OPT时所用的文件参数:

1. INCAR

text
SYSTEM = FCC Si
PREC = A
ENCUT = 350
ISMEAR = 0; SIGMA = 0.05

ADDGRID = .T.

LCHARG = .F.
LWAVE = .F.

EDIFF = 1e-7

NSW = 50 
ISIF = 3
EDIFFG = 0.02
IBRION = 2
POTIM = 0.2

下面带注释的版本,我不小心用了Tab键,会引入一些看不见的符号,运行VASP时可能会报错,所以复制的时候请复制上面的代码。

text
# 常规参数
SYSTEM = FCC Si
PREC = A                 # 即accuracy,测试下来我用Normal画出来的也不赖
ENCUT = 350              # 可根据你的体系适当调
ISMEAR = 0; SIGMA = 0.05

ADDGRID = .T.            # 待会马上在下面讲这个参数

LCHARG = .F.             # 不输出电荷密度,节约空间
LWAVE = .F.              # 不输出波函数,节约空间

# KSPACING = 0.15        # 可用这个自动生成K点,也可手动写KPOINTS,这里为了加深理解不使用这个参数,手写KPOINTS

# 结构优化参数
# 电子步
EDIFF = 1e-7             # 电子步精度
# 离子步
NSW = 50                 # 离子步步数,因为FCC Si很容易优化,所以这里的步数偏少
ISIF = 3
EDIFFG = 0.02            # 离子步精度
IBRION = 2               # 共轭梯度算法,进行结构优化
POTIM = 0.2              # 稍微减小IBRION步长,让优化更稳

其中的参数 ADDGRID

这是一个用于提升计算精度的参数。简单来说,它会在VASP计算中启用一个额外的、更密集的网格,专门用来更精确地处理原子核附近的电荷密度。这在计算声子(晶格振动)时很重要,因为声子频率对原子受力的精确度非常敏感。

为什么需要额外的网格?

要理解这个参数,可以先了解VASP是如何处理电荷密度的:

  • 常规网格:VASP会使用一个基础的网格来“描绘”整个晶胞内的电子波函数和电荷密度。这个网格的疏密程度由 PREC(精度)和 NGX/NGY/NGZ 等参数控制。
  • “补丁”网格(PAW方法):由于原子核附近的电子密度变化极其剧烈,为了精确描述这个区域,VASP(采用PAW方法时)会在原子核周围加上一个“补丁”式的球内网格来进行计算。这个“补丁”区域的电荷被称为增广电荷(augmentation charge)。
  • ADDGRID的作用:ADDGRID = .T. 会在这个“补丁”区域启用一个更密集的辅助网格来更精确地计算增广电荷。根据VASP手册,这个额外网格的格点数是常规网格的8倍。
对声子计算的意义

在声子计算中,每个原子的受力是由电子密度分布决定的。如果原子核附近的电荷分布计算不精确,力就会出现微小误差,进而导致声子频率出现误差。

  • 对于硅(Si)这类半导体,开启 ADDGRID 通常能显著提高力的计算精度,有助于获得更平滑、更准确的声子色散曲线,并减少虚假的“虚频”。
  • VASP官方也确认,ADDGRID=.TRUE. 有时可以进一步提高力的计算精度,尤其是在需要高精度力(如声子计算)的场景下。

2. KPOINTS

text
K-POINTS
0
Gamma
10 10 10 
0 0 0

3. POSCAR

text
FCC Si
5.43
   0.5    0.5   0.0
   0.0    0.5   0.5
   0.5    0.0   0.5
Si
2
c
0 0 0   
1.35 1.35 1.35

4. POTCAR

还需要Si的POTCAR。

有了上面这四个文件,直接丢给VASP进行OPT即可。

第二步 生成超胞与位移文件

重命名

首先,将前面OPT得到的 CONTCAR 文件重命名为 POSCAR-unitcell(名字可以随意,接下来马上会讲)。

在结构优化后,需要使用Phonopy的命令把初基原胞扩展成超胞。超胞在空间中重复原来原胞的结构,形成一个更大的‘原胞’。

对于Si,以2×2×2超胞为例已经足够,可以使用以下Linux命令:

bash
phonopy -d --dim="2 2 2" -c POSCAR-unitcell

(注意:最新版输入该指令可能会报错,不过终端会提示你该怎么做,在接下来“注意”部分会讲到为什么)

指令参数的意义

1. -d 这是 --dim 的简写,全称是 --dimension(维度/倍数)。 作用:启用Phonopy生成超胞并同步生成位移文件。

2. --dim='2 2 2' 这里双引号和单引号均可。 含义:指定超胞大小,这里 2 2 2 表示沿着晶格的 a、b、c 三个基矢方向,各扩展 2 倍。 对于本次例子的FCC Si,原胞有2个硅原子,扩完之后超胞里就有 \(2 \times 2 \times 2 \times 2 = 16\) 个原子。

3. -c POSCAR-unitcell 含义:-c 是 --cell 的缩写, 表示读取目录中名为 POSCAR-unitcell 的文件作为初始原胞。 所以前面说到,对 CONTCAR 重命名是可以任意的,只要这里跟着变就可以了。若这里不填,phonopy就会默认搜寻目录中名为 POSCAR 的文件。

输出的文件

  • POSCAR-unitcell:备份的原胞。
  • SPOSCAR:没有位移的完美超胞。
  • POSCAR-001, POSCAR-002…:根据晶体对称性,Phonopy自动判断需要移动哪些不等价的原子,每一个文件代表一种位移构型(比如硅只需移一次,生成一个 POSCAR-001;如果对称性低,可能会生成几十个)。

注意

前面提到,输入 1. 的命令可能会报错,这是因为 Phonopy 是 v4 或更高版本,其命令结构发生了重大变化(本人深受其害)。

在 v4 中,Phonopy 将命令拆分为两个部分:负责“准备”的 phonopy-init 和负责“计算”的 phonopy。--dim 被移动到 phonopy-init 模块。

所以你要把命令换成:

bash
phonopy-init -d --dim="2 2 2" -c POSCAR-unitcell

除此之外,还有以下这些变化:

操作类型 v3 命令 (旧) v4 命令 (新)
扩胞/生成位移 phonopy -d --dim ... phonopy-init -d --dim ...
提取力常数 phonopy -f vasprun.xml-* phonopy-init -f vasprun.xml-*
DFPT 计算 phonopy --fc vasprun.xml phonopy-init --fc vasprun.xml
绘制能带图 phonopy -p band.conf phonopy -p band.conf (不变)

第三步 自洽计算

本步的目的是优化电子的电荷密度分布,计算的过程和前面的SCF基本一致。

需要额外注意的点

  1. 若你前面第二步生成了多个位移文件 POSCAR-XXX,你就要进行多次SCF计算。最好为每个 POSCAR-00x 建立一个独立的文件夹(例如 disp001, disp002…)。
  2. 别忘了保持相同的截断能(ENCUT)和精度(EDIFF)。

输入文件参数

1. INCAR

text
# 常规参数
SYSTEM = FCC Si
PREC = A                 # 即accuracy,测试下来我用Normal画出来的也不赖
ENCUT = 350              # 可根据你的体系适当调
ISMEAR = 0; SIGMA = 0.05

ADDGRID = .T.            # 提升受力精度

LCHARG = .F.             # 不输出电荷密度,节约空间
LWAVE = .F.              # 不输出波函数,节约空间

# KSPACING = 0.15        # 可用这个自动生成K点,也可手动写KPOINTS,这里为了加深理解不使用这个参数,手写KPOINTS

# 结构优化参数
# 电子步
EDIFF = 1e-7             # 电子步精度
# 离子步
NSW = 0                  # 离子步步数,因为FCC Si很容易优化,所以这里的步数偏少
# ISIF = 3
# EDIFFG = 0.02          # 离子步精度
IBRION = -1              # 固定离子位置,计算单点能
POTIM = 0.2              # 稍微减小IBRION步长,让优化更稳

同样的,这里给出没有注释的干净版本:

text
SYSTEM = FCC Si
PREC = A
ENCUT = 350
ISMEAR = 0; SIGMA = 0.05

ADDGRID = .T.

LCHARG = .F.
LWAVE = .F.

EDIFF = 1e-7

NSW = 0 
IBRION = -1

2. KPOINTS

text
K-POINTS
0
Gamma
5 5 5 
0 0 0

注意这里的K点,在各个方向减半。这是因为扩胞后,超胞的晶格常数是原来原胞的两倍,即正空间中各个基矢的长度变为原来的两倍,那么倒空间中的基矢的长度变为原来的 \(\frac{1}{2}\),为了保持相同的采样密度(k点之间的间距保持不变),这里必须这样做。

可以参考前面章节 输入文件的参数 -> POSCAR -> 对POSCAR的理解 -> 扩胞下的情况

前面的INCAR里提到了参数 KSPACING = 0.15,在不写KPOINTS的情况下,这个参数直接限定k点之间的间距,自动生成 KPOINTS。所以使用这个就不用自己更改 KPOINTS 文件了,会方便得多。

对于声子谱计算,推荐的做法是:

  • 统一使用 KSPACING:在结构优化(原胞)和声子计算(超胞)的所有VASP步骤中,都在INCAR里设置相同的 KSPACING 值,并确保计算目录中不存在 KPOINTS 文件。
  • 做好收敛测试:虽然 KSPACING 很方便,但 0.15 这个值是否适合你的体系,仍需要通过测试来判断。一个可靠的方法是,用 KSPACING 生成K点后,在 OUTCAR 里查看VASP实际使用的K点网格,然后手动在 KPOINTS 文件里设置一个更密的网格(例如,把生成的 4 4 4 手动改为 6 6 6),对比两次计算的总能或力是否收敛。如果变化很小,说明原来的 KSPACING 已经足够。

3. POSCAR 将第二步生成的位移文件 POSCAR-XXX,改名为 POSCAR。

4. POTCAR 同上。

第四步 提取力常数

这一步是把VASP算出来的力,转化为Phonopy认识的矩阵。

对于有限位移法: 在包含所有 disp00x 文件夹的总目录下运行(若有多个位移文件,就这样子):

bash
phonopy -f disp001/vasprun.xml disp002/vasprun.xml ... 

新版本使用(这里只有一个位移文件,只生成了一个 vasprun.xml):

bash
phonopy-init -f vasprun.xml

这会生成 FORCE_SETS 文件。

计算逻辑:

  1. VASP本身不知道什么是“力常数”。它只是在你把原子人为推开(位移)后,算出每个原子此时此刻受到的力(Forces)。
  2. -f 告诉 Phonopy:去读 VASP 算出来的这些受力。
  3. Phonopy拿到受力后,会结合扩胞时生成的位移说明书(phonopy_disp.yaml),通过数学公式计算(组装)出力常数。
  4. 输出文件:生成 FORCE_SETS 文件。

第五步 准备配置文件与绘图

这里需要准备两个文件 band.conf 和 mesh.conf,来分别计算声子色散关系和声子态密度。

声子能带图配置(band.conf)

text
ATOM_NAME = Si       # 你的元素名
DIM = 2 2 2          # 必须和你扩胞的倍数一模一样

BAND_LABELS = G X W K G L

FC_SYMMETRY = .TRUE.    # 开启对称性加速

Phonopy会自动找同一目录下的 FORCE_SETS。

声子能带图绘制

准备好 band.conf 后,确保目录下有 band.conf, FORCE_SETS,执行:

若不画图,只生成 band.yaml 文件,使用:

bash
phonopy --config band.conf --band "0 0 0  0.5 0 0.5  0.5 0.25 0.75  0.375 0.375 0.75  0 0 0  0.5 0.5 0.5"

指令的意义

  1. --config:读取目录中的 band.conf 文件,进行配置。
  2. --band:表示开启绘制能带模式,其后面的数字表示,按 band.conf 中 BAND_LABELS = G X W K G L 顺序的k点坐标。

若画图,则在指令后加上 -p 指令,表示启用绘图,即:

bash
phonopy --config band.conf --band "0 0 0  0.5 0 0.5  0.5 0.25 0.75  0.375 0.375 0.75  0 0 0  0.5 0.5 0.5" -p

声子态密度配置(mesh.conf)

text
ATOM_NAME = Si
DIM = 2 2 2
MP = 30 30 30       # 在布里渊区划分的网格密度,越大越平滑

其中 MP 表示声子态密度计算所需的 k 点。

同样的,若不画图,只生成 mesh.yaml 文件:

bash
phonopy --config mesh.conf --mesh "30 30 30"

指令的意义

  • --mesh:表示开启绘制网格样本模式,后面的数字表示空间中k点的分割数目。

投影态密度(PDOS)

若你想看投影态密度(PDOS),则在声子态密度配置(mesh.conf)中加上 PDOS 参数:

text
ATOM_NAME = Si
DIM = 2 2 2
MP = 40 40 40
PDOS = 1 2          # 表示分别计算第1个和第2个原子的投影态密度

使用其它软件绘图

上一节我们知道输出文件中有:band.yaml 和 mesh.yaml。通常其它绘图软件不会识别这两个文件,因此我们要把它们转为 .dat 格式:

bash
phonopy-bandplot --gnuplot band.yaml > band.dat

band.dat 的第一列是 X 轴(高对称点路径的距离),后面几列是 Y 轴(不同声子支的频率)。注意:不同高对称点之间会用空行隔开。

bash
phonopy-dosplot --gnuplot mesh.yaml > mesh.dat

mesh.dat 第一列是频率(Y轴),第二列是态密度(X轴)。

DFPT法计算硅的声子谱与声子态密度

DFPT(密度泛函微扰理论):更高级的量子力学方法,直接在倒空间算。理论上使用原胞即可,但为了兼容Phonopy,有时也需要结合超胞。计算量较大,但精度高。

前两步与有限位移法相同,这里从第三步开始讲起。

第三步 自洽计算

输入文件参数:

与有限位移法相比,主要不同在于 IBRION = -8 以及 NSW = 1。

text
# 常规参数
SYSTEM = FCC Si
PREC = A                # 即accuracy,测试下来我用Normal画出来的也不赖
ENCUT = 350             # 可根据你的体系适当调
ISMEAR = 0; SIGMA = 0.05

ADDGRID = .T.

LCHARG = .F.            # 不输出电荷密度,节约空间
LWAVE = .F.             # 不输出波函数,节约空间

# KSPACING = 0.15       # 可用这个自动生成K点,也可手动写KPOINTS,这里为了加深理解不使用这个参数,手写KPOINTS

# 结构优化参数
# 电子步
EDIFF = 1e-7            # 电子步精度
# 离子步
NSW = 1                 # 只有NSW不为0,VASP才会去检测IBRION的值
# ISIF = 3
# EDIFFG = 0.02         # 离子步精度
IBRION = -8             # 使用DFPT方法计算声子谱
SYMPREC=1E-6            # 如果不加,会遇到 "non-integer element in rotation matrix" 报错

由此得到 vasprun.xml 文件。

第四步 提取力常数

这里在含 vasprun.xml 文件的目录使用:

bash
phonopy --fc vasprun.xml

这会生成 FORCE_CONSTANTS 文件。 (注:如果在v4版本中报错,请替换为 phonopy-init --fc vasprun.xml)

第五步 准备配置文件与绘图

同有限位移法,需要准备 band.conf 与 mesh.conf。

区别在于,要加上一个指令:FORCE_CONSTANTS = READ:

band.conf:

text
ATOM_NAME = Si       # 你的元素名
DIM = 2 2 2          # 必须和你扩胞的倍数一模一样

BAND_LABELS = G X W K G L

FORCE_CONSTANTS = READ  # 告诉Phonopy直接读取上一步生成的文件
FC_SYMMETRY = .TRUE.    # 开启对称性加速

mesh.conf:

text
ATOM_NAME = Si
DIM = 2 2 2
MP = 30 30 30       
FORCE_CONSTANTS = READ

评论

发表回复

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