引言
在分子动力学(MD)模拟的后处理中,沿某个方向的空间分布(profile)是非常常见的分析需求,例如数密度/质量密度、速度分布、应力(压力)分布、电荷分布、势能分布等。理想情况下,我们可以在 LAMMPS 的 in 文件里用 compute chunk/atom + fix ave/chunk 在运行过程中直接对空间分箱(binning)并做时间平均;而且 fix ave/chunk 还能对多种 per-atom 量(如速度、力、电荷、势能、应力等)做按 chunk 的汇总/平均输出。
但很多时候模拟已经跑完,脚本里没写这些 profile 计算,手头只剩下轨迹文件(dump/xyz/lammpstrj)。这时再回去重跑既费时又不必要——更合适的做法是:使用后处理工具从轨迹中重新统计分布。
OVITO 的 Python 模块提供了一套非常清晰的'数据流水线(pipeline)'机制:导入数据(import_file)→ 依次应用 modifiers → compute() 得到结果 → export_file 导出,非常适合把后处理流程脚本化、自动化。

一、为什么要做'后处理密度分布'
在 LAMMPS 里,密度/电荷/速度/应力等空间分布,本来可以在 in 文件里通过 chunk + 平均直接算出来(典型做法是 compute chunk/atom + fix ave/chunk),并输出为 profile 文件。LAMMPS 官方文档也明确:chunks 可以按空间 bin 切分,并对每个 chunk 统计包括密度、速度、应力、势能等多种量。
但现实经常是:
计算已经跑完了;当时没有在
in文件里写 profile 的计算;现在只剩 dump/xyz 轨迹文件。
这时就需要后处理。OVITO 的 Python 模块非常适合做这一类'按空间分箱统计'的任务:读取轨迹 → 选择原子子集 → 做直方图/分箱 → 导出表格。
二、核心原理:直方图(Histogram)= 沿 x 方向分箱计数
我们把盒子在 x 方向切成 bin_count 个小区间(bin),对每个 bin:
- 计数:$N_{\text{bin}}$(这个 bin 里有多少个目标原子)
- 若要'数密度'(number density)而不仅是计数:

其中 $L_y, L_z$ 是盒子在 y,z 方向长度(假设截面积不随时间变化或你逐帧计算)。
OVITO 的 HistogramModifier 支持多种归一化方式:
- AbsoluteCount(每个 bin 的样本数)
- RelativeFrequency(频率 = bin_count / 总样本数)
- ProbabilityDensity(概率密度 = bin_count / 总样本数 / bin_width) 这些模式在 OVITO 3.13.0 起提供。



