ASE近邻、空间群与几何工具
用实际结构检查配位数、最小镜像、键长键角、空间群、约束与应力顺序。
阅读本篇目录
下载完整脚本、实际输入、参考输出和四张高清图。在集群新解压目录执行 bash run.sh,结果写入 work/;使用ASE3.29.0、单进程和单线程,不调用GPU或新DFT计算。
1 先运行完整脚本#
本篇所有片段都在附件 modules.py 中连成可运行程序:
bash run.sh
cat work/module-output/RESULTS.json
cat work/module-output/coordination.csv
以下演示13组几何和数据操作。它们处理明确给定的结构、张量或旋转,不把几何控制量当作材料模拟结果。
2 FCC铜近邻与周期镜像#
from ase.io import read
from ase.neighborlist import neighbor_list
import numpy as np
atoms = read('inputs/cu_bulk.extxyz')
i, j, distance, shift = neighbor_list('ijdS', atoms, 2.7)
coordination = np.bincount(i, minlength=len(atoms))
print(coordination)
vector = atoms.positions[j] - atoms.positions[i] + shift @ atoms.cell.array
print(np.max(np.abs(np.linalg.norm(vector, axis=1) - distance)))
32原子FCC铜在2.7Å截断下,每个原子的第一近邻数为 12,最近距离 2.545584Å。shift是跨周期晶胞的整数位移,必须加上它才能正确重建近邻矢量。附件还用独立的全原子对最小镜像距离进行核对。
from ase.geometry import find_mic
vector, length = find_mic([7.1, 0, 0], atoms.cell, pbc=atoms.pbc)
print(vector, length)
对于本例7.2Å晶胞,7.1Å位移的最近镜像是−0.1Å,距离为0.1Å。对倾斜晶胞应调用几何工具,不能简单对每个笛卡尔分量取余。
3 水分子的键长、键角与重复原子#
from ase.geometry.analysis import Analysis
water = read('inputs/water.extxyz')
analysis = Analysis(water)
bonds = analysis.get_bonds('O', 'H', unique=True)
angles = analysis.get_angles('H', 'O', 'H', unique=True)
print(analysis.get_values(bonds))
print(analysis.get_values(angles))
实际结构有两个O–H键,均约 0.968565Å;H–O–H角约 103.999875°。这是ASE给定的分子几何,不是本篇优化得到的实验预测。
get_duplicate_atoms可以检查重叠;示例有意复制一个Cu原子,然后检查并移除该重复原子,恢复32个原子。实际数据中应先检查重叠原因,再决定删除。
4 从空间群和团簇构造结构#
from ase.spacegroup import crystal
from ase.spacegroup.symmetrize import check_symmetry
from ase.cluster import Icosahedron
from ase.io import write
nacl = crystal(['Na', 'Cl'], basis=[(0,0,0), (0.5,0.5,0.5)],
spacegroup=225, cellpar=[5.64,5.64,5.64,90,90,90])
print(len(nacl), check_symmetry(nacl, symprec=1e-5).number)
cluster = Icosahedron('Cu', 3)
print(len(cluster))
write('nacl.cif', nacl)
write('cu55.extxyz', cluster)
结果为Na4Cl4、空间群225,以及55原子Cu二十面体。两者是初始几何模型,未在本篇做DFT或团簇结构优化。

5 晶胞、化学式与元素数据#
from ase.cell import Cell
from ase.formula import Formula
from ase.collections import g2
from ase.data import atomic_masses, atomic_numbers
cell = Cell([[4,0,0], [1,5,0], [0.5,1,6]])
print(cell.volume) # 120 ų
print(cell.reciprocal() @ cell.T) # 单位矩阵;倒格矢不含2π
print(Formula('Cu4O2').reduce()) # Cu2O,因子2
water = g2['H2O']
print(water.get_masses().sum()) # 18.015 u
ASE的FCC Bravais对象 FCC(3.6).tocell()给出原胞体积11.664ų,和常规胞体积不同。化学式归约只处理成分,不能据此改变晶胞里的实际原子数。
6 约束、应力格式与四元数#
FixAtoms(indices=[0])能固定指定原子。附件用EMT计算水几何的力,再核对约束后固定原子的力分量为0,其余原子的力保留;这里只演示力投影,不把水的EMT力当作可靠化学结果。
ASE应力Voigt顺序为 xx、yy、zz、yz、xz、xy,与某些程序的输出顺序不同:
from ase.stress import full_3x3_to_voigt_6_stress, voigt_6_to_full_3x3_stress
import numpy as np
s = np.array([[0.01,0.002,0.003],
[0.002,0.02,0.004],
[0.003,0.004,0.03]])
v = full_3x3_to_voigt_6_stress(s)
print(v)
print(np.allclose(voigt_6_to_full_3x3_stress(v), s))
这里的张量是明确给定的格式控制例,单位可按使用场景定义;附件以eV/ų标注,不把它当成某个材料的实算应力。
Quaternion.from_axis_angle([0,0,1], np.pi/2)可将x单位向量旋转到y方向,脚本核对了旋转矩阵正交性。更多优化、MD、振动和外部计算器操作继续按ASE建模教程及其联用文档选择;本页所列模块不等于全部ASE方法。