pymatgen NMR屏蔽张量转换实操
读取水分子的真实CSA张量,转换主值和三种表示,区分G=0参照与skew符号。
阅读本篇目录
下载EOS、介电光学与NMR实操包,在解压目录执行:
bash run.sh
ls analysis
ls figures
该包使用现有pymatgen 2026.9.24环境,单次1个CPU核心,直接读取已有的真实VASP输出,不启动新的VASP任务。分步执行也可以:
module load pymatgen/2026.9.24
python response.py
python plot.py
1. 先分清绝对屏蔽和化学位移#
本例是3原子水分子的真实VASP 6.6.1 NMR输出。先优化结构,再按LCHIMAG线性响应计算,流程见VASP NMR入门。附件保留本次完整输入:
INCAR:水NMR的完整原始输入
SYSTEM = water-nmr
ENCUT = 550
PREC = Accurate
EDIFF = 1E-6
EDIFFG = -0.02
IBRION = -1
NSW = 0
ISIF = 2
ISMEAR = 0
SIGMA = 0.05
LREAL = .FALSE.
LASPH = .TRUE.
LWAVE = .FALSE.
LCHARG = .FALSE.
NELM = 150
ALGO = Normal
ISYM = 0
LCHIMAG = .TRUE.
LNMRSHIELD = .TRUE.
POSCAR:水NMR的完整原始输入
H O
1.0000000000000000
14.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 15.5264780000000009 0.0000000000000000
0.0000000000000000 0.0000000000000000 14.5963089999999998
H O
2 1
Direct
0.5000000008650107 0.5494280959188510 0.4795763630523225
0.5000000008711729 0.4505719043605292 0.4795763636714860
0.4999999982638164 0.4999999997206199 0.5204205681413534
Cartesian
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
KPOINTS:水NMR的完整原始输入
Gamma mesh
0
Gamma
1 1 1
0 0 0
本页读取绝对化学屏蔽,并保留各向同性芯层贡献。与实验化学位移比较时,还需要选取并计算相同方法、相应核种的参照物;不能把参照屏蔽直接默认为0。
2. 读取两个G=0约定#
head analysis/water-NMR.csv
cat analysis/RESULTS.json
| 原子 | 不含G=0的绝对屏蔽 / ppm | 含G=0的绝对屏蔽 / ppm |
|---|---|---|
| H1 | 30.6804 | 30.7335 |
| H2 | 30.6804 | 30.7335 |
| O3 | 318.7559 | 318.8090 |
孤立水分子的主要比较采用不含G=0的列;含G=0列作为宏观项约定的对照保留,静态晶体的读取口径另有对应选择。CSV有6行是因为3个原子各保留两种约定,不是6个原子。VASP官方NMR说明。

3. 从完整矩阵转换表示#
本例新版CSA块打印完整3×3矩阵和iso_shield、span、skew摘要。脚本先读取该完整矩阵,再用ChemicalShielding得到对称化张量主值、Mehring、Haeberlen和Maryland表示。
tensor = ChemicalShielding(matrix)
mehring = tensor.mehring_values
haeberlen = tensor.haeberlen_values
maryland = tensor.maryland_values
原始BDIR行方向、主值和各表示都保存在RESULTS.json中。图上的主值属于对称化张量;本例没有进一步分析主轴方向或模拟完整NMR谱线。
4. 不要直接照搬skew三元组#
这份VASP输出与当前pymatgen安装版使用相反的符号:
VASP skew = 3*(sigma_iso - sigma22)/span
pymatgen Maryland kappa = 3*(sigma22 - sigma_iso)/span
因此H原子的VASP skew约+0.7697,而本例pymatgen Maryland κ约−0.7697;O约为+0.3913和−0.3913。直接把VASP的三元组不加转换地传给from_maryland_notation,会得到不匹配的主值。优先从原始完整矩阵转换,并保留自己采用的定义。pymatgen ChemicalShielding接口。
5. 版本与输入格式#
附件读取程序匹配本例VASP 6.6.1的新版CSA格式;当前pymatgen通用Outcar构造器的旧标题匹配不能直接读入这份NMR输出,所以这里使用附件脚本读取,再调用张量转换接口。无需修改集群安装环境,也不需要为此重算数据。
换自己的输出时,先确认CSA标题、芯层、G=0及屏蔽/位移符号。不要仅为适配读取程序随意切换LNMRLEG;旧格式还有相应符号约定需要核对。输入文件和单位明确后再做不同结构或实验参照之间的比较。