在理论计算中,如果我们有一个结构,需要求解两个原子之间的距离,可以使用一些可视化程序进行手动测量。但是对于周期性结构,还需要考虑周期性边界的影响,确定测量出来的是最短距离。在此分享使用ASE(Atomic Simulation Environment)灵活地测量两个位置距离且考虑结构周期性的方法。
可以参考本人之前记录的博客:【ASE+python】实现将poscar格式文件批量转换为xsd格式文件
使用ase.io中的read()函数,可以将结构信息读取为atoms object,结合ase.visualize中的view()函数可以显示结构图形。例如,我有一份掺氮石墨烯的结构信息文件
from ase.io import read,write
from ase.visualize import view
CN=read('POSCAR0',format='vasp')#读入结构信息,转为atoms object
view(CN)#显示图形,viewer='VMD'可以选择显示器
此处’POSCAR0’为文件名字,format='vasp’指文件类型为vasp。
图形显示为:
下面在该可视化程序中选择‘view’→’show labels’→‘atom index’。可以显示原子序号
根据想要计算的原子之间的距离,记下其原子序号,如计算97号原子与47号原子之间的距离
下面调用ASE的get_distance()函数,计算97号原子与47号原子之间的距离。
from ase.io import read,write
from ase.visualize import view
CN=read('POSCAR0',format='vasp')#读入结构信息,转为atoms object
view(CN)#显示图形,viewer='VMD'可以选择显示器
distance=CN.get_distance(97,47,mic=True)
print(distance)
计算结果:2.459992982373338
此外,如果想求两个原子形成的向量,则可以在get_distance()函数中添加:vector=True。如
from ase.io import read,write
from ase.visualize import view
CN=read('POSCAR0',format='vasp')#读入结构信息,转为atoms object
view(CN)#显示图形,viewer='VMD'可以选择显示器
distance=CN.get_distance(97,47,mic=True,vector=True)
print(distance)
输出结果为向量形式:[1.23017875 2.13031118 0. ]