Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++分子动力学模拟程序_C++_Simulation - Fatal编程技术网

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该系统的优点是,对于每个时间窗口,我们都假设粒子均匀分布,即均匀粒子*网格大小,而不是均匀粒子*宇宙大小检查碰撞。根据宇宙大小、速度和粒子密度的不同,在良好的条件下,您可以将计算效率提高几个数量级。

您要求的是一个开源的分子动力学程序,它完全可以完成您想要做的事情,不多也不少,你可以从中寻找灵感来编写自己的程序?学习一些算法知识,不要浪费时间在别人的代码中寻找这样的基本算法。不一定,这里的关键点是:如果存在这样的东西,我可以看看源代码吗,它是否实现了某种优先级队列,它是否足够简单,比如说几十个文件,几万行代码,我可以从中学习?你在碰撞检测代码中使用了局部性吗?你也可以使用现实泡泡。物理学中的可观测宇宙。如果你想保留你的模型,只解决你现在面临的事件队列问题,那么就搜索离散事件模拟器,而不是分子动力学模拟器。这是一种常见的模拟技术,不受你的领域分子动力学的限制。不幸的是,如果没有优先级队列,这将无法工作。原因如下:一个具有足够高速度的粒子可以穿越整个空间,并与一个比桶大一点的粒子碰撞。在这种情况下,不会检测到碰撞。为了使这起作用,我们必须考虑非重叠桶,从一个桶到另一个桶也被认为是一个事件…但现在我们回到。。。事件队列。这是目前正在考虑的问题。请注意我对这个问题的评论。是的,我同意这是一个解决方案。我担心的是,由于管理存储桶的开销,它不太可能运行得更快。我的一个评论是关于用平面将空间划分为多个区域,并将粒子在这些区域之间的传输视为事件,但这同样需要一个优先级队列。Bucket management处于启用状态,因此如果n足够大,则Bucket management开销将变得无关紧要。但我同意这是需要测试的。这个想法很有趣,但并没有最高速度。除非你计算双峰,我想…如果你在模拟一个物理现象时没有考虑到最大速度,那么你必须假设相对论效应很小,它们大约出现在c/10到c/100之间,也许这是设定速度上限的好地方,因为你已经在这样的假设下运行了。如果我这样做,我也会失去能量和动量守恒。然后,如果你在相对论的情况下使用非相对论方程,你们已经打破了能量和动量守恒定律。你们为什么认为我不是呢?