跳转至

OVITO 使用

约 751 个字 232 行代码 预计阅读时间 5 分钟

介绍


使用

  • OVITO常用的无需Python代码的后处理技巧

  • 直接导入构型/轨迹文件,下方默认有 Particles 信息;添加 Modification 后,会出现 Global Attributes、Data Tables 另外两种类型的数据(添加 DXA,会多出 Dislocation、Surfaces 数据)

  • Add Modification 选项

    • 无直接计算原子层间距的 Modification
# Analysis
Coordination analysis             # 配位分析
Dislocation analysis (DXA)        # 位错分析
Histogram                         # 直方图
Voronoi analysis                  # Voronoi 分析
Wigner-Seitz defect analysis      # WS 缺陷分析

# Coloring
Assign color                      # 分配颜色/着色
Color coding

# Modification
Replicate                         # 扩胞
Slice                             # 切片 
Smooth trajectory                 # 
Unwrap trajectories               # 
Wrap at periodic boundaries       # 将 box 外原子移至 box 内

# Selection
Clear selection                   # 清除选择
Expression selection              # 表达式选择
Manual selection                  # 手动选择
Select type                       # 选择(原子)类型

# Python modifiers (pro)
Calculate local entropy           # 计算局域熵

# Structure identification
Ackland-Jones analysis            # 
Centrosymmetry parameter          # CSP
Common neighbor analysis          # CNA;识别原子对应的晶体结构

# Visualization
Position.X              # x 方向笛卡尔坐标
Position.Y              # y 方向笛卡尔坐标
Position.Z              # z 方向笛卡尔坐标;可用于选中原子层
ReducedPosition.Z       # z 方向分数坐标
StructureType           # 晶体结构类型

# 添加 WS 缺陷分析 Modification 后新增的 Attributes
Occupancy               # 原子占位

OVITO Python

from ovito.pipeline import Pipeline
from ovito.modifiers import ...
from ovito.io import import_file

# 导入构型/轨迹文件
pipline = import_file("dump.lammpstrj")
# 可使用通配符
pipline = import_file("dump_*.lammpstrj")
# 参数
sort_particles           # 是否对原子进行排序

modifier = ...

# 添加 modifier(可添加多个,也可不添加)
pipeline.modifiers.append(modifier)

# data 类型 DataCollection(只代表一帧的数据)
data = pipeline.compute()

# 查看 data 相关属性
# 不同 modifier 处理后,particles、attributes、table 会有不同
list(data.particles.keys())                # 原子属性
list(data.attributes.keys()                # 全局属性
list(data.tables.keys())                   # Tabulated data/DataTable


# 处理多帧构型数据
# 方式 1
for frame in range(pipeline.num_frames):
    data = pipeline.compute(frame)
    ...

# 方式 2;该迭代器可直接获取计算的 DataCollection
for data in pipeline.frames:
    ...
  • Pipeline、DataCollection 类相关
# DataCollection 相关
list(data.particles.keys())    # 查看原子属性;不同输出文件格式,可能会有不同
# POSCAR
['Position', 'Particle Type']
# dump.lammpstrj / xyz
['Particle Identifier', 'Particle Type', 'Position']

data.particles.positions       # 原子位置
data.particles.count           # 原子数

# 查看原子种类及其 ID
for type in data_init.particles.particle_types.types:
    print(type.id, type.name)


# Pipeline 类
# 属性
num_frames                    # 构型帧数
frames                        # 所有构型(数据)

# 方法
add_to_scene()                # 用于可视化
  • 数据导出
from ovito.io import export_file

export_file(data, file, format, **params)
# 参数
data                  # 可以是 Pipeline、DataCollection、DataObject、None 类型
file                  # 输出文件
foramt                # 输出文件格式

# **params 参数
multiple_frames       # 是否导出多帧的数据,默认只会导出第一帧的数据
start_frame           # 起始帧
end_frame             # 结束帧
every_nth_frame       # 每第 n 帧数据导出
key                   # 若为 "txt/table" 格式,可添加该参数导出对应 key 的数据

# 支持的 format
"txt/attr"            # 导出 global attributes
"txt/table"           # 导出 DataTable
"xyz"
"vasp"
"lammps/data"
"lammps/dump"
"imd"
"netcdf/amber"


# 导出示例
# 导出 VASP 格式
export_file(
    pipeline,
    "xxx.vasp",
    "vasp",
    reduced=True,           # 分数坐标
)

# 导出 LAMMPS data 格式
export_file(
    pipeline,
    "output.data",
    "lammps/data",
    atom_style="atomic",    # 默认值
)

# 导出 LAMMPS dump 格式
export_file(
    pipeline,
    "output.*.dump",
    "lammps/dump",
    multiple_frames=True,
)

for i in range(pipeline.num_frames):
    export_file(pipeline, f"output.{i}.dump", "lammps/dump", frame=i)

# 对于 "lammps/dump" "xyz" "imd" "netcdf/amber" 格式,需通过 column 指定具体的原子属性
export_file(
    pipeline,
    "output.xyz",
    "xyz",
    columns=["Particle Identifier", "Particle Type", "Position.X", "Position.Y", "Position.Z"],
)

# 导出 "txt/attr"
export_file(
    pipeline,
    "data.txt",
    "txt/attr",
    columns=["Timestep", "CommonNeighborAnalysis.counts.FCC"],
    multiple_frames=True,
)

# 导出 "txt/table"
export_file(
    data=pipeline,
    file=output_fn,
    format="txt/table",
    key="coordination-rdf[average]",
)
from ovito.modifiers import ...
from ovito.data import CutoffNeighborFinder, DataCollection


# modifier,对应于 OVITO 软件中的 Modification
VoronoiAnalysisModifier              # Voronoi 分析
ComputePropertyModifier
CoordinationAnalysisModifier         # 配位分析
TimeAveragingModifier                # 时间平均
BondAnalysisModifier                 # 键分析
CreateBondsModifier
CommonNeighborAnalysisModifier
ExpressionSelectionModifier          # 表达式
InvertSelectionModifier
AssignColorModifier                  # 分配颜色/着色
CalculateDisplacementsModifier
DislocationAnalysisModifier          # 位错分析;DXA
SelectTypeModifier
DeleteSelectedModifier
  • Global Attributes 和 Data Tables
data.attributes[...]            # 获取 Global Attributes 中对应 keyword 的数据
data.tables[...]                # 获取 Data Tables 中对应  keyword 的数据


# CommonNeighborAnalysisModifier
"CommonNeighborAnalysis.counts.FCC"
"CommonNeighborAnalysis.counts.BCC"
"CommonNeighborAnalysis.counts.HCP"
"CommonNeighborAnalysis.counts.Other"

"structures"
  • 格式转换(OVITO Python 中的 DataCollection 可转换成 ASE、pymatgen 的格式)
from ovito.io.ase import ase_to_ovito, ovito_to_ase
from ovito.io.pymatgen import pymatgen_to_ovito, ovito_to_pymatgen

pipeline = import_file()
data = pipeline.compute()

atoms = ovito_to_ase(data)
structure = ovito_to_pymatgen(data)
  • 计算 RDF
pipeline.modifiers.append(
    CoordinationAnalysisModifier(
        cutoff=5.0,
        number_of_bins=100,
        partial=False,
    )
)

# 只输出第一帧的数据
print(pipeline.compute().tables["coordination-rdf"].xy())

# 会输出每帧的数据
for data in pipeline.frames:
    print(data.tables["coordination-rdf"].xy())

# 对所有帧的数据做平均
pipeline.modifiers.append(TimeAveragingModifier(operate_on="table:coordination-rdf"))
print(pipeline.compute().tables["coordination-rdf[average]"].xy())