spglib专题

spglib原胞转换与原子对应实操

从16原子Si超胞得到原胞映射,并核对标准胞、原点平移和原子编号。

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

下载本篇输入、完整脚本、数据与高清图。解压后在新目录运行,reference保存鸢算科技实际运行的参考结果。

1 什么时候需要原子映射#

把超胞改成原胞后,原子数和排序通常都会改变。若要转移逐原子的标签、约束或磁矩,先确认对应关系,不能直接复制原数组。本例使用环境中的spglib 2.7.0、ASE 3.29.0,以16原子的Si超胞演示。

2 运行脚本,得到映射表#

module purge
module load pymatgen/2026.9.24
mkdir work
cp structure_checks.py work/
cd work
python structure_checks.py

脚本同时生成本专题及SeeK-path配套示例;本篇结果位于spglib-atom-mapping。

cat spglib-atom-mapping/atom-map.csv
cat spglib-atom-mapping/input-to-standard-matrix.csv
cat spglib-atom-mapping/standard-origin-shift.csv

atom-map.csv第一列是输入原子编号,第二列是其对应的原胞原子编号。这里为方便阅读均从1开始;Python接口返回的编号从0开始。后面三列是输入原子在所选原胞基矢下的分数坐标,可以超出0至1。

3 核心Python操作#

import spglib
from ase.io import read
a = read('input.vasp')
d = spglib.get_symmetry_dataset(
    (a.cell.array, a.get_scaled_positions(), a.numbers),
    symprec=1e-5)
print(d.mapping_to_primitive)
print(d.std_mapping_to_primitive)
print(d.transformation_matrix)
print(d.origin_shift)

把input.vasp放在当前目录后可运行这一段,完整脚本已自动生成它。mapping_to_primitive对应输入晶胞,std_mapping_to_primitive对应标准化晶胞,两个数组长度不一定相同。变换矩阵还需要与原点平移一起解释。

16个Si输入原子与两个原胞原子的编号对应

4 本次得到什么#

16原子输入映射到2原子原胞,每个原胞原子各对应8个输入原子;标准常规胞含8原子,各对应4个。程序将同一映射组内的坐标差写到原胞基矢下,确认都是整数平移,最大残差为 5.56×10⁻¹⁷。

本例输入到标准胞的矩阵为diag(2,1,1),原点平移为(0,0,0.5)。这两个量不等同于SeeK-path教程中为行向量晶格自行定义的基矢变换矩阵,不能混用。对有磁序、缺陷或不同原子属性的结构,不应为了减小原子数而强行使用更高的结构对称性。

参考:spglib数据集字段与映射定义。

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

查看配图

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

100%查看原图 ↗