OVITO选择、切片与轨迹时间分析
表达式、反选、删除、切片、键团簇,以及真实Na轨迹展开MSD和时间平均RDF。
阅读本篇目录
下载结构、实际数据、全部脚本与参考结果。解压后进入附件目录,依次执行本文步骤;reference/ 保存本次结果,复跑写入 work/,重建模型前会把旧work移到work-history。
1 运行与环境#
本篇演示表达式筛选、反选删除、按几何切片、建键/团簇,以及真实Na轨迹的时间分析。筛选修改对象只是附件工作副本;保留原始轨迹再做数据处理。
bash run.sh models
bash run.sh time
cat work/TIME-SELECTION.json

2 表达式选择、反选与删除#
from ovito.io import import_file, export_file
from ovito.modifiers import (ExpressionSelectionModifier,
InvertSelectionModifier, DeleteSelectedModifier)
p = import_file('strain-reference.xyz')
p.modifiers.append(ExpressionSelectionModifier(expression='Position.X < 9.0375'))
p.modifiers.append(InvertSelectionModifier())
p.modifiers.append(DeleteSelectedModifier())
export_file(p, 'selected-half.xyz', 'xyz', columns=[
'Particle Identifier', 'Particle Type', 'Position.X', 'Position.Y', 'Position.Z'])
Cu500先选中x小于半盒长的250个原子,反选后另外250个原子成为Selection,再删除后剩250个。删除操作处理的是当前被选中的原子,不是表达式最初选中的那一半。
附件还用ComputeProperty生成R²=x²+y²+z²,再用R²<25筛出10个原子,演示“先计算属性、再按属性筛选”的顺序。
3 切片到底保留哪部分#
from ovito.modifiers import SliceModifier
p = import_file('strain-reference.xyz')
p.modifiers.append(SliceModifier(normal=(1,0,0), distance=9.0375,
slab_width=3, select=True))
d = p.compute()
print(d.particles['Selection'])
这里平面法向x,中心9.0375 Å,厚度3 Å,select=True只标记而不删除。本次默认标记的是薄层外450个原子,薄层内50个未选中。若随后添加DeleteSelectedModifier,会保留薄层;需要反向效果时先反选。不要未检查Selection就覆盖原文件。
4 建键和团簇#
水分子示例使用1.2 Å建键截断,得到2条O–H键;用Bonding邻接模式识别为1个团簇。这个截断只适合此示例,不是所有元素体系的通用化学键准则。
from ovito.modifiers import CreateBondsModifier, ClusterAnalysisModifier
p = import_file('water.xyz')
p.modifiers.append(CreateBondsModifier(cutoff=1.2))
p.modifiers.append(ClusterAnalysisModifier(
neighbor_mode=ClusterAnalysisModifier.NeighborMode.Bonding))
d = p.compute()
print(d.particles.bonds.count)
print(d.attributes['ClusterAnalysis.cluster_count'])
5 周期轨迹先展开,再算位移#
输入是此前在集群实际运行的VASP Na16轨迹,1000帧、输出间隔2 fs;当前分析相对首帧覆盖1.998 ps。原子ID保持1至16,晶胞不变。
from ovito.modifiers import UnwrapTrajectoriesModifier, CalculateDisplacementsModifier
import numpy as np
p = import_file('Na-MD.xyz', multiple_frames=True)
p.modifiers.append(UnwrapTrajectoriesModifier())
p.modifiers.append(CalculateDisplacementsModifier(minimum_image_convention=False))
for frame in range(p.source.num_frames):
d = p.compute(frame)
u = np.asarray(d.particles['Displacement'])
print(frame, np.mean(np.sum(u*u, axis=1)))
先展开跨周期轨迹,再关闭相对参考位移的最小镜像约定;否则长时间位移会被折回半盒长范围。独立的分数坐标增量展开与OVITO的MSD最大差约1.42×10⁻¹⁴ Ų,末帧MSD约19.3403 Ų。
该MSD以单个首帧为起点,且体系小、轨迹短;本例不拟合扩散系数,也不把波动当作收敛输运性质。真实轨迹若丢失粒子ID、输出过稀或晶胞变化,需先核对展开和匹配规则。
6 时间平均RDF#
from ovito.modifiers import CoordinationAnalysisModifier, TimeAveragingModifier
p = import_file('Na-MD.xyz', multiple_frames=True)
p.modifiers.append(CoordinationAnalysisModifier(cutoff=4, number_of_bins=120))
p.modifiers.append(TimeAveragingModifier(operate_on='table:coordination-rdf'))
d = p.compute()
print(d.tables['coordination-rdf[average]'].xy())

该RDF取4 Å截断,小于8.5 Å立方周期盒的一半4.25 Å;它用于演示时间平均接口,短轨迹及小周期盒仍有尺寸/采样限制。输出的径向范围不应自动等同于无限体系的独立局部结构信息。完整CSV在work/ovito/,配套绘图:
bash run.sh plots
head work/ovito/Na-msd.csv
head work/ovito/Na-rdf-time-average.csv
参考:OVITO Python修饰器。