【发布时间】:2015-02-28 15:48:26
【问题描述】:
我正在开展一个模拟气体硬球模型的项目。 (类似于理想气体模型。)
我已经编写了整个项目,并且它正在运行。为了让您了解我所做的事情,有一个循环执行以下操作:(伪代码)
Get_Next_Collision(); // Figure out when the next collision will occur
Step_Time_Forwards(); // Step to time of collision
Process_Collision(); // Process collision between 2 particles
(Repeat)
对于大量粒子(比如 N 个粒子),必须进行 O(N*N) 检查以确定下一次碰撞发生的时间。遵循上述程序显然是低效的,因为在绝大多数情况下,粒子对之间的碰撞不受其他地方的碰撞处理的影响。因此,希望有某种形式的优先级队列来存储每个粒子的下一个事件。 (实际上,由于一次碰撞涉及 2 个粒子,因此只会存储一半的事件,因为如果 A 与 B 发生碰撞,那么 B 也会与 A 发生碰撞,而且是同时发生的。)
我发现编写这样一个事件/冲突优先级队列很困难。
我想知道是否有任何已编写的分子动力学模拟器,我可以去查看源代码以了解如何实现这样的优先级队列。
通过谷歌搜索,我很清楚已经编写了许多 MD 程序,但其中许多程序要么过于复杂,要么不适合。
这可能是因为它们具有巨大的功能,包括生成可视化的能力或计算粒子之间的相互作用力的模拟的能力等。
有些模拟器不适合,因为它们为不同的模型进行计算,即:不是能量守恒的硬球模型,具有弹性碰撞。例如,与势能相互作用的粒子或非球形粒子。
我曾尝试查看 LAMMPS 的源代码,但它非常庞大,我很难理解它。
我希望这是关于我正在尝试做的事情的足够信息。如果没有,我可能会添加更多信息。
【问题讨论】:
-
您需要一个开源的分子动力学程序,该程序完全符合您的要求,不多不少,您可以寻找灵感来编写自己的程序?
-
学习一些算法的东西,不要浪费时间在别人的代码中寻找这样的基本算法。
-
不一定,这里的重点是:如果有这样的东西,能不能看一下源码,是不是实现了某种优先级队列,是不是够简单(说几个几十个文件,几万行代码)我可以从中学习吗?
-
您是否在碰撞检测代码中使用局部性?您也可以使用现实气泡。物理学中的可观测宇宙。
-
如果您想保留您的模型并仅解决您现在面临的事件队列问题,请搜索discreet event Simulators,而不是分子动力学的模拟器。这是一种常见的模拟技术,不受您的领域(分子动力学)的约束。
标签: c++ simulation