Lightchaser

三人行,必有我师

介电常数

首先进行结构优化,参考官网: https://www.vasp.at/wiki/index.php/Dielectric_properties_of_SiC

静态介电常数:

方法1:DFPT方法;

{.line-numbers}
1
2
3
4
5
IBRION = 8
NSW=1
LEPSILON = .TRUE.
LRPA=.TRUE.#RPA考虑局域场效应,默认关闭,即IP近似
LPEAD=.TRUE.#有限差分法

方法2:Response to finite electric fields

{.line-numbers}
1
2
3
4
5
LCALCEPS = .TRUE.
IBRION=6
NFREE=2
ISMEAR = 0
SIGMA = 0.01

在OUTCAR中抓取:

STATIC DIELECTRIC TENSOR (including local field effects in DFT)``` 电子贡献或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```MACROSCOPIC STATIC DIELECTRIC TENSOR (including local field effects in RPA (Hartree))```
```MACROSCOPIC STATIC DIELECTRIC TENSOR IONIC CONTRIBUTION``` 离子贡献
```BORN EFFECTIVE CHARGES (in e, cummulative output)```
```ELASTIC MODULI IONIC CONTR (kBar)```
```PIEZOELECTRIC TENSOR IONIC CONTR for field in x, y, z (C/m^2)```
### 频率依赖介电函数:读取WAVECAR
IPA:
```javascript {.line-numbers}
ALGO = Exact
NBANDS = 64
LOPTICS = .TRUE.
CSHIFT = 0.100
NEDOS = 2000
#and you might try with the following
#LPEAD = .TRUE.

frequency dependent IMAGINARY DIELECTRIC FUNCTION (independent particle, no local field effects)
and
frequency dependent REAL DIELECTRIC FUNCTION (independent particle, no local field effects)

Note:对于光学性质的计算,也就是计算材料的介电函数,需要足够多的空带和致密的K网格点,使其达到非常好的收敛状态,我们才可以得到合理的光学性质;因此通常计算中,一般设置NBANDS为默认值(可在自洽的OUTCAR中以关键字NBANDS查找到)的2-3倍,K网格点为自洽值或适当增加。
使用optics.sh脚本得到介电函数的实部和虚部

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
# extract image and real parts of dielectric function from vasprun.xml
awk 'BEGIN{i=1} /<imag>/,\
/<\/imag>/ \
{a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > IMAG.in
#awk 'BEGIN{i=1} /imag/,\
# /\/imag/ \
# {a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
# END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > IMAG.in
awk 'BEGIN{i=1} /<real>/,\
/<\/real>/ \
{a[i]=$2 ; b[i]=$3 ; c[i]=$4; d[i]=$5 ; e[i]=$6 ; f[i]=$7; g[i]=$8; i=i+1} \
END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml > REAL.in

vaspkit处理:
vaspkit-task 711

压电常数

上面计算完介电常数后,一般正交晶系。
grep "PIEZOELECTRIC TENSOR IONIC CONTR for field in x, y, z (C/m^2)" OUTCAR -A10
&
grep "PIEZOELECTRIC TENSOR for field in x, y, z (C/m^2)" OUTCAR -A10

极化强度

  1. 极化强度计算
    首先选取极化相FE(PhaseB, P, 铁电相)和参考相NP(PhaseA, P=0, 中心对称相),分别以下列INCAR计算,
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     SYSTEM = FE
    ENCUT = 600 #铁电极化计算建议设置高精度
    EDIFF = 1E-6
    IBRION = -1
    POTIM = 0.3
    NSW = 0
    EDIFFG = -5E-3
    ISMEAR = 0
    SIGMA = 0.05
    PREC = Accurate
    ISIF = 2
    #NPAR = 4
    LWAVE = .FALSE.
    LCHARG = .FALSE.
    LREAL = .FALSE.
    LDIPOL = .T.
    DIPOL = 0.2 0.2 0.2 #不要设置在原子及迁移路径上,设置在真空层的一边/质心
    LCALCPOL = .TRUE. #计算铁电极化开关
    IPEAD=4
    LPEAD=.True.
  2. 收集结果:grep “Total electronic dipole momen” OUTCAR & grep “Ionic dipole moment” OUTCAR,离子与电子相加即可,然后用NP相-铁电相即可得到极化强度P,注意单位换算。
    首先要理清数据单位。VASP 计算得到的 dipole moment 的单位是 e*Å,它与库仑之间换算为:
    $1e = 1.602176634 * 10^{-19} C$
    $1Å = 10^{-10} m$
    三维体系的极化强度: 极化值除以体积。单位为 $e/Å^2$;二维体系的极化强度:极化值除以面积。单位为 e/Å。

Note:

在铁电极化计算过程中经常会出现参考相为非半导体的情况,这种情况下可以:①镜像法:以FE以NP为参照中心,建立一个-FE相(PhaseB’, 即铁电极化方向相反)。然后按照上述方法计算极化,再以FE相的极化-(-FE相)的极化值,然后除以2即得到极化强度。可以理解为1-(-1)=2,2/2=1;②线性插值法:在FE和NP相中间插入一系列中间过渡相(0%(FE),10%,20%,30%….100%(NP)),计算它们的极化,然后可以用Origin做拟合,100%时即为NP相的极化。(100%-0%)则是极化强度P。

线性插值法计算极化强度

原文链接:

https://www.cnblogs.com/ghzhan/articles/16305679.html

BaTiO3 是钙钛矿结构,它的铁电相结构和中心对称结构如图所示0401,属于四方晶系。

  1. 先构造 BaTiO3 两种极化方向的晶格结构,并用 VASP 进行结构优化得到 CONTCAR;

  2. 将上一步优化后的两个结构分别放入创建好的 ini, fin 文件夹。利用 NEB 的 nebmake.pl 命令产生这两种极化方向的中间过渡结构 (vtst下载地址: Download — Transition State Tools for VASP (utexas.edu)),具体命令为:

    nebmake.pl ini/CONTCAR fin/CONTCAR 32

    这里的 ‘32’ 是表示产生中间过渡的 32 种结构。执行上述命令后,当前文件夹下会产生 00, 01, 02, …, 33 个文件夹,每个文件夹下有一个 POSCAR 文件。

  3. 对每个文件夹的结构进行一次 VASP 自洽运算,INCAR 文件里面需要额外设置 DIPOL 和 LCALPOL 参数。

    DIPOL 参数可以选取任一坐标,但是保证同一体系采用相同值。

    LCALPOL 参数是打开 极化运算。

    INCAR 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SYSTEM=BaTiO3
    ISTART =0
    ICHARG =2
    PREC =Accurate
    ENCUT =520
    EDIFF =0.1E-07
    ISMEAR = 0
    LWAVE=.FALSE.
    LCHARG = .FALSE.
    NELM = 200
    DIPOL = 0.5 0.5 0.5
    LCALCPOL=.TRUE
  4. 计算完成后运行命令:

    1
    2
    3
    grep 'dipole moment' OUTCAR|rev| awk '{printf ("%s ", $4)}'|rev|awk '{printf ("%f\n", $1+$2)}' >> ../dipole_c.dat

    grep 'free energy TOTEN' OUTCAR | awk '{printf ("%s\n",$5)}' >> ../energy.dat

    这里通过 grep 命令产生的 dipole_c.dat 文件记录的是沿着 c 方向的极化值,这是因为 BaTiO3 是沿着 c 方向极化的。对于具体的情况需要自行修改。

  5. 处理和分析数据。

    首先要理清数据单位。VASP 计算得到的 dipole moment 的单位是 e*Å,它与库仑之间换算为:

    $1e = 1.602176634 * 10^{-19} C$

    $1Å = 10^{-10} m$

    三维体系的极化强度: 极化值除以体积。单位为 e/Å2;二维体系的极化强度:极化值除以面积。单位为 e/Å。

    在这个例子中,BaTiO3 的体积为 64.3586 Å3。接下来,我们来处理数据。用energy.dat 文件 (单位为 eV),这样,我们就得到每个中间结构 (image) 的总能:0402
    用dipole_c.dat 文件 (单位: e*Å):不同 image 的极化值如图所示0403
    可以发现,该极化强度不是连续的,这是和选取的原胞有关,需要考虑极化量子的影响。BaTiO3 沿着 c 方向极化,所以需要对该极化值加减整数倍的 c 方向的晶格常数。这样我们得到下图:0404

    选取最靠近中间极化强度为 0 的那条曲线,即为 BaTiO3 的极化强度曲线:0405

    除以体积并进行简单的单位换算后为:0406
    另外,我们也可以绘制极化值 P 与能量 E 曲线0407
    因此, BaTiO3 的极化强度大约为 0.248 C/m2,与文献中的实验结果 0.26 C/m2 吻合。(Physical Review, 99(4), 1161–1165, 1955 )

    拟合 Landau-Ginzburg 公式

    $E= \sum_{i} A/2 * P_i^2 + B/4 * P_i^4 + C/6 * P_i^6 + D/2 * \sum_{i,j}(P_i-P_j)^2$

拟合该多项式曲线,得到

$E = 6062.434883706029P^6 + 2437.756598493882P^4 + -340.5806845162749*P^2 + 10.339600058315137$
其中参数 A, B, C 分别为

$A = -0.68116 eV *(m^2/C)^2
B = 9.75103 eV *(m^2/C)^4
C = 36.37461 eV *(m^2/C)^6$
0408

  1. 绘制能量曲线的脚本
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open('energy.dat','r') as f:
    content = f.readlines()
    res = [float(i.strip('\n')) for i in content]
    minres = min(res)
    res = [1e3*(i-minres) for i in res]
    import matplotlib.pyplot as plt
    plt.figure()
    plt.plot(res,'b.-')
    plt.xlabel('displacement')
    plt.ylabel('Energy ($meV$)')
    plt.show()

绘制dipole曲线,以及考虑极化量子的脚本:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
with open('dipole_c.dat','r') as f:
content = f.readlines()
res = [float(i.strip('\n')) for i in content]

import matplotlib.pyplot as plt
plt.figure()
plt.xlabel('displacement')
plt.ylabel('Polarization ($e*{\AA}$)')
plt.xlim([0,32])
plt.plot(res,'r.')


### 考虑极化量子
c = 4.0335000000000001
tmp = []
N = 20
for j in range(N):
start = -N/2+j
tmp1 = [i+start*c for i in res]
# print(tmp1[0])
tmp.append(tmp1)
plt.figure()
for i in tmp:
plt.plot(i,'.')

#plt.ylim([-2,2])
plt.xlabel('displacement')
plt.ylabel('Polarization ($e*{\AA}$)')
plt.xlim([0,32])

### 单位换算
P = [-1.1965400000000006, -1.1288099999999996, -1.060039999999999, -0.990219999999999, -0.9193599999999993, -0.8474299999999992, -0.7744599999999995, -0.7004900000000003, -0.6255299999999995, -0.5496499999999997, -0.4728999999999992, -0.3953799999999994, -0.31716999999999906, -0.2384000000000004, -0.1591799999999992,-0.11827, 0.0, 0.11827, 0.1591799999999992, 0.2384000000000004, 0.31716999999999906, 0.3953799999999994, 0.4728999999999992, 0.5496499999999997, 0.6255299999999995, 0.7004900000000003, 0.7744599999999995, 0.8474299999999992, 0.9193599999999993, 0.990219999999999, 1.060039999999999, 1.1288099999999996, 1.1965400000000006]
plt.figure()
P = [i*0.248945227832799346 for i in P]
plt.xlabel('displacement')
plt.ylabel('Polarization ($C/m^2$)')
plt.xlim([0,32])
plt.plot(P,'r.')
plt.show()

绘制极化值 P 与能量 E 曲线的脚本:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
E = [0.0035557599999975764, 0.0016252999999935014, 0.0004821100000000911, 0.0, 5.983999999870093e-05, 0.0005505999999968481, 0.0013690299999993272, 0.0024182999999950994, 0.003608839999998281, 0.004859239999994713, 0.006096989999996083, 0.007258279999994954, 0.008287759999994648, 0.009138139999997463, 0.00977216999999797, 0.010162939999993625, 0.010294929999993485, 0.010162939999993625, 0.00977216999999797, 0.009138139999997463, 0.008287759999994648, 0.007258279999994954, 0.006096989999996083, 0.004859239999994713, 0.003608839999998281, 0.0024182999999950994, 0.0013690299999993272, 0.0005505999999968481, 5.983999999870093e-05, 0.0, 0.0004821100000000911, 0.0016252999999935014, 0.0035557599999975764]
P = [-1.1965400000000006, -1.1288099999999996, -1.060039999999999, -0.990219999999999, -0.9193599999999993, -0.8474299999999992, -0.7744599999999995, -0.7004900000000003, -0.6255299999999995, -0.5496499999999997, -0.4728999999999992, -0.3953799999999994, -0.31716999999999906, -0.2384000000000004, -0.1591799999999992,-0.11827, 0.0, 0.11827, 0.1591799999999992, 0.2384000000000004, 0.31716999999999906, 0.3953799999999994, 0.4728999999999992, 0.5496499999999997, 0.6255299999999995, 0.7004900000000003, 0.7744599999999995, 0.8474299999999992, 0.9193599999999993, 0.990219999999999, 1.060039999999999, 1.1288099999999996, 1.1965400000000006]
import matplotlib.pyplot as plt
import numpy as np

E = [1e3*i for i in E]
P = [i*0.248945227832799346 for i in P]

plt.figure()
plt.plot(P,E,'b.-')
plt.xlabel('Polarization ($C/m^2$)')
plt.ylabel('Energy ($meV$)')

f1 = np.polyfit(P, E, 6)
poly = ''
for i in range(len(f1)):
poly += '{}*x^{} + '.format(f1[i],len(f1)-i-1)
print(poly)

x = [ -0.35+0.7*i/99 for i in range(100)]
Eval = np.polyval(f1,x)
plt.figure()
plt.plot(x,Eval,'b')
plt.plot(P,E,'r*')
plt.xlabel('Polarization ($C/m^2$)')
plt.ylabel('Energy ($meV$)')
plt.show()

拉曼计算

VASP中计算拉曼谱主要使用vasp_raman.py这个脚本,见github:
https://github.com/raman-sc/VASP

使用raman-sc有几个注意的地方:https://zhuanlan.zhihu.com/p/354651066

作者这里提供了一个算例。供大家参考链接:https://pan.baidu.com/s/1dTCP_0bRcRo0uIy0rBGttQ
提取码:4vp8

  1. 这个代码已经年代久远,使用python2写的,对大部分新学vasp的同学来说可能装的anaconda3,既使用的是python3,与python2代码是不兼容的,作者这里对vasp_raman.py进行了改写,方便python3环境运行这段代码。下载见附件。
  2. raman.sub既提交代码的脚本,需要根据自己的软件环境进行更改,我这里给出我的提交脚本供大家参考:
    export VASP_RAMAN_RUN=’mpirun -np 64 /public/home/wangxiaohui/vasp/vasp.5.4.4/bin/vasp_std &> job.out ‘意思是运行vasp的命令,找一下vasp_std所在路径

python /public/home/wangxiaohui/WORKSPACE/Ti3C2Li2/raman/zhenraman/vasp_raman.py > vasp_raman.out这里是运行raman.py代码的意思,既raman.py代码所在路径

  1. 查看raman.py代码内容得知,POSCAR.phon和OUTCAR.phon是前一步计算的结果文件,不要被作者的例子给坑了。并且POSCAR.phon,OUTCAR.phon和INCAR等文件放在同一个文件夹下。

按照脚本VASP需要计算两步:

第一步,计算Gamma点声子。用有限位移方法或者DFPT方法。

第一步结束后,执行,

cp POSCAR POSCAR.phon

cp OUTCAR OUTCAR.phon

第二步,计算宏观介电常数的导数。用vasp_raman.py 脚本。

DFPT: LEPSILON=.TRUE.

频率依赖的介电矩阵: LOPTICS=.TRUE.

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#PBS -l select=1:ncpus=32:mpiprocs=32
#PBS -l walltime=01:00:00
#PBS -q debug
#PBS -j oe
#PBS -N Example
#PBS -V

cd $PBS_O_WORKDIR

ulimit -s unlimited # remove limit on stack size

export VASP_RAMAN_RUN='mpirun -n 12 /u/afonari/vasp.5.3.2/vasp.5.3/vasp &> job.out' #a按照自己路径更改
export VASP_RAMAN_PARAMS='01_10_2_0.01' #b按照自己材料更改

python27 vasp_raman.py > vasp_raman.out

a. VASP_RAMAN_RUN设置调用VASP的命令

b. VASP_RAMAN_PARAMS=01_10_2_0.01

1
2
3
4
FIRST_MODE - 整数, 第一个计算的振动模
LAST-MODE - 整数, 最后一个计算的振动模
NDERIV - 整数, 有限位移的策略选择,目前只有2这一种选择
STEPSIZE - 浮点数, 有限位移步长,单位是Angstroms,一般选默认就可以

注意:以上这种设置格式允许我们并行计算大体系拉曼,我们可以在计算大体系的时候将Γ点的振动频率分为很多段分别计算,这样会大大提高我们计算大体系的效率。

在多段计算的时候。具体细节上要把每一段计算的OUTCAR.000n.-1.out和OUTCAR.000n.-1.out文件拷贝到同一个文件夹下,然后注释掉vasp_raman.py脚本中的运行VASP的命令。运行python2.7 vasp_raman.py > vasp_raman.out 即可得到整段的数据。

vasp_raman.py文件中执行VASP的行为331行:

1
2
3
else: # run VASP here
print "[__main__]: Running VASP..."
os.system(VASP_RAMAN_RUN) #注释掉这一行

加展宽

使用脚本broaden.py给出展宽谱,可以选择洛伦兹线型或者高斯线型。

$ python2 broaden.py result.txt
生成result.txt-broaden.dat文件,画图即可。

需要注意的是,broaden.py的第23和24行分别代表频率和强度所在列。其设置文件中对应的列。

cm1 = hw[:,1]
int1 = hw[:,2]

红外谱计算

  1. 红外谱主要是因为振动模在振动前后偶极矩发生变化,从而产生后外吸收。在振动过程中引起偶极矩改变的振动都具有红外活性。

  2. 根据上述原理,我们首先需要在计算过程中计算Gamma点的振动模,其次,我们需要计算伯恩有效电荷。

有限位移方法INCAR关键参数:

IBRION = 5
NWRITE = 3
POTIM = 0.015
LEPSILON = .TRUE
DFPT方法INCAR关键参数:

IBRION = 7
NWRITE = 3
NSW = 1
LEPSILON = .TRUE.
NELMIN=6

另外,建议进行k点测试直到伯恩有效常数收敛。

  1. 后处理

    计算得到OUTCAR,然后文件夹下运行脚本。运行结果如下:

sh IR.sh

上面的振动模和活性是归一化以后的结果,也就是运行结果intensities/results/results.txt的内容。文件intensities/results/exact.res.txt是归一化之前的内容。

  1. 展宽

使用脚本broaden.py给出展宽谱,可以选择洛伦兹线型或者高斯线型。

$ python2 broaden.py result.txt
生成result.txt-broaden.dat文件,画图即可。

约束DFT

vasp中实现

https://wiki.kfki.hu/nano/Easy_manual_occupancy_of_Kohn-Sham_levels_with_FERWE_and_FERDO

The vasp wiki tells that one can set manual uccupancy with FERWE and FERDO:

One has to converge a WAVECAR before proceeding further.

Let say your system contain 2042 electrons. Assume the ground state is a closed shell singlet. It looks enough to do the calculation without any spin polarization with ISPIN=1 since both the ground and the excited state must have the same spin singlet wavefunction. But in order to move an electron from the HOMO to the LUMO one has to preconverge the ground state with ISPIN=2.

To do an excitation, one has to promote an electron from spatial orbital #1021 to #1022. To do so, one has to

ISTART = 1

ISTART=2 also might work, but ISTART =1 is not a simple vasp continuation. ISTART=1 will transform the old WAVECAR into the new job’s bases, or truncate the bands, or create new ones if the continuation job have more NBANDS setting than the original. Keep in mind NBANDS sighly varies with the number of MPI threads on which VASP is being executed, since NBANDS/THREADS must be an integer. VASP will automatically increase this value accordingly regardless your NBANDS is fixed.

ISMEAR = -2

ISPIN = 2 # 1020 1021 1022 1023 just a commend line

FERWE = 10201.0 10.0 11.0 10000.0 #The syntax is BANDS*OCC

FERDO = 10201.0 11.0 10.0 10000.0

The 1000*0.0 means zero electron for the next bands. Note this will do not override the NBANDS = 1150 setting is this will dont calculate 2022 bands, the bands after 1150 defined with FERWE and FERDO will be simply ignored.

The following SCF cycle alterations also required for HSE06 deltaSCF calculations:

ALGO = All TIME = 0.4 LDIAG = .FALSE. LSUBROT = .FALSE.

shf3
the shellpack have the option to copy the WAVECAR along the with the inputs. OTHER=”diamSiV.WAVECAR.gz” Just uncomment the OTHER in your *.guide file!

弹性常数

基本概念

弹性常数描述了晶体对外加应变的响应的刚度。在材料的线性变形范围内(应变较小的情况下),体系的应力与应变满足胡克定律。也就是说,对于足够的小的变形,应力与应变成正比,即应力分量(S)是应变分量(E)的线性函数,三维材料的弹性刚度常数矩阵是6×6的。公式中Cij就是我们通常所说的弹性常数。因为刚度矩阵是对称矩阵,因此,弹性常数的独立张量元数目至多只有21个。对不同的晶系的晶体,因为对称性的关系,其独立的弹性常数是确定的。因此,晶系的对称性越高,独立的张量元数目越少。
立方晶系 ——只有3个独立矩阵元(C11,C12,C44)
六角晶系 ——有5个独立矩阵元(C11,C12,C13,C33,C44)
三角晶系
a) 32,3m,-32/m——有6个独立矩阵元(C11,C12,C13,C14,C33,C44)
b) 3,-3,——有8个独立矩阵元(C11,C12,C13,C14,C15,C33,C44,C45)
四方晶系
a) 422,4mm,-42m,4/mmm——有6个独立矩阵元(C11,C12,C13,C33,C44,C66)
b) 4,-4,4/m——有7个独立矩阵元(C11,C12,C13,C16,C33,C44,C66)
正交晶系 ——有9个独立矩阵元(C11,C12,C13,C22,C23,C33,C44,C55,C66)
单斜晶系 ——有13个独立矩阵元
三斜晶系 ——有21个独立矩阵元

计算过程

采用第一性原理计算弹性常数有两种方法,第一种方法是应力-应变方法, 即通过给结构施加不同应变,分别计算出所对应的应力大小,然后利用公式(1)拟合得到一次项系数,从而得到。第二种方法是能量-应变方法, 即通过给结构施加不同应变后计算出体系总能相对于基态能量变化(应变能),再利用公式(2)进行二次多项式拟合,其中二次多项式系数是晶体的某个弹性常数或者弹性常数组合。第一种方法优点是每进行一次计算可一次得到六个独立分量,缺点是为了得到准确的应力大小,必须选择更高的截断能和更密集的K格点。在同样的精度下,能量-应变法相比应力-应变方法要求的截断能和K点数目相对较少,缺点是计算应变数目有所增加。VASPKIT中弹性常数计算基于能量-应变法,目前不支持三斜晶系。
一般计算弹性常数我们可以采用应变应力或者应变能量关系,进行拟合。或者可以直接通过VASP直接计算。

方法一:

首先介绍直接用VASP在输入文件中添加参数进行计算的方法。

  1. 当然首先要进行结构优化,

  2. 在INCAR中添加关键参数,进行弹性常数的计算

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    NSW=1
    EDIFFG=-1e-3
    ISIF=3
    IBRION=6 #计算弹性常数
    POTIM=0.015
    NFREE = 4
  3. 计算完成后可以查看OUTCAR得到弹性刚度矩阵。或者可以利用VASPKIT直接得到弹性常数。
    请注意OUTCAR中的刚度矩阵是未经过处理的刚度矩阵,二维材料需要乘以C轴长度的0.01,还需要了解Voigt简标,11>1 22>2 33>3 23>4 13>5 12>6。然后我们通过Origin等工具绘图即可得到材料的杨氏模量,泊松比等力学性质。

方法二:

VASPKIT和VASP计算晶体的弹性常数具体计算步骤分为:

  1. 准备优化彻底的POSCAR文件,注意通常采用标准的惯用原胞计算弹性常数,如果不确信POSCAR文件中是否是标准的惯用原胞,可以用vaspkit-603/604生成标准结构;

  2. 运行vaspkit 选择102生成KPOINTS,由于计算弹性常数对K-mesh要求很高,因此对于半导体(金属体)体系,生成K点的精度应不小于 0.03(0.02)×2π {\AA}^{-1}

  3. INCAR参考设置如下;

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Global Parameters
    ISTART = 0
    LREAL = F
    PREC = High (截断能设置默认值1.5-2倍)
    LWAVE = F
    LCHARG = F
    ADDGRID= .TRUE.
    Electronic Relaxation
    ISMEAR = 0
    SIGMA = 0.05
    NELM = 40
    NELMIN = 4
    EDIFF = 1E-08
    Ionic Relaxation
    NELMIN = 6
    NSW = 100
    IBRION = 2
    ISIF = 2 (切记选择2,如果选择3会把施加应变后原胞重新优化成平衡原胞)
    EDIFFG = -1E-02
  4. 准备VPKIT.in文件并设置第一行为1(预处理);运行vaspkit并选择201, 将生成用于计算弹性常数文件;

    {.line-numbers}
    1
    2
    3
    4
    1                    ! 设置1将产生计算弹性常数的输入文件,2则计算弹性常数
    3D ! 2D为二维体系,3D为三维体系
    7 ! 7个应变
    -0.015 -0.010 -0.005 0.000 0.005 0.010 0.015 ! 应变变化范围
  5. 批量提交vasp作业;
    总计有9个大文件夹,分别以该空间群所需要的独立弹性常数来命名;在每个大文件夹内则是以应变强度命名的实际计算执行的文件夹,文件夹的数量可根据预处理的VPKIT.in文件的最后一行的应变设置来更改。在每一个应变文件夹内则是施加了应变的POSCAR和事先准备好的INCAR、KPOINTS和POTCAR文件的链接,可直接进行vasp计算。
    这里通过一个简单的两重for循环命令依次序完成所需要的计算任务。
    脚本 :

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/bin/bash
    path=`pwd`
    #记录当前文件夹位置并定义到变量 path中,称为初始目录
    pwd
    for cij in `ls -F | grep /$`
    #ls -F| grep /$ 命令为返回当前文件夹中所有子目录
    #将所有子目录添加到变量cij中,并准备进行for循环
    do
    cd ${path}/$cij
    #进入cij变量所代表的子目录中
    pwd
    for s in strain_*
    #将cij代表的子目录中所有strain文件夹添加到变量s中
    #此部添加变量s的方式可更改为添加变量cij的方式,但不建议这么做
    do
    cd ${path}/$cij/$s
    #进入初始目录下变量cij和变量s组成的目录,由于for循环的设置,将遍历所有可计算的strain文件夹
    pwd
    mpirun -np 16 vasp_std
    #执行vasp计算
    cd ${path}
    #返回初始目录
    pwd
    done
    done
  6. 再次修改VPKIT.in文件中第一行为2(后处理),然后再次运行vaspkit并选择201,得到以下结果;

  7. 如果在计算弹性常数时希望强制固定某个体系的空间群,可在SYMMETRY.in文件第二行设置空间群,这样晶系将通过指定空间群判断并计算相应的独立弹性常数,这对于掺杂或者合金体系比较有用。

根据弹性常数计算和三维可视化材料力学量

首先利用VASPKIT-204命令得到体弹性模量、杨氏模量、剪切模量及泊松比随角度的依赖关系,具体算法可参考文献【J. Phys. Condens. Matter, 28, 275201 (2016)和Comput. Phys. Commun. 181, 2102–2115 (2010)】。接下来我们以某单斜体系的弹性常数为例来演示如何进行材料力学量三维可视化。

  • 第一步新建ELASTIC_TENSOR.in并输入6x6弹性常数矩阵,注意第一行是注释行不可省略。如果是二维体系,则输入文件为ELASTIC_TENSOR_2D.in,注意二维体系弹性常数矩阵大小为3x3。
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    # comment line (in GPa)
    228.38 85.741 81.503 0 -0.737 0
    85.741 217.47 94.201 0 -20.213 0
    81.503 94.201 178.81 0 -9.472 0
    0 0 0 35.094 0 -17.851
    -0.737 -20.213 -9.472 0 37.778 0
    0 0 0 -17.851 0 42.708
  • 第二步运行VASPKIT 204命令得到MECHANICS_3D.dat
    打开MECHANICS_3D.dat可看到第一行给出了每一列数据所代表的物理量,第二行给出了球坐标系下分别划分仰角θ∈[0,180]和方位角ϕ∈[0,360]的格点大小。
  • 第三步从vaspkit/examples/angular_dependent_mechanics (VASPKIT ver. >= 1.3.2)文件夹中拷贝mechanics_3d_plot_matlab.m到当前目录,调用Matlab软件运行该脚本,得到以下信息.
    如果我们想可视化杨氏模量,则输入2回车即可得到。
  • 另外,以下两个软件也可以实现材料力学量三维可视化。
    Elate
    ElasticPOST

介绍

ALAMODE中非谐声子计算部分采用了自洽声子计算方法。

具体教程:https://alamode.readthedocs.io/en/latest/anphondir/formalism_anphon.html#self-consistent-phonon-scph-calculation

https://www.bilibili.com/video/BV1mv411M7W7/?spm_id_from=333.999.0.0&vd_source=17084cc867ff3bb86398ff1a79b443f2

TDEP 是其采用技术Temperature dependent effective potential的缩写。
下面是开发者的网站,但是并不能下载到源代码。http://ollehellman.github.io/page/index.html好消息是第一性原理计算软件ABINIT中集成了TDEP方法,官网user guide>a-TDEP。需要研究的可以自行研究。ABINIT官网:https://www.abinit.org/

Dynaphopy 是采用了一种基于AIMD(第一性原理分子动力学)的杂化方法的python程序包:http://abelcarreras.github.io/DynaPhoPy/index.html
文中给出了参考文献,需要的自行下载。

ALAMODE

安装

https://alamode.readthedocs.io/en/latest/index.html#

ALAMODE计算Si简谐声子谱

1、利用ALM计算displacement patterns

优化后的超胞结构重命名POSCAR.orig,准备输入文件si_alm.in

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
&general
PREFIX = si222
MODE = suggest
NAT = 64; NKD = 1
KD = Si
/

&interaction
NORDER = 1 # 1: harmonic, 2: cubic, ..
/

&cell
20.406 # factor in Bohr unit
1.0 0.0 0.0 # a1
0.0 1.0 0.0 # a2
0.0 0.0 1.0 # a3
/

&cutoff
Si-Si None
/

&position
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
1 0.0000000000000000 0.0000000000000000 0.5000000000000000
1 0.0000000000000000 0.2500000000000000 0.2500000000000000
1 0.0000000000000000 0.2500000000000000 0.7500000000000000
1 0.0000000000000000 0.5000000000000000 0.0000000000000000
1 0.0000000000000000 0.5000000000000000 0.5000000000000000
1 0.0000000000000000 0.7500000000000000 0.2500000000000000

晶格常数替代为自己的超胞结构。

运行ALM: alm si_alm.in > si_alm.log1,将会生成si222.pattern_HARMONIC文件,包含坐标信息。对于Si只有一个displacement patterns。

2、计算原子间力

在此之前要确定位移的大小,一般简谐0.01-0.04,0.01大多可以。运行python displace.py --VASP=POSCAR.orig --mag=0.01 -pf si222.pattern_HARMONIC

之后对每个结构提交计算,脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# Assume we have 20 displaced configurations for QE [disp01.pw.in,..., disp20.pw.in].

for ((i=1;i<=20;i++))
do
num=`echo $i | awk '{printf("%02d",$1)}'`
mkdir ${num}
cd ${num}
cp ../disp${num}.pw.in .
pw.x < disp${num}.pw.in > disp${num}.pw.out
cd ../
done

计算完成后,提取信息:python extract.py --VASP=POSCAR.orig vasprun*.xml > DFSET_harmonic,生成DFSET_harmonic文件。

3、拟合力常数

修改1中的 si_alm.in

1
2
3
4
5
6
7
8
9
10
&general
PREFIX = si222
MODE = optimize # <-- here
NAT = 64; NKD = 1
KD = Si
/

&optimize
DFSET = DFSET_harmonic
/

运行alm si_alm.in > si_alm.log2,生成si222.fcs and si222.xml

4、计算声子谱和DOS

准备si_phband.in文件,结构中用晶胞结构,注意&cell中单位是Bohr,具体可设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&general
  PREFIX = si
  MODE   = phonons
  FCSXML = si.xml

  NKD = 1; KD = Si
  MASS = 28.085
/

&cell
  10.184247326051628 
  0.0000000000000000    0.5071343999939496    0.5071343999939496
  0.5071343999939496    0.0000000000000000    0.5071343999939496
  0.5071343999939496    0.5071343999939496    0.0000000000000000
/

&kpoint
  1   # KPMODE = 1: line mode
  G 0.0 0.0 0.0 X 0.5 0.5 0.0 51
  X 0.5 0.5 1.0 G 0.0 0.0 0.0 51
  G 0.0 0.0 0.0 L 0.5 0.5 0.5 51
/

执行anphon si_phband.in > si_phband.log会产生si.bands文件,可以用plotband.py脚本画图。执行python plotband.py si.bands得到

准备si_phdos.in文件,结构中用晶胞结构,注意&cell中单位是Bohr,具体可设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&general
  PREFIX = si
  MODE   = phonons
  FCSXML = si.xml

  NKD = 1; KD = Si
  MASS = 28.085
/

&cell
  10.184247326051628 
  0.0000000000000000    0.5071343999939496    0.5071343999939496
  0.5071343999939496    0.0000000000000000    0.5071343999939496
  0.5071343999939496    0.5071343999939496    0.0000000000000000
/

&kpoint
  2   # KPMODE = 2: uniform mesh mode
  20 20 20
/

执行anphon si_phdos.in > si_phdos.log会产生si.dos文件,可以用plotdos.py脚本画图。执行python plotdos.py –emax 550 –nokey si.dos得到

5. 估算对热导率的立方IFCs(非简谐IFCs)

这里计算非简谐IFCs,我们把si_alm1.in复制为si_alm3.in,将NORDER = 1改为NORDER = 2.我们还要注意这里考虑计算三阶力常数,所以&cutoff下的参数我们要再指定个截止半径,一般要求略大于第二近邻的距离(可以从si_alm1.log查看,如下图)。当然你接着用None也行,这样可能大大增加参数的数量,从而增加计算成本。

运行alm si_alm3.in > si_alm3.log,可以看到多了si_cubic.相关文件。运行python displace.py –OpenMX=Si.dat –mag=0.04 -pf si_cubic.pattern_ANHARM3,可见产生了disp01.dat到disp11.dat11个OpenMX输入文件,我们准备shell脚本批量提交,shell脚本命名为pbs.sh,具体为

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

for ((i=1;i<=11;i++))
do
    num=`echo $i | awk '{printf("%02d",$1)}'`
    mkdir ${num}
    cd ${num}
    cp ../disp${num}.dat .
    cp disp${num}.dat Si.dat
    cp ../openmx.pbs .
    qsub openmx.pbs
    cd ../
done

总结

简谐计算步骤

  1. 输入文件: 优化后的超胞结构重命名POSCAR.orig,准备输入文件si_alm.in(其中mode:suggest);输出:si222.pattern_HARMONIC文件,包含坐标信息。
  2. displace.py对上面的.pattern文件处理,得到随机位移结构;对随机位移机构进行力的计算,生成不同vasprun.xml;extract.py处理上面vasprun.xml,生成DFSET_harmonic文件。
  3. 力常数拟合输入文件:DFSET_harmonic文件,修改1中的 si_alm.in,其中mode改成opt, 添加下面;生成si222.fcs and si222.xml
    1
    2
    3
    &optimize
    DFSET = DFSET_harmonic
    /
  4. 后处理输入文件:准备phband.in文件,修改MODE   = phonons
      FCSXML = si.xml;修改kmesh格式可得到声子谱、态密度、热性质等。

非谐计算

  1. 准备简谐计算得到的si222.fcs and si222.xml,AIMD得到的vasprun.xml,超胞结构。
  2. displace.py 对AIMD的vasprun.xml处理,得到随机结构;对随机位移机构进行力的计算,生成不同vasprun.xml;extract.py处理上面vasprun.xml,生成DFSET_AIMD_random文件。
  3. Cross validation (CV):alm_cv.in文件中添加简谐力常数 FC2XML = ../harmonic.xml,添加高阶力常数部分标签和cv相关标签,mode = cv;得到*cvset文件;python3 cvscore.py *cvset > si222.cvscore得到Minimum cvscore
  4. 拟合力常数输入文件:alm_opt.in中mode=opt;修改cv相关标签;生成高阶力常数cv.fcs and cv.xml.在这一步alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1可输出ShengBTE格式的输入文件。
  5. SCPH计算:scph.in文件中修改MODE=SCPH和温度标签;添加&scph模块,见上面例子。anphon scph.in > scph.log提交,查看收敛:grep “conv” scph.log。生成输出文件:.scph_dymat、.scph_dfc2、.scph_bands。对.scph_dfc2处理得到有效二阶力常数文件,用于后续计算。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >dfc2
    DFC2--a generator of renormalized harmonic FCs from SCPH outputs.
    XML file containing original Fc2 : STo222.xml
    Output xml filename with anharmonic correction : ST0222_SCPH2-2_300K.xml
    FC2 correction file fromSCPH calculation :STo_scph2-2.scph_dfc2
    Target temperature : 300


    New XML file STo222_SCPH2-2_300K.xml was created successfully.

Alamode计算高温声子色散

Anharmonic Phonons (self-consistent phonon theory)
主要使用alamode软件。 版本:alamode-1.1.0

输入文件

1
2
3
4
5
6
7
vasprun.xml #分子动力学输出文件
Dfile #包含原子的力和位移
extract_disp.py #选取结构,并计算位移
extract_force.py #选取结构,并获得受力
PPOSCAR #初始超胞
alm.in #提取力常数的输入文件
anphono.in #计算声子谱的输入文件
  1. 从分子动力学数据中选取一定数量的结构,并提取它们的力和计算与初始状态相比的位移,输出到Dfile文件当中

python extract_disp.py
#运行后根据提示输入开始的步数和间隔步数
#例如总共1000步,从第一步开始提取,每间隔五步提取一次
#得到disp.dat

python extract_force.py

方法同上得到force.dat
将disp.dat和force.dat文件按如下形式合并到一起

1
2
3
4
disp1x  disp1y  disp1z   force1x  force1y  force1z
......
......
dispNx dispNy dispNz forceNx forceNy forceNz
  1. 获取力常数

提取四阶力常数的alm.in文件如下(使用LASSO方法):

二阶力常数可以通过有限位移法提取(详见官网手册)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
&general
PREFIX = ThO2_ENET
MODE = optimize
NAT = 81; NKD = 2
KD = Th O
# PRINTSYM=1
/

&interaction
NORDER = 5 # 1: harmonic, 2: cubic, ..
NBODY = 2 3 3 2 2
/

&cell
1 # factor in Bohr unit
0.0000000000000 15.919498944104 15.919498944104
15.919498944104 0.0000000000000 15.919498944104
15.919498944104 15.919498944104 0.0000000000000
/

&optimize
LMODEL= enet
FC2XML = ThO2_2nd.xml
DFSET=ThO2_dffile

CV = 0
L1_RATIO = 1.0
L1_ALPHA = 1.0e-06
CV_MINALPHA = 1.0e-6
CV_MAXALPHA = 0.02
CV_NALPHA = 100

STANDARDIZE = 1
CONV_TOL = 1.0e-9
/

&cutoff
*-* None None 12.0 12.0 12.0
/

&position
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
1 0.3333333333333333 0.0000000000000000 0.0000000000000000
..................

注意晶格常数单位的转换 $1 Bohr= 0.529177208 Angstrom$

在终端运行:

bash
alm alm.in > alm.log
得到Nb.xml

  1. Anharmonic Phonon

anphono.in输入文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
&general
PREFIX =scph
MODE = SCPH
FCSXML =Nb.xml #forceconstant file

NKD = 1; KD = Nb
MASS = 92.90638

#NONANALYTIC = 0; BORNINFO = PbTe.born

TMIN = 0; TMAX = 300; DT = 100 #Temperature and step
/

&scph
KMESH_SCPH = 6 6 6
KMESH_INTERPOLATE = 6 6 6

SELF_OFFDIAG = 0
RESTART_SCPH = 0

MIXALPHA = 0.1
MAXITER = 500
TOL_SCPH = 1.0e-10
/

&cell ## primitive cell is best
6.2507550151332
-0.5 0.5 0.5
0.5 -0.5 0.5
0.5 0.5 -0.5
/

&kpoint
1 # KPMODE = 1: get phonon band 2: get others properties
G 0.0 0.0 0.0 H 0.5 -0.5 0.5 201
H 0.5 -0.5 0.5 P 0.25 0.25 0.25 201
P 0.25 0.25 0.25 G 0.0 0.0 0.0 201
G 0.0 0.0 0.0 N 0.0 0.0 0.5 201
/

在终端运行:

anphon anphono.in > anphono.log
得到scph.scph_bands,里面有不同温度下的声子谱

  1. 进入安装目录下的tools文件夹:make Makefile,编译df2c。
    1
    2
    3
    4
    5
    6
    [scf1355@ln151%nc-l ah]$ ~/soft/alamode/tools/dfc2 
    DFC2 -- a generator of renormalized harmonic FCs from SCPH outputs.
    XML file containing original FC2 : crte2-442.xml
    Output xml filename with anharmonic correction : crte2-new.xml
    FC2 correction file from SCPH calculation : crte2-442.scph_dfc2
    Target temperature : 300

输出crte2-new.xml.利用https://github.com/ttadano/alamode/discussions/192 中提到的脚本转换成phonopy格式。此时的力常数文件由于对称性数量不匹配,利用phonopy读取并写出FULL_FORCE_CONSTANTS。

Alamode_to_ShengBTE

Alamode计算热导率步骤

  1. 所有的计算都是基于密度泛函软件 VASP 来进行的。
  2. 首先利用第一性原理的密度泛函对晶体结构进行优化,弛豫出稳定的晶格结构,然后利用密度泛函微扰理论计算出波恩有效电荷和静态介电张量,以便用于后续求解动力学矩阵的非解析部分。
  3. 随后为了获得更加精准的二阶力常数,通过差分位移的方法生成微扰结构,后利用静态密度泛函理论计算出力和位移信息,再利用最小二乘法得到所需要的二阶力常数。
  4. 对于高阶力常数,本文利用分子动力学模拟得到 80 个准随机结构,对每个准随机结构的原子施加随机方向的微小位移,以便得到更加随机的结构,最后利用最小绝对收缩和选择算子的方法得到高阶力常数。
  5. 结合上述已经得到的介电张量、波恩有效电荷、二阶力常数和三阶力常数作为输入,最后通过ShengBTE声子玻尔兹曼输运方程求得简谐近似下晶格热导率、声子群速度、 声子散射率等热输运系数。
  6. 结合介电张量、波恩有效电荷、二阶力常数和四阶力常数作为输入进行自洽声子理论的计算,这将得到与温度相关的非谐动力学矩阵,对其进行傅里叶变换得到与温度相关的有效二阶力常数,用有效二阶力常数代替上述的二阶力常数,在此基础上求解声子玻尔兹曼输运方程求得自洽声子理论下晶格热导率、声子群速度、声子散射率等热输运系数。
  7. 在简谐近似下存在虚频,与实验观察到的稳定性不一致。因此,传统的基于简谐原子间力常数的玻尔兹曼输运方程解的结果不再有效,并且非谐效应在足够大的位移振幅内变得显著。在 ALAMODE 软件包中,通过有限位移法在 2×2×2 超胞中获得简谐原子间力常数 (IFCs) ,位移大小设置为 0.01Å。
    随后,通过压缩感知晶格动力学方法训练三阶和四阶力常数。具体来说,本文首先模拟了在 300 K、时间步长为 2fs 的 4000 步的从头算分子动力学,得到了 80 个快照。为了得到准随机结构, 本文将到得到快照中的原子向随机方向移动 0.1 Å。随后,本文将获得的准随机结构在 4×4×4 的 k 点网格中进行了静态 DFT 计算,以计算 Hellmann–Feynman 力。最终,利用得到的 80 个准随机结构的位移和力组成的数据集通过最小绝对收缩和选择算子 (least absolute shrinkage and selection operator,简称 LASSO)方法训练出非谐力常数。
    在计算中本文考虑了超胞内的所有原子间最近邻相互作用来计算简谐和三阶力常数,四阶力常数只考虑了第五最近邻内的相互作用,由于五阶和六阶力常数 对结果的影响很小,因此只考虑了次近邻相互作用。
    本文根据 ALAMODE 软件包中采用的 SCP 理论,利用获得的简谐和非谐力常数来计算非谐声子频率。
    声子玻尔兹曼输运方程的解是通过 ShengBTE 的修订版 FourPhonon 软件包来实现的,并建立了具有高斯涂抹 (scale broad 参数为 0.05) 的 18×18×18 的 q 点网格来模拟相关积分和声子波矢量。此外,在计算中得到了大约 2.3×105 个三声子过程和 1.2×109 个四声子过程。因此,对于三声子散射,本文采用迭代方案来求解玻尔兹曼输运方程,而通过单模弛豫时间近似(SMRTA) 来处理四声子散射过程,这是因为计算成本巨大。

步骤分析

  • 上面第3步,利用alm来算大概分为三步,mode设为suggest产生随机位移,vasp求力和能量,mode设为opt拟合二阶力常数即可。alm模块
  • 上面第4步,利用AIMD产生随机位移,vasp求力和能量,压缩感知晶格动力学方法训练三阶和四阶力常数mode设为cv,随后mode设为opt拟合高阶力常数,alm模块。最后mode设为SCPH获得变温声子谱和有效二阶力常数,anphon模块。后续运行dfc2模块生成指定温度的有效二阶力常数,用https://github.com/ttadano/alamode/discussions/192 中提到的脚本转换成phonopy格式。
  • 上面第5步,为了产生ShengBTE的力常数输入文件,在拟合高阶力常数时,alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1即可。如果简谐声子谱有虚频,上面的有效二阶力常数也需要,即第7步所述。
  • 上面第6步见ShengBTE教程3.2节。
  • Alamode可以得到的结果包括格林艾森常数、声子群速度、三声子相空间、热导率原子贡献率和元素、变温声子谱和态密度、MSD、可视化振动模式、QHA等,anphon模块

Alamode 连接 shengBTE

首先,github上安装最新版本的develop branches 或 feature/shengbte_4ph branches

[3rd 4th IFCs]

拟合力常数时,alm 的输入文件&general 部分加入 FC3_SHENGBTE=1、 FC4_SHENGBTE=1即可。


&general

PREFIX = BN-1000

MODE = opt

NAT = 128

NKD = 2; KD = B N

TOLERANCE = 1.0e-3

FC3_SHENGBTE=1

FC4_SHENGBTE=1

/


Note:输出的文件名为:FORCE_CONSTANT_3RD、FORCE_CONSTANT_4TH,和ShengBTE的文件名差一个S,FORCE_CONSTANTS_3RD、FORCE_CONSTANTS_4TH

[2nd IFCs]

首先通过QE的DFPT计算一个不含SCP的二阶力常数,BN.ifc2。

做SCPH计算,会生成计算温度点的二阶力常数SCP等效修正部分,例如BN.scph_dfc2(仅考虑四声子散射对重整化的影响),若进一步考虑三声子散射的重整化作用,文件名为BN.scph+bubble(0)_dfc2。

alamode/tools/scph_to_qefc.py 可以将SCP的修正部分与QE计算的二阶力常数相加,得到指定温度重整化后的二阶力常数。

Usage:

python scph_to_qefc.py original_QEfc2 scph_fc2_correction temperature > scp_fc2

python scph_to_qefc.py BN.ifc2 BN.scph_dfc2 1000 > espresso.ifc2

Authors and references

Weizhe Yuan yuanwz@stu.hit.edn.cn

注意的问题

  1. The accuracy of the anharmonic force constants can be checked by increasing the size of the training dataset. If the physical properties, such as thermal conductivity and free energy, change significantly with the size of the training dataset, it indicates that the training is insufficient. If the change is minor, your force constants may be OK.

  2. 报错:Warning: The following force constant doesn’t exist in the original file:
    You can neglect this warning as long as the correction term (the last column) is small.
    This warning is raised when the absolute value of the correction is larger than 1.0e-10 and the corresponding force constant does not exist in the original FCSXML file. In your case, the correction term is only slightly above the tolerance. So, it should not cause any problems hopefully.
    When the correction term is much larger than 1.0e-10, this warning indicates a possible error in the inputs. Likely errors are the input structure is not fully symmetrized, or the numerical digits of lattice vectors and fractional coordinates are insufficient.
    the given KMESH_INTERPOLATE is not commensurate with the supercell size of the original FCSXML.

  3. In the current implementation of alamode, only the former choice,
    renormalized 2FCs + conventional (old) 3FCs,
    is supported. Another possible choice may be
    renormalized 2FCs + renormalized 3FCs,
    but it is not supported within alamode yet.
    When MODE = RTA, the anphon code only reads the 2FCs and 3FCs from given XML files. By contrast, when MODE = SCPH, the code additionally reads the 4FCs because they are necessary to compute the renormalized 2FCs based on the self-consistent phonon theory.
    Therefore, the second combination of
    renormalized 2FCs + high order FCs using SCPH
    is not possible.

  4. I performed the SCPH calculation. It is not converged at low temperatures (0K, 100K, 200K), while it achieved convergence at high temperatures (300~1200K).A potential solution is to use a smaller MIXALPHA and a smaller DT.

  5. I would like to use second-order, third-order, and fourth-order force constants to obtain anharmonic potentials and calculate the potential energy as a function of atomic displacement. My goal is to generate a plot similar to the one in the paper “Orbitally driven giant phonon anharmonicity in SnSe” (Nature Phys. 2015).Please use https://github.com/ttadano/alamode/blob/develop/tools/calcpes.py.

  6. now that I have obtained the renormalized force constant file xxx.xml at a finite temperature, I now want to convert the renormalized force constant file directly to FORCE_CONSTANS

  7. How to convert a second-order force constant matrix obtained by almode to FORCE_CONSTANTS in phonopy format?

    python convert.py alamode.xml > FORCE_CONSTANTS

Could you give me some suggestion? How shoud I covert this with phonopy?

FULL_FORCE_CONSTANTS = .TRUE.
WRITE_FORCE_CONSTANTS = .TRUE.
Note: the old FORCE_CONSTANTS will be overwrited

  1. How small the fitting error should be?

It depends on the Taylor expansion potential and displacement magnitude you choose.
In the standard harmonic calculation where –mag=0.01 is used in displace.py and the all harmonic interactions are considered (cutoff = None), the fitting error is usually less than 5% (~1–2% in most cases).
In the calculation of third-order force constants with –mag=0.04, the fitting error should be small as well. Indeed, in many cases, we obtain much smaller fitting errors (< 1%) than the harmonic case.
In the temperature-dependent effective potential method, we try to fit the harmonic potential to the displacement-force datasets sampled by ab initio molecular dynamics at finite temperature. Therefore, the fitting error tends to be much larger (> 10%).

dynaphopy

  1. 简谐声子谱的计算。
    dynaphopy的非谐修正是在phonopy的力常数基础上进行的,需要先进行0k声子谱的计算。
    结构优化的INCAR,力的收敛标准是E-3,大部分的文献也是在这个精度范围内。结构优化的结构是单胞,10个原子。
    这是phonopy计算的声子谱,计算的结构为222的超胞,80个原子,在gmma点和X点有很强的虚频。这个虚频即使提高收敛精度和扩大超胞也是无法消除的。
  2. AIMD计算
    dynaphopy通过读取AIMD的计算结构进行拟合(说法不准确),需要预先准备AIMD的outcar或xdatcar。
    AIMD的计算设置,基本参考dynaphopy的example中的设置,详细的参数涵义,都有教程介绍。
    这里只是采用了3000步的计算,步长是2fs,能量的收敛精度是E-6,不算太高。同样是采用80个原子的超胞。大部分做非谐计算的文献,所采用的都是在80-160原子数范围内的超胞,步长多是1-2fs,总步数大概是3000-6000,总的时长是5ps-10ps。从下面的非谐声子谱结果来看,这个设置对于非谐计算是合适的?
  3. dynaphopy非谐声子谱计算。
    dynaphopy的官网如下:Dynaphopy (abelcarreras.github.io)。
    将结构优化的原始晶胞POSCAR,phonopy输出的力常数,和AIMD的OUTCAR放在一个文件夹内。
    设置dynaphopy的输入文件input如下:分别是输入结构文件,力常数文件,原胞和超胞与POSCAR的关系设置,band是声子谱的高对称点路径,设置方式和vasp计算PBE能带一致。
    然后输入dynaphopy input OUTCAR -i,进入下的界面,选择6,进入非谐声子谱计算,再选择1,可以同时输出简谐声子谱和非简谐声子谱,此时会对peak进行拟合。拟合结束后,会输出声子谱。
    一开始使用默认设置,输出的声子谱,可以看到高温声子谱虚频加重了。从@get-it 大佬处了解到,dynaphopy默认使用最大熵方法拟合,效果可能不如fftw有效。于是小弟将拟合方式改为fftw,通过指令dynaphopy input OUTCAR -i -psm 3,采用快速傅里叶变换拟合。得到300k下的声子谱,可以看到,原来gamma点和X点的虚频,已经被成功消除了。而实验上,这个材料在室温下肯定是稳定的。

当然,如果想要得到更准确的声子谱,需要提高优化精度,采用更大的超胞计算力常数,AIMD需要更多的步数和更小的步长,比如dynaphopy的例子是采用0.7 fs,跑200000步。如果只是想得到一个比较合理的声子谱,适当降低精度是没问题的。比如这个计算,在24核的机器上,结构优化用时不到3小时,dfpt计算1小时,AIMD计算14小时,差不多用时一天,能够得到一个比较合适的声子谱。如果提高精度,计算用时可能会提升数倍,但是声子谱的提升可能并不会太明显。

MC-电声耦合

需要vasp6.0之后的版本,INCAR开启

PHON_LMC = .TRUE.
IBRION = 6

全MC采样

  • 标签PHON_NSTRUCT设置由于MC抽样而生成的结构的数量。应该监视观测值相对于这个数量的收敛。

  • 标签TEBEG=0也是需要的,用于选择运行抽样的温度。

  • 另外,PHON_LBOSE可以设置为.TRUE.或.FALSE. (默认PHON_LBOSE=.TRUE.),分别选择玻色-爱因斯坦统计或麦克斯韦-玻尔兹曼统计。

0K的一个INCAR文件如下:

1
2
3
4
5
6
7
8
System = DEFAULT
PREC = Accurate
ISMEAR = 0; SIGMA = 0.1;
IBRION = 6

PHON_LMC = .TRUE.
PHON_NSTRUCT = 100
TEBEG = 0.0

随后生成Wycoff positions畸变的许多POSCAR,输出为POSCAR.TEBEG.NUMBER

ZG configuration即时采样(one-shot)

这种方法仅使用单一的扭曲结构,因此比完全的MC抽样快上几个数量级,同时保持了与收敛的超晶胞尺寸的完全MC抽样非常接近的准确性。例如,我们展示了对于带隙的零点重整化,准确度在ZG配置和完全MC抽样之间在5毫电子伏特之内。因此,我们建议优先使用这种方法,当很难实现超晶胞尺寸的收敛或者5毫电子伏特的精度已经足够时。

  1. 输入
    要选择ZG配置,必须在INCAR文件中设置PHON_NSTRUCT=0。不同温度的数量和温度列表(以K为单位)必须使用标签PHON_NTLISTPHON_TLIST,在INCAR文件中分别提供。一个示例如下:
    1
    2
    PHON_NTLIST = 4
    PHON_TLIST = 0.0 100.0 200.0 350.0

给出了一个温度范围为0-700K(步长为100K)的示例INCAR文件:

1
2
3
4
5
6
7
8
System = DEFAULT
PREC = Accurate
ISMEAR = 0; SIGMA = 0.1;
IBRION = 6
PHON_NTLIST = 8
PHON_TLIST = 0.0 100.0 200.0 300.0 400.0 500.0 600.0 700.0
PHON_NSTRUCT = 0
PHON_LMC = .TRUE.
  1. 输出

类似于MC抽样,ZG配置方法会产生多个具有不同扭曲Wycoff位置但不变的布里渊矩阵的POSCAR文件。这些文件被标记为

POSCAR.TEMP
其中TEMP遍历由PHON_TLIST定义的所有温度。

one-shot例子(金刚石带隙重整化)

输入文件

INCAR:

1
2
3
4
5
6
7
8
9
10
11
general:
System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1;
IBRION = 6 #获得动力学矩阵声子计算
PHON_LMC = .TRUE. #开启电声耦合计算
PHON_NSTRUCT = 0 #选择one-shot方法
PHON_NTLIST = 1 #温度点个数
PHON_TLIST = 0.0 #对应温度

准备优化后的结构,需要扩胞,以保证声子准确。KPOINTS、POTCAR根据POSCAR调整。

计算

一、获得结构

按照超胞结构和上面的INCAR提交任务,结束后获得OUTCAR。
执行: cp OUTCAR OUTCAR.init
新的畸变后的结构输出为POSCAR.T=0.

二、计算特定位移畸变结构的电子能级

cp POSCAR.T=0. POSCAR

INCAR 修改为

1
2
3
4
5
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1 #去掉PHON_标签

执行计算,完成后cp OUTCAR OUTCAR.T=0.

三、 提取ZPR

具有特殊位移的带隙减去没有特殊位移的带隙,就可以得到零点带隙重整的值。带隙保存在OUTCAR文件里。

执行例子中的脚本:bash extract_zpr.sh,
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash 

i="OUTCAR.T=0."
j="OUTCAR.init"

homo1=`awk '/NELECT/ {print $3/2}' $i`
homo2=`awk '/NELECT/ {print $3/2-1}' $i`
homo3=`awk '/NELECT/ {print $3/2-2}' $i`
lumo1=`awk '/NELECT/ {print $3/2+var+1}' $i`
lumo2=`awk '/NELECT/ {print $3/2+var+2}' $i`
lumo3=`awk '/NELECT/ {print $3/2+var+3}' $i`
lumo4=`awk '/NELECT/ {print $3/2+var+4}' $i`
lumo5=`awk '/NELECT/ {print $3/2+var+5}' $i`
lumo6=`awk '/NELECT/ {print $3/2+var+6}' $i`
e1a=`grep " $homo1 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1b=`grep " $homo2 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1c=`grep " $homo3 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e2a=`grep " $lumo1 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2b=`grep " $lumo2 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2c=`grep " $lumo3 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2d=`grep " $lumo4 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2e=`grep " $lumo5 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2f=`grep " $lumo6 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

homo_ref=`awk '/NELECT/ {print $3/2}' $j`
lumo_ref=`awk '/NELECT/ {print $3/2+var+1}' $j`

h_ref=`grep " $homo_ref " $j | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
l_ref=`grep " $lumo_ref " $j | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

echo "The band gap (in eV) without zero-point vibrations is:"
echo "$h_ref $l_ref" |awk '{print ($2-$1)}'
echo "The band gap (in eV) including zero-point vibrations is:"
echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)}'
echo "The zero-point renormalization of the band gap (in eV) is:"
echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f $h_ref $l_ref" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)-($11-$10)}'

输出如下:

1
2
3
4
5
6
The band gap (in eV) without zero-point vibrations is:
4.4049
The band gap (in eV) including zero-point vibrations is:
4.05102
The zero-point renormalization of the band gap (in eV) is:
-0.353883

精度

精度取决于超胞大小。超胞越大越准确。

温度依赖的带隙计算

输入文件

INCAR:

1
2
3
4
5
6
7
8
9
10
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1;
IBRION = 6 #获得动力学矩阵声子计算
PHON_LMC = .TRUE. #开启电声耦合计算
PHON_NSTRUCT = 0 #选择one-shot方法
PHON_NTLIST = 8 #温度个数
PHON_TLIST = 0.0 100.0 200.0 300.0 400.0 500.0 600.0 700.0

准备优化后的结构,需要扩胞,以保证声子准确。KPOINTS、POTCAR根据POSCAR调整。

计算

一、 获取特定位移的结构

按照超胞结构和上面的INCAR提交任务,结束后获得OUTCAR。
执行: cp OUTCAR OUTCAR.init
新的畸变后的结构输出为POSCAR.T=0. ~ POSCAR.T=700.

二、计算特定位移畸变结构的电子能级
cp POSCAR.T=0. POSCAR

INCAR 修改为

1
2
3
4
5
 System = cd-C
PREC = Accurate
ALGO = FAST
ISMEAR = 0
SIGMA = 0.1 #去掉PHON_标签

对每个温度下的结构执行计算。可通过脚本run_temperature.sh批量提交。
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# please enter your executable path here
vasp_exec=./vasp_gam

#please enter the number of processors used for VASP here
np=8


for i in 0 100 200 300 400 500 600 700
do
cp POSCAR.T\=$i. POSCAR
mpirun -np $np $vasp_exec
mv OUTCAR OUTCAR.T\=$i
done

三、 分析OUTCAR

利用脚本extract_temp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
!/bin/bash 

if [ -f gap_vs_temp.dat ]
then
rm gap_vs_temp.dat
fi

touch gap_vs_temp.dat
counter=0

for temp in 0 100 200 300 400 500 600 700
do
i="OUTCAR.T=$temp"

homo1=`awk '/NELECT/ {print $3/2}' $i`
homo2=`awk '/NELECT/ {print $3/2-1}' $i`
homo3=`awk '/NELECT/ {print $3/2-2}' $i`
lumo1=`awk '/NELECT/ {print $3/2+var+1}' $i`
lumo2=`awk '/NELECT/ {print $3/2+var+2}' $i`
lumo3=`awk '/NELECT/ {print $3/2+var+3}' $i`
lumo4=`awk '/NELECT/ {print $3/2+var+4}' $i`
lumo5=`awk '/NELECT/ {print $3/2+var+5}' $i`
lumo6=`awk '/NELECT/ {print $3/2+var+6}' $i`
e1a=`grep "^ $homo1 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1b=`grep "^ $homo2 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e1c=`grep "^ $homo3 " $i | head -$nkpt | sort -n -k 2 | tail -1 | awk '{print $2}'`
e2a=`grep "^ $lumo1 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2b=`grep "^ $lumo2 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2c=`grep "^ $lumo3 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2d=`grep "^ $lumo4 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2e=`grep "^ $lumo5 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`
e2f=`grep "^ $lumo6 " $i | head -$nkpt | sort -n -k 2 | head -1 | awk '{print $2}'`

if [ $temp -eq "0" ]
then
ref=`echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f" |awk '{print (($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)}'`
fi

echo "$e1a $e1b $e1c $e2a $e2b $e2c $e2d $e2e $e2f $temp $ref" |awk '{print $10,(($4+$5+$6+$7+$8+$9)/6.0-($1+$2+$3)/3.0)-$11}' >> gap_vs_temp.dat
done

运行脚本后生成gap_vs_temp.dat文件,画图即可。

gnuplot画图:
gnuplot -e "set terminal jpeg;set xlabel 'T (K)'; set ylabel 'band gap'; set style data lines; plot 'gap_vs_temp.dat', 'C_exp_points_offset0.dat' w circles, 'C_exp_fit_offset0.dat'" > gap_vs_temp.jpg

包含体积效应的温度依赖带隙

仅考虑温度效应会低估带隙,要考虑体积效应。

一、准简谐近似方法获得体积变化

三个脚本:

1
2
3
quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh
quasi_harm_4x4x4_diamond_make_energy_vs_volume_plots.sh
quasi_harm_4x4x4_diamond_obtain_fitting.sh

对超胞结构创建不同体积的结构进行体积-能量计算:

运行脚本:quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash

# please enter your executable path here
vasp_exec=./vasp_gam

#please enter the number of processors used for VASP here
np=8

cp INCAR.qh INCAR

for i in 6.13521592 6.27789536 6.4205748 6.56325424 6.70593368 6.84861312 6.99129256 7.133972 7.27665144 7.41933088 7.56201032 7.70468976 7.8473692 7.99004864 8.13272808
do
sed "s/7.13397200/${i}/g" POSCAR.4x4x4 > POSCAR_$i
cp POSCAR_$i POSCAR
mpirun -np 8 $vasp_exec

mv OUTCAR OUTCAR_$i
done

该脚本创建15个POSCAR,体积每步变化2%,运行脚本quasi_harm_4x4x4_diamond_create_pos_and_run_vasp.sh提交计算。

二、计算完成后运行quasi_harm_4x4x4_diamond_make_energy_vs_volume_plots.sh数据处理。
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/bin/bash

bandshift=0
gwrun=-1
dgbd=-1
val=-1
con=-1
gwldadiff=-1
test=-1
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
esac
shift
done

if [ -f "helpscript.perl" ]; then
rm helpscript.perl
fi


cat > helpscript.perl <<EOF
#!/bin/perl

use strict;
use warnings;

my \$zahler=0;
my @entropy=0;
my \$ezp=0;
my \$fhelmholtz=0;
my \$uenergy;
my \$kboltzmann=8.6173303*10**(-5.0);
my \$ntemp=8;
my \$tmax=700;
my \$tmin=0;
my \$tstep=100;
for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
\$entropy[\$itemp]=0;
}
while (<>)
{
chomp;
\$_=~s/^/ /;
my @help=split(/[\t,\s]+/);
\$zahler=\$zahler+1;
if (\$zahler == 1) {\$uenergy=\$help[1];}
else
{
my \$homega=\$help[2]/1000;
\$ezp=\$ezp+\$homega*0.5;
for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
my \$temp=(\$itemp-1)*\$tstep+\$tmin;
my \$kbt=\$kboltzmann*\$temp;
if (\$temp < 0.0000001)
{
}
else
{
\$entropy[\$itemp]=\$entropy[\$itemp]-\$kboltzmann*log(1-exp(-\$homega/\$kbt));
\$entropy[\$itemp]=\$entropy[\$itemp]+\$kboltzmann*\$homega/\$kbt*(1/(exp(\$homega/\$kbt)-1));
}
}
}
last if eof;
}

\$ezp=\$ezp; #/ \$zahler;

for (my \$itemp=1;\$itemp<=\$ntemp;\$itemp++)
{
my \$temp=(\$itemp-1)*\$tstep+\$tmin;

\$entropy[\$itemp]=\$entropy[\$itemp]; # / \$zahler;
\$fhelmholtz=\$uenergy+\$ezp-\$temp*\$entropy[\$itemp];
printf ("%15.8e %15.8e\n",\$temp,\$fhelmholtz);
}
printf ("#NOTEMP %15.8e\n",\$uenergy);
EOF

rm OUTTEMP*
first=0
for i in OUTCAR_*; do

echo "Starting $i"
v2=${i##OUTCAR_}
if [ -f "helpfile.help" ]; then
rm helpfile.help
fi
touch helpfile.help
cp OUTCAR_$v2 OUTCAR
awk '/free energy/' OUTCAR | tail -n 1| awk '{print $5}' >> helpfile.help
awk '/[0-9]* f .* THz/ {print $1,$10}' OUTCAR >> helpfile.help
awk '/[0-9]* f.i.*THz/ {print $1,$9}' OUTCAR >> helpfile.help
volume=`awk '/volume of cell/ {print $5}' OUTCAR | tail -n 1`

perl helpscript.perl helpfile.help > hhhhelp.txt

runcount=0
while read line; do
runcount=$((runcount+1))
if [[ $first -eq 0 ]]; then
echo $line | awk -v var="$volume" '{print var,$2,$1}' > OUTTEMP_$runcount
else
echo $line | awk -v var="$volume" '{print var,$2}' >> OUTTEMP_$runcount
fi
done < ./hhhhelp.txt

first=1
done

for i in OUTTEMP_*; do
v2=${i##OUTTEMP_}
mv OUTTEMP_$v2 OUTHELP
sort -n -k 1 OUTHELP > OUTTEMP_$v2
done

rm helpfile.help
rm helpscript.perl
rm hhhhelp.txt
rm OUTHELP

自由能曲线保存在OUTTEMP_*.

运行脚本quasi_harm_4x4x4_diamond_obtain_fitting.sh获得温度-体积关系。
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

for i in OUTTEMP_*
do
cp $i OUTTEMP.current
#extract temperature
temp=`head -n 1 OUTTEMP.current|awk '{print $3}'`
#do fitting
gnuplot -e "E(V)=E0+9.0/8.0*B0*V0*((V0/V)**(2.0/3.0)-1)**2 + 9.0/16.0*B0*\
(B0P-4)*V0*((V0/V)**(2.0/3.0)-1.0)**3.0 + R*((V0/V)**(2.0/3.0)-1.0)**4.0;\
B0P = 1;B0 = 1;V0 = 720;E0 = -1150;R = -1.0;fit E(x) 'OUTTEMP.current' u 1:2 via B0P,B0,V0,E0,R" &> suppress_output
#extract volume from fit
a=`grep "V0" fit.log|grep "=" |tail -n 1|awk '{print ($3/2.0)**(1.0/3.0)}'`
#print temperature and volume to
echo "temperature: $temp, a_latt: $a"
done

rm suppress_output
rm OUTTEMP.current

输出如下:

1
2
3
4
5
6
7
8
9
temperature: 0.00000000e+00, a_latt: 7.18012
temperature: 1.00000000e+02, a_latt: 7.18014
temperature: 2.00000000e+02, a_latt: 7.18064
temperature: 3.00000000e+02, a_latt: 7.18267
temperature: 4.00000000e+02, a_latt: 7.18613
temperature: 5.00000000e+02, a_latt: 7.19037
temperature: 6.00000000e+02, a_latt: 7.19493
temperature: 7.00000000e+02, a_latt: 7.19959
temperature: #NOTEMP, a_latt: 7.15218

三、 最后将QHA获得的晶胞参数,替换掉POSCAR.T=* files中的晶胞参数。再次运行run_temperature.shextract_temp.sh.获得数据画图。

  • 通过添加体积效应,与实验获得了更好的一致性。在这个教程中,我们只使用了一个4x4x4的单元格,因为更大的单元格已经相当耗时,但对于收敛的5x5x5单元格,两条曲线都应该与实验相比略有变差。由于在本例中使用的PBE无法充分描述电子交换和相关性,因此预计实验与理论之间会有差异。为了获得真正的优异一致性,需要使用GW近似方法

  • 严格来说,将体积效应添加到电子-声子相互作用的正确方法是首先为每个温度更改体积,然后为该温度计算电子-声子相互作用。在这个教程和参考文献[5]中,我们是反过来做的。因此,电子-声子相互作用只需要计算一次。在参考文献[5]中,我们观察到这两种方法给出了非常相似的结果。

三阶力常数矩阵

需要用到thirdorder程序。

使用方法:

  1. 准备好POSCAR,INCAR,KPOINTS,POTCAR和提交任务脚本(以sub.sh为例);
    其中POSCAR与二阶力常数矩阵求解时的POSCAR-unit一致,KPOINTS也与二阶一致。INCAR文件与二阶力常数求解时的有限位移法一致,其他不变。完成后运行thirdorder实现扩胞。

~/安装目录/thirdorder_vasp.py sow 2 2 2 -12
2 2 2是扩胞倍数,要和二阶力常数矩阵保持一致或者略小。-12指的是考虑多少个近邻原子,需要测试,但是如果计算资源紧缺的时候取个-10就行了,但有风险;正值是指截断半径。之后生成成功以后会出现一堆3RD开头的文件,那些都是POSCAR,一般有几百上千个。

  1. 参考phonopy计算声子谱的有限位移法,需要把这些POSCAR单独计算。也就是有多少POSCAR,建立多少文件夹,分别进行多少次计算。
  2. find job* -name vasprun.xml|sort -n|/ thirdorder_vasp.py reap a b c -d a b c和-d与前面一致。该命令可获得FORCE_CONSTANT_3RD也即是三阶力常数矩阵。

脚本方法

  • 测试-d参数(秦光照老师)

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/bin/bash
    #
    # Construct the 3nd files based on the finished calculations
    #
    # Written BY QIN, GuangZhao <qin.phys@gmail.com>
    # 2016-11-22

    DIR="/vol-th/home/xhaiyan/WangN/Au6S2/third241-14"

    if [ ! -d "$DIR" ];then
    echo Please specify the source directory.
    exit
    fi

    for NAME in 3RD.POSCAR.*
    do
    NUM="${NAME#3RD.POSCAR.}" # the number of the 3nd POSCAR file
    CODE=$(head -1 $NAME) # the code of the POSCAR file
    # find the source POSCAR file in the source directory
    INFO=$(grep $CODE $DIR/3RD.POSCAR.* | head -1)
    [ x"$INFO" == x ] && echo "NOT FOUND for job-$NUM" && continue
    SOURCE_NUM="${INFO%:*}" # the number of the source POSCAR file
    SOURCE_NUM="${SOURCE_NUM##*.}"

    echo "$DIR/job-$SOURCE_NUM/ --> job-$NUM/"
    # diff 3RD.POSCAR.$NUM $DIR/3RD.POSCAR.$SOURCE_NUM
    rsync -a $DIR/job-$SOURCE_NUM/vasprun.xml ./job-$NUM/
    done
  • 针对大量POSCAR批量建立文件夹

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #module load spglib/master
    #thirdorder_vasp.py sow 3 3 1 -10
    #生成2*2*2的超胞 0.6表示截断半径为6埃。
    #sow a b c m abc表示生成的超胞大小,m为正数的时候表示截断半径(单位:nm)(例如0.6,表示截断半径为6.0埃);为负数时表示第几近邻截断(此时应取负整数,例如-3表示第三近邻)

    for i in 3RD.POSCAR.*
    do
    s=$(echo $i| cut -d "." -f 3)
    d=job-$s
    mkdir $d
    cp $i $d/POSCAR
    cp ./INCAR ./sub.sh ./KPOINTS ./POTCAR $d
    pushd $d
    popd
    done
  • 批量提交任务

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
    root_path='pwd'

    #在每个job文件夹里进行静态计算。
    for i in {001..1050} #按顺序从job-0011050做静态vasp计算,根据生成的文件夹设定
    do
    cd job-$i
    echo "job-$i", time
    sbatch sub.sh
    wait
    cd ..
    done

    #上述静态计算完成后提取三阶力常数文件
    #cd ${root_path}

    #find job* -name vasprun.xml| sort -n| python thirdorder_vasp.py reap 2 2 1 -12 #最后四个数字跟你扩胞时一致

脚本赋予权限:chmod +x .sh;运行脚本:./sh

ShengBTE获得热输运性质

运行ShengBTE计算热输运性质

  • 获得二阶力常数计算:
    计算流程与声子谱计算流程相同,用DFPT和有限位移法都可以。将得到的FORCE_CONSTANTS重命名为FORCE_CONSTANTS_2ND。
  • 获得三阶力常数计算:见上,输出为FORCE_CONSTANTS_3RD文件。
  • 准备CONTROL文件:格式如下:
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #CONTROL for ShengBTE
    &allocations
    nelements=2 #元素种类
    natoms=6 #原子个数
    ngrid(:)=20 20 5 #计算网格密度
    &end
    &crystal
    lfactor=0.1 #软件长度单位换算
    lattvec(:,1)=3.1613337552503711 0.0000000000000025 0.0000000000000000 #原胞晶胞参数
    lattvec(:,2)=-1.5806668776251651 2.7377953418477841 0.0000000000000000
    lattvec(:,3)=-0.0000000000000000 0.0000000000000000 12.3318234981499426
    elements= "Mo" "S" #原子顺序
    types= 1 1 2 2 2 2 #原子个数,2代表第二种元素,42代表有4个第二类原子
    positions(:,1)= 0.3333333449999998 0.6666666890000030 0.2500000000000000 #原子坐标,按顺序
    positions(:,2)=0.6666666240000012 0.3333333229999980 0.7500000189999980
    positions(:,3)= 0.3333333449999998 0.6666666890000030 0.6230719397502427
    positions(:,4)=0.6666666240000012 0.3333333229999980 0.3769280602499874
    positions(:,5)=0.6666666240000012 0.3333333229999980 0.1230720067501656
    positions(:,6)=0.3333333449999998 0.6666666890000030 0.8769280222497613
    scell(:)=4 4 1 #扩胞倍数,和前面一致
    &end
    &parameters
    T=300 #温度
    &end
    &flags
    nonanalytic=.TRUE.
    nanowires=.FALSE.
    convergence=.TRUE. #迭代法,默认最大1000
    &end

详细参数可参考手册。

  • 提交任务
  • 获得不同温度的数据,只需要依次修改CONTROL文件的T tag。或者通过脚本:
{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for i in {350..1350..100} # 对i赋值,区间为300900,每搁10取一个数,即(300 310 320 330 ....890 900),可以根据自身情况自行设置
do #开始循环
mkdir $i #建立单一任务文件夹
cp sub.sh CONTROL FORCE_CONSTANTS_2ND FORCE_CONSTANTS_3RD $i
#将二阶三阶力学常数文件和CONTROL文件复制到单一任务文件夹
#注意,这里的CONTROL文件夹是删减过的
cd $i #进入单一文件夹内
echo \&parameters >> CONTROL #补充CONTROL文件
echo T= $i >> CONTROL #补充CONTROL文件
#温度设置 如果同时设置多个温度,同一行只会算第一个并报错。如果多次设定一个温度到同一个CONTROL文件,只会运算最后一个。
#echo scalebroad=0.1 >> CONTROL #补充CONTROL文件
echo \&end >> CONTROL #补充CONTROL文件
echo \&flags >> CONTROL #补充CONTROL文件
echo nonanalytic=.TRUE. >> CONTROL #补充CONTROL文件
echo nanowires=.FALSE. >> CONTROL #补充CONTROL文件
echo convergence=.True. >> CONTROL
echo \&end >> CONTROL #补充CONTROL文件
#这里补充CONTROL文件用的是笨方法,如果有相应改进方法可以自行更改,简洁代码
sbatch sub.sh #执行ShengBTE计算,这里的执行命令应视情况而定。
cd .. #返回初始目录
done #结束任务

数据处理

其他参考:https://www.bilibili.com/read/cv22090733/

注意事项

  • 计算得到的热导率和文献报道有较大偏差,可能偏大或者偏小,可能的原因有:

    1.采用的2阶力常数FORCE_CONSTANT中超胞内原子排序不是按照ucatomsc_zsc_y*sc_x排列;力常数文件与control文件中原胞内原子次序是否一致;

    2.shengBTE的control文件中晶格参数单位默认nm,有转换系数的参数;

    3.使用QE利用phonopy计算得到的FORCE_CONSTANT文件中,单位需要转换,不能直接利用shengBTE计算,vasp利用phonopy则单位正确;

    1. 3阶力常数的计算量较大,但精度要求很高,如0.0003Rh/bohr^2量级的力的误差,也会导致最终热导率的数值出现大的偏离;如使用cp2k计算力常数,通常使用QE等平面波软件,对于超胞体系,随着扩胞,在较大的截断半径下,所需计算量非常大,使用CP2K中的QS模块也能进行第一性原理计算,具有相对较高的计算效率,但是CP2K不同于平面波的QE等,计算中仅有gamma点计算,需要采用实空间较大超胞,如果使用和QE等相同的超胞,则会导致原子受力精度不高,一般在~0.0003Rh/bohr^2量级的误差,也会对某些体系,特别是二维体系的热导率有很大的影响。在使用cp2k进行3阶力常数大量计算之前,先进行超胞收敛测试,可以在相同的位移构型下,不断扩胞,判断力计算的变化情况和误差。用QE等计算也建议先进行k点等计算参数的收敛判断,否则会浪费大量时间,热导率计算结果却有很大偏离。

    2. 使用经验势能模型,在通过lammps进行热输运计算之前,可以先利用分子静力学软件GULP结合shengBTE模块,预判势能应用于热输运计算的准确性。但经验势能用于热输运精度和前景一般,机器势能表现更好。

    原文链接:https://blog.csdn.net/odin_linux/article/details/130084321

  • 静态计算可以各个job文件夹同时分别计算,不用按顺序来。等所有job文件夹计算完后,自行运行“find job…” 提取三阶力常数的命令。严格来说,胞的大小和三阶力常数计算的截断半径都应该进行测试,测试以所计算得到的热导率的收敛进行判断。计算资源有限无法测试的话,尽可能取大一点。Born有效电荷和介电常数的计算应该不是必要的,如果你要考虑在Gamma点附近LO-TO劈裂的话(主要针对离子晶体),则需要进行计算。可以加上,感觉要好点。
    二阶力常数和三阶力常数所用的超胞大小可以不统一,我看文献中有这种情形,不过一般作者采用的二阶力常数的超胞都是大于等于三阶力常数超胞的大小。
    原文链接:https://zhuanlan.zhihu.com/p/147810223

  • 官方网站:https://www.shengbte.org/

四声子过程

除了ShengBTE的CONTROL文件中的常规输入,FourPhonon还需要四阶力常数和一些新的标签在CONTROL文件中。请检查ShengBTE网站以获取其他标签的定义。

并行环境

1.1和1.0版本是为MPI并行性编写的。从1.2版本开始,支持四声子散射的迭代求解器,我们已经迁移到OpenMP,以处理该迭代求解器所需的大内存。未来我们可能会支持MPI+OpenMP混合并行性,以允许更多灵活性。确保在编译时添加-qopenmp,或者:

export FFLAGS=-qopenmp -traceback -debug -O2 -static_intel

四阶IFCs文件:FORCE_CONSTANTS_4TH

该文件包含四阶原子间力常数矩阵,并使用稀疏描述来节省空间。要构建四阶力常数,可以参考Fourthorder的python脚本。该力常数的格式是对三阶力常数的直接扩展,包含nb个这样的矩阵块:

  • 一行空白
  • 一个从1开始的顺序索引(从1到nb)
  • 一行表示第二个晶胞的笛卡尔坐标(单位:Å)
  • 一行表示第三个晶胞的笛卡尔坐标(单位:Å)
  • 一行表示第四个晶胞的笛卡尔坐标(单位:Å)
  • 一行表示四个相关原子的从1开始的索引,每个原子索引从1到natoms
  • 81行的力常数矩阵(单位:eV Å⁴)。开头的索引用于标记笛卡尔坐标轴。
    该文件的一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

1
0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
1 1 1 1
1 1 1 1 -42.0002584218
1 1 1 2 0.0000000000
1 1 1 3 0.0000000000
1 1 2 1 0.0000000000
1 1 2 2 40.3875689003
1 1 2 3 0.0000000000
1 1 3 1 0.0000000000
1 1 3 2 0.0000000000
1 1 3 3 40.3875689003
1 2 1 1 0.0000000000
1 2 1 2 40.3875689003
1 2 1 3 0.0000000000
1 2 2 1 40.3875689003
1 2 2 2 0.0000000000
1 2 2 3 0.0000000000
1 2 3 1 0.0000000000
1 2 3 2 0.0000000000
1 2 3 3 0.0000000000
1 3 1 1 0.0000000000
1 3 1 2 0.0000000000
1 3 1 3 40.3875689003
1 3 2 1 0.0000000000
1 3 2 2 0.0000000000
1 3 2 3 0.0000000000
1 3 3 1 40.3875689003
1 3 3 2 0.0000000000
1 3 3 3 0.0000000000
2 1 1 1 0.0000000000
2 1 1 2 40.3875689003
2 1 1 3 0.0000000000
2 1 2 1 40.3875689003
2 1 2 2 0.0000000000
2 1 2 3 0.0000000000
2 1 3 1 0.0000000000
2 1 3 2 0.0000000000
2 1 3 3 0.0000000000
2 2 1 1 40.3875689003
2 2 1 2 0.0000000000
2 2 1 3 0.0000000000
2 2 2 1 0.0000000000
2 2 2 2 -42.0002584218
2 2 2 3 0.0000000000
2 2 3 1 0.0000000000
2 2 3 2 0.0000000000
2 2 3 3 40.3875689003
2 3 1 1 0.0000000000
2 3 1 2 0.0000000000
2 3 1 3 0.0000000000
2 3 2 1 0.0000000000
2 3 2 2 0.0000000000
2 3 2 3 40.3875689003
2 3 3 1 0.0000000000
2 3 3 2 40.3875689003
2 3 3 3 0.0000000000
3 1 1 1 0.0000000000
3 1 1 2 0.0000000000
3 1 1 3 40.3875689003
3 1 2 1 0.0000000000
3 1 2 2 0.0000000000
3 1 2 3 0.0000000000
3 1 3 1 40.3875689003
3 1 3 2 0.0000000000
3 1 3 3 0.0000000000
3 2 1 1 0.0000000000
3 2 1 2 0.0000000000
3 2 1 3 0.0000000000
3 2 2 1 0.0000000000
3 2 2 2 0.0000000000
3 2 2 3 40.3875689003
3 2 3 1 0.0000000000
3 2 3 2 40.3875689003
3 2 3 3 0.0000000000
3 3 1 1 40.3875689003
3 3 1 2 0.0000000000
3 3 1 3 0.0000000000
3 3 2 1 0.0000000000
3 3 2 2 40.3875689003
3 3 2 3 0.0000000000
3 3 3 1 0.0000000000
3 3 3 2 0.0000000000
3 3 3 3 -42.0002584218

CONTROL 文件设置

此 CONTROL 文件包含所有用户指定的设置和参数,包括晶体结构信息、展宽因子、q 网格、温度、函数等。

一般用法

要启用 FourPhonon 功能,您需要添加一个新的 &flags 名称列表:

1
2
four_phonon (逻辑,默认为 .false.):计算四声子相空间和四声子散射率。
four_phonon_iteration (逻辑,默认为 .false.):精确计算四声子散射并求解玻尔兹曼输运方程(BTE)。这仅在 four_phonon=.true. 时有效。

标志的实际用法
以下是这些标志的一些实用组合:

1
2
3
4
onlyharmonic=.true. 和 four_phonon=.true.:仅计算四声子相空间。
convergence=.false. 和 four_phonon=.true.:在 RTA 层面计算三声子和四声子散射的热导率;此设置将输出不同四声子通道的贡献。
four_phonon=.true. (收敛默认值为 .true.):使用三声子迭代方案计算热导率,但将四声子散射处理为 RTA 层面。
four_phonon=.true. 和 four_phonon_iteration=.true.:利用 BTE 的精确解计算三声子和四声子散射的热导率。

注意: CONTROL 文件中的所有其他参数,例如温度或 q 网格,适用于三声子和四声子过程。FourPhonon 包不支持纳米线功能。

加速 RTA 解的采样方法

为了从散射过程样本中估计散射率,请引用 [Z. Guo 等人,npj Comput. Mater. 10, 31 (2024).] 并使用相关标签。

参数设置

num_sample_process_3ph 和 num_sample_process_3ph_phase_space

num_sample_process_3phnum_sample_process_3ph_phase_space (整数,默认值为 -1):表示从每个模式中提取的样本数,以用于估计三声子相空间和散射率。 -1 表示不进行取样,执行严格计算。注意,当 convergence=.true.,即使用迭代方案计算三声子散射时,num_sample_process_3ph 必须为 -1,因为取样方法基于弛豫时间近似。

num_sample_process_4ph 和 num_sample_process_4ph_phase_space

num_sample_process_4phnum_sample_process_4ph_phase_space (整数,默认值为 -1):表示从每个模式中提取的样本数,以用于估计四声子相空间和散射率。 -1 表示不进行取样,执行严格计算。注意,当 four_phonon=.false. 时,num_sample_process_4phnum_sample_process_4ph_phase_space 必须均为 -1。

示例

计算三声子散射率(精确计算,迭代),并在 RTA 层面采用 100,000 个样本过程计算四声子散射:

1
2
3
4
5
6
7
8
&parameters
T=300
scalebroad=1
num_sample_process_3ph_phase_space = -1
num_sample_process_3ph = -1
num_sample_process_4ph_phase_space = 100000
num_sample_process_4ph = 100000
&end

TDEP IFCs 的输入

对于 TDEP 格式的谐波力常数,请使用以下描述的标签/脚本:

tdep=.true. 启用 TDEP 格式谐波 IFCs 的处理,该输入文件名应始终为 infile.forceconstant。如果系统是极性材料,除了常规参数(如 Born 有效电荷和介电常数)外,我们还需要用户手动输入耦合参数 (\lambda_{Ewald}),该参数在 TDEP IFCs 的末尾近似写出,如下所示:

1
0.675614929199219       # Coupling parameter in Ewald summation

注意:输入的谐波 IFCs 是未带极性修正的裸 IFCs,以便 FourPhonon 能够处理并在内部添加修正。该模块在很大程度上依赖 TDEP 源代码,我们无法保证成功。建议用户检查处理后的频率和三声子散射率。

对于非极性材料,我们还开发了一种脚本,将 TDEP 格式转换为 Phonopy 格式,名为 tdep2phonopy.f90。这样您无需激活 tdep 标志。编译 Fortran 后,运行可执行文件(以下是示例):

1
./tdep2phonopy outfile.forceconstant 10 10 1 2

这将 TDEP IFCs (outfile.forceconstant)转换为 Phonopy 格式,构建一个来自双原子单位胞的 (10 \times 10 \times 1) 超胞。请检查转换后的声子色散。我们建议使用足够大的超胞来存储所有的第二阶 IFC 中的成对相互作用。

示例

计算三声子散射率(精确计算,迭代),并在 RTA 层面计算四声子散射。使用的 TDEP 格式谐波 IFCs 并应用非解析修正,Ewald 参数为 (\lambda =0.675614929199219)。同样需要 Born 有效电荷(此处未列出),与 ShengBTE 对极性系统的处理相似。

1
2
3
4
5
6
7
8
9
10
11
&parameters
T=300
scalebroad=0.1
Ewald=0.675614929199219
&end
&flags
tdep=.TRUE.
nonanalytic=.TRUE. ! 此标签现在需要明确指定
convergence=.TRUE.
four_phonon=.TRUE.
&end

TDEP 格式的 3阶/4阶 IFCs

对于 TDEP 格式的 3阶/4阶 IFCs,我们开发了一个独立的脚本,将其转换为 ShengBTE 格式,名为 tdep2ShengBTE.f90。我们需要在同一目录下有 infile.ucposcar。编译 Fortran 后,运行可执行文件:

示例

1
./tdep2ShengBTE 3 2 outfile.forceconstant_thirdorder

这将 TDEP 的 3 阶 IFCs(outfile.forceconstant_thirdorder)转换为 ShengBTE 格式。

Output files

Besides the routine output files from previous ShengBTE program, FourPhonon generates these output files:

  • BTE.Numprocess_4ph: number of allowed four-phonon scattering processes, for each irreducible q point and phonon band
  • BTE.P4: phase space available for four-phonon processes, for each irreducible q point and phonon band
  • BTE.P4_total: total volume in phase space available for four-phonon processes
  • BTE.P4_plusplus*, BTE.P4_plusminus*, BTE.P4_minusminus*: similar to BTE.P4 but only includes contributions from ++/+-/- - processes

*Note for four-phonon scatterings, there are three different channels: recombination (++), redistribution (+-) and splitting (- -) processes.

Under temperature-dependent directories: (the unit of scattering rates is ps−1 if not specified)

  • BTE.WP4: weighted phase space available for four-phonon processes ([rad/ps]$^{-5}$, 2nd column) vs angular frequency (rad/ps, 1st column) for each irreducible q point and phonon band
  • BTE.WP4_plusplus*, BTE.WP4_plusminus*, BTE.WP4_minusminus*: similar to BTE.WP4 but only includes contributions from ++/+-/- - processes
  • BTE.w_3ph: three-phonon scattering rates for each irreducible q point and phonon band, this file replaces the original output BTE.w_anharmonic. Absorption and emission processes are written out into BTE.w_3ph_plus and BTE.w_3ph_minus
  • BTE.w_4ph: four-phonon scattering rates for each irreducible q point and phonon band. Similarly, we provide the contributions from different channels: BTE.w_4ph_plusplus, BTE.w_4ph_plusminus and BTE.w_4ph_minusminus
  • BTE.w_4ph_normal: four-phonon scattering rates of normal processes, for each irreducible q point and phonon band. This file has 5 columns and each one represents: angular frequency in rad/ps, recombination channel, redistribution channel, splitting channel, overall scattering rates from normal processes
  • BTE.w_4ph_Umklapp: four-phonon scattering rates of Umklapp processes, for each irreducible q point and phonon band. The format is the same as BTE.w_4ph_normal
  • BTE.kappa*: thermal conductivity results are written out as usual

声子谱

声子谱的计算主要有两种方法,一种是直接法,另一种是微扰密度泛函方法(DFPT)。

  • 直接法,或称frozen-phonon方法,是通过在优化后的平衡结构中引入原子位移,计算作用在原子上的Hellmann-Feynman力,进而由动力学矩阵算出声子色散曲线。直接法的缺陷在于它要求声子波矢与原胞边界supersize
    正交,或者原胞足够大使得Hellmann-Feynman力在原胞外可以忽略不计。这使得对于复杂系统,如对称性高的晶体、合金、超晶格等材料需要采用超原胞。超原胞的采用使计算量急剧增加,极大的限制了该方法的使用。
  • 1987年,Baroni、Giannozzi和Testa提出了DFPT方法。DFPT通过计算系统能量对外场微扰的响应来求出晶格动力学性质。该方法最大的优势在于它不限定微扰的波矢与原胞边界正交,不需要超原胞也可以对任意波矢求解。Castep、Vasp等采用的是一种linear response theory 的方法(或者称为 density perturbation functional theory,DFPT),直接计算出原子的移动而导致的势场变化,再进一步构造出动力学矩阵。进而计算出声子谱。

DFPT计算步骤

  • 结构优化
    声子谱的计算需要对原胞结构做高精度的充分优化,否则很容易出现虚频;
    {.line-numbers}
    1
    2
    EDIFF  = 1E-08
    EDIFFG = -1E-06
    可以采用分步优化,直到达到精度。然后优化后的结果,cp CONTCAR POSCAR:

$ phonopy -d --dim="4 4 1"

之后会生成一堆文件,其中有 SPOSCAR 和POSCAR-00* ,分别对应不同的方法密度泛函微扰法 (DFPT) 以及有限位移法。

{.line-numbers}
1
2
3
4
5
6
$ ls
phonopy_disp.yaml POSCAR-002 POSCAR-005 POSCAR-008 POSCAR-011 POSCAR-014 SPOSCAR
POSCAR POSCAR-003 POSCAR-006 POSCAR-009 POSCAR-012 POSCAR-015
POSCAR-001 POSCAR-004 POSCAR-007 POSCAR-010 POSCAR-013 POSCAR-016
$ cp POSCAR POSCAR-unitcell
$ cp SPOSCAR POSCAR

KPOINTS需适当减小,可以的话最好再进行一次收敛测试
INCAR
{.line-numbers}
1
2
3
4
5
6
7
8
9
10
IBRION =  8            (determines the Hessian matrix using DFPT)
EDIFF = 1E-08 (SCF energy convergence; in eV)
PREC = Accurate (Precision level)
ENCUT = 500 (Cut-off energy for plane wave basis set, in eV)
IALGO = 38 (Davidson block iteration scheme)
LREAL = .FALSE. (Projection operators: false)
LWAVE = .FLASE. (Write WAVECAR or not)
LCHARG = .FLASE. (Write CHGCAR or not)
ADDGRID= .TRUE. (Increase grid; helps GGA convergence)
NSW = 1

上面参数 IBRION = 8 NSW = 1是注意修改的。
提交VASP计算

后处理
phonopy --fc vasprun.xml

读取vasprun.xml,生成FORCE_CONSTANTS文件。

编辑band.conf文件,该文件给出了高对称点路径的信息
Note:

{.line-numbers}
1
2
3
4
5
ATOM_NAME = * *  #元素名称,顺序与POSCAR保持一致
DIM = 4 4 1 #建立超胞的大小,--dim后面的
BAND = 0.5 0.0 0.0 0.0 0.0 0.0 0.333333 0.333333 0.0 0.5 0.0 0.0 #高对称点路径,每组高对称点之间用两个空格隔开
FORCE_CONSTANTS = READ #表示读取力常数文件FORCE_CONSTANTS
FC_SYMMETRY = .TRUE.

准备mesh.conf文件,如下所示:
{.line-numbers}
1
2
3
ATOM_NAME = Si
DIM = 2 2 2
MP = 24 24 24

{.line-numbers}
1
2
3
4
phonopy --dim="4 4 1" -c POSCAR-unitcell -p -s band.conf
(单位是THz)或者
phonopy --dim="4 4 1" --factor=524.147 -c POSCAR-unitcell -p -s band.conf
(单位是cm-1)

(读取band.conf、FORCE_CONSTANTS、POSCAR-unitcell,输出band.yaml、phonopy.yaml以及pdf图)

1
2
3
phonopy-bandplot  --gnuplot> phono.dat
如果上述命令不行,可以用旧版本phonopy
bandplot --gnuplot> phonon.dat

读取band.yaml,就可以获得二阶力常数矩阵声子谱的数据,其中第一行为高对称点的坐标。

准备mesh.conf以计算态密度和PDOS:

{.line-numbers}
1
2
3
4
5
6
ATOM_NAME = 
DIM = 4 4 1
MP=12 12 1
PDOS=1 2, 3 4, 5 6
FORCE_CONSTANTS = READ
BAND_POINTS = 71

运行命令:phonopy –dim='4 4 1' -c POSCAR-unitcell mesh.conf或者乘上因子修改单位。phonopy –dim='4 4 1' --factor=524.147 -c POSCAR-unitcell mesh.conf
得到projected_dos.dat文件,拖到Origin中画图,得到声子态密度图像(从第二列数据开始,每一列对应每个原子的态密度),对比着之前计算得到的声子谱可以分析声学支与光学支之间的相互作用关系

有限位移方法

这里需要准备和 POSCAR-00* 数目一样的文件夹,并把 POSCAR-00* 复制到每个文件夹中并命名为 POSCAR 。每个文件夹内都需要准备 POTCAR 、 POSCAR 、 INCAR 、 KPOINTS 。并且分别计算。
可用以下sh脚本快速进行:手动修改第一行文件夹数目和vasp运行文件名称。

{.line-numbers}
1
2
3
4
5
6
7
8
9
for i in {001..006}
do
mkdir $i
cd $i
cp ../POSCAR-$i POSCAR
cp ../{INCAR,KPOINTS,POTCAR,sub.sh} .
运行提交任务命令
cd ../
done

INCAR 可以设置为如下内容:
INCAR设置如下(静态计算):

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
PREC = Accurate
IBRION = -1
NSW = 1
ENCUT = 500
EDIFF = 1.0e-08
EDIFFG = -0.001
ISMEAR = 0
SIGMA = 0.05
IALGO = 38
LREAL = .FALSE.
LWAVE = .FALSE.
LCHARG = .FALSE.

里面IBRION = -1 NSW = 1注意修改

KPOINTS需适当减小,可以的话最好再进行一次收敛测试
提交VASP计算

后处理

{.line-numbers}
1
phonopy -f ./disp-*/vasprun.xml

准备band.conf

{.line-numbers}
1
2
3
4
5
ATOM_NAME = In Se
DIM = 4 4 1
BAND = 0.5 0.0 0.0 0.0 0.0 0.0 0.333333 0.333333 0.0 0.5 0.0 0.0
FORCE_CONSTANTS = WRITE #注意这里是 WRITE
FC_SYMMETRY = .TRUE.
{.line-numbers}
1
2
3
4
5
6
7
8
phonopy -c POSCAR-unitcell band.conf -p -s
phonopy --factor=524.147 -c POSCAR-unitcell -p -s band.conf
#旧版本phonopy
bandplot --gnuplot> phonon.dat
就可以获得二阶力常数矩阵 FORCE_CONSTANTS 和声子谱的数据
#新版本phonopy
phonopy-bandplot --gnuplot > phonon.dat

Mind

  • 如果计算完的声子谱其他地方都好,就是在Γ点有一点点虚频,那么这个材料很可能是稳定的,只是你优化做得不够好,进一步提高优化的精度可消除这一点点虚频。
  • 对于二维材料,如果在Γ点出现很小的虚频,基本可以认为这个材料是稳定的,大部分二维材料都会有此现象;尤其是VASP结合phonopy code计算二维材料的声子谱在Γ点更是容易出现虚频;使用Quantum-ESPRESSO的PWSCF和PH模块计算声子谱对于内存的需求较小一些,且对于二维材料的声子谱计算更友好一些,后期会详细介绍Quantum-ESPRESSO计算声子谱的具体步骤。
  • 声子谱是表示组成材料原子的集体振动模式。如果材料的原胞包含n个原子,那么声子谱总共有3n支,其中有3条声学支,3n-3条光学支。声学支表示原胞的整体振动,光学支表示原胞内原子间的相对振动。

计算出的声子谱有虚频,往往表示该材料不稳定。 有些情况下,我们可以利用虚频信息使不稳定的材料变得稳定。如果声子谱的一条声学支存在虚频,主要位于Γ点和M点1/2处(对应倒格矢的1/4位置)。倒格矢的1/4,对应晶格长度的4倍。我们可能需要将原胞沿上述倒格矢方向扩大四倍,进一步优化原子位置,才可能得到比较稳定的晶胞。

消虚频

  1. DFPT方法与有限位移法互换尝试。或者更换标准胞扩胞计算。
  2. 扩胞,在虚频很小时可以尝试扩大扩胞倍数。
  3. 提高精度优化后计算声子谱。声子谱对力的精度要求特别高,所以提高精度多次优化后再计算声子谱也是可行的。
  4. 修改POTCAR,尝试不同的赝势方法。(不太建议,因为需改之后所有计算都需要统一成稳定构型的赝势。不过有效)
  5. 修改POSCAR原子坐标,再优化,再计算声子谱。
    修改方法:对于DFPT计算的声子谱,使用grep cm-1 OUTCAR查看频率,寻找最大的虚频频率。然后在OUTCAR中从最后往前找到最大的虚频频率对应的坐标。
    dx dy dz对应虚频的位移,把这些坐标与POSCAR中的坐标相加或者0.1-0.9之间的倍数,形成新的POSCAR。进行优化,再计算声子谱。
  6. 不排除真的算不出来没虚频的,据我所知,SnTe就没见到谁大大方方发文章谈声子谱的(算出来虚频消除不了不好意思讲)。
  7. INCAR参数对虚频的影响:ADDGRID影响很小,LREAL有影响。截断能和K点密度在收敛情况下影响小。

结构优化消虚频

X, Y, Z为体系中原子的坐标,也就是POSCAR中的内容。 dx, dy,dz为虚频对应的原子振动方向上的位移。我们将(dx, dy,dz)这个位移乘以一个介于0-1之间的校正因子,然后跟POSCAR中的坐标加起来即可。以z方向为例,校正因子设为0.1, 微调后的z方向坐标为: 10.709980 + (-0.676634)0.1。
脚本vib_correct.py如下:https://www.bigbrosci.com/2022/04/29/A29/

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- coding: utf-8 -*-
"""
Qiang Li
Command: python3 vib_correct.py
This is a temporary script file.
"""
import numpy as np
from ase.io import read, write
import os

#获取虚频开始行
l_position = 0 #虚频振动方向部分在OUTCAR中的起始行数
with open('OUTCAR') as f_in:
lines = f_in.readlines()
wave_num = 0.0
for num, line in enumerate(lines):
if 'f/i' in line:
wave_tem = float(line.rstrip().split()[6])
if wave_tem > wave_num: #获取最大的虚频
wave_num = wave_tem
l_position = num+2
# ASEPOSCAR
model = read('POSCAR')
model_positions = model.get_positions()
num_atoms = len(model)
#print(model_positions)

# 获取虚频对应的OUTCAR部分
vib_lines = lines[l_position:l_position + num_atoms] #振动部分 72227248
#print(vib_lines)
vib_dis = []
for line in vib_lines:
#model_positions = [float(i) for i in line.rstrip().split()[:3]]
vib_infor = [float(i) for i in line.rstrip().split()[3:]] # dx, dy, dz对应的那三列
vib_dis.append(vib_infor)
vib_dis = np.array(vib_dis) #将振动部分写到一个array中。

# 微调结构
new_positions = model_positions + vib_dis * 0.4 # 0.4是微调的校正因子,即虚频对应振动位移的0.4,具体多大自己根据经验调。
model.positions = new_positions

###保存结构
write('POSCAR_new', model, vasp5=True) # POSCAR_new是微调后的结构,用于下一步的计算(别忘了把POSCAR_new改成POSCAR)。

过渡态虚频

如果过渡态计算的时候出现好几个虚频,自己直接写个python脚本也能实现。不过使用ASE可以很方便地获取POSCAR中原子数目,保存原子固定的信息。参考如下。

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Qiang Li
Command: python3 vib_correct.py
This is a temporary script file.
"""
import numpy as np
import os

#获取虚频开始行
l_position = 0 #虚频振动方向部分在OUTCAR中的起始行数
with open('OUTCAR') as f_in:
lines = f_in.readlines()
wave_num = 0.0
for num, line in enumerate(lines):
if 'f/i' in line:
wave_tem = float(line.rstrip().split()[6])
if wave_tem > wave_num: #获取最大的虚频
wave_num = wave_tem
l_position = num+2
# 读POSCAR
with open('POSCAR') as f_pos:
lines_pos = f_pos.readlines()

# 获取虚频对应的OUTCAR部分
num_atoms = sum([int(i) for i in lines_pos[6].rstrip().split()])
vib_lines = lines[l_position:l_position + num_atoms] #振动部分 72227248

model_positions = []
vib_dis = []
for line in vib_lines:
position = [float(i) for i in line.rstrip().split()[:3]]
vib_infor = [float(i) for i in line.rstrip().split()[3:]] # dx, dy, dz对应的那三列
model_positions.append(position)
vib_dis.append(vib_infor)

# 微调结构
model_positions = np.array(model_positions)
vib_dis = np.array(vib_dis) #将振动部分写到一个array中。
new_positions = model_positions + vib_dis * 0.4 # 0.4是微调的校正因子,即虚频对应振动位移的0.4,具体多大自己根据经验调。

###保存结构
f_out = open('POSCAR_new','w')
f_out.writelines(lines_pos[:8])
f_out.write('Cartesian\n')
for i in new_positions:
f_out.write(' '.join([str(coord) for coord in i]) + ' F F F\n')
f_out.close()

phonopy声子群速度

操作步骤

  1. 首先对结构高精度优化后扩胞,计算得到没有虚频的声子谱;
  2. 对band.conf文件进行修改,并添加群速度计算相关参数GROUP_VELOCITY = .TRUE.GV_DELTA_Q = 0.01,程序需要读取本征值和本征矢,所以必须设置 EIGENVECTORS =.TRUE.,此外为了防止vaspkit在导出数据时报错,需要删除BAND_LABELS高对称路径名称,修改后band.conf文件内容如下;

而且具体使用过程中,关于执行命令还有执行文件的tag内容还有一些可替换的关系,–gv, –group_velocity 可在执行计算命令时替代执行文件中的GROUP_VELOCITY = .TRUE.内容, –gv_delta_q 可在执行计算命令时替代执行文件中的(GV_DELTA_Q)内容

  1. 对声子谱重新进行计算,打开phonopy.yaml文件可以看到,phonopy在计算声子谱的过程中考虑到了群速度;打开band.yaml文件中也保存了有关群速度的相关信息;同时在计算声子谱中phonopy所储存的数据文件mesh.yaml和band.yaml文件中也保存了有关群速度的相关信息。
  2. 随后进行数据提取,以vaspkit1.12版本为例,打开vaspkit,输入73,打开VASP2other Interface 子功能,选择739 Sort Phonon Band Structure for Phononpy,运行完成即可获得group velocity相关数据以及各原子的声子谱数据;在运行过程中我们可以看到软件说明find group velocity并写入输出文件中。
    1.5版本为789功能。

格林艾森常数(Grüneisen parameters)

为表示声子非简谐效应的参数。phonopy计算模式格林艾森参数方式见官网。
以NaCl为例,首先需要进行三个声子谱计算,分别是平衡体积(orig),稍小体积(minus)和稍大体积(plus)的结构,计算时改变晶格参数使得体积获得改变。

计算完成后获得不同体积下的原子间力常数文件FORCE_SETS 或 FORCE_CONSTANTS (后续命令中需要添加–readfc参数)。

随后通过phonopy-gruneisen(旧版gruneisen)命令获得对应于声子带结构中倒易空间中的路径的模式格林艾森常数(具体设定可根据自身计算情况更改)
phonopy-gruneisen orig plus minus --dim="2 2 2" --pa="0 1/2 1/2 1/2 0 1/2 1/2 1/2 0" --band="1/2 1/4 3/4 0 0 0 1/2 1/2 1/2 1/2 0.0 1/2" -p -c POSCAR-unitcell
在倒易网格中的模式格林艾森常数(具体设定可根据自身计算情况更改):
phonopy-gruneisen orig plus minus --dim="2 2 2" --pa="0 1/2 1/2 1/2 0 1/2 1/2 1/2 0" --mesh="20 20 20" -p -c POSCAR-unitcell --color="RB"
phonopy-gruneisen 命令选项包括–dim,–mp, –mesh,–band,–pa, –primitive_axis,–readfc,–band_points,–nac,–factor,–nomeshsym,-p,-c,-s, –save,-o等,功能上均与phonopy命令相同,但除上述列出的选项外,可以在phonopy命令上使用的其它选项是不能在phonopy-gruneisen 上使用的。如有必要,可以自行修改phonopy-gruneisen代码。

如查看帮助,可输入
phonopy-gruneisen -h
通过 phonopy-gruneisenplot 命令导出计算得到的数据,使用方式类似于phonopy-bandplot

原文链接:https://blog.csdn.net/icehoqion/article/details/130550807

热学性质

参考:
http://supersunsir.com/2020/08/01/vasp/vasp_phonopy/

热膨胀系数

我们通过准简谐近似(QHA)的方法计算热膨胀系数和等压热容等性质,

  • 首先,我们要把优化好的POSCAR加应变(比如0.96 0.97 0.98 0.99 1 1.01 1.02 1.03 1.04的缩放系数,这样就有9个结构文件),
  • 然后 把每一个POSCAR都去重复步骤(2)也就是去计算每一个缩放系数声子谱。大概就是这个效果
  • 最后我们通过phonopy里面的QHA模块 去得到此材料的非偕性质phonopy-qha -p -s e-v.dat *00/thermal_properties.yaml就可以得到很多热力学性质比如热膨胀系数,格林爱森参数,自由能,等压热容等等。
  1. 先进行高精度的晶格优化。
  2. 修改缩放系数为0.95-1.05新建10个POSCAR.
  3. 对11个POSCAR晶体进行声子谱计算
  4. thermo.conf文件后处理生成11个对应的thermal_properties.yaml
  5. QHA计算热膨胀系数

另一个写的步骤:

  1. 高精度的原胞优化
  2. 在此基础上施加形变(梯度可以设置为千分之一)
  3. 优化多个结构
  4. 使用DFPT方法计算每个结构的声子谱(如果结构有问题,使用phonopy –symmetry)
  5. 在每个文件夹中得到thermal_properties.yaml
  6. 运行脚本得到e-v.dat
  7. 运行phonopy-qha的相关命令得到各种dat文件
  8. Over

可以参考作者的thermo.conf文件:

{.line-numbers}
1
2
3
4
5
6
7
DIM = 2 2 2
ATOM_NAME = sio
MP = 31 31 31
TPROP = .TRUE.
TMAX = 2000
TSTEP = 2
FORCE_CONSTANTS = READ

然后是如何写e-v.dat文件

  • 大概意思就是找到之前计算的那11个POSCAR的vasprun.xml结果文件,然后记事本打开搜索最后一个e_wo_entrp。
  • 下载phonopy官方文件中Si-QHA的example,
  • 解压vasprun_xmls.tar.lzma我们可以得到算例中用到的vasprun.xml文件。

不同温度下热力学性质计算(自由能、热容、振动熵)

  • 在DFPT或者Finite displacement方法计算声子谱的基础上,得到mesh.yaml文件

  • 新建一个文件夹,将FORCE_CONSTANTS、POSCAR、mesh.conf放入该文件夹中(POSCAR为原胞)

  • 得到mesh.yaml文件

    {.line-numbers}
    1
    phonopy mesh.conf -c POSCAR

    mesh.conf的内容

    {.line-numbers}
    1
    2
    3
    4
    ATOM_NAME = Hf Si O
    DIM = 2 2 2
    MP = 13 13 13
    FORCE_CONSTANTS = READ

    得到thermal_properties.yaml文件

phonopy -c POSCAR mesh.conf -t
得到thermal_properties.dat文件
phonopy-propplot --gnuplot thermal_properties.yaml >thermal_properties.dat
将dat文件导入到Origin中画图

dat文件的5列数据分别为:

{.line-numbers}
1
2
3
4
5
temperature[K]
Free energy [kJ/mol]
Entropy [J/K/mol]
Heat capacity [J/K/mol]
Energy [kJ/mol]

下面是能用到的各种命令

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
扩胞用
phonopy -d --dim="2 2 2" -c POSCAR_UNIT
查找晶格对称性
phonopy --symmetry
收集力常数
phonopy --fc vasprun.xml
得到band.yalm文件(好像不需要这一步)
phonopy --dim="2 2 2" -c POSCAR-UNIT -p band.conf
得到thermal_properties.yaml文件
phonopy -c POSCAR mesh.conf -t

下面是产生e-v.dat文件的脚本,需要根据自己的目录名进行修改:

{.line-numbers}
1
2
3
4
5
6
7
8
9
for i in -0.005 -0.004 -0.003 -0.002 -0.001 0.001 0.002 0.003 0.004 0.005
do
cd AC_Uni$i;
pwd;
volume=`grep volume vasprun.xml | tail -1| awk '{printf("%20.13f", $3)}'`;
energy=`grep 'E0' OSZICAR | tail -1 | awk '{printf "%12.4f \t", $5}'`;
echo ${volume} ${energy} >> ../e-v.dat;
cd ../; #Exit the Strain folder
done

声子谱振动可视化

  1. 上面生成band.yaml文件,利用JMOL打开。https://jmol.sourceforge.net/
    或者网站:https://henriquemiranda.github.io/phononwebsite/phonon.html

  2. band.conf添加标签ANIME=0 0 0将000这个Q点的振动模式输出到anime.ascii,用v_sim软件打开即可。https://l_sim.gitlab.io/v_sim/index.en.html

  3. 运行命令 phonopy -f vasprun.xml-{001,002}得到FORSETS
    运行phonopy –dim=”3 3 3” –ct=”0 0 0”得到gamma点的振动模式密度

  4. DFPT方法得到的OUTCAR可以利用PyVibMS、JMOL

  5. 从band.yaml生成vesta读取:https://github.com/AdityaRoy-1996/Phonopy_VESTA

注意不要输出声子群速度,写出声子本征矢量。需要POSCAR.vesta格式。

从OUTCAR生成vesta读取:https://github.com/Stanford-MCTG/VASP-plot-modes

  1. 其他参考:https://www.bilibili.com/read/cv11848434/

声子谱反折叠

https://github.com/yuzie007/upho

热位移

热学性质是根据倒易空间采样网格上的声子频率计算得出的,必须设置Mesh tag进行使用,并且必须检查它们相对于取样网格的收敛性。 通常这种计算对计算量要求不高,因此随着采样网格密度的增加,收敛性很容易达到。此外,计算时Phonopy对频率的默认单位为Thz。
在DFPT和冷冻声子的计算基础上,在thermal_properties.conf 中设置:

1
2
3
4
5
6
TPROP = .TRUE. #进行热学性质计算
DIM = 1 1 1 #扩胞情况
MP = 16 16 8 #Mesh网格密度
TMAX = 2000
TMIN = 0
TSTEP = 10 #温度上下限默认为100,0,step默认值为10

计算得到thermal_properties.yaml文件:

phonopy -c POSCAR thermal_properties.conf -t

得到thermal_properties.dat文件:

phonopy-propplot --gnuplot thermal_properties.yaml >thermal_properties.dat

五列数据分别为:temperature[K]、Free energy [kJ/mol]、Entropy [J/K/mol]、Heat capacity [J/K/mol]、Energy [kJ/mol]。

Phonopy官网还给出了两个参数:
PRETEND_REAL = .TRUE.
这里将虚频声子当成实声子进入计算,仅在有小虚频实作测试用;
CUTOFF_FREQUENCY = 0.1
默认值为0,将虚频声子频率视为负值,计算高于截止频率的声子。

热位移计算

计算投影到笛卡尔轴上的均方位移与温度的函数关系。声子频率以 THz 为单位(phononopy 的默认设置),用于获得均方位移。同样需要与Mesh tag共同使用,温度设置与前述相同。新建thermal_displacements.conf用于输入tag。

1
2
3
4
5
6
TDISP = .TRUE. #进行均方位移计算
DIM = 1 1 1 #扩胞情况
MP = 16 16 8 #Mesh网格密度
TMAX = 2000
TMIN = 0
TSTEP = 10 #温度上下限默认为100,0,step默认值为10

XYZ_PROJECTION = .TRUE.
打开该tag,将对特征向量按实空间进行投影,得到不同原子在a,b,c三个轴向上的位移投影,数据存储为frequency atom1_x atom1_y atom1_z atom2_x atom2_y atom2_z…形式。

PROJECTION_DIRECTION = 1 1 0
打开该tag,将原子位移在指定实空间轴向上进行投影。
phonopy -c POSCAR thermal_displacements.conf -p -s
执行后,输出结果将保存在thermal_displacements.yaml中。注意,计算的原子位移为均方位移。

此外的两个tag:

TDISPMAT = .TRUE.
打开该tag时,将以3*3矩阵形式储存原子在六个方向上的均方位移xx, yy, zz, yz, xz, xy,结果写入thermal_displacement_matrices.yaml中。

TDISPMAT_CIF = 1273.0
该tag用于指定计算在某温度(1273K)下,原子的均方位移矩阵,结果输出在tdispmat.cif中。

Phonopy其他功能

  • phonopy --symmetry -c POSCAR-unit

BPOSCAR和PPOSCAR生成,分别是标准胞和原胞,vasp格式。

  • phonopy --rd 10 --dim 2 2 2 --pa auto --amplitude 0.03 -c POSCAR-unitcell

–rd 10 代表生成10个随机位移结构,–dim 2 2 2扩胞倍数,–pa auto沿三个坐标轴投影方向,–amplitude 0.03位移幅度,-c指定对象。

输出”phonopy_disp.yaml” and supercells

  • phonopy-load phonopy_disp_orig.yaml --rd 1000 --temperature 300

generate 1000 supercells with displacements at 300K.

  • New in v2.25 Symfc (symfc/symfc) is based on fitting approach and any displacements set of atoms in supercell can be handled. For example, random displacements generated by RANDOM_DISPLACEMENTS can be used to compute force constants. To use symfc, its python module has to be installed via conda-forge or pip.

New in v2.3 ALM (ttadano/ALM) is based on fitting approach and any displacements set of atoms in supercell can be handled. For example, random displacements generated by RANDOM_DISPLACEMENTS can be used to compute force constants. To use ALM, its python module has to be installed via conda-forge or building it. The installation instruction is found here.

When ALM is used, please cite the paper: T. Tadano and S. Tsuneyuki, J. Phys. Soc. Jpn. 87, 041015 (2018).

FC_CALCULATOR = ALM

参考:

https://zhuanlan.zhihu.com/p/355317202

https://mp.weixin.qq.com/s?__biz=MzI3MzIyMjI2Nw==&mid=2247488523&idx=1&sn=90a544712f166e248993e1198eb40981&chksm=eb27cb1fdc50420921bb11d3bc8f4833c14418b0d0c0d755af6687fca024fc9d15d999ae7813&scene=21#wechat_redirect

https://blog.sciencenet.cn/blog-2909108-1154273.html

https://zhuanlan.zhihu.com/p/642116307

https://zhuanlan.zhihu.com/p/25432728

一、安装编译

wannier90安装

下载: https://wannier.org/download/

2.1版本是可以与VASP结合的最新版本。但是2.1版本默认安装与VASP接口并不好,主要是借助肖承诚博士写了一个Fortran的接口(https://github.com/Chengcheng-Xiao/VASP2WAN90_v2_fix), 需要注意的是这个接口是针对VASP 5.4.4版本的。1.2版本与VASP的接口是好的,所以1.2版本默认安装就好。对比两个版本的不同,1.2版本的主要缺点就在于不能构建向上自旋和向下自旋的能带,也就是没有自旋轨道耦合作用的铁磁和反铁磁体系。 0201

1.1 wannier90 2.1安装

首先,解压安装包

tar -zxvf wannier90-2.1.0.tar.gz

其次,进入文件夹

cd wannier90-2.1.0/

然后,准备编译文件(这里老王用的是ifort,注意要检查ifort和mpiifort执行命令)

cp config/make.inc.ifort make.inc

接着,编译

make

完成后,编译库,得到libwannier.a文件

make lib

1.2 VASP编译(注意以上接口VASP2WAN90_v2_fix只针对VASP 5.4.4)

首先拷贝VASP2WAN90_v2_fix接口文件中的mlwf.patch 到VASP代码编译目录下。然后执行如下命令。

patch -p0 < mlwf.patch

接着在VASP makefile.include 文件中加入下面两行。注意路径。

1
2
3
CPP_OPTIONS+=-DVASP2WANNIER90v2

LLIBS+=/path/to/your/wannier90_distro/libwannier.a

最后编译即可

make all

wannier-tools安装

开源软件包WannierTools,是一个用于研究新型拓扑材料的软件。此代码在紧束缚模型中工作,可以由另一个软件包Wannier90生成。

它可以通过计算Wilson loop来帮助对给定材料的拓扑相进行分类,通过角分辨光电发射(ARPES)和红外光谱技术,可以得到表面态光谱扫描隧道显微镜(STM)实验。它还可以识别Weyl/Dirac点和节点线结构的位置,计算闭合动量环周围的贝里相位和部分布里渊区(BZ)的贝里曲率。
此外,WannierTools还可以计算非磁性金属和半金属的普通磁电阻利用玻尔兹曼输运理论,计算给定磁场方向和强度下的朗道能级谱;并从超胞计算中得到展开的能谱。

wanniertools官方安装教程

http://www.wanniertools.com/installation.html

安装依赖环境

1、Intel编译器即oneapi(Fortran compiler (Gfortran or ifort),MPICH version higher than 2.1.5,Lapack and Blas library, (Intel MKL recommended))

2、Arpack-ng

安装步骤

下载wanniertools和arpack安装包并分别解压

1
2
unzip wannier_tools-master.zip
tar vzxf arpack96.tar.gz

先进入arpack,修改编译文件并编译
在ARmake.inc中修改编译路径,这里以实际安装路径为准

1
home = $(HOME)/ARPACK

修改编译器,参考VASP安装时的makefile.include

1
2
FC=f77
FFLAGS= -O -cg89

改为

1
2
3
FC         = mpiifort
FCL = mpiifort -mkl=sequential
FFLAGS = -O -cg89

然后执行make编译

make lib

直至产生libarpack_SUN4.a文件,该文件会因为不同机器不同环境而不同名称,只要确定好,然后在编译wanniertools的时候指定好就行了

在wanniertools的src文件夹的makefile文件中该默认值为

1
2
3
#ARPACK LIBRARY

ARPACK=/Users/quan/work/workplace/ARPACK/libarpack MAC.a

修改为刚刚已经生成的文件路径,这里使用的是Makefile.intel-mpi,重命名为makefile

1
cp Makefile.intel-mpi Makefile

然后编译即可

1
make

最后生成wt.x文件即为安装成功

1
cp -f wt.x../bin

二、计算过程(以石墨烯为例)

1、结构优化加自洽计算

POSCAR为

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
Surf-mp-48                             
1.00000000000000
1.2344083195740001 -2.1380573715510001 0.0000000000000000
1.2344083195740001 2.1380573715510001 0.0000000000000000
0.0000000000000000 0.0000000000000000 12.0000000000000000
C
2
Direct
0.0000000000000000 0.0000000000000000 0.5000000000000000
0.3333329999917112 0.6666670000099160 0.5000000000000000

INCAR为

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SYSTEM=Graphene
Global Parameters
ISTART = 0 (Read existing wavefunction; if there)
ISPIN = 1 (Non-Spin polarised DFT)
ICHARG = 2 (Non-self-consistent: GGA/LDA band structures)
LREAL = .FALSE. (Projection operators: automatic)
ENCUT = 500 (Cut-off energy for plane wave basis set, in eV)
PREC = A (Precision level)
ADDGRID= .TRUE. (Increase grid; helps GGA convergence)

Electronic Relaxation
ALGO = N
ISMEAR = 0 (Gaussian smearing; metals:1)
SIGMA = 0.05 (Smearing value in eV; metals:0.2)
NELM = 90 (Max electronic SCF steps)
NELMIN = 6 (Min electronic SCF steps)
EDIFF = 1E-08 (SCF energy convergence; in eV)

Ionic Relaxation
NSW = 0 (Max ionic steps)
IBRION = -1 (Algorithm: 0-MD; 1-Quasi-New; 2-CG)
ISIF = 3 (Stress/relaxation: 2-Ions, 3-Shape/Ions/V, 4-Shape/Ions)
EDIFFG = -2E-02 (Ionic convergence; eV/AA)

加SOC在自洽计算加上
LSORBIT=T

2、非自洽计算投影能带

在自洽计算基础上,cp -r scf band
修改INCAR

1
2
3
ISTART =  1         
ICHARG = 11
LORBIT = 10/11

KPOINTS 改为高对称点路径。

画一下能带结构,然后再做一下Fatband分析,了解费米面附近能带是有哪些成分构成的。以C的pz轨道。

3、非自洽vasp产生.win文件

在自洽计算基础上 cp -r scf wan1
修改INCAR

1
2
3
4
5
ISTART =  1         
ICHARG = 11
NBANDS = 40
LWANNIER90 = .TRUE.
NUM_WANN = 2

注意,INCAR中使用NPAR参数会出错

KPOINTS、POSCAR、POTCAR不改。

准备好wannier90.win文件,同时在INCAR里头添加一行LWANNIER90=.TRUE.和一行ICHARG=11,然后再运行一遍VASP。 顺利的话,会产生 wannier90.amn, wannier90.mmn, wannier90.eig, wannier90.chk 等4个文件。wannier90.win里头的内容也有可能会被改变。包括结构信息,k点信息。有了这三个文件就可以进一步调节参数,构造wannier函数了。请注意wannier90.win里头的num_bands要和OUTCAR里头的NBANDS一致。.mmn积分矩阵和.amn布洛赫态在轨道上的尝试投影和UNK0000x.1存储实空间单胞的布洛赫态相关信息,这些文件是运行链接wannier90的DFT计算输出的结果,而gaas.win是计算参数设置文件

4、wannier90.x计算

运行wannier90主程序。mpirun -np 40 wannier90.x wannier90 &

注意在第3步打开hr_plot = T,关闭write_hr = true;在第4步打开write_hr = true,关闭hr_plot = T

这里后面一个winner90代表wannier90.win的文件.win前面的部分。如果你的win文件是name.win运行的地方就可以是

wannier90.x name &

运行过程中当num_bands > num_wann 有个迭代过程,控制迭代步数可以通过

1
2
dis_num_iter  =  200   # 迭代1,默认200步
num_iter = 200 # 迭代2,默认200步

最后会生成wannier90.chk文件,restart计算会读取这个文件。

加入能带部分的话第一次运行就会出来,wannier90_band.dat文件,这个可以用来和DFT结果对比。
构造好Wannier函数以后,仔细检查一下wannier90.wout,
搜索”Final State”,在这里可以看到每条Wannier轨道的展宽,由此可以检查你构造的Wannier函数是否足够局域。如果有某个Wannier函数的展宽
比晶格常数大许多,就表明你的Wannier函数构造不是很理想,需要不断调节投影轨道,解纠缠窗口以及Frozen窗口等。从这些轨道的中心和展宽也能
看出轨道之间的简并性如何,由此也可以判断所构造的Wannier函数对称性如何,这个也会影响后续的分析,特别是表面态的计算。查看wannier90.wout末尾的Final State的最后一列小于3,其结果是可以的。

5、

紧接着,你就可以开始书写WannierTools的主输入文件了,
目前叫input.dat,以后会改成http://wt.in (WannierTools v2.2之后)。 这里不具体介绍每一个参数,在说明文档中有详细的介绍,中文版的说明文档正在翻译中。
input.dat文件有模板,使用的时候直接拷贝然后加以修改。很多内容都可以直接从wannier90.win和wannier90.wout中拷
贝。 Bi2Se3的主输入文件input.dat可以在附件中下载得到。我们可以通过控制输入文件中的一些参数来实现我们所需要的功能。

常见报错

  1. 首先跑接口会生成3个文件.amm .mmm .eig通过这三个文件构造wannier函数。也可以提前把.win文件准备好放进去。以上三个文件生成后运行wannier90.x会成.chk文件

  2. Restar=T是需要读取.chk文件的

Error: restart requested but wannier90.chkfile not found

原因:加了restart = plot 这个命令,但却没有wannier90.chk这个文件。Restart是需要读取wannier90.chk的。

解决办法:注释掉restart = plot,然后重新运行wannier90.x wannier90 &得到wannier90.chk.

  1. 问题:Wannier90 is running in LIBRARY MODE

Setting up k-point neighbours…

Ignoring in input file

解决办法:尽量串行,不要并行。请再次运行 $postw90 wannier90的为输出的数据

  1. Spinors与文件INCAR中的ISPIN的设置有关,同时存在或者同时去掉,否则影响.amn文件的形成。(自旋轨道耦合)

  2. 谨慎用use_bloch_phases=T一般是F

  3. 问题:param_read: mismatch in wannier90.eig

解决办法:每一步计算的核数要相等

  1. 问题:dis_windows: More states in the forze window than target WFs

解决办法:把dis_windows改大点

  1. Fewer projections defined than the number of wannier functions requested.

投影的轨道太少

解决办法:增加投影的轨道

  1. Kmesh_get_bvector: Not enongh bevectors found

解决办法:添加kemsh_tol

  1. Wanted band:1 found band:17

Wanted kpoint:2 found kpoint:1

解决办法:常见原因是num_bands设置错误,返回band计算文件夹查看NBANDS

  1. Dis_windows: Energy window contains fewer states than number sf target WFs

解决办法:把dis_windows改大点

  1. Dis_windows: more states in the frozen window than WFs

解决办法:调节frozen window, 投影太多或者这个窗口太大涉及到别的轨道

  1. Wannier 运行有两种模式一是library mode,一种是单机模式stand-alone mode

解决办法:library mode是需要进行串行。

  1. param_get_projection: too many projections defined

解决办法:begin projections random

原因:num_wann 与设置投影数不匹配。

解决办法:不加soc:num_wann 等于每种原子投影轨道数之和

soc:num_wann 等于两倍的每种原子投影轨道数之和

  1. Gnuplot的报错信息”arc_bulk.gnu”, line 26: warning: No unsable data in this plot to auto-scale axis range

  2. param_get_projection: Problem reading m state into string

解决办法:已解决Fe: s;px;py;pz;dz2;dxz;dyz;dx2-y2;dxy

不是Fe:s;p;d

  1. 能带拟合的不好可能是因为,投影的不对,还有核数和能带数的关系

解决办法:太马虎了,这样的问题肯定是K点写错了

能带布里渊区的宽度不一样有可能是wannier里规定的K点数并没有完全计算。

  1. num_iter = 2000 #wannier center 迭代次数

num_print_cycles = 40 #wannier center 迭代每40步输出一次

  1. dis_num_iter = 1200 #解纠缠的迭代步数#

  2. num_iter最小化过程中的总迭代次数。如果您希望生成投影wf而不是最大本地化的wf,则设置num_iter=0(请参阅教程中的示例8)?默认值为100

  3. dis_mix_ratio = 1.d0 # 0.5<dis_mix_ratio<1, 默认值0.5

#在解纠缠过程中,要利用混合参数进行收敛,值为0.5是“安全”的选择。使用1.0(即不混合)通常会得到更快的收敛,但可能会导致 最小化,在某些情况下是不稳定的。

dis_conv_tol = 1.0E-10 # Delta < 1.000E-10 over 3 iterations

  1. dis_win_max = 15

dis_froz_max = 14

num_wan = 12

exclude_bands : 1-11,26 #在使用这个参数时,num_bands = 总能带数减去排除在外的能带数

num_bands = 14

#如果使用能量窗口规定想要拟合的能带区间,需要同时使用这个几个参数

  1. wannier_plot_supercell =2 #在一个对应于“超胞”的网格上生成WFs

  2. wannier_plot_list =2 #列举要画出WFs的序号,与wannier center 的序号是一致的

  3. 运行接口的情况有三种,一是选择投影能带数发生了改变,二是,需要写入wannier90.win的输入文件;三是需要在INCAR添加关键参数,输出wannier.x需要的文件。(仅仅是调节能量窗口是不需要重新运行接口的)

  4. 无没有projection是肯定没有amn的

简介

https://github.com/hackingmaterials/Amset
https://hackingmaterials.lbl.gov/amset/
https://www.nature.com/articles/s41467-021-22440-5.pdf

劳伦斯·伯克利国家实验室Alex M. Ganose和Anubhav Jain开发了一种根据第一性原理输入来计算固态半导体和绝缘体载流子散射率的有效计算方法(AMSET)。本方法扩展了现有的极性和非极性电子-声子耦合、离子化杂质和基于各向同性能带结构的压电散射机制的公式以支持高度各向异性的材料。他们通过计算23种半导体的电子传输特性来测试这个公式,包括48个大原子$CH_3NH_3PbI_3$混合钙钛矿,并将结果与实验测量结果和更详细的散射模拟进行比较。相对于实验的斯皮尔曼迁移率秩系数(rs = 0.93)与使用恒定弛豫时间近似值(rs = 0.52)获得的结果相比有明显提高。他们发现,他们的方法可提供与最新技术类似的精度,而计算成本约为1/500,因此可在高通量计算工作流程中使用,以精确筛选载流子迁移率、寿命和热电功率。

  • Inputs obtainable from first-principles calculations. The primary input for AMSET is an uniform band structure calculation.
  • Scattering rates calculated in the Born approximation using common materials properties such as phonon frequencies and dielectric constants.
  • Transport properties calculated through the Boltzmann transport equation.
  • Efficient implementation that can run on a personal laptop.

安装

依赖

pymatgen==2023.3.23
scipy==1.10.1
monty==2022.9.9
matplotlib==3.7.1
BoltzTraP2==22.12.1
tqdm==4.65.0
tabulate==0.9.0
memory_profiler==0.61.0
spglib==2.0.2
click==8.1.3
sumo==2.3.6
h5py==3.8.0
pyFFTW==0.13.0
interpolation==2.2.4
numba==0.56.4

conda environment

pip install amset

Developer Installation

{.line-numbers}
1
2
3
git clone https://github.com/hackingmaterials/amset.git
cd amset
pip install -e .

准备工作

Structural relaxation:

“tight” calculation settings

{.line-numbers}
1
2
3
4
ADDGRID = True  
EDIFF = 1E-8
EDIFFG = -5E-4
PREC = Accurate

Dense uniform band structure and wave function coefficients:

2倍的K点密度,HSE06 is required,输出波函数,

wave ``` 得到
1
2
3
4
5
6
```wavefunction.h5 file ```
### Elastic constants:
"tight"relax
```javascript {.line-numbers}
NSW = 1
IBRION = 6

Deformation potentials:

amset deform create
single point calculation,

{.line-numbers}
1
2
NSW = 1   
ICORELEVEL = 1

amset deform read undeformed def-1 def-2 def-3
产生deformation.h5 file。

Dielectric constants, piezoelectric constants and polar-phonon frequency:

DFPT方法,Note, DFPT cannot be used with hybrid exchange-correlation functionals. In these cases the LCALCEPS flag should be used in combination with IBRION = 6

{.line-numbers}
1
2
3
NSW = 1
IBRION = 8
LEPSILON = True

amset phonon-frequency
读取DFPT的 vasprun.xml 获得 dielectric constants 和 polar phonon frequency。

运行

有两种方式,Python脚本
或者通过读取settings.yaml和输入文件加命令行运行

脚本

cp path/example/Si/Si.py .
脚本如下:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import warnings
from amset.core.run import Runner
from amset.plot.rates import RatesPlotter
warnings.simplefilter("ignore")
settings = {
#general settings
"scattering_type": ["IMP", "ADP"],
"doping": [-1.99e14, -2.20e15, -1.72e16, -1.86e17, -1.46e18, -4.39e18],
"temperatures": [300],
"bandgap": 1.14,
#electronic_structure settings
"interpolation_factor": 50,
#materials properties
"deformation_potential": "deformation.h5",
"elastic_constant": [
[144, 53, 53, 0, 0, 0],
[53, 144, 53, 0, 0, 0],
[53, 53, 144, 0, 0, 0],
[0, 0, 0, 75, 0, 0],
[0, 0, 0, 0, 75, 0],
[0, 0, 0, 0, 0, 75],
[0, 0, 0, 0, 0, 75],
],
"static_dielectric": [[11.7, 0, 0], [0, 11.7, 0], [0, 0, 11.7]],
"high_frequency_dielectric": [[11.7, 0, 0], [0, 11.7, 0], [0, 0, 11.7]],
#performance settings
"write_mesh": True,
}

if __name__ == "__main__":
runner = Runner.from_vasprun("vasprun.xml", settings)
amset_data = runner.run()

plotter = RatesPlotter(amset_data)
plt = plotter.get_plot()
plt.savefig("Si_rates.png", bbox_inches="tight", dpi=400)

python Si.py 即可

命令行设置

需要准备settings.yaml文件:以Si为例:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 # general settings
scattering_type: [IMP, ADP]
doping: [-1.99e14, -2.20e15, -1.72e16, -1.86e17, -1.46e18, -4.39e18]
temperatures: [300]
bandgap: 1.14

# electronic_structure settings
interpolation_factor: 50

# materials properties
deformation_potential: deformation.h5
elastic_constant:
- [144, 53, 53, 0, 0, 0]
- [ 53, 144, 53, 0, 0, 0]
- [ 53, 53, 144, 0, 0, 0]
- [ 0, 0, 0, 75, 0, 0]
- [ 0, 0, 0, 0, 75, 0]
- [ 0, 0, 0, 0, 0, 75]
static_dielectric:
- [11.7, 0, 0]
- [0, 11.7, 0]
- [0, 0, 11.7]
high_frequency_dielectric:
- [11.7, 0, 0]
- [0, 11.7, 0]
- [0, 0, 11.7]
#performance settings
write_mesh: true

amset run –directory path/to/files 运行即可
其他设置可以通过命令行加入:
amset run –interpolation-factor 20
画图:
amset plot rates mesh_99x99x99.h5

Output filesThe transport results will be written to transport_99x99x99.json. The 99x99x99 is thefinal interpolated mesh upon which scattering rates and the transport properties arecomputed.The write_mesh option is set to True, meaning scattering rates for all doping levelsand temperatures will be written to the mesh_99x99x99.h5 file.

设置相关参数:

General settings

  1. scattering_type:Default: auto ;单独设置: ADP,IMP,POP
    ADP (acoustic deformation potential scattering)
    IMP (ionized impurity scattering)
    PIE (piezoelectric scattering)
    POP (polar optical phonon scattering)
    CRT (constant relaxation time)
    MFP (mean free path scattering)
  2. doping:负值代表电子,正值代表空穴
    Default: ['1.e15', '1.e16', '1.e17', '1.e18', '1.e19', '1.e20', '-1.e15', '-1.e16', '-1.e17', '-1.e18', '-1.e19', '-1.e20']
    单独设置有两种: 1E13,1E14,1E15,1E16,1E17,1E18,1E19,1E20 或者 1E13:1E20:8
  3. temperatures:Default: [300]
    单独设置:300,400,500,600,700,800,900,1000 或者300:1000:8
  4. interpolation_factor:Default: 10
    控制插值密度,最终的k点等于能带计算的k点乘上插值因子。
  5. wavefunction_coefficients:Default: wavefunction.h5
    波函数系数读取的方式,产生该文件可以通过amset wave获得。
  6. bandgap:
    设置该参数会自动采用scissor修正,因此不能与scissor选项共用,且对金属不起作用。
  7. scissor:
    正值代表带隙打开,负值代表缩小,对金属无效。
  8. zero_weighted_kpoints:
    设置方式:
    keep: Keep zero-weighted k-points in the band structure.
    drop: Drop zero-weighted k-points, keeping only the weighted k-points.
    prefer: Drop weighted-kpoints if zero-weighted k-points are present in the calculation (useful for cheap hybrid calculations).
  9. use_projections:Default: False
    不建议设置。该参数使用投影计算波函数交叠,往往导致差的性能,使用时设置LORBIT = 11
  10. free_carrier_screening:Default: False
    控制是否屏蔽极化光学声子和压电散射率。这可以导致在高载流子浓度下散射率的大幅度降低。

Material settings

  1. high_frequency_dielectric:Required for: POP, PIE
  2. static_dielectric:Required for: IMP, POP
  3. elastic_constant:Required for: ADP, PIE
  4. deformation_potential:Required for: ADP
  5. piezoelectric_constant:Required for: PIE
  6. defect_charge:Required for: IMP。Default: 1
  7. pop_frequency:Required for: POP amset phonon-frequency获得。
  8. compensation_factor:Required for: IMP Default: 2
  9. mean_free_path:Required for: MFP
  10. constant_relaxation_time:Required for: CRT 不建议和其他散射机制设置。

Performance settings:控制速度和精度,一般默认。

  1. energy_cutoff:Default: 1.5
  2. fd_tol:Default: 0.05. 0-1之间,越小计算K点越多。
  3. dos_estep:Default: 0.01.越小越好越贵。
  4. symprec:Default: 0.01。
  5. nworkers:Default: -1。代表用所有的机器。其他设置代表几个。
  6. cache_wavefunction:Default: True。加速计算,增加内存。如果内存不够关闭。

Output settings:输出文件设置

  1. calculate_mobility:Default: True。是否计算n/p载流子迁移率。
  2. separate_scattering_mobilities:Default: True。是否计算单独的散射机制的迁移率。
  3. write_mesh:Default: False。是否将全K点结果写入磁盘。对于大的interpolation_factor可以打开。
  4. file_format:Default: json。输出文件的格式:json, yaml, and txt.对于write_mesh=True不能用TXT。
  5. write_input:Default: False。是否将输入设置写入amset_settings.yaml.
  6. print_log:Default: True。是否输出日志。

Summary of scattering rates

Mechanism Code Requires Type
Acoustic deformation potential scattering ADP n- and p-type deformation potential, elastic constant Elastic
Piezoelectric scattering PIE high-frequency dielectric constant, elastic constant, piezoelectric coefficient (e) Elastic
Polar optical phonon scattering POP polar optical phonon frequency, static and high-frequency dielectric constants Inelastic
Ionized impurity scattering IMP static dielectric constant Elastic

其他功能

you can use amset which relies on Fourier interpolation of the band
structure using BoltzTraP2. There are two options.

  • Use amset eff-mass: This calculates the conductivity effective mass as defined here: https://www.nature.com/articles/s41524-017-0013-3
  • Use amset plot band --stats vasprun.xml: This calculates the effective mass in the same way as sumo but using a band structure interpolated from a uniform calculation.

自洽计算

VASP做静态自洽的目的主要是为了得到好的电子密度和波函数文件,为了使后续的性质计算可以读取电子密度和波函数,进而增加收敛速度。
首先进行 高精度 的结构优化。然后复制文件, cp CONTCAR POSCAR 做一次自洽计算。
自洽计算要求有密的k网格点,在计算条件允许的情况下要求自洽的k网格点大致为优化时的2倍左右。
修改标签

{.line-numbers}
1
2
3
4
IBRION=-1
NSW=0
LWAVE = .T. (Write WAVECAR )
LCHARG = .T. (Write CHGCAR )

这一步完成后的输出文件CHGCAR即是电荷密度,导入VESTA直接查看。

bader电荷

自洽时INCAR再加一个参数:

{.line-numbers}
1
2
3
IBRION=-1
NSW=0
LAECHG=.T.

输出文件:
AECCAR0 全电子中的芯电子部分(POTCAR)
AECCAR1 自洽计算前的交叠原子电荷(POTCAR,bader 分析不用)
AECCAR2 全电子中的价电子部分(自洽计算后)
CHGCAR 自洽计算后赝电子

输入:

{.line-numbers}
1
2
chgsum.pl AECCAR0 AECCAR2
bader CHGCAR -ref CHGCAR_sum

得到两个文件:

  • BCF.dat 电荷极大值序号和坐标
    体积内的 Bader 电荷(积分)
    距离极大值最近的原子和距离
  • ACF.dat 原子序号和坐标
    原子电荷(极大值的电荷之后)
    到零通量面最小距离
    原子体积

李强博士《learn vasp the hard way》https://www.bigbrosci.com/2011/12/24/A08/ Bader电荷与原子电荷着色:
https://www.bigbrosci.com/2011/12/23/A07/ https://mp.weixin.qq.com/s/BNzjhz8SI_HXkaEnyL29Bg

成键反键

自洽时添加:

{.line-numbers}
1
2
3
4
5
NBANDS=96
ISYM=-1
IBRION=-1
NSW=0
LWAVE = T

vi lobsterin
原子编号改为自己的,例如

lobsterin:

1
2
3
4
5
6
7
8
COHPstartEnergy  -14
COHPendEnergy 6
basisSet Bunge
basisfunctions Ga 4s 4p 3d
basisfunctions As 4s 4p

cohpbetween atom 1 and atom 2

前两行代表提取的能量范围;第三行代表选择的基组,如果不设置(空行)就是默认基组,如果要覆盖默认基集,可使用此关键字进行覆盖。它目前支持bunge、koga和pbeVaspFit2015;第四行代表为每个元素指定所使用的基函数;最后一行代表选择一对两个原子进行键合分析。

lobster < lobsterin

1、删除存在的WAVECAR文件,做单点计算,计算需要保存波函数文件;
2、做完单点计算在当前目录下运行lobster软件;
3、用wxDragon软件打开COHPCAR.lobster文件。
4、COHPCAR.lobster 文件包含COHP结果,第二列为pCOHP,将第二列乘-1可得-pCOHP
https://github.com/JaGeo/LobsterPy
https://zhuanlan.zhihu.com/p/470592188

注:

  • orbitalWise 这个参数一般加在cohpBetween或者cohpGenerator之后,用以把原子之间的相互作用具体分到s p d 这些轨道上,比如计算s-s, p-p, d-d之间的pCOOP, pCOHP;
    比如:cohpBetween atom 1 atom 2 orbitalWise

cohpGenerator from 1.4 to 1.5 type Ga type Sr orbitalWise

  • 不要使用US-PP超软赝势,使用PAW赝势;请使用vasp_std版本,不要使用vasp_gam
    ;不支持处理对称:ISYM=0或ISYM=-1

  • 由于需要把基于平面波的波函数投影到原子轨道的基函数上,所以计算的能带的数量要多于投影的基函数,VASP计算的时候,默认的NBANDS达不到要求,需要加大NBANDS,只要查看OUTCAR里面的NBANDS多少,grep NBANDS OUTCAR;在INCAR里面,NBANDS关键词设置成1.5倍NBANDS,足以满足计算的投影要求,在计算过程中一定要记住设置足够的NBANDS,否则会出现报错,一直不能正常算出COHP

  • cohpGenerator 这里通过距离或者元素类别告诉想要计算什么原子之间的COHP;cohpGenerator from 1.5 to 2.3 type Fe type N orbitalwise #输出Fe-N原子对距离在1.5到2.3的所有数据之和。

  • gaussianSmearingWidth 高斯展宽,如果VASP中用的ISMEAR=0,那么gaussianSmearingWidth的数值和SIGMA一样,默认值是0.2 eV,但是过大了,所以需要减小。设置格式:gaussianSmearingWidth 0.05

ELF电子局域函数计算

电子局域函数(Electron Localization Function—ELF)是研究电子结构的手段之一。用来描述以某个位置处的电子为参考,在其附近找到与他同自旋的电子的概率,可以表征这个作为参考的电子的局域化程度,也是一种描述在多电子体系中的电子对概率的方法。
ELF的取值范围是[0,1]。
ELF=1 对应完全局域化;
ELF=1/2,对应类电子气型的成对概率;
ELF=0,对应电子完全离域化。

计算流程:做自洽的时候在INCAR中加入:

{.line-numbers}
1
2
3
4
PREC=A
LELF=T
IBRION=-1
NSW=0

运行vasp得到ELFCAR文件。

将ELFCAR拖入Vesta http://www.jp-minerals.org/vesta/en/download.html

点击 Utiltties - 2D Data Display。
点击Slice,确定切面和fractional coordinates。
导出图片:之后可以用PS工具将原子模型加入。

费米面

费米面计算,这里我们以Cu为例,见vaspkit/examples/Cu_fermi_surface。
第一步,准备好POSCAR,注意一定是原胞(primitive cell )和用于静态计算的INCAR文件;
第二步,运行VASPKIT,输入261命令,产生用于计算计算费米面的KPOINTS和POTCAR文件,
第三步,提交VASP作业;第四步,待VASP计算完成后,再次运行VASPKIT,输入262命令,生成包含费米面数据的FERMISURFACE.bxsf文件;第五步,运行XcrySDen软件。
发现第五条能带穿过费米面,因此我们选择Band Number 5,然后点击Selected,然后得到Cu的费米面。推荐使用FermiSurfer可视化费米面。
对于半导体不存在费米面,如果想可视化导带或价带中某个能级处的等能面,新建FERMI_ENERGY.in文件然后在该文件第二行(第一行为注释行)中人为指定能级大小,注意该值一定要保证穿过价带或导带。接下来调用vaspkit-252或263命令提取可视化。

STM模拟

参考:https://zhuanlan.zhihu.com/p/538950799

https://zhuanlan.zhihu.com/p/667558468

https://www.vasp.at/wiki/index.php/STM_of_graphite

  1. 首先做一个自洽计算,输出 WAVECAR 和 CHGCAR 文件。

  2. 加入一些特殊参数计算,输出我们想要的 PARCHG 文件。

    1
    2
    3
    4
    5
    LPARD = .TRUE.
    LSEPK = .FALSE.
    LSEPB = .FALSE.
    NBMOD = -3
    EINT = -0.1 0.1
  3. 用p4vasp软件打开PARCHG文件或者vaspkit 后处理。由于 VASP 在对于远离原子表面时波函数的衰减指数描述不明确,所以模拟探针高度的时候不应该太高,否则会出现非物理的现象,比如 7 埃,就算比较远了。所以一般高度的选择要接近材料表面,这里选择了 0.5 埃。而原胞沿着 ab 平面重复的标准是 20 埃,也就是说原胞晶格 * 重复单元 = 20 埃就可以。vaspkit 里选择的是 Tersoff-Hamman 方法,现在大多数模拟 STM 的都是选择这个方法。

  4. vaspkit处理后的输出文件包括X.grd, Y.grd, STM_*.grd三个文件,可以用以下脚本画图。
    Usage: python plot.pyimport numpy as npimport matplotlib as mpl#mpl.use(‘Agg’) #silent modefrom matplotlib import pyplot as plt
    x_mesh=np.loadtxt(‘X.grd’) y_mesh=np.loadtxt(‘Y.grd’) v_mesh=np.loadtxt(‘STM.grd’)
    fig = plt.figure()cmap = plt.cm.get_cmap(“Greys_r”) plt.contourf(x_mesh,y_mesh,v_mesh,cmap=cmap)
    plt.axis(‘equal’)plt.axis(‘off’)#plt.show()plt.savefig(“STM.jpg”,dpi=300)
    或者用以下脚本处理后,得到data.txt文件,将该文件导入origin画图。Usage: sh get_data.shawk ‘{for(i=1;i<=NF;i++) print $i}’ X.grd >xawk ‘{for(i=1;i<=NF;i++) print $i}’ Y.grd >yawk ‘{for(i=1;i<=NF;i++) print $i}’ STM_0.50.grd >spaste x y s >data.txt

态密度

自洽计算之后,读取产生的CHGCAR、WAVECAR
上面例如bader电荷、ELF标签都关闭。
INCAR中修改:

{.line-numbers}
1
2
3
4
5
ISTART=1
ICHARG=11
ISMEAR=-5
NEDOS=2001
LORBIT=11

其他参数和自洽时保持一致。
运行后vaspkit的111/112/113/114命令处理即可得到。

分波态密度和局域态密度

态密度很多分析和能带的分析结果可以一一对应,很多术语也和能带分析相通。但是因为它更直观,因此在结果讨论中用得比能带分析更广泛一些。在电子能级为准连续分布的情况下,单位能量间隔内的电子态数目,即为态密度。能态密度与能带结构密切相关,是一个重要的基本函数。固体的许多特性,如电子比热、光和X射线的吸收和发射等,都与能态密度有关。在VASP中,LORBIT=10计算的就是LDOS,也就是每个原子的局域态密度 (local DOS),是分解到每个原子上面的s,p,d;LORBIT=11,计算的就是PDOS,投影态密度(projected DOS)或分波态密度(partial DOS),不仅分解到每个原子的s,p,d,而且还进行px,py,pz分解。

/vaspkit.0.72/examples/LDOS_PDOS/Partial_DOS_of_CO_on_Ni_111_surface 目录下启动 vaspkit ,输入命令 115 选择子功能 The Sum of Projected DOS for Selected Atoms and orbitals 。我们需要提取的是O的s,p轨道,C的s,p轨道以及表面的dxy和d3z2-r2(dz2)轨道。首先提示你选择元素(累加),第一次输入元素O,回车后提示你输入提取的轨道名(累加),第一次输入轨道s。回车后重复以上两个操作。如果想结束输入,在元素选择行直接按回车键结束输入。

元素行接受自由格式输入,你可以输入以下内容元素行接受自由格式输入,你可以输入以下内容1-3 4 Ni表示选择元素1,2,3,4和Ni元素的PDOS进行累加。轨道行只支持标准输入,如果使用了LORBIT=10不投影轨道,你只能选择 s p d f中的一个或多个,如果使用了LORBIT=11投影了轨道,你可以从s p d f和s py pz px dxy dyz dz2 dxz dx2 f-3 f-2 f-1 f0 f1 f2 f3中选择一个或多个输入。轨道行还支持输入all计算所有轨道的DOS之和。

比如元素行输入C O ,对应的轨道选择s px,那么提取的就是所有C和O元素的s轨道和px轨道的PDOS之和。 PDOS_USER.dat中的轨道名 为#Energy C&O_s&px,显而易懂。

电荷密度差

Vaspkit 可以方便的处理 VASP 输出的电荷密度文件 (CHGCAR),做电荷密度差分处理,VTST 脚本或者 VESTA 也可以做,但是不如 vaspkit方便灵活。
注:此文中讲述的功能同样适用于任何的实空间函数形式的文件处理,比如静电势差值图 (LOCPOT),电子定域化函数差值图 (ELFCAR),能带分解的电荷密度插值图 (PARCHG) 等等。
电荷密度差分(charge density difference)是研究电子结构的重要手段之一。可以直观的得到两个片段相互作用后的电子流向,原子形成分子过程中电子密度的变化、探究化学键的本质。电荷密度差分有以下几种形式:
(1)体系的电荷密度减去组成它的两个或几个片段的密度,也是最常见的电荷密度差分形式:

(2)自洽计算收敛以后体系的电荷密度减去该原子构型下每个原子的球对称的电荷密度(即初猜电荷密度),也称为变形电荷密度(Deformation charge density)

(3)在某个状态的密度减去这个体系在另外一个状态的密度。比如:外加电场作用下的电荷密度减去没有外势场的电荷密度。再比如:激发态的密度减去它在基态时的密度。

以上三种电荷密度差,无论哪一种计算都需要保证原子坐标坐标必须一致!并且保证晶胞参数和 FFT-mesh 的格点密度 (NGXF, NGYF, NGZF) 一致!

(1) 的计算只需要优化 AB 的结构,A、B片段保持 AB 结构中原子坐标,不能再对片段进行单独优化。
(2) 只要优化自洽计算时候的几何结构,生成原子的球对称的电荷密度时候 (ICHARG = 12) 保持坐标不变。
(3) 也需要共用其中一个状态的几何构型(比如激发态或基态的几何构型)。

CHGCAR文件格式

CHGCAR 是包含电子密度信息的格点文件,对于自旋非极化体系(ISPIN = 1)计算只包含电荷密度,对于自旋极化体系(ISPIN = 2)计算还包含自旋电子密度。可以用 VESTA,Jmol 等程序打开。CHGCAR 的第一部分和 POSCAR, CONTCAR 的格式是完全一样的,它包含了最终结构的晶格矢量,原子核坐标等信息。紧接着是三个数字,这三个数是实空间函数的网格密度,对应于 NGXF,NGYF,NGZF 三个变量。然后是电荷密度信息 ρ(r) * Vcell。一共有 NGXF * NGYF * NGZF 个数值。比如:下面是一个 Al2O3 晶胞的 CHGCAR 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Al2O3 Cell opt                          
1.00000000000000
6.138452 0.000551 -0.011568
5.434311 2.854620 -0.011568
-1.324042 -0.326661 5.501689
O Al
6 4
Direct
0.160314 0.160314 0.108934
0.839686 0.839686 0.891066
0.495028 0.495028 0.257399
0.504972 0.504972 0.742601
0.826429 0.826429 0.432705
0.173571 0.173571 0.567295
0.090130 0.090130 0.795615
0.909870 0.909870 0.204385
0.342109 0.342109 0.683236
0.657891 0.657891 0.316764
100 100 96
0.43432567054E+01 0.44027037758E+01 0.45822813500E+01 0.48861003640E+01 0.53223812855E+01
0.59054783755E+01 0.66583226816E+01 0.76145085758E+01 0.88190771181E+01 0.10327304760E+02
...

Vaspkit计算几个片段的电荷密度差

以 CO 分子吸附在 Ni(100) 表面为例:
步骤一:优化 CO/Ni(100) 的结构;
步骤二:分别计算 Ni(100) 和 CO 的单点能 CO 和 Ni(100) 片段的坐标从 CO/Ni(100) 的 CONTCAR 里直接截取,不要再结构优化!!计算时也要保证三次自洽计算所采用的 FFT mesh 一致(NGXF,NGYF,NGZF)
步骤三:用 vaspkit 314 功能做电荷差分。依次输入三个片段的 CHGCAR 路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
314   
======== File Options ========
Input the Names of Charge/Potential Files with Space:
(e.g., to get AB-A-B, type: ~/AB/CHGCAR ./A/CHGCAR ../B/CHGCAR)
(e.g., to get A-B, type: ~/A/CHGCAR ./B/CHGCAR)

------------>>
./CHGCAR ./co/CHGCAR ./slab/CHGCAR

-->> (01) Reading Structural Parameters from ./CHGCAR File...
-->> (02) Reading Charge Density From ./CHGCAR File...
-->> (03) Reading Structural Parameters from ./co/CHGCAR File...
-->> (04) Reading Charge Density From ./co/CHGCAR File...
-->> (05) Reading Structural Parameters from ./slab/CHGCAR File...
-->> (06) Reading Charge Density From ./slab/CHGCAR File...
-->> (07) Written CHGDIFF.vasp File!

生成 CHGDIFF.vasp 包含电荷密度差的信息,可以直接导入到 VESTA 里作图。
图片

Vaspkit计算变形电荷密度差

变形电荷密度差:自洽计算收敛以后体系的电荷密度减去该原子构型下每个原子的球对称的电荷密度(即初猜电荷密度)。
以 CO 分子为例:
步骤一:先自洽计算优化 CO 分子。
步骤二:新键文件夹,在优化好的结构基础上用 ICHARG = 12 做非自洽计算。
步骤三:用 vaspkit 314 功能做电荷差分。依次输入两个 CHGCAR 路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
314   
======================= File Options ============================
Input the Names of Charge/Potential Files with Space:
(e.g., to get AB-A-B, type: ~/AB/CHGCAR ./A/CHGCAR ../B/CHGCAR)
(e.g., to get A-B, type: ~/A/CHGCAR ./B/CHGCAR)

------------>>
./CHGCAR ./deform/CHGCAR

-->> (01) Reading Structural Parameters from ./CHGCAR File...
-->> (02) Reading Charge Density From ./CHGCAR File...
-->> (03) Reading Structural Parameters from ./deform/CHGCAR File...
-->> (04) Reading Charge Density From ./deform/CHGCAR File...
-->> (05) Written CHGDIFF.vasp File!

步骤四:得到 CHGDIFF.vasp 文件,导入到 VESTA 里做图。

Vaspkit计算外加电场下的电荷密度差

外加电场作用下的电荷密度减去没有外势场的电荷密度。
以 InSe 二维单层材料为例:
步骤一:先优化没有外加电场的结构。
步骤二:在同样结构下计算外加电场下做单点自洽计算。添加关键词,EFIELD 控制电场力的大小(eV/Angstrom)F=qE, 对应电场的单位是 E=F/q, 场强单位是 V/Angstrom

1
2
3
EFIELD = 0.05
IDIPOL = 3
LDIPOL = .TRUE.

步骤三:运行 Vaspkit 314 功能做电荷差分。依次输入二个 CHGCAR 路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
314
======================= File Options ============================
Input the Names of Charge/Potential Files with Space:
(e.g., to get AB-A-B, type: ~/AB/CHGCAR ./A/CHGCAR ../B/CHGCAR)
(e.g., to get A-B, type: ~/A/CHGCAR ./B/CHGCAR)

------------>>
./CHGCAR ./noele/CHGCAR

-->> (01) Reading Structural Parameters from ./CHGCAR File...
-->> (02) Reading Charge Density From ./CHGCAR File...
-->> (03) Reading Structural Parameters from ./noele/CHGCAR File...
-->> (04) Reading Charge Density From ./noele/CHGCAR File...
-->> (05) Written CHGDIFF.vasp File!
步骤四:得到 CHGDIFF.vasp 文件,导入到 VESTA 里做图。

电荷密度差作图

得到的电荷密度差文件必须作成图才便于被直观地考察,常用的图分为三类:
(1)3D 等值面图,isosurface.
(2)2D 切面图.
(3)1D,平面平均的数值,planar averaged charge.
通常这几种图可以配合使用讨论。等值面图和切面图用 VESTA 画最方便,平面平均图用 vaspkit 生成方便。得到的 CHGDIFF.vasp 用 VESTA 打开,isosurface 青色部分电荷密度减小,黄色密度电荷密度增加。注意 VESTA 对电荷密度的默认单位是 e/Bohr3。
vaspkit 319 功能可以把VASP的格点文件转化成 .cube的方法,.cube 在 VMD 里作图可以得到更好看的效果:

能带计算

参考链接:
https://yh-phys.github.io/2019/10/04/vasp-band-structure-dos/
自洽计算之后,读取产生的CHGCAR、WAVECAR

{.line-numbers}
1
2
ISTART=1
ICHARG=11

其他参数和自洽时保持一致。

能带计算的KPOINTS文件不同于前面,称为高对称点。
学术之友微信公众号历史记录搜索文章《五种方法生成能带结构计算的高对称点》
1、http://cryst.ehu.es/
2、https://www.materialscloud.org/work/tools/seekpath
3、http://www.aflowlib.org/aflow-online (已更新)
4、http://pymatgen.org/ (pymatgen)
5、http://www.xcrysden.org/ (XCrySDen)
Accurate DOS and Band-structure calculations:
http://cms.mpi.univie.ac.at/vasp/vasp/Accurate_DOS_Band_structure_calculations.html

可以通过vaspkit的303命令产生KPATH.in文件,cp KPATH.in KPOINTS即可。
计算完成后通过vaspkit的211命令提取能带。
注意能带路径生成操作需在自洽计算前完成。

  • 1.准备POSCAR,调用vaspkit- 303(体相材料)或-302(二维材料)得到KPATH.in和PRIMCELL.in文件;对于二维体系,需要检查POSCAR文件的真空层是否沿z方向,如果没有,可调用vaspkit-923或vaspkit-407强制真空层沿z方向。另外,如果需要改变识别结构对称性精度(symprec默认值为1E-5),可通过vaspkit -task 302 -symprec 1E-6实现或者在~/.vaspkit中修改SYMPREC默认值。

  • 2.执行cp PRIMCELL.vasp POSCAR命名。(如果PRIMCELL.vasp 和POSCAR不一样,并且要读取电荷密度和波函数,要从SCF计算保持结构一致。)KPATH.in推荐能带路径只针对于PRIMITIVE CELL,缺少这一步,你可能得到错误的结果。如果有必要,比较KPATH.in文件中的能带路径是否与在线能带路径产生工具SeeK-Path产生的一致,包括比较PRIMCELL.vasp和HIGH_SYMMETRY_POINTS文件。需要指出的是SeeK-Path只用于体相结构能带路径的产生。自1.3.0版本,对于二维体系不需要执行cp PRIMCELL.vasp POSCAR。

投影电荷密度

复制能带结构文件,
vi INCAR

{.line-numbers}
1
2
3
增加标签 LPARD=.T.
增加标签 IBAND=16 17
增加标签 LSEPB=.T.

  • LPARD:它的取值为.TRUE.或.FALSE.,它的默认值是.FALSE.,当为.TRUE.时,表示读入自
    洽收敛的 CHGCAR 和 WAVECAR 并进行 partial charge density计算。
  • IBAND:它的取值就是你想要计算的第几条能带或哪几条能带(比如要计算第 4、 5、 6 条能带,那么就设置 IBAND = 4 5 6),此时 NBMOD的值就是所要计算的能带的条数。
  • EINT:另一种方式指定所要计算的能带,它是指定计算某能量范围的partial charge density,一般是设置为两个实数,比如EINT= 4.00 5.00,此时NBOMD的值设置为-2。如果只设置了一个数,那么表示计算从 EINT 到费米能级这个范围内的,此时NBOMD 的值为-3。
  • KPUSE:指定所要计算的 k 点(哪个或哪几个)。
  • LSEPB:指定是不是要把计算的partial charge density按每个带分别写到各自对应的文件
  • PARCHG.nb (设置为.TRUE.)中,还是把它们合并写到一个文件中(相当于把各个带对应的partial charge density 加起来,设置为.FALSE.),默认值为.FALSE.。
  • LSEPK:指定是不是把要计算的partial charge density按每个k分别写到各自对应的文件PARCHG.nk (设置为.TRUE.).

三个方法:

1、读取自恰计算的波函数,KPOINTS文件采用特定的k点

{.line-numbers}
1
2
3
4
5
6
#partial charge density
LPARD = .TRUE.
IBAND = 17 18 # 价带顶和导带底
KPUSE = 1
LSEPB = .TRUE.
LSEPK = .TRUE.
{.line-numbers}
1
2
3
4
CsPbI3-cubic
1
r
0.500000 0.500000 0.500000 1.0

http://muchong.com/html/200906/1404880.html
2、读取自恰计算的波函数,KPOINTS文件采用自恰计算的k点

{.line-numbers}
1
2
3
4
5
6
7
8
#partial charge density
LPARD = .TRUE.
IBAND = 17 18
KPUSE = 35
LSEPB = .TRUE.
LSEPK = .TRUE.
NELM = 200
ICHARG = 1

在scf自恰计算OUTCAR中
找到对应导带底和价带顶
对应的k-point编号
{.line-numbers}
1
2
3
4
5
CsPbI3-cubic
0
Gamma
8 8 8
0.0 0.0 0.0

3、读取能带计算的波函数,KPOINTS文件采用能带计算的k点

{.line-numbers}
1
2
3
4
5
6
7
8
#partial charge density
LPARD = .TRUE.
IBAND = 17 18
KPUSE = 80 81
LSEPB = .TRUE.
LSEPK = .TRUE.
NELM = 200
ICHARG = 1

KPOINTS和能带计算一样。在band能带计算OUTCAR中找到对应导带底和价带顶对应的k-point编号。

轨道投影态密度和能带。

{.line-numbers}
1
2
LORBIT=11 
NEDOS=2001

提取DOS:vaspkit -task 111/113
提取band:211/212/213/214
如果3D能带图不够平滑,可通过能带插值进行改善。
VASPKIT升级到1.3.0或更新版本,在~/.vaspkit文件中设置以下三个参数:

{.line-numbers}
1
2
3
GET_INTERPOLATED_DATA      .TRUE.     是否插值
INTERPOLATION_SPACING 0.04 插值间距,决定平滑程度
INTERPOLATION_METHOD 'cubic' 插值方法

HSE06计算电子结构:

  1. 结构优化(PBE)

  2. 静态自洽scf计算(PBE)KPOINTS和POTCAR文件不变,写波函数和电荷密度

  3. (可选)静态自洽scf计算(HSE06)KPOINTS,POSCAR和POTCAR文件不变

  4. DOS/band计算(HSE06)vaspkit -task 303
    vaspkit→251→2→0.03→0.03生成KPOINTS,运行VASP
    vaspkit-252
    http://vaspkit.cn/index.php/29.html

  5. PBE优化结构

  6. HSE自洽计算(得到波函数)

  7. HSE能带计算/态密度计算

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    ALGO = Damped
    HFSCREEN = 0.2
    LHFCALC = .True.
    LMAXFOCK = 4
    PRECFOCK = Fast
    TIME = 0.4

+SOC计算电子结构:

  1. 结构优化(PBE)
  2. 静态自洽scf计算(PBE+SOC)KPOINTS和POTCAR文件不变,写波函数和电荷密度
  3. 非自洽计算(PBE+SOC)
    Spin-Orbit Coupling Calculation
    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ISPIN  =  2
    NELMIN = 6 (Min electronic SCF steps)
    LSORBIT = .TRUE. (Activate SOC)
    GGA_COMPAT = .FALSE. (Apply spherical cutoff on gradient field)
    #VOSKOWN = 1 (Enhances the magnetic moments and the magnetic energies)
    LMAXMIX = 2 (For d elements increase LMAXMIX to 4, f: LMAXMIX = 6)
    SAXIS = 0 0 1 (Direction of the magnetic field)
    #MAGMOM = 0 0 3 (Set this parameters manually, Local magnetic moment parallel to SAXIS, 3*NIONS*1.0 for non-collinear magnetic systems)
    NBANDS = 32 (Set this parameters manually, 2 * number of bands of collinear-run)

调节SOC强度

  1. 调节自旋轨道耦合作用的大小

要调优VASP中的自旋轨道耦合强度,需要修改源文件vasp_source_code_path/src/relativistic.F 并重新编译。如果要将强度减少一半,可以在relativistic.F的129行L●S项乘以0.5d0,如下:
DO I=0,1DO J=0,1DO M =1,2LL+1DO MP=1,2LL+1    DLLMM(LMP+MP-1,LM+M-1,J+2I+1)=DLLMM(LMP+MP-1,LM+M-1,J+2I+1)+ &    0.5d0SUMLS(M,MP,I+2*J+1,LL)   !!!line 129 relativistic.F fileEND DOEND DOEND DOEND DO

代码片段:可切换语言,无法单独设置文字格式

   注意,需要使用重新编译的vasp_ncl来运行计算。另外,最好比较0d0L●S,1d0L●S和vasp_std,vasp_ncl计算结果。

  1. 如果只想给一些元素加SOC,而其他元素不加该怎么办呢?拓扑材料计算互助群的Eurus-清华给出了VASP中给特定元素加自旋轨道耦合相互作用的方法(感谢Eurus-清华)。在原来VASP,src文件夹下的relativistic.F文件中注释掉46行的

! REAL(q), PARAMETER :: INVMC2=7.45596E-6

然后53行位置加入如下6-17行的内容,然后重新编译。

  INTEGER, PARAMETER :: LMAX=3, MMAX=LMAX*2+1      COMPLEX(q) DUMMY(MMAX,MMAX,3,LMAX)      COMPLEX(q) LS(MMAX,MMAX,4,LMAX)      REAL(q) SUM, SCALE

! add  parameter  REAL(q), PARAMETER :: INVMC2_ORIG=7.45596E-6 REAL(q) INVMC2! add end ! add  control IF(ABS(Z-83).LT.1.0E-5)THEN INVMC2=INVMC2_ORIG ELSE INVMC2=INVMC2_ORIG*0.0001 END IF! add end
LS=(0._q,0._q) CALL SETUP_LS(1,THETA,PHI,DUMMY(1:3,1:3,1:3,1),LS(1:3,1:3,1:4,1)) CALL SETUP_LS(2,THETA,PHI,DUMMY(1:5,1:5,1:3,2),LS(1:5,1:5,1:4,2)) CALL SETUP_LS(3,THETA,PHI,DUMMY(1:7,1:7,1:3,3),LS(1:7,1:7,1:4,3))
原理:这样做的原理就是将除Z-83的元素外的其他元素缩小一万倍。注意:这个脚本的第12行, IF(ABS(Z-83)),表明除了83号元素打开SOC之外,其他所有的元素SOC都是相当于关闭的。如果想打开某个特定元素的SOC,就把83改成你想要的元素序号就行。
另外,其他元素SOC关闭方式就是将其缩小一万倍。所以使用这种方法,任然是非共线计算,如果要进行wannier90计算,只要按照正常的wannier90设置就可以。

HSE06+SOC band structure calculation

  • Step-I: HSE06 SCF calculation with SOC (INCAR):

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #SOC-related:
    LSORBIT=.TRUE.
    SAXIS= 0 0 1
    ISYM=0

    #HSE06-related:
    LHFCALC = .TRUE.
    HFSCREEN = 0.2
    ALGO = Damped #Damped/Normal/All
    TIME = 0.4
  • Step-II: HSE06 NSCF calculation with SOC:

    {.line-numbers}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #SOC-related:
    LSORBIT=.TRUE.
    SAXIS= 0 0 1
    ISYM=0

    #HSE06 related:
    LHFCALC = .TRUE.
    HFSCREEN = 0.2
    ALGO = Normal !use Normal
    TIME = 0.4

能带反折叠

vaspkit:

  1. 准备POSCAR
  2. 运行vaspkit -task 302/303生成KPATH.in文件
  3. cp PRIMCELL.vasp POSCAR
  4. 运行vasp优化结构,cp CONTCAR POSCAR
  5. 运行vaspkit -task 400/400生成超胞结构POSCAR,并执行cp TRANSMAT TRANSMAT.in
  6. 运行vasp优化含有缺陷的超胞结构,cp CONTCAR POSCAR
  7. 运行vaspkit -task 281生成KPOINTS文件
  8. 准备INCAR(静态计算,设置LWAVE = T,适当增加NBANDS值)并执行VASP计算
  9. 运行vaspkit -task 282提取effective band structure(画法类似于投影能带)
  • 如果不会计算变换矩阵(TRANSMAT.in文件不存在时),可以执行cp PRIMCELL.vasp PRIMCELL.in,281 ,这时vaspkit分别读入超胞基矢(POSCAR)和原胞基矢(PRIMCELL.in)计算变换矩阵并生成TRANSMAT.in文件。
  • vaspkit/examples/band_unfolding/ebs.py画图。生成的ENERGY.grd,WEIGHT.grd和MOMENTUM.grd三个文件,可使用vaspkit/examples/band_unfolding/ebs_k_resolved_dos_plot_matlalb.m脚本画图。

bandup:

第一步 得到超胞CHGCAR:输入文件参考BANDUP的example的第一步,提交任务之后得到CHGCAR。
第二步 主要是为了得到超胞非自洽计算的K点路径,分别给出单胞和超胞的晶格坐标文件prim_cell_lattice.in与supercell_lattice.in。还有单胞的高对称K点路径。
下一步命令是bandup kpts-sc-get -no_symm_avg,这一步会生成KPOINTS_supercell.out文件后面会用到。-no_symm_avg这个标签是为了减少需要计算的k点个数,减小计算量和WAVECAR大小。
第三步 利用前面第一步生成 CHGCAR; POSCAR POTCAR与第一步的一样,K点从第二步那个复制过来,然后提交任务得到波函数WAVECAR
第四步就要开始做能带反折叠了,一句命令,bandup unfold -emin -13 -emax 6 -dE 0.050 -no_symm_avg
会生成一个unfolded_EBS_not-symmetry_averaged.dat文件,画出来就行了。
https://github.com/band-unfolding/bandup

http://staff.ustc.edu.cn/~zqj/posts/Band-unfolding-tutorial/
可以处理能带反折叠的软件汇总:
https://mp.weixin.qq.com/s/-5lN2lwxsALA-rhNQxK1dw
https://vaspkit.com/tutorials.html#band-unfolding
https://github.com/QuantumMaterialsModelling/bands4vasp
https://github.com/QuantumMaterialsModelling/UnfoldingPatch4vasp

3D能带

__第一步__,准备好石墨烯的POSCAR和用于静态计算的INCAR文件;
__第二步__:运行VASPKIT并选择231生成用于3D能带计算 的KPOINTS文件。为了获得平滑的3D能带面,用于产生KPOINTS文件的分辨率值应该设置在0.005左右 ;
__第三步__,提交VASP作业;
__第四步__,待VASP计算完成后,再次运行VASPKIT,输入232或233命令。233命令可一次性输入包含价带顶的BAND.HOMO.grd和导带底的BAND.LUMO.grd文件的能带;232可以得到其它任意能带的计算数据,这里我们选择233。
__第五步__:运行python how_to_visual.py,绘制3D能带图(python2.7环境)。
如果3D能带图不够平滑,可通过能带插值进行改善。

有效质量:

除了通过能带,也可以通过调用VASPKIT-911命令来得到带边位置,接下来我们计算K点处沿着K -> Γ和K -> M方向的电子及空穴载流子的有效质量;
第一步:准备POSCAR文件以及VPKIT.in文件,VPKIT.in文件包含以下内容;

{.line-numbers}
1
2
3
4
5
6
1                  设置为1将会生成计算有效质量的KPOINTS文件,2则计算有效质量
6 6表示我们在K附近取6个离散点用于多项式拟合
0.015 k-cutoff, 截断半径,典型值0.015 1
2 2 表示有两个有效质量任务
0.333333 0.3333333 0.000 0.000 0.000 0.000 K->Γ 计算K点处有效质量,沿着K指向Γ方向
0.333333 0.3333333 0.000 0.500 0.000 0.000 K->M 计算K点处有效质量,沿着K指向M方向

第二步:运行vaspkit并选择912或者913产生KPOINTS,POTCAR文件及静态计算INCAR文件;
第三步:提交VASP作业;
第四步:计算完成后把VPKIT.in文件中第一行的1修改为2,然后再次运行vaspkit并选择913,得到结果:
为了得到可靠的有效质量计算值,括号里的精度至少要在1E-7这个量级,如果误差比较大,可以适当调整k-cutoff值,一般减少该值但不能太小。
手动vaspkit处理的能带:$m^∗=3.815/B$

GW方法

参考:https://www.vasp.at/wiki/index.php/Bandgap_of_Si_in_GW

步骤:

  1. PBE基态计算
  2. 获得虚拟轨道(50-100/atom)

INCAR:

1
2
3
4
5
6
7
8
9
10
11
ALGO = Exact
NBANDS = 64
LOPTICS = .TRUE. #得到WAVEDER文件
CSHIFT = 0.1
NEDOS = 2000
# you might try
#LPEAD = .TRUE.

ISMEAR = 0
SIGMA = 0.05
EDIFF = 1E-8

完成后:

1
2
cp WAVECAR WAVECAR.DIAG
cp WAVEDER WAVEDER.DIAG
  1. GW计算
    读取上一步
    INCAR:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # Frequency dependent dielectric tensor including
    # local field effects within the RPA (default) or
    # including changes in the DFT xc-potential (LRPA=.FALSE.).
    # N.B.: beware one first has to have done a
    # calculation with ALGO=Exact, LOPTICS=.TRUE.
    # and a reasonable number of virtual states (see above)
    ALGO = GW0 ; LSPECTRAL = .TRUE. ; NOMEGA = 50

    # be sure to take the same number of bands as for
    # the LOPTICS=.TRUE. calculation, otherwise the
    # WAVEDER file is not read correctly
    NBANDS = 64

    # Add this to update the quasiparticle energies
    # in the Green's function (GW0)
    #NELM = 4

    ISMEAR = 0
    SIGMA = 0.05
    EDIFF = 1E-8
    在OUTCAR中quasi-particle (QP) energies.
    1
    2
    3
    4
    5
    6
    7
    QP shifts <psi_nk| G(iteration)W_0 |psi_nk>: iteration 1
    for sc-GW calculations column KS-energies equals QP-energies in previous step
    and V_xc(KS)= KS-energies - (<T + V_ion + V_H > + <T+V_H+V_ion>^1 + <V_x>^1)

    k-point 1 : 0.0000 0.0000 0.0000
    band No. KS-energies QP-energies sigma(KS) V_xc(KS) V^pw_x(r,r') Z occupation
    .........

LWANNIER90计算能带结构

重新开始第三步

INCAR:

1
2
3
4
5
6
7
8
ALGO = GW0 ; LSPECTRAL = .TRUE. ; NOMEGA = 50
#LRPA = .FALSE.
## be sure to take the same number of bands as for
## the LOPTICS=.TRUE. calculation, otherwise the
## WAVEDER file is not read correctly
NBANDS = 64
##VASP2WANNIER90
LWANNIER90=.TRUE.

wannier90.win:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
num_wann=8
num_bands=8

exclude_bands = 9-64

Begin Projections
Si:sp3
End Projections

dis_froz_max=9
dis_num_iter=1000

guiding_centres=true

# Bandstructure plot
#restart = plot
#bands_plot = true
#begin kpoint_path
#L 0.50000 0.50000 0.5000 G 0.00000 0.00000 0.0000
#G 0.00000 0.00000 0.0000 X 0.50000 0.00000 0.5000
#X 0.50000 0.00000 0.5000 K 0.37500 -0.37500 0.0000
#K 0.37500 -0.37500 0.0000 G 0.00000 0.00000 0.0000
#end kpoint_path
#bands_num_points 40
#bands_plot_format gnuplot xmgrace

begin unit_cell_cart
2.7150000 2.7150000 0.0000000
0.0000000 2.7150000 2.7150000
2.7150000 0.0000000 2.7150000
end unit_cell_cart

begin atoms_cart
Si 0.0000000 0.0000000 0.0000000
Si 1.3575000 1.3575000 1.3575000
end atoms_cart

mp_grid = 4 4 4

begin kpoints
0.0000000 0.0000000 0.0000000
0.2500000 0.0000000 0.0000000
0.5000000 0.0000000 0.0000000
0.2500000 0.2500000 0.0000000
0.5000000 0.2500000 0.0000000
-0.2500000 0.2500000 0.0000000
0.5000000 0.5000000 0.0000000
-0.2500000 0.5000000 0.2500000
0.0000000 0.2500000 0.0000000
0.0000000 0.0000000 0.2500000
-0.2500000 -0.2500000 -0.2500000
-0.2500000 0.0000000 0.0000000
0.0000000 -0.2500000 0.0000000
0.0000000 0.0000000 -0.2500000
0.2500000 0.2500000 0.2500000
0.0000000 0.5000000 0.0000000
0.0000000 0.0000000 0.5000000
-0.5000000 -0.5000000 -0.5000000
0.0000000 0.2500000 0.2500000
0.2500000 0.0000000 0.2500000
-0.2500000 -0.2500000 0.0000000
-0.2500000 0.0000000 -0.2500000
0.0000000 -0.2500000 -0.2500000
0.0000000 0.5000000 0.2500000
0.2500000 0.0000000 0.5000000
-0.2500000 -0.2500000 0.2500000
-0.5000000 -0.2500000 -0.5000000
0.2500000 0.5000000 0.0000000
0.2500000 -0.2500000 -0.2500000
-0.5000000 -0.5000000 -0.2500000
0.0000000 0.2500000 0.5000000
-0.2500000 0.2500000 -0.2500000
-0.2500000 -0.5000000 -0.5000000
0.5000000 0.0000000 0.2500000
-0.5000000 -0.2500000 0.0000000
0.0000000 -0.5000000 -0.2500000
-0.2500000 0.0000000 -0.5000000
0.2500000 0.2500000 -0.2500000
0.5000000 0.2500000 0.5000000
-0.2500000 -0.5000000 0.0000000
-0.2500000 0.2500000 0.2500000
0.5000000 0.5000000 0.2500000
0.0000000 -0.2500000 -0.5000000
0.2500000 -0.2500000 0.2500000
0.2500000 0.5000000 0.5000000
-0.5000000 0.0000000 -0.2500000
0.0000000 -0.2500000 0.2500000
0.2500000 0.0000000 -0.2500000
-0.2500000 -0.2500000 -0.5000000
0.2500000 0.5000000 0.2500000
0.2500000 -0.2500000 0.0000000
-0.5000000 -0.2500000 -0.2500000
0.2500000 0.2500000 0.5000000
0.0000000 0.2500000 -0.2500000
-0.2500000 -0.5000000 -0.2500000
0.5000000 0.2500000 0.2500000
-0.2500000 0.0000000 0.2500000
0.0000000 0.5000000 0.5000000
0.5000000 0.0000000 0.5000000
0.2500000 -0.2500000 0.5000000
0.5000000 0.2500000 -0.2500000
-0.5000000 -0.2500000 -0.7500000
0.2500000 -0.5000000 -0.2500000
-0.2500000 0.2500000 -0.5000000
end kpoints

Compute Wannier functions
run wannier90:

wannier90.x wannier90

This run generates the wannier90 standard output (wannier90.wout) and the file wannier90.chk needed for the wannier interpolation (next step)

Obtain bandstructure (Wannier interpolation)
Uncomment the bandstructure plot flags in wannier90.win and rerun (restart) wannier90:

wannier90.x wannier90

This run generates the following bandstructure files which can be visualized using xmgrace or gnuplot:

wannier90_band.agr

wannier90_band.dat

wannier90_band.gnu

to plot the band structure using gnuplot: gnuplot -persist wannier90_band.gnu

Beyond the random-phase-approximation

To include local field effects beyond the random-phase-approximation in the description of the frequency dependent dielectric response function (local field effects in DFT) add the following line to your INCAR file:

LRPA = .FALSE.
and again restart from the WAVECAR and WAVEDER files from step 2.

Beyond G0W0: GW0

The most usual step beyond single-shot GW (G0W0) is to iterate the quasi-particle energies in the Greens functions. This is the socalled GW0 approximation. To have VASP do, for instance, 4 iterations of the QP-energies in G, add the following line to the INCAR file:

NELM = 4
and again restart from the WAVECAR and WAVEDER files from step 2.

To quickly find the QP-energy of the highest lying occupied state after 4 iterations of the QP energies in G, type:

./gap_GW.sh OUTCAR

0%