问题标签 [verlet-integration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
97 浏览

c++ - 嵌套 for 循环和 Verlet 列表优化 C++

我正在用 C++ 模拟分子动力学。我的代码的主要结构如下

对撞机类是粒子类的朋友,它知道每个粒子在哪里,它的速度是多少,等等。粒子与正常的 Lenard Jhones 势相互作用。在计算力中,我有这样的东西

我本质上是在计算每个其他分子对分子 i 所做的力。我遇到的问题是这个程序效率很低。我有 2 个嵌套的 for 循环。计算力和积分算法中的力。我想优化这段代码,因为使用 25 个粒子和 10^5 次迭代需要很长时间才能运行,而对于模拟,我想要这样做,我必须至少有 10^3 个分子和 10^5 次迭代。我尝试了以下方法:

  1. 我尝试使用 #omp parallel for 并行化 for 循环,并且工作速度比串行版本慢。
  2. 我读到了 Verlet 列表,基本上,粒子不会与所有粒子相互作用,而只会与它们的邻居相互作用。这意味着力计算嵌套循环的大小变得更小。这样做的问题是,要列出你必须遍历所有粒子并以某种方式告诉每个粒子它的邻居如何。然后遍历该邻居数组。我一直在考虑如何以有效的方式做到这一点,但我还没有想出答案。
  3. 为了减少 Verlet 列表实现的计算成本,我发现了一种叫做跳过列表的东西,这使得在列表中搜索某物成为 O(ln(N)) 操作而不是 O(N)。但实际上我不太了解它是如何工作的,也不知道如何集成到 Verlet 列表问题中。
  4. 在过去,我进行了空间并行化,其中每个核心都对空间中的某个区域进行计算。这样做的问题是与 Verlet 列表不兼容,我读过 Verlet 列表更好。
  5. 因为移动位置和速度的操作类似于 V+=F dt常数,所以我认为一些缩减算法会有所帮助,但我对缩减算法一无所知,所以有帮助。
  6. 最后,我认为也许在 c++ 17 或 20 中,算法库中可能有一些可以提供帮助的东西,但我对算法知之甚少,所以我花了很长时间阅读文档并确定它的用处。到目前为止,我已经开始使用向量而不是数组添加 for auto。另外,我有一个小型库,允许我将变量定义为 3D 向量并进行法线向量运算。

所以我被困在这里,我对编程知之甚少,不知道该做什么,我发现的解决方案与我现在遇到的问题相同。所以,如果有人可以帮助我就如何集成所有这些东西,或者如何优化我的代码,或者如果它知道可以帮助我的特殊数据结构或算法提供建议,我真的很感激帮助。目标是使单个时间步长的积分算法至少为 O(N)。谢谢。

0 投票
0 回答
26 浏览

d3.js - D3中力有向图中的verlet集成

在 d3.JS 上的力有向图中,d3 使用 verlet 积分,其中它累积由于多体力和由于每个链接或边缘而产生的力的速度。

每次迭代后它都会这样做:

为什么它使用verlet积分,它比在每次迭代中计算简单位移并在每次迭代后添加FRUCHTERMAN建议的算法有什么优势

即使我们忽略这个算法,我们也会计算每个节点中每个力的位移,无论是反射力还是吸引力,并添加到初始位置。

我不明白这和 verlet 集成有什么区别。与此相比,verlet 的优势是什么?

作为参考,这个位移代码来自这个算法:

在此处输入图像描述

0 投票
0 回答
19 浏览

python - Verlet 集成 3D 角度约束

伙计们!我正在尝试使用 Python 从头开始​​编写 verlet 物理代码。我已经在二维空间中完成了它,它按预期工作。我的代码包含点和边,它们限制了点之间的距离。如您所知,使用 Verlet 集成很容易实现它。如果我们想让一些点之间保持一定的角度,我们可以很容易地在它们之间添加不可见的边缘并调整它的长度。

现在让我们想象我在 3D 中有 10 个点的链,与边缘连续连接。我需要在第一点和第三点之间保持一个特定的角度。而且我无法弄清楚如何使用三个旋转轴来做到这一点,因为您可以想象,在这种情况下,单个不可见的边缘是不够的。而且,当然,从同一点再添加两条线是没有意义的。

我也不应该为不相邻的点创建不可见的边缘,因为如果我们谈论第一点和第三点之间的角度,它不应该直接影响链的中间或末端。