C++分子动力学模拟程序
我正在做一个模拟气体硬球模型的项目。类似于理想气体模型 我已经写了我的整个项目,它正在工作。为了让您了解我所做的工作,有一个循环执行以下操作:伪代码C++分子动力学模拟程序,c++,simulation,C++,Simulation,我正在做一个模拟气体硬球模型的项目。类似于理想气体模型 我已经写了我的整个项目,它正在工作。为了让您了解我所做的工作,有一个循环执行以下操作:伪代码 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 p
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个粒子),必须进行ON*N检查以确定下一次碰撞何时发生。显然,遵循上述程序效率低下,因为在绝大多数情况下,粒子对之间的碰撞不会受到其他地方碰撞处理的影响。因此,需要某种形式的优先级队列来存储每个粒子的下一个事件。实际上,由于碰撞涉及两个粒子,因此只会存储一半数量的事件,因为如果a与B碰撞,那么B也会与a碰撞,并且是在完全相同的时间
我发现很难编写这样的事件/冲突优先级队列
我想知道是否有任何已经编写的分子动力学模拟器,我可以去看看源代码,以了解如何实现这样一个优先级队列
做过谷歌搜索后,我很清楚有很多MD程序已经被编写出来了,但其中很多程序要么过于复杂,要么不适合
这可能是因为它们具有巨大的功能,包括生成可视化的能力或计算粒子模拟的能力,这些粒子之间有相互作用力,等等
有些模拟器不适合,因为它们对不同的模型进行计算,即:除了能量守恒的硬球弹性碰撞模型之外的其他模型。例如,粒子与势或非球形粒子相互作用
我曾尝试查看LAMMPS的源代码,但它非常庞大,我很难理解它
我希望这是关于我正在努力做什么的足够信息。如果没有,我可能会添加更多信息。我不知道“优先级队列”方法是如何工作的,但我有另一种方法可以帮助您。我认为@Boyko Perfanov的意思是“利用当地” 您可以将粒子分类到“桶”中,这样就不必在屏幕上检查每个粒子。这利用了这样一个事实,即粒子只有在彼此非常接近时才能碰撞。创建表示小面积/体积的桶,并在最坏情况下填充当前位于桶的面积/体积中的所有粒子。然后对照桶内的其他颗粒检查桶内的所有颗粒Om*n/m²平均情况,m=桶数。桶需要重叠才能工作,否则也可以检查相邻桶中的粒子 更新:如果粒子的移动距离超过铲斗尺寸,一个明显的“解决方案”是减少时间步长。但是,这将再次增加算法的运行时间,并且只有在存在最大速度时才有效
即使在没有最高速度的情况下,另一个适用的解决方案是创建一个额外的“高速”铲斗。由于速度分布通常是高斯曲线,因此不需要将许多粒子放入该桶中,因此“桶方法”仍比On²更有效。位置感知系统的基本版本可能如下所示: 将宇宙划分为一个立方体网格,每个立方体有a面,体积a^3,每个立方体足够大,但比系统的总体积小。每个网格立方体进一步划分为4个子立方体,理论上可以将其粒子提供给相邻立方体并用于计算。 每个栅格立方体注册包含在其中的粒子,并知道其相邻栅格立方体包含的粒子。 定义粒子的可观测宇宙,使其半径为栅格尺寸/2。定义timestep=griddim/2/max\u速度。这假设来自最多四个相邻格子立方体的粒子理论上可以在该时间段内相互作用。 对于每个网格立方体中的每个粒子,使用mini_timestep