VTST专题

VTST:DOS拆分、自旋与轨道求和

用真实硅和钴输出学习DOS0、DOS1、费米能平移及s、p、d分组求和。

更新于 2026-11-13约 4 分钟阅读按任务与环境选择适用配置
阅读本篇目录

VASP的 DOSCAR 包含总态密度和按原子投影的态密度。VTST提供拆分、求和与绘图脚本,但不同工具对列数和注释行的要求不同。本篇用非自旋极化Si₂与自旋极化Co实际输出演示。

1. 下载并查看真实结构#

下载实际DOSCAR、结构、输入及读取绘图程序,保存为 example.zip:

python3 -m zipfile -e example.zip .
cd vtst-DOS-analysis
bash read.sh
bash plot.sh

默认读取附带结果,CSV在 analysis-read,图片在 figures。需要重新执行轻量后处理时运行 bash run.sh,随后用 bash read.sh work-new 和 bash plot.sh 读取新结果;不会重新提交VASP。

硅和钴的实际晶胞及钴自旋分辨总DOS

Si₂来自VASP 6.6.1,Co来自VASP 6.5.1;本篇只处理已有输出。VTST脚本版本为1040,依赖Perl、Python/NumPy/ASE和gnuplot,无需编译;不依赖GPU。环境入口:

module load vtstscripts/1040 ase/3.29.0

2. DOS计算需要哪些输入#

投影DOS需要开启合适的 LORBIT。Co实例实际INCAR为:

SYSTEM=Co PBE common-reference finite example
ENCUT=500
PREC=Accurate
EDIFF=1e-6
ISMEAR=0
SIGMA=0.05
ISPIN=2
ISYM=0
NSW=0
IBRION=-1
ALGO=Normal
NELM=160
LREAL=.FALSE.
LASPH=.TRUE.
ADDGRID=.TRUE.
LWAVE=.FALSE.
LCHARG=.FALSE.
LORBIT=11
NEDOS=4001
MAGMOM=1*2.0

Si₂的 ISPIN=1,Co的 ISPIN=2。本例都使用 LORBIT=11;要比较自旋上下通道,应先确认源计算确实开启自旋极化。

cat inputs/Co/POSCAR
cat inputs/Co/KPOINTS
head -6 inputs/Co/DOSCAR

资料包保留对应输入。若自己重新做DOS计算,应在Slurm作业内按相应VASP教程运行;下文只在输出文件的副本中操作。

3. 把DOSCAR拆成DOS0、DOS1……#

mkdir dos-work
cp inputs/Co/{DOSCAR,POSCAR,INCAR,OUTCAR} dos-work/
cd dos-work
python3 "$VTSTSCRIPTS_ROOT/split_dos.py"
head -3 DOS0
head -5 DOS1

DOS0 为总DOS;DOS1 为第1个原子的投影DOS。Si₂有 DOS1、DOS2,Co原胞只有1个原子。本次完整拆分Si₂的301个能量点和Co的4001个能量点。

第一列已减去 DOSCAR 头部费米能,单位eV。因此后续不必再减一次费米能。Python拆分器的原子投影文件将自旋向下列写成负值,便于上下对称画图;其 DOS0 的两个DOS通道仍保留正值,不能假定二者符号约定相同。

4. LORBIT=11的列怎样分组#

非自旋极化的投影文件为“能量+9个s/p/d分量”,共10列;自旋极化时每个分量有上下两个通道,共19列。要交给只接受s、p、d分组的旧求和脚本,应先相加为对应分组。

资料包 run.py 已自动完成该转换。例如非自旋极化时:

s = dos[:, 1]
p = dos[:, 2:5].sum(axis=1)
d = dos[:, 5:10].sum(axis=1)

这是对已有投影数值求和,没有新增电子结构计算。分组后的例子保存在 reference-results/Si2-spd 和 reference-results/Co-spd。

5. 连续原子与指定原子求和#

进入相应分组目录,非自旋极化使用:

cd ../reference-results/Si2-spd
bash "$VTSTSCRIPTS_ROOT/sum_dos_np" 0 1 2
bash "$VTSTSCRIPTS_ROOT/sum_dos_np" 1 1 2

前者选择1到2号,后者逐个列出1、2号原子;本例两种结果一致。输出分别为 DOS.SUM.1.to.2、DOS.SUM.1.2。

自旋极化Co的一个原子可用范围方式:

cd ../Co-spd
bash "$VTSTSCRIPTS_ROOT/sum_dos" 0 1 1

不要把19列lm分辨文件直接交给只按s/p/d组读取的求和入口,也不要把一个原子的选择列表写成不足该脚本参数个数的命令。

另一个分组求和入口为:

cd ../Si2-spd-shortheader
bash "$VTSTSCRIPTS_ROOT/sumup_dos" 1 2 Si2

本例使用仅含一行 # x y z 的短注释头。旧脚本会查看列内容推断轨道数,长文字注释或多行头会干扰判断。输出为 Si2 及 Si2_s、Si2_p、Si2_d。

6. 绘图时以实际数值为准#

总DOS的原生gnuplot入口:

perl "$VTSTSCRIPTS_ROOT/dosplot.pl" DOS0
ls -lh dosplot.eps

旧 doslplot.pl 对列数和上下自旋符号有特定约定,不能直接把所有Python拆分结果交给它。本资料包的 plot.py 从实际数值显式分组、统一显示符号,适合这两份输入。

cd ../..
bash plot.sh

图中的投影和总DOS分别有自己的归一化含义,不要求投影权重简单等于全空间总DOS;本例也没有做k网格或展宽收敛测试。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗