pymatgen:Voronoi配位数与多面体
用实际Cu和Fe晶格对照面数、面形索引与固体角加权配位数,避免和最近邻壳层混用。
阅读本篇目录
“配位数”取决于如何定义邻居。本例在鸢算科技集群读取实际FCC Cu、BCC Fe结构,运行Voronoi多面体分析与加权配位统计,并用FeO演示几何氧化物分类。
unzip pymatgen-surface-local-tools-wave721-*.zip
cd pymatgen-surface-local-tools
module load pymatgen/2026.9.24
bash results.sh
bash plot.sh
环境为pymatgen2026.9.24、Python3.11、NumPy/SciPy和Matplotlib。run.sh重新后处理到新建的analysis,不提交DFT;reference-data和原图保留,plot.sh画图到figures。再次分析请保留已有目录,在另一份解压目录运行。

1. 读取结构和多面体索引#
python - <<'PY'
from pymatgen.core import Structure
from pymatgen.analysis.structure_analyzer import VoronoiAnalyzer
analyzer = VoronoiAnalyzer(cutoff=5)
for name in ['Cu','Fe']:
s = Structure.from_file('inputs/POSCAR-' + name)
print(name, analyzer.analyze(s, n=0))
PY
cutoff=5单位Å,是构造Voronoi分析的搜索范围,不是只把5Å内所有原子都当成同一种最近邻。
本例输出:
| 结构 | 索引从三边面开始 | Voronoi面数 |
|---|---|---|
| FCC Cu | 0,12,0,0,0,0,0,0 | 12 |
| BCC Fe | 0,6,0,8,0,0,0,0 | 14 |
每个数是有相应边数的面的数量:FCC的12个四边形面构成菱形十二面体;BCC有6个四边形面和8个六边形面,对应截角八面体。这里不是原子轨道或电子占据的计数。
2. 再看加权配位数#
python - <<'PY'
from pymatgen.core import Structure
from pymatgen.analysis.local_env import VoronoiNN
from pymatgen.analysis.structure_analyzer import average_coordination_number
for name in ['Cu','Fe']:
s = Structure.from_file('inputs/POSCAR-' + name)
nn = VoronoiNN()
print(name, '面数:', len(nn.get_voronoi_polyhedra(s,0)))
print('加权CN:', nn.get_cn(s,0,use_weights=True))
print('按元素平均:', average_coordination_number([s],freq=1))
PY
FCC Cu的面数和加权CN都为12;BCC Fe的面数为14,加权CN约为10.160610。原生权重使用归一化固体角,不是每个面都取1。
BCC的径向第一近邻是8个,而其Voronoi面数是14。 前者按距离壳层,后者包含有Voronoi共面的邻居;两种结果可以同时正确。不要把14或10.16直接当作“BCC第一壳层有多少原子”。
3. 多结构统计怎么用#
python - <<'PY'
from pymatgen.core import Structure
from pymatgen.analysis.structure_analyzer import VoronoiAnalyzer, average_coordination_number
a = Structure.from_file('inputs/POSCAR-Cu')
b = a.copy()
b.scale_lattice(a.volume*1.02**3)
series = [a,b]
print(VoronoiAnalyzer(cutoff=5).analyze_structures(series,step_freq=1))
print(average_coordination_number(series,freq=1))
PY
这里第二个结构只是整体缩放2%的几何控制,两者仍为相同FCC拓扑;没有把这两个结构称为MD轨迹。对真实MD可替换为同组成、同原子数的一系列结构,freq=10表示每10帧抽取一次。
average_coordination_number输出按元素平均的加权CN,不是多面体类型分布。不同组成或原子数的结构不能不加检查地放进同一序列平均。
4. FeO的几何分类与键长估计#
python - <<'PY'
from pymatgen.core import Structure
from pymatgen.analysis.structure_analyzer import oxide_type, get_max_bond_lengths
s = Structure.from_file('inputs/FeO.json')
print('氧化物几何分类:', oxide_type(s))
print('半径规则估计:', get_max_bond_lengths(s))
PY
本例FeO返回普通oxide类别。这个几何分类根据氧相关连接判断是否有过氧/超氧等特征,不能替代电荷和电子结构分析。
get_max_bond_lengths是基于半径规则的估计,不是从能量面求得的断键阈值,也不表示小于它的每一对原子都有同等化学键强度。
cat reference-data/Pymatgen-Voronoi-local-analysis.csv
cat reference-data/FeO-heuristic-bond-lengths.csv
若需要按成键数据选择邻居,可继续阅读ICOHP配位分析;按最近邻壳层做组成有序统计见CuNi短程有序度。接口见pymatgen结构分析。