spglib结构、容差与磁对称性
实际比较Si微扰容差、原胞转换、不可约k网格和Fe指定磁序。
阅读本篇目录
本文使用鸢算科技集群实际运行的小算例。先下载输入、完整脚本与参考数据并解压,以下命令从解压目录开始。reference 保存原始参考结果,自己的运行放在 work,避免覆盖。
1 环境与输入形式#
使用集群 pymatgen/2026.9.24 独立Python环境内的spglib。输入是晶格矩阵、分数坐标、原子序数;symprec使用笛卡尔长度单位Å。
module purge
module load pymatgen/2026.9.24
mkdir -p work/symmetry
cp scripts/symmetry_examples.py work/symmetry/
cd work/symmetry
python symmetry_examples.py symmetry-tolerance
python symmetry_examples.py standard-cell-kmesh
python symmetry_examples.py magnetic-symmetry
import spglib
from ase.build import bulk
a = bulk('Si', 'diamond', a=5.43, cubic=True)
cell = (a.cell.array, a.get_scaled_positions(), a.numbers)
data = spglib.get_symmetry_dataset(cell, symprec=1e-5)
print(data.number, data.international, len(data.rotations))
2 对称性容差不要随意放大#
理想Si为227号空间群Fd-3m,当前8原子常规胞有192个操作。将其中一个原子移动(0.001,0.002,0.0015) Å后,1E-5至1E-3 Å容差得到P1;放宽至0.01 Å时恢复227号。

放宽容差只是让程序把差异当成数值误差,不证明结构真的具有高对称性。优化后轻微数值扰动与真实畸变应分别判断。
3 原胞、常规胞与不可约k网格#
primitive = spglib.standardize_cell(cell, to_primitive=True)
conventional = spglib.standardize_cell(cell, to_primitive=False)
mapping, grid = spglib.get_ir_reciprocal_mesh([8,8,8], cell, is_shift=[0,0,0])
脚本对16原子Si超胞执行标准化,得到2原子原胞和8原子常规胞。原输入晶胞的8×8×8网格共有512点,约化为75点,权重之和为512。k网格密度依赖输入晶胞,换原胞后不能认为相同8×8×8仍具有相同密度。
4 磁对称性是指定磁序的分类#
bcc Fe常规胞中分别赋予 [2,2] 与 [2,-2] 标量共线磁矩,调用 get_magnetic_symmetry_dataset。得到FM的UNI编号1642,以及AFM的1599;各有96个操作,后者包含48个时间反演操作。程序逐个核对变换后的原子与磁矩。
magnetic_cell = (*cell, moments)
magnetic = spglib.get_magnetic_symmetry_dataset(magnetic_cell, mag_symprec=1e-5)
print(magnetic.uni_number, magnetic.msg_type)
这里的cell必须换成Fe晶胞,moments长度等于原子数。完整脚本已构造两种Fe输入。此例采用标量共线磁序,未计算能量,也不据此判断Fe的磁基态或SOC效应。
查看和复现配图#
下载包 figures 中是高清图片,可点击正文图片放大。reference 中保存数据与结果表;重新绘图可执行:
module purge
module load ase/3.29.0
mkdir -p work/replot
cp -r reference work/replot/
cp plot_reference.py work/replot/
cd work/replot
python plot_reference.py
不同教程共用此资料包;同一个脚本不需要重复下载。重新运行算例时使用新的工作目录。
方法与接口参考:spglib官方接口。