py4vasp STM恒高与等密度面
用Cu111真实选能窗密度生成恒高对比和等密度面起伏,讲清原生显示量、密度单位与高度坐标。
阅读本篇目录
先有表面电子态,再选定费米能附近的能窗,最后用py4vasp提取恒高对比或等密度面起伏。本例使用鸢算科技集群实际计算的5层Cu(111),比较EF−0.5到EF与EF到EF+0.5 eV两种能窗。它是基于局域态密度的简化STM流程,不包含真实针尖态和完整隧穿矩阵元。
1. 下载数据,先看图再重画#
下载Cu表面STM实操包,在新目录解压:
unzip py4vasp-STM-practical-wave295-*.zip
cd py4vasp-STM-practical-wave295
bash preview.sh
bash run.sh
preview/重画三张参考图;results/data/保存提取结果,tools-output/保存8个原生交互HTML,plots/保存重新生成的PNG,随包figures/可直接查看。输出目录受保护,重复运行请换新解压目录。
本步只用已分配资源内1个CPU后处理,不重新运行VASP。环境为py4vasp/0.11.3的Python3.11,以及pymatgen/2026.9.24中的NumPy2.3.5、Matplotlib3.11.2。carriers/保存实际计算导出的自有全分辨率数值与字段配方,运行时重建明确标记的最小HDF读取载体;它不是原始完整VASP输出,不含PAW、波函数或CHGCAR。
2. 准备表面电子态#
自己的体系先按需要优化原子位置与晶胞,再用一致的PAW、截断和k网格收敛电子态,保存WAVECAR。本例复用已有5层Cu111的电子态,550 eV、Gamma9×9×1、33条能带,原胞体积151.019121 ų,c方向真空约18 Å。原生LPARD使用VASP6.6.1 GPU/HDF5、NVHPC25.3、CUDA12.8,P100和V10016G单GPU运行。

图左将5原子原胞按2×2周期图像展示,并非新增20原子计算;图右保留真实平面平均。表面上方的2/3 Å要相对最高原子定义,不能直接取从晶胞原点量起的z=2/3 Å。
3. 在独立目录做能窗密度#
复制输入,保留原始SCF目录:
mkdir STM-filled
cp inputs/Cu-occupied-window/INCAR STM-filled/
cp inputs/Cu-occupied-window/POSCAR STM-filled/
cp inputs/Cu-occupied-window/KPOINTS STM-filled/
# 将自己匹配的POTCAR、WAVECAR、CHGCAR复制到STM-filled
使用普通复制,不把原SCF的CHGCAR软链接或硬链接到这个目录。 本例原生程序会重写任务目录中的CHGCAR,即使LCHARG为false。原SCF文件应留在原处,后续读取本任务的partial-density数据。
关键参数:
ISTART = 1
ICHARG = 11
LPARD = .TRUE.
LPARDH5 = .TRUE.
NBMOD = -3
EINT = -0.5 0
LSEPB = .FALSE.
LSEPK = .FALSE.
NBMOD=-3使EINT相对EF;另一份输入改成EINT=0 0.5。STM接口需要对能带和k点求和,所以这里两项LSEP均为false;不能把逐带4/5密度例中分开保存能带的设置原样套来。
在计算目录保存下面的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:15:00
source /etc/profile
module purge
module load vasp/6.6.1-p100-hdf5
export OMP_NUM_THREADS=1
ulimit -s unlimited
mpirun --bind-to none -np 1 vasp_std > vasp.log
cd STM-filled
sbatch submit.sh
tail vasp.log
ls -lh vaspout.h5
LPARD完成时会输出Finished calculating partial charge density并停止,不应只凭普通SCF迭代行判断这一步的输出。第二个能窗在自己的新目录独立提交,不覆盖第一个结果。
4. 提取恒高图#
在资料包根目录:
module load py4vasp/0.11.3
python - <<'PYCODE'
import py4vasp
c = py4vasp.Calculation.from_path('work/Cu-occupied-window')
print(c.partial_density.bands(), c.partial_density.kpoints())
g = c.partial_density.to_stm('constant_height(total)', tip_height=2, supercell=2)
g.to_plotly().write_html('STM-height.html')
PYCODE
tip_height单位Å,supercell=2只是横向显示2×2图像,不会扩展DFT计算。bands=[0]、kpoints=[0]表示已求和。py4vasp官方partial_density说明列出两种模式和可用设置。

本例FFT网格40×40×420,z步长约0.062845 Å。请求2/3 Å映射到最近原生网格后,实际为2.026508/2.969177 Å。图共用色标,既显示能窗差别,也保留离表面更远后密度减小的事实,不把每幅图各自拉满色阶制造对比。
5. 不把软件显示倍率当作实验电流#
本例原生部分电荷满足mean(raw)=50/81与8/9电子,分别对应两个能窗实际选中态的k点加权总量。物理密度为:
rho(e/ų) = raw / cell_volume(ų)
这些数值是选能窗的态权重,不是体系额外注入了相同数量的载流子。
当前0.11.3的to_stm恒高显示量还除以网格点数,并乘enhancement_factor。因此资料包保留原生HTML,同时用正确的rho单位画上面的静态密度图。增强因子只是软件显示倍率,不能据此宣称得到已标定的实验nA电流;更换版本时应重新核对读数约定。
6. 恒流模式读取的是等密度面起伏#
本例选择2 Å最近平面上平滑密度的中位数作为等密度面阈值;两能窗分别约0.00220944、0.000988381 e/ų。对于当前软件接口,把阈值映射成threshold/Ngrid*1E9传给其带nA标签的参数,使程序寻找相应密度面。这是本版接口的阈值映射,不是从密度推导实验电流的公式。
bash tools.sh
ls tools-output/*current*.html
head -9 results/data/Cu-STM-controls.csv
本版本恒流Graph数据来自缩放后的网格索引,不能直接给它贴Å标签。资料脚本按下面的关系转成物理相对高度:
height_Å = native_graph_data × c/Nz × interpolation_factor
高度以整幅图的最小值为零,不是绝对针尖z坐标。脚本还在上方真空中独立求解同一密度阈值的交点,核对这项转换。

默认插值因子10与加密50都保留在数据中;因子50的垂直子网格步长约0.001257 Å,与独立交点的最大差约0.00125 Å。插值加密改善读取分辨率,不会创造新的电子结构信息。图中两个面板用各自色标,比较起伏大小应看数值;右图保留原生台阶,没有用平滑曲线替代。
默认Gaussian平滑的sigma是4个网格点,不是4 Å。实际研究需检查网格、平滑、真空、k点、能窗、空带及表面结构;这里不给出完整针尖、势垒或实验电流标定。
完整输入#
以下输入也保留在下载包中;PAW和匹配的前置电子态文件需自行提供。
Cu-occupied-window
INCAR
SYSTEM=Cu-occupied-window
ENCUT=550
PREC=Accurate
EDIFF=1E-6
NSW=0
IBRION=-1
ISMEAR=0
SIGMA=0.05
LREAL=.FALSE.
LASPH=.TRUE.
LWAVE=.FALSE.
LCHARG=.FALSE.
LH5=.FALSE.
ISTART=1
ICHARG=11
NBANDS=33
NSIM=1
ALGO=Normal
NELM=1
LPARD=.TRUE.
LPARDH5=.TRUE.
NBMOD=-3
EINT=-0.5 0
LSEPB=.FALSE.
LSEPK=.FALSE.
POSCAR
Cu
1.0000000000000000
2.5703489492249236 0.0000000000000000 0.0000000000000000
1.2851744746124618 2.2259874866194220 0.0000000000000000
0.0000000000000000 0.0000000000000000 26.3947245153332943
Cu
5
Direct
0.6666666666666642 0.6666666666666644 0.3410627374451473
0.0000000000000000 0.0000000000000000 0.4203288858368925
0.3333333333333357 0.3333333333333358 0.5000000000000000
0.6666666666666642 0.6666666666666644 0.5796711141631075
0.0000000000000000 0.0000000000000000 0.6589372625548526
Cartesian
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
KPOINTS
Gamma mesh
0
Gamma
9 9 1
0 0 0
Cu-empty-window
INCAR
SYSTEM=Cu-empty-window
ENCUT=550
PREC=Accurate
EDIFF=1E-6
NSW=0
IBRION=-1
ISMEAR=0
SIGMA=0.05
LREAL=.FALSE.
LASPH=.TRUE.
LWAVE=.FALSE.
LCHARG=.FALSE.
LH5=.FALSE.
ISTART=1
ICHARG=11
NBANDS=33
NSIM=1
ALGO=Normal
NELM=1
LPARD=.TRUE.
LPARDH5=.TRUE.
NBMOD=-3
EINT=0 0.5
LSEPB=.FALSE.
LSEPK=.FALSE.
POSCAR
Cu
1.0000000000000000
2.5703489492249236 0.0000000000000000 0.0000000000000000
1.2851744746124618 2.2259874866194220 0.0000000000000000
0.0000000000000000 0.0000000000000000 26.3947245153332943
Cu
5
Direct
0.6666666666666642 0.6666666666666644 0.3410627374451473
0.0000000000000000 0.0000000000000000 0.4203288858368925
0.3333333333333357 0.3333333333333358 0.5000000000000000
0.6666666666666642 0.6666666666666644 0.5796711141631075
0.0000000000000000 0.0000000000000000 0.6589372625548526
Cartesian
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
KPOINTS
Gamma mesh
0
Gamma
9 9 1
0 0 0
继续查看py4vasp功能索引。