pymatgen:磁矩读取与共线磁序分析
读取实际FeO投影磁矩,比较分类阈值、全局自旋反转及派生FM/NM结构。
阅读本篇目录
VASP输出的原子投影磁矩可以交给pymatgen,用于读取位点信息、比较共线磁序和准备派生磁性结构。本篇从实际Fe₄O₄ PBE计算开始,不预设它就是材料的磁基态。
unzip pymatgen-oxide-tools-wave713-*.zip
cd pymatgen-oxide-tools
bash results.sh
bash plot.sh
bash run.sh
run.sh读取随包reference-native,不启动DFT。前置计算使用VASP6.6.1、NVHPC25.3的P100 GPU模块,单MPI进程、单科学线程;后处理使用pymatgen2026.9.24、Python3.11和NumPy/SciPy。

1. 前置计算做了什么#
完整INCAR:
SYSTEM = FeO energy compatibility tutorial
ENCUT = 520
EDIFF = 1E-6
NELM = 160
ALGO = Normal
ISPIN = 2
MAGMOM = 4 -4 4 -4 4*0
ISYM = 0
ISMEAR = 0
SIGMA = 0.05
LREAL = .FALSE.
LASPH = .TRUE.
PREC = Accurate
IBRION = -1
NSW = 0
LWAVE = .FALSE.
LCHARG = .FALSE.
LORBIT = 11
NCORE = 1
KPAR = 1
AMIX = 0.2
BMIX = 0.0001
AMIX_MAG = 0.8
LDAU = .FALSE.
MAGMOM给四个Fe交替正负的初始磁矩,O初始为0。它是初始条件,不保证最终投影磁矩仍为±4。ISPIN=2、LORBIT=11用于这次共线自旋与位点投影输出。
NSW=0、IBRION=-1表明本例是固定几何电子单点,没有优化晶胞或原子位置。实际电子迭代96步后达到EDIFF=1E-6。
POSCAR:
Fe4O4 unrelaxed collinear example
1.0
4.33 0 0
0 4.33 0
0 0 4.33
Fe O
4 4
Direct
0 0 0
0.5 0.5 0
0.5 0 0.5
0 0.5 0.5
0.5 0.5 0.5
0 0 0.5
0 0.5 0
0.5 0 0
KPOINTS:
FeO teaching SCF
0
Gamma
4 4 4
0 0 0
使用Fe_pv、O的PBE赝势,总价电子数80。POTCAR不随包发布。自己在已有授权的集群环境中准备和提交:
bash prepare-potcar.sh
cd inputs/PBE
sbatch job.slurm
随包GPU模板采用P100-HS;按账户可用资源选择对应分区、GPU类型和VASP模块。确认新计算完成后回到包根目录:
cd ../..
bash magnetism-new.sh
新结果写入analysis-magnetism-new,参考分析保存在analysis-magnetism。
2. 读取原子投影磁矩#
核心Python操作为:
from pymatgen.io.vasp.outputs import Vasprun, Outcar
from pymatgen.analysis.magnetism.analyzer import CollinearMagneticStructureAnalyzer
v = Vasprun('reference-native/PBE/vasprun.xml',
parse_dos=False, parse_projected_eigen=False,
parse_potcar_file=False)
o = Outcar('reference-native/PBE/OUTCAR')
s = v.final_structure.copy()
moments = [row['tot'] for row in o.magnetization]
s.add_site_property('magmom', moments)
a = CollinearMagneticStructureAnalyzer(
s, make_primitive=False, set_net_positive=False,
threshold=0, threshold_ordering=0.01)
print(a.magmoms, a.ordering)
make_primitive=False保留原子编号,set_net_positive=False保留本次输出的自旋正负方向。位点磁矩单位μB。它们是PAW投影量,不必与全空间磁化积分严格相等。
cat reference-data/FeO-PBE-projected-magnetic-moments.csv
3. 分类阈值为什么会影响标签#
本次打印精度下,全部投影磁矩之和为约0.001μB。实际调用的结果为:
| 总投影磁矩近零阈值/μB | 原生启发式分类 |
|---|---|
| 1E-8 | FiM |
| 0.01 | AFM |
threshold_ordering控制把多小的总投影磁矩视作零;它不是DFT电子收敛阈值,也不会重新计算密度。选择时要考虑磁矩打印精度、投影方式和问题尺度,不能直接把启发式标签当作磁基态证明。
4. 比较磁序和生成派生结构#
flipped = s.copy()
flipped.add_site_property('magmom', [-m for m in moments])
print(a.matches_ordering(flipped))
ferro = a.get_ferromagnetic_structure(make_primitive=False)
nonmagnetic = a.get_nonmagnetic_structure(make_primitive=False)
本例全局反转后被识别为同一类共线磁序;全同号与清除磁矩的派生结构分别得到FM、NM标签。
cat reference-data/FeO-collinear-ordering-controls.csv
ls reference-structures
这些派生JSON只是磁矩标记和结构操作,没有新的FM/NM DFT能量。比较不同磁序的稳定性,需要分别完成对应计算,并检查结构、泛函、磁性初态与收敛条件。
5. 换自己的体系#
先确认OUTCAR和vasprun.xml来自同一次计算,位点顺序一致,再读取magmom。本篇接口处理共线磁矩;SOC或非共线矢量磁矩需要适合的接口,不能把三个分量随意相加后套用。
原生方法和参数见pymatgen磁性分析模块。接着可看实际氧化物的能量兼容处理。