见 src/simpleMD.cpp
该 C++ 程序可以在 Linux 和 Windows 操作系统使用。我们推荐使用 GCC 工具。在命令行可以用如下方式编译本章的程序:
$ g++ -O3 simpleMD.cpp -o simpleMD
其中,-O3
选项表示优化等级。编译完成后,将生成名为 simpleMD
的可执行文件(在 Windows 中为 simpleMD.exe
)。
然后,就可以在命令行使用该程序:
$ simpleMD numCells numSteps temperature timeStep
如果使用时忘了给命令行参数,程序会提示正确的用法。
具体地,笔者用如下命令运行程序:
$ simpleMD 4 20000 60 5
也就是说,考虑原子数为
程序每隔100步输出系统的总动能
(a) 体系总动能随时间的变化;(b) 体系总势能随时间的变化;(c) 体系总能随时间的变化;(d) 相对总能量随时间的变化。
上图(a-c)给出了系统的总动能、总势能和总能量随时间变化的情况。可以看出动能是正的,势能是负的,涨落相对较大;总能是负的,涨落较小。细心的读者可以注意到,体系的总动能在很短的时间内突然降低了大约一半。这是因为,我们的模拟体系一开始是完美的面心立方晶格,每个原子都处于受力为零的平衡状态,没有振动产生的额外势能。我们用某个温度(在我们的例子中是 60 K)初始化了原子的速度,故该体系一开始是有一定的动能的。假设每个原子都会在其平衡位置做简谐振动(这就是所谓的简谐近似,它对很多问题的研究来说是一个很好的出发点),故根据能量均分定理,在达到热力学平衡后体系的动能会基本上等于体系的振动势能。也就是说,随着时间的推移,体系的动能平均值会减半,减少的部分变成了原子的振动势能。从图(a-b)可以看到,这个过程是很快的。该过程实际上就是一个从非平衡态跑向平衡态的过程。在这个例子中,这个过程只需要 1 ps 的量级。图 (d)给出了