pymatgen专题

pymatgen:实际波函数的SOC spillage

用相同Bi2结构和完整匹配平面波基底比较标量/SOC占据子空间,展示实际数据、主夹角核对和方法边界。

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

SOC打开前后,波函数的占据子空间可能发生变化。pymatgen的SOCSpillage可以读取两套相匹配的WAVECAR,计算其原生定义下的子空间spillage。

本例在鸢算科技集群实际完成同一个Bi₂结构的两套VASP6.6.1单点:标量双自旋计算用P100,SOC计算用V10016G;均为单MPI、单科学线程,NVHPC25.3 GPU构建,EDIFF=1E-6。没有进行新的结构优化。

下载完整输入、提交/分析脚本、实际数值与绘图资料。POTCAR和WAVECAR不随包发布;可先读取已有数值,再在已获VASP授权的环境中按输入重算。

unzip pymatgen-SOC-spillage-wave720-*.zip
cd pymatgen-SOC-spillage
module load pymatgen/2026.9.24
bash results.sh
bash run.sh
bash plot.sh

run.sh只从实际主夹角数据复算各k点spillage,写入analysis-reference,不启动DFT。plot.sh从参考CSV生成figures。

实际Bi2四个k点spillage与各主夹角分量贡献

1. 两套计算必须真正匹配#

本例使用相同POSCAR、Bi的PBE64赝势、ENCUT=300eV、24带和四个显式k点;仅改变是否包含SOC与相应波函数表示。

inputs/scalar/POSCAR与SOC目录中的文件相同:

Bi buckled honeycomb layer             
   1.00000000000000     
     4.3888421599896201    0.0000000000000000    0.0000000000000000
     2.1944210799948101    3.8008488037511787    0.0000000000000000
     0.0000000000000000    0.0000000000000000   15.0000000000000000
   Bi
     2
Selective dynamics
Direct
  0.1666666666666643  0.1666666666666643  0.0579618666614847   F   F   T
  0.8333333333333357  0.8333333333333357  0.9420381333385153   F   F   T
 
  0.00000000E+00  0.00000000E+00  0.00000000E+00
  0.00000000E+00  0.00000000E+00  0.00000000E+00

结构为固定Bi₂层状模型,真空方向15Å。是否用于真实材料研究,还需另外检验几何、真空、截断能和k网格;本例只展示四点后处理流程。

共同KPOINTS:

Matched explicit shifted mesh
4
Reciprocal
0.125 0.125 0 0.25
0.625 0.125 0 0.25
0.125 0.625 0 0.25
0.625 0.625 0 0.25

显式列出并关闭对称性,是为了两套WAVECAR保留相同k点及顺序。不能把两个程序产生的不同不可约k点列表按行号直接比较。

2. 两份完整INCAR#

标量双自旋:inputs/scalar/INCAR#

SYSTEM = Bi2 matched occupied-subspace comparison
ENCUT = 300
PREC = Accurate
EDIFF = 1E-6
NELM = 120
ALGO = Normal
ISYM = -1
LREAL = .FALSE.
ISMEAR = 0
SIGMA = 0.02
IBRION = -1
NSW = 0
NBANDS = 24
LASPH = .TRUE.
ADDGRID = .TRUE.
LWAVE = .TRUE.
LCHARG = .FALSE.
NCORE = 1
KPAR = 1
ISPIN = 2
MAGMOM = 2*0

SOC旋量:inputs/SOC/INCAR#

SYSTEM = Bi2 matched occupied-subspace comparison
ENCUT = 300
PREC = Accurate
EDIFF = 1E-6
NELM = 120
ALGO = Normal
ISYM = -1
LREAL = .FALSE.
ISMEAR = 0
SIGMA = 0.02
IBRION = -1
NSW = 0
NBANDS = 24
LASPH = .TRUE.
ADDGRID = .TRUE.
LWAVE = .TRUE.
LCHARG = .FALSE.
NCORE = 1
KPAR = 1
LSORBIT = .TRUE.
LNONCOLLINEAR = .TRUE.
SAXIS = 0 0 1
MAGMOM = 6*0

标量计算明确设ISPIN=2,保留自旋上下两个通道;本例初始磁矩为0,最终每个k点上下自旋各有5条明确占据带。SOC旋量则选10条占据带,对应同样10个价电子。

MAGMOM长度和波函数表示要对应:标量每原子一个数,SOC非共线每原子三个分量。这里的单点不移动原子,POSCAR选择性约束不会变成实际几何优化。

3. 准备赝势并用Slurm提交#

bash prepare-potcar.sh
bash submit.sh
squeue -u "$USER"

脚本分别进入inputs/scalar和inputs/SOC提交job.slurm。模板对应P100-HS的vasp/6.6.1-p100、V10016G-HS的vasp/6.6.1-v100,请按自己账户可用资源选择适用模块、分区和GPU类型。

提交脚本使用一个MPI进程和mpirun --bind-to none,仍由Slurm分配CPU/GPU;计算输出包括各自的OUTCAR、vasprun.xml和WAVECAR。

两套都完成后,从包根目录执行:

bash analyze-new.sh
cat analysis-native/Bi2-SOC-spillage-kpoints.csv

实际前置计算分别在19步和22步电子迭代达到EDIFF,Slurm用时约39秒和80秒;不同负载与体系下耗时会变化。

4. 原生接口如何调用#

python - <<'PY'
from pymatgen.analysis.topological.spillage import SOCSpillage
comparison = SOCSpillage(
    wf_noso='inputs/scalar/WAVECAR',
    wf_so='inputs/SOC/WAVECAR')
print('采样点最大spillage:', comparison.overlap_so_spinpol())
PY

该版本原生接口主要返回采样点中的最大值;完整脚本另外逐k点求独立主夹角结果,并核对原生最大值。

本例严格检查晶格、ENCUT、k点和逐点G向量及其顺序一致,没有用截短或取最小长度的方式拼凑不同基底。不同k点各自可以有不同平面波数量,但同一个k点的两套计算必须对应。

5. 读实际数值#

cat reference-data/Bi2-SOC-spillage-kpoints.csv
cat reference-data/Bi2-sampled-direct-gaps.csv
k点 每自旋平面波数 spillage
(0.125,0.125,0) 2941 0.3512587923
(0.625,0.125,0) 2965 0.1677113641
(0.125,0.625,0) 2965 0.1677124658
(0.625,0.625,0) 2954 0.1724752878

原生最大值为0.3512587923324162,独立QR正交化和主夹角算法得到0.3512587923324011,差异约1.5×10⁻¹⁴。

四点的标量直接带隙约1.64–3.22eV、SOC直接带隙约1.02–2.80eV,仅用于检查这里选择的占据子空间清楚分离;不能当作充分采样后的材料基本带隙。

6. 主夹角数据与含义#

把两套占据波函数分别正交化,取重叠矩阵的奇异值sᵢ,本例逐点计算:

γ(k)=Σᵢ(1−sᵢ²)。

head -n 12 reference-data/Bi2-SOC-spillage-principal-values.csv

N=10是本例占据子空间维数,不是把所有24条带都放进去。图中每个小格是一个1−sᵢ²贡献;同一k点求和对应左侧柱状图。

原生实现比较的是正交化后的赝平面波系数子空间,这里没有另加入PAW增广重叠修正。spillage反映所选子空间变化,不是Z₂不变量,也不能仅凭一个大于或小于某值的结果判定拓扑相。

7. 换自己的体系#

先保持两套结构、赝势、截断能和k网格一致,分别收敛,确认占据数和子空间选择适用。随包分析脚本按本例10电子、5+5/10占据维数检查;换材料时应修改相应维数与占据判断,不能强行取前10条带。

金属、分数占据或不同k点占据维数变化的情形,需要另外定义适用的投影空间与方法。进一步做拓扑判断时,应结合适用的对称性、Berry/Wilson loop等分析,并进行必要的网格和参数收敛。

接口见pymatgen SOC spillage。

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

查看配图

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

100%查看原图 ↗