首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++分子动力学模拟程序

C++分子动力学模拟程序
EN

Stack Overflow用户
提问于 2015-02-28 15:48:26
回答 2查看 2.7K关注 0票数 0

我正在做一个模拟气体硬球模型的项目。(类似于理想气体模型)

我写了我的整个项目,而且它正在起作用。为了让您了解我所做的事情,有一个循环执行以下操作:(伪代码)

代码语言:javascript
复制
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)检查,以确定下一次碰撞何时发生。遵循上述程序显然效率低下,因为在绝大多数情况下,粒子对之间的碰撞不受其他地方碰撞处理的影响。因此,希望有某种形式的优先级队列来存储每个粒子的下一个事件。(实际上,由于一次碰撞涉及两个粒子,所以只有一半的事件会被储存起来,因为如果A和B碰撞,那么B也会与A同时碰撞。)

我发现很难编写这样的事件/冲突优先级队列。

我想知道是否有任何分子动力学模拟器已经编写,我可以去看看源代码,以了解我如何实现这样一个优先级队列。

做了谷歌搜索后,我很清楚有很多MD程序已经被编写出来了,但是它们中的许多要么过于复杂,要么不合适。

这可能是因为它们具有巨大的功能,包括产生可视化的能力,或者计算具有相互作用力的粒子的模拟的能力等等。

有些模拟器是不适合的,因为它们为不同的模型做了计算,例如,除了能量守恒的东西,硬球模型和弹性碰撞。例如,粒子与势或非球形粒子相互作用。

我试过查看LAMMPS的源代码,但是它很大,我很难理解它。

我希望这是关于我想做的事情的足够的信息。如果没有,我可能会添加一些更多的信息。

EN

回答 2

Stack Overflow用户

发布于 2015-02-28 16:18:46

我不明白“优先级队列”方法是如何工作的,但我有一种可能会帮助您的替代方法。这就是我认为博伊科·佩尔法诺夫()的意思是“利用地方”。

您可以将粒子排序为“桶”,这样您就不需要检查每个粒子之间的相互关系(O(n平方) )。这利用了这样一个事实,即粒子只有在它们已经非常接近的情况下才能碰撞。创建表示小区域/体积的桶,并填充当前在桶的区域/卷中的所有粒子( O(n)最坏的情况)。然后检查桶内的所有粒子与桶中的其他粒子(O(m*(n/m )平方)平均值,m=桶数)。桶必须是重叠的,这样才能工作,否则你也可以检查来自相邻桶的粒子。

更新:如果粒子可以比桶长的距离移动,一个明显的“解决方案”是减少时间步幅。但是,这将再次增加算法的运行时间,并且只有在有最大速度的情况下才能工作。

另一个适用的解决方案,即使没有最大的速度,将是创建一个额外的‘高速’桶。由于速度分布通常是高斯曲线,因此不需要将许多粒子放入桶中,因此“桶法”仍将比O(n平方)更有效。

票数 0
EN

Stack Overflow用户

发布于 2015-02-28 16:50:43

本地感知系统的基本版本如下所示:

  1. 将宇宙划分为一个立方体网格(每个立方体都有侧A和体积A^3),其中每个立方体足够大,但足够小于系统的总体积。每个网格立方体被进一步划分为4个子立方体,理论上它可以将其粒子分配给相邻的立方体(并用于计算)。
  2. 每个网格立方体都注册包含在其中的粒子,并且知道其相邻网格立方体中包含的粒子。
  3. 定义粒子的可观测宇宙半径为(网格维数/2)。定义timestep=(griddim/2) / max_speed。这个假设认为,最多有四个相邻网格立方体的粒子在理论上可以在这段时间内相互作用。
  4. 对于每个网格立方体中的每个粒子,运行传统的碰撞检测算法(使用mini_timestep < timestep,其中每个粒子被检查是否可能与其可观测宇宙中的其他粒子发生碰撞)。将冲突存储到按时间排序的任何结构中,甚至只是按冲突时间排序的数组。
  5. mini_timestep中发生的第一次碰撞将您的宇宙(和宇宙时钟)重置为(last_time + time_to_collide),其中time_to_collide < mini_timestep。我想这和你现在的算法没有什么不同。重要注意:粒子的绝对坐标被更新,但是它们所属的网格立方体和子立方体没有被更新。
  6. 重复步骤5,直到大型timestep通过为止。按每个网格正方形更新粒子的所有权。

该系统的优点是,对于每个时间窗口,我们都有(假设粒子的均匀分布) O(universe_particles * grid_size)而不是O(universe_particles * universe_size)的碰撞检查。在良好的条件下(取决于宇宙大小、速度和粒子密度),你可以将计算效率提高数量级。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28783601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档