pymatgen:配位几何识别与畸变程度
用实际Si、NaCl、Cu和单层hBN结构识别配位形状,比较Si单轴应变前后的连续对称性指标。
阅读本篇目录
数出四个近邻,还不能确定它们是否形成四面体;即使键长相同,键角也可能已经变化。ChemEnv把局域环境与理想多面体比较,给出几何类型和连续对称性指标CSM。
本例在鸢算科技集群使用pymatgen2026.9.24实际运行,复用已有VASP计算中的Si、Cu、NaCl和单层hBN几何,不启动新的电子结构计算。另生成4组受控Si应变结构,演示几何形状变化;它们不是重新松弛后的材料结构。
unzip pymatgen-chemenv-wave706-*.zip
cd pymatgen-chemenv
bash results.sh
bash plot.sh

1. 准备软件和结构#
module load pymatgen/2026.9.24
cat inputs/POSCAR-Si
该环境使用Python3.11、NumPy/SciPy以及Matplotlib,不需要为本例重新编译DFT程序。Si输入为:
Si
1.0000000000000000
0.0000000000000000 2.7344629562984917 2.7344629562984917
2.7344629562984917 0.0000000000000000 2.7344629562984917
2.7344629562984917 2.7344629562984917 0.0000000000000000
Si
2
Direct
0.0000000000000000 0.0000000000000000 -0.0000000000000000
0.2500000000000000 0.2500000000000000 0.2500000000000000
Cartesian
0.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 0.0000000000000000 0.0000000000000000
它是2原子原胞。中心Si的四个近邻包含其他周期映像,不能只看POSCAR文件中还有几个坐标。图中画的是以中心原子为原点的相对近邻坐标,不是把周期映像重复算成新的独立结构。
2. 从结构得到配位环境#
完整脚本已在附件analyze.py。核心步骤如下:
from pymatgen.core import Structure
from pymatgen.analysis.chemenv.coordination_environments.coordination_geometry_finder import LocalGeometryFinder
from pymatgen.analysis.chemenv.coordination_environments.chemenv_strategies import SimplestChemenvStrategy
from pymatgen.analysis.chemenv.coordination_environments.structure_environments import LightStructureEnvironments
s = Structure.from_file('inputs/POSCAR-Si')
finder = LocalGeometryFinder()
finder.setup_structure(s)
environments = finder.compute_structure_environments(
only_cations=False, only_indices=[0],
maximum_distance_factor=1.6,
min_cn=3, max_cn=12,
additional_conditions=[0], valences='undefined')
strategy = SimplestChemenvStrategy(
distance_cutoff=1.3, angle_cutoff=0.3,
additional_condition=0)
light = LightStructureEnvironments.from_structure_environments(
strategy, environments)
print(light.coordination_environments[0])
only_indices=[0]只分析0号位点;去掉这个限制才会逐位点处理。only_cations=False允许分析元素晶体或阴离子位点。这里additional_condition=0不加阴阳离子成键限制,也不猜测氧化态,适合比较几何;需要化学成键条件时,应另行提供可靠的价态信息。
distance_cutoff=1.3和angle_cutoff=0.3是这个策略的归一化Voronoi距离与角度筛选参数,不是1.3Å和0.3度。不要不看定义就当作普通键长截断。
3. 运行并读取结果#
在新的解压目录执行:
bash run.sh
cat analysis/ChemEnv-coordination.csv
ls cases/Si
输出cases/*/POSCAR、light-environments.json与CSV。原始输入保留在inputs;随包的reference-data是已经实际算出的参考结果。
| 结构 | 环境符号 | 配位数 | 近邻距离/Å | 解释 |
|---|---|---|---|---|
| Si | T:4 | 4 | 2.368114 | 四面体 |
| NaCl的Cl位点 | O:6 | 6 | 2.850000 | 八面体 |
| Cu | C:12 | 12 | 2.570349 | 立方八面体 |
| 单层hBN的B位点 | TL:3 | 3 | 1.443376 | 平面三角形 |
这些高对称参考结构的CSM均接近数值零。CSM是无量纲形状指标,小值表示更接近相应理想环境;它不是能量、力、配位概率或材料稳定性评分。
4. 二维结构遇到Voronoi错误怎么办#
这个hBN输入的c方向为20Å。默认10Å Voronoi搜索范围只包含共面点,不能建立完整的三维Voronoi构造。本例保留结构和真空层,增加构造搜索范围:
environments = finder.compute_structure_environments(
only_cations=False, only_indices=[0],
maximum_distance_factor=1.6,
min_cn=3, max_cn=12,
additional_conditions=[0], valences='undefined',
voronoi_distance_cutoff=25)
这使构造时能看到相邻周期层,随后仍按策略选近邻,最终为面内三配位。没有给坐标加随机噪声,也没有把真空层外的原子当成化学近邻。换真空厚度时应重新检查构造范围和实际输出。
5. 配位数不变,形状能变化吗#
可以。对Si晶胞的Cartesian x方向施加1%、3%、5%、10%的仿射应变,保持分数坐标不变;不再做离子松弛。本次原生分析得到:
| 单轴应变 | 配位类型 | CSM |
|---|---|---|
| 0% | T:4 | 约0 |
| 1% | T:4 | 0.00220743 |
| 3% | T:4 | 0.01960208 |
| 5% | T:4 | 0.05372012 |
| 10% | T:4 | 0.20768432 |

这组模型的四条近邻键仍等长,但近邻之间的夹角已分裂,所以四面体形状发生畸变。CSM在这条特定应变路径上增加,并不表示所有复杂变形或随机扰动都必然单调。
脚本还实际比较了整体旋转、均匀放大8%、交换等价Si位点顺序,CSM仍约为0。CSM主要描述形状,不用它代替键长、体积或应变能。
6. 换自己的结构#
先把结构转换为pymatgen支持的文件,再修改Structure.from_file、位点范围和近邻策略。保留元素、坐标和周期映像信息;用输出的近邻向量核对实际选中了哪些原子。
cat reference-data/ChemEnv-neighbor-vectors.csv
对于混合配位、强畸变或无序结构,应比较距离/角度参数的敏感性,并按需要使用多权重策略。这里演示的是固定参数的SimplestChemenvStrategy,不能把一次分类当作唯一化学键定义。
方法及参数说明见pymatgen ChemEnv官方文档与ChemEnv方法论文。近邻数和网络维数的基础操作见局域配位与结构维数。