py4vasp 电声耦合带隙修正
从Si真实Fan与Debye–Waller响应提取温度依赖的间接、直接带隙,比较网格和展宽。
阅读本篇目录
从Si真实Fan与Debye–Waller响应提取温度依赖的间接、直接带隙,比较网格和展宽。
1. 下载实例,先看图再提取#
下载本篇终端实操资料包,在新目录解压:
unzip py4vasp-electronphonon-practical-wave291-*.zip
cd py4vasp-electronphonon-practical-wave291
bash preview.sh
preview/figures/生成三张参考图。完整提取、原生报告和重新画图只需:
bash run.sh
ls results/data
ls tools-output
ls plots/figures
run.sh依次执行prepare.sh、extract.sh、tools.sh、plot.sh。results/data/是提取的CSV与张量,tools-output/是原生报告,plots/figures/是PNG。输出目录受保护;再次操作请换一个新解压目录。随包figures/可以直接查看。
后处理使用py4vasp/0.11.3的Python3.11环境,静态图使用pymatgen/2026.9.24中的NumPy2.3.5、Matplotlib3.11.2。已分配资源内1个CPU即可,不会重新运行VASP。carriers/保存本例导出的自有全分辨率数值与字段配方;脚本在work/重建明确标记的最小HDF读取载体,它不是原始完整VASP输出。下载包不含PAW、波函数、响应导数、Wannier系数或程序。
2. 先准备电子态和声子势导数#
本例为2原子Si原胞,ENCUT=550 eV、电子自洽Gamma4³、NBANDS=24、EDIFF=1E−6。晶格、PAW、能带数与声子势导数必须相互匹配。顺序是:优化结构 → 生成声子势导数 → 计算收敛电子态 → 插值与自能 → 提取各温度带隙 → 收敛参数。已有自己的phelel_params.hdf5时可以复用,不必每换一个温度都重新生成导数。
本次复用同一结构的真实声子势导数,第一份6³任务保存WAVECAR/CHGCAR;8³任务读取它们做固定电荷电子态更新。真实原生计算用VASP6.6.1 GPU/HDF5、NVHPC25.3、CUDA12.8,P100和V10016G,单任务1GPU、1MPI进程。参数与声子势导数准备可结合VASP官方带隙重整化说明。
mkdir Si-gap6
cp inputs/Si-gap6/{INCAR,POSCAR,KPOINTS,KPOINTS_ELPH} Si-gap6/
# 将自己匹配的POTCAR、phelel_params.hdf5放入Si-gap6
cd Si-gap6
sbatch submit.sh
submit.sh见文末。KPOINTS控制电子态,KPOINTS_ELPH控制本例插值网格,它们不是同一个文件。本例后者6³/8³对照,ELPH_NBANDS=16,展宽0.05/0.10 eV,温度0、300、600 K。
ELPH_RUN = .TRUE.
ELPH_MODE = RENORM
ELPH_SELFEN_GAPS = .TRUE.
ELPH_SELFEN_TEMPS = 0 300 600
ELPH_SELFEN_DELTA = 0.05 0.10
计算完成后先检查输出,再提取:
tail OUTCAR
grep -n 'Fundamental gap' OUTCAR
ls -lh vaspout.h5
3. 选择累加器,读取修正后的带隙#
在第1节资料包根目录操作:
module load py4vasp/0.11.3
python - <<'PYCODE'
import py4vasp
c = py4vasp.Calculation.from_path('work/Si-gap6')
print(c.electron_phonon.bandgap.read())
for i in range(len(c.electron_phonon.bandgap)):
result = c.electron_phonon.bandgap[i].to_dict()
print('累加器', i+1)
print(result)
PYCODE
容器的read()只告诉你有多少个累加器;必须用[0]或[1]选实例,再to_dict()取实际数组。Python索引0对应OUTCAR累加器1。本例两个累加器对应两种展宽;不要把累加器编号当成温度编号。参数说明见VASP ELPH_SELFEN_GAPS。
fundamental是实际采样网格上价带最高与导带最低之差,可在不同k点;direct是同一k点的最小带间间隔。只挑Γ点两条能带相减不能冒充全局间接带隙。字段中的renorm是修正后的带隙,变化量要再减去bare。
4. Si实际数据和图#
下表固定展宽0.05 eV;完整两种展宽都在CSV中。
| 插值网格 | 未修正间接带隙/eV | 0 K修正后/eV | 300 K修正后/eV | 600 K修正后/eV |
|---|---|---|---|---|
| 6³ | 0.735078 | 0.645114 | 0.575177 | 0.457700 |
| 8³ | 0.634809 | 0.562512 | 0.504549 | 0.404946 |

未修正直接带隙两种网格都是约2.538833 eV;间接带隙却明显不同,说明导带最低点的采样很重要。0 K也有零点振动修正,不能机械令其为零。

head -8 results/data/Si-electronphonon-gaps.csv
ls tools-output/*.html
tools.sh实际调用每个累加器的to_plotly('fundamental_renorm, direct_renorm'),HTML可用浏览器放大查看。静态图保留原生采样点,连接线只是便于阅读。
这里16条中间能带、6³/8³及两种展宽是操作对照,还没有达到网格、空带和展宽收敛,不能把表中数值直接当Si的最终材料结论。更换体系时,应先确保半导体带边和声子稳定性,再分别加密插值网格、增加能带、改变展宽,并保持同一套结构和PAW。
5. 需要逐态分析时#
self_energy[0].to_dict()返回Fan与Debye–Waller数组。本版本Fan有独立展宽轴,DW没有;资料脚本显式选择Fan的实部,再按态与温度轴加DW,使用bks_idx和band_start还原稀疏能带编号。不要把默认广播得到的高维数组直接当正确能量修正。进一步操作见电声自能教程。
将自己的电子结构输入提交到Slurm#
解压、读取和画图不需要提交VASP。若要运行新计算,在上文计算目录保存submit.sh:
#!/bin/bash
#SBATCH --partition=gpu-8p100-hs
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --gres=gpu:p100-16g:1
#SBATCH --time=00:30:00
source /etc/profile
module purge
module load vasp/6.6.1-p100-hdf5
export OMP_NUM_THREADS=1
mpirun --bind-to none -np 1 vasp_std > vasp.log
请先用module avail vasp确认模块名称与账户可用分区。所需PAW和前置文件应来自自己的同一计算链;不要混用不同晶格、PAW或能带数的WAVECAR/导数。
本例完整输入#
以下文件已包含在资料包inputs/中。POTCAR和匹配的前置响应文件需自行提供。
Si-gap6:完整输入
INCAR
ENCUT=550
PREC=Accurate
EDIFF=1E-6
NSW=0
IBRION=-1
ISMEAR=0
SIGMA=0.05
EFERMI=MIDGAP
ISYM=2
LREAL=.FALSE.
LASPH=.TRUE.
LWAVE=.TRUE.
LCHARG=.TRUE.
NELM=160
NBANDS=24
ELPH_RUN=.TRUE.
ELPH_MODE=RENORM
ELPH_DRIVER=EL
ELPH_NBANDS=16
ELPH_SELFEN_GAPS=.TRUE.
ELPH_SELFEN_TEMPS=0 300 600
ELPH_SELFEN_DELTA=0.05 0.10
SYSTEM=Si-actual-EP-gap6
LH5=.FALSE.
ISTART=0
ICHARG=2
POSCAR
si-thermal-static
1.000000000000000
0.0000000000000000 2.7344629562984921 2.7344629562984921
2.7344629562984921 0.0000000000000000 2.7344629562984921
2.7344629562984921 2.7344629562984921 0.0000000000000000
Si
2
Direct
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.2500000000000000 0.2500000000000000 0.2500000000000000
KPOINTS
Gamma mesh
0
Gamma
4 4 4
0 0 0
KPOINTS_ELPH
Actual electronphonon interpolation mesh
0
Gamma
6 6 6
0 0 0
Si-gap8-fixedcharge:完整输入
INCAR
ENCUT=550
PREC=Accurate
EDIFF=1E-6
NSW=0
IBRION=-1
ISMEAR=0
SIGMA=0.05
EFERMI=MIDGAP
ISYM=2
LREAL=.FALSE.
LASPH=.TRUE.
LWAVE=.FALSE.
LCHARG=.FALSE.
NELM=160
NBANDS=24
ELPH_RUN=.TRUE.
ELPH_MODE=RENORM
ELPH_DRIVER=EL
ELPH_NBANDS=16
ELPH_SELFEN_GAPS=.TRUE.
ELPH_SELFEN_TEMPS=0 300 600
ELPH_SELFEN_DELTA=0.05 0.10
SYSTEM=Si-gap8
LH5=.FALSE.
ISTART=1
ICHARG=11
ALGO=Normal
POSCAR
si-thermal-static
1.000000000000000
0.0000000000000000 2.7344629562984921 2.7344629562984921
2.7344629562984921 0.0000000000000000 2.7344629562984921
2.7344629562984921 2.7344629562984921 0.0000000000000000
Si
2
Direct
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.2500000000000000 0.2500000000000000 0.2500000000000000
KPOINTS
Gamma mesh
0
Gamma
4 4 4
0 0 0
KPOINTS_ELPH
Actual electronphonon interpolation mesh
0
Gamma
8 8 8
0 0 0
继续查找其他数据入口:py4vasp功能索引。