N体问题是力学中的著名基础问题,当\( N \ge 3 \)时的解析解迄今依旧是个问题,仅在某些特殊情况下(比如其中若干个粒子/物体的质量相对极小)有解析解。 N体问题也是粒子模拟中的经典问题,分子动力学的入门例子就是一个势场中粒子的相互作用问题。

昨日我在学校的图书馆闲逛,发现一本Molecular And Particle Modelling Of Laminar And Turbulent Flows, Donald Greenspan, 2005,实际上就是一本有关分子动力学的书,每章最后竟然还带了一些Fortran77的程序,引发了我的兴趣。于是我翻到了这本书的电子版,尝试着看看有没有可能把这些例子跑起来。

结果呢,有点失望。Fortran77不愧是知名的科学黑料,当我浏览第一个例子时就有些头大:

  1. 这里的循环全是用GOTO实现的,而且老习惯喜欢用大写字母,却还大小写混用(Fortran是不区分大小写的),非常难读;
  2. 程序一开始有一个读初始位置和速度的部分,但是显然没有提供数据文件;
  3. 虽然逻辑不复杂,但是这个实现非常“糟糕”,典型的科学家写码;
  4. 印在PDF或者在线网站上的格式无法正确用编辑器显示,尤其是空格和换行。

我的本意是如果能快速运行,或者简单改成现代语言,作为一个程序小例子玩一玩挺好的。 结果尝试了半天,发现如果想解决以上几个问题需要花费更多精力,还不能保证跑起来没问题,很快萌生放弃的念头。

在网上搜了一下,Julia社区中已经有了一个开发中的NBodySimulator,展现了极大的潜力。 他不仅涵盖了分子动力学,还有众多能归纳为N个物体相互作用的系统。本质上N体问题是一个ODE常微分方程组,所以DifferentialEquations.jl这个库天然适合处理这类问题。 与其费心费力改写老旧Fortran77,不如直接拥抱新时代。

N体模拟比等离子体模拟要简单,不失为一个很好的模拟入门训练。