示例 03:ENCUT、k 点与展宽(SIGMA)收敛测试(Si 与金属 Al)¶
配套教程:第3章 收敛测试与计算精度控制
目的¶
- 对金刚石 Si 做 ENCUT 扫描(能量、压强/Pulay 应力、原子受力三种判据);
- 对 Si 做 k 点扫描(N×N×N Γ 网格或 KSPACING 两种方式);
- 对金属 fcc Al 做 ISMEAR/SIGMA 与 k 网格的联合测试,检查熵项
|T*S|< 1 meV/atom; - 提供可直接改造的批量脚本:本地运行、Slurm 提交、汇总与作图。
文件说明¶
| 文件 | 说明 |
|---|---|
common.sh |
公共函数:natoms、outcar_row(从 OUTCAR 提取 E0/TOTEN/EENTRO/压强/最大力/NKPTS/耗时)、run_or_submit、check_potcar |
plot_conv.py |
读取 .dat 结果表,计算相对参考点的偏差,判断收敛并画图(需要 numpy、matplotlib) |
encut_test/INCAR.template |
ENCUT 扫描模板(__ENCUT__ 占位;EDIFF=1E-7、ISIF=2 输出应力) |
encut_test/POSCAR |
理想金刚石 Si,a = 5.43 Å |
encut_test/POSCAR_displaced |
第二个 Si 原子沿 a1 方向位移约 0.08 Å,用于力的收敛 |
encut_test/KPOINTS |
Γ 中心 8×8×8(扫描 ENCUT 时固定) |
encut_test/run_encut.sh |
建目录 → 运行/提交 → 汇总为 encut_<POSCAR>.dat |
kpoint_test/INCAR |
k 点扫描用 INCAR(ENCUT = 320 eV) |
kpoint_test/POSCAR |
同上 Si |
kpoint_test/run_kpts.sh |
SCAN=mesh(写 KPOINTS)或 SCAN=kspacing(INCAR 追加 KSPACING) |
sigma_check_Al/INCAR.template |
Al 展宽测试模板(__ISMEAR__、__SIGMA__ 占位) |
sigma_check_Al/POSCAR |
fcc Al 原胞,a = 4.05 Å(实验值约 4.05 Å) |
sigma_check_Al/run_sigma.sh |
ISMEAR × SIGMA × k 网格扫描,外加 ISMEAR=−5 + 24³ 网格参考 |
Important
本目录不含 POTCAR。每个测试目录运行前都要先放入对应的 POTCAR(Si 或 Al)。
运行步骤¶
export VASP_PP_PATH=$HOME/vasp/potentials # 含 potpaw_PBE/Si、potpaw_PBE/Al
export OMP_NUM_THREADS=1
# 1) ENCUT
cd encut_test
cat $VASP_PP_PATH/potpaw_PBE/Si/POTCAR > POTCAR
NP=4 bash run_encut.sh # 理想结构
NP=4 bash run_encut.sh POSCAR_displaced # 力的收敛
python ../plot_conv.py encut_POSCAR.dat
python ../plot_conv.py encut_POSCAR_displaced.dat --thr-f 5
cd ..
# 2) k 点
cd kpoint_test
cat $VASP_PP_PATH/potpaw_PBE/Si/POTCAR > POTCAR
bash run_kpts.sh # N = 2 4 6 ... 16
SCAN=kspacing bash run_kpts.sh # KSPACING = 0.5 ... 0.15
python ../plot_conv.py kpts_mesh.dat
python ../plot_conv.py kpts_kspacing.dat --ref min
cd ..
# 3) Al 展宽
cd sigma_check_Al
cat $VASP_PP_PATH/potpaw_PBE/Al/POTCAR > POTCAR
bash run_sigma.sh
在 Slurm 集群上:
MODE=slurm bash run_encut.sh # 每个 ENCUT 一个作业(模板默认 ../01-setup-compile/job_cpu.slurm)
JOB_TEMPLATE=$HOME/my_job.slurm MODE=slurm bash run_kpts.sh
# 全部作业完成后:
MODE=collect bash run_encut.sh
MODE=collect bash run_kpts.sh
常用环境变量:ENCUTS、MESHES、SPACINGS、ISMEARS、SIGMAS、REF_N、NP、VASP_CMD、MODE、JOB_TEMPLATE(含义见各脚本开头的注释)。
预期结果 / 如何检查¶
| 测试 | 产物 | 判断方法 |
|---|---|---|
| ENCUT | encut_POSCAR.dat、encut_POSCAR.png |
plot_conv.py 给出 ΔE < 1 meV/atom、ΔP < 1 kB 的最小 ENCUT;常见情况是压强比能量收敛得慢(Pulay 应力) |
| 力 | encut_POSCAR_displaced.dat |
最大力偏差 < 5 meV/Å |
| k 点 | kpts_mesh.dat、kpts_kspacing.dat |
ΔE < 1 meV/atom;NKPTS 列与教程第 5.1 节的表对照(如 8³ → 29) |
| 展宽 | sigma_Al.dat |
脚本末尾标 OK 的组合满足 |T*S| < 1 meV/atom 且 |ΔE0| < 1 meV/atom;同一 SIGMA 下 MP(ISMEAR=1)的 |T*S| 通常小于 Gaussian |
每个子目录都应在 OUTCAR 末尾出现 General timing and accounting;未正常结束的目录会在汇总时打印 WARNING,结果列显示为 NaN。
注意事项¶
- 扫描时其余参数全部固定,且每个目录
ISTART = 0(模板已设置),避免读入旧 WAVECAR; - 本示例的 Si ENCUT = 320 eV 只是 k 点测试的起点;请用你自己的 ENCUT 测试结果替换
kpoint_test/INCAR中的值; - 生产计算的 EDIFF 可以放宽到 1E-6,但测试阶段建议 1E-7;
- 改造成自己的体系时,替换 POSCAR/POTCAR,按需要修改 INCAR(自旋、DFT+U、泛函),并相应调整扫描范围(例如含 O 的体系 ENCUT 从 400 eV 起扫);
- 输入文件均为纯 ASCII、LF 换行;生成的
*.dat、*.png与各计算子目录不要提交到仓库。