示例 16-1:CO/Pt(111) 的 Bader 电荷分析¶
目的¶
- 演示正确的 Bader 流程:
LAECHG = .TRUE.→chgsum.pl AECCAR0 AECCAR2→bader CHGCAR -ref CHGCAR_sum; - 用 POTCAR 中的
ZVAL把 Bader 布居换算成净电荷,并对 CO 分子整体求和; - 做 FFT 网格收敛检查。
对应教程:第16章 电荷与成键分析(§4)。
文件说明¶
| 文件 | 说明 |
|---|---|
POSCAR |
Pt(111) p(2×2)、4 层、CO 顶位吸附;Pt 晶格常数取 3.97 Å(接近 PBE 值),C–Pt 1.85 Å、C–O 1.15 Å 为未优化的初始结构;底部两层固定。建议替换为 第10章 优化后的 CONTCAR |
INCAR |
单点 + LAECHG、LCHARG;NGXF/NGYF/NGZF 以注释形式给出,需按自己的 OUTCAR 修改 |
KPOINTS |
Γ 中心 6×6×1 |
job.slurm |
Slurm 脚本:运行 VASP 后调用 run_bader.sh |
run_bader.sh |
chgsum.pl + bader + 净电荷换算 |
bader_net_charge.py |
读 ACF.dat、POSCAR、POTCAR,输出每个原子的净电荷与分组求和(仅用 Python 标准库) |
POTCAR |
不提供,需自行生成(见下) |
运行步骤¶
cd VASP/examples/16-bader-co-pt111
# 0) (推荐)用第10章优化好的结构
# cp /path/to/chapter10/CO_on_Pt111/CONTCAR POSCAR
# 1) POTCAR:元素顺序 Pt C O,与 POSCAR 第 6 行一致
cat $VASP_PP_PATH/potpaw_PBE/{Pt,C,O}/POTCAR > POTCAR
grep -E "TITEL|ZVAL" POTCAR
# 2) 第一次运行(默认网格),提交作业
sbatch job.slurm
grep "dimension x,y,z NGXF" OUTCAR
# 3) 网格收敛:把 INCAR 中 NGXF/NGYF/NGZF 改为默认值的约 2 倍,在新目录中再算一次
mkdir -p grid2 && cp INCAR KPOINTS POSCAR POTCAR job.slurm run_bader.sh bader_net_charge.py grid2/
# 编辑 grid2/INCAR,取消注释并填写 NGXF/NGYF/NGZF
(cd grid2 && sbatch job.slurm)
只想手动后处理时:
chgsum.pl AECCAR0 AECCAR2 # -> CHGCAR_sum
bader CHGCAR -ref CHGCAR_sum # -> ACF.dat BCF.dat AVF.dat
python bader_net_charge.py --group 17-18
chgsum.pl 来自 VTST 脚本,bader 从 Henkelman 组网站下载;两者都需要在 PATH 中。
预期结果 / 如何检查¶
tail -3 ACF.dat # NUMBER OF ELECTRONS 应等于 NELECT
grep NELECT OUTCAR # 标准 Pt/C/O POTCAR 时为 170
cat bader_net_charge.txt
sum of Bader populations与NELECT相差应小于约 0.01–0.05 e;group 17-18 (CO)给出 CO 分子整体的净电荷(负值表示得到电子)。文献中常见的结论是 CO 从 Pt 得到少量电子,但数值依赖覆盖度、泛函与网格,请以自己的收敛结果为准;- 两套网格下 C、O 的电荷差应小于约 0.02 e,否则继续加密。
注意事项¶
- 不要把
CHGCAR、AECCAR*、CHGCAR_sum等大文件提交到仓库; - 用
Pt_pv等不同 POTCAR 时 ZVAL 不同,净电荷的换算由脚本自动处理,但不同 POTCAR 的结果不能直接比较; - 自旋极化体系 bader 只分析 CHGCAR 第一块(总密度),自旋分辨分析见教程 §3 的提示;
ACF.dat中的CHARGE是布居,不是净电荷。