首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成一组随机x,y,z数,它们之间的最小差在定义的界限之间。

生成一组随机x,y,z数,它们之间的最小差在定义的界限之间。
EN

Stack Overflow用户
提问于 2017-05-08 09:43:45
回答 5查看 319关注 0票数 1

所以我正在尝试分子动力学模拟,尝试用随机粒子填充三维矩形体积,这些粒子均匀地分布在整个体积中。每个分子都有一个固定的半径r(球体),其中r对于每个分子来说是不同的。所以我希望在卷中生成球体,然后在( 2(r+tolerance) )距离点的距离内不存在其他球体(容差很小,比如10^-6)。

此外,通道具有一定的长度、宽度和宽度,因此应在上述条件相同的单一方向上在这些限制范围内进行随机化,即如果分子靠近壁而不是其radius+tolerance,则不应生成该分子。

我最初尝试的是一个有结构的晶格,但这意味着,分子的数量将与维数相关,这对我来说是行不通的。所以我写了下面的算法(我想粘贴我的代码,但它不工作,它现在是一个巨大的,夸张的混乱,并几乎崩溃了我的电脑一次。

所以逻辑是

1.)对于每个粒子,使max_X=X-(radius+tol)。为Y和Z做同样的事情。

2.)对于每个粒子,生成0到max_X之间的随机数。

3.)计算每个粒子之间的距离,并创建一个违反上述条件的粒子列表。

4.)翻阅清单,重新生成这些粒子。

5.)创建另一个违反粒子对的列表。

6.)走过去。冲洗并重复,直到列表的大小为零。

所以这不管用。我需要这段代码最终对大量的粒子执行,所以我需要它尽可能的高效和OpenMP可并行化。我在for循环前面使用了标准的#实用化omp并行方法来并行计算,但是它在运行时不工作或不使用杂注,就像一个超级风扇噪音5-10分钟之后。

我是一个非编码背景的人,最近开始学习用C++编写复杂的代码,所以我现在不能做一些花哨的事情,比如结构、类或指针。不过,我正在使用std::向量。如果你们能带我出去,如果你们在罗利附近,,我会亲自开车送你们一杯冰啤酒,我会很高兴的。几天来一直试图这样做,这是我的代码中唯一一个主要的非功能性的东西。

救命?!

PS/编辑:只是澄清一下,这不是家庭作业,否则我现在应该已经问教授了。它是一个独立项目的一部分,我将在完成后免费分发。

EN

回答 5

Stack Overflow用户

发布于 2017-05-08 09:53:17

CGAL完全满足您的需要,但是请:

“我不能做一些花哨的事情,比如结构、类或指针”,这将使你一事无成。我们可以帮助您到达那里,但您也需要得到至少结构,类和STL。

票数 1
EN

Stack Overflow用户

发布于 2017-05-08 11:13:57

首先,我将对迄今所采取的方法做一些说明:

  • 首先,应该调查少数粒子(如1,2,10)发生了什么,以了解为什么它没有完成。
  • 我怀疑的问题是,违反约束的列表永远不会变成空的。也许代码中有错误,或者粒子太难适应长方形的体积。
  • 第3步和第4步的结合似乎效率低下。不能保证违反约束的范围从一个步骤减少到下一个步骤。例如,对于许多球体来说,每个球体可能至少有一个重叠的球体。在这种情况下,每一次都需要重新生成所有领域,导致没有任何进展。
  • 在步骤3)和步骤4中,如果一对球违反了约束,那么这两个球都会被重新生成。考虑只重新生成其中一个可能是有用的(可能是随机选择的)。

一种不同的方法是一个接一个地产生球体。虽然新添加的球面违反了以前放置的任何约束,但请重试将其随机放置。如果它没有违反任何约束,那么修复它的位置,然后继续下一个领域。

票数 0
EN

Stack Overflow用户

发布于 2017-05-08 13:57:52

“3)计算每个粒子之间的距离,并创建一个违反上述任何条件的粒子列表。”

这是一个O(N*N)算法。而且你已经重复了一遍。你做这件事的频率可能取决于分子的密度,但我希望你不是在模拟固体。

有一个正确的方法来做到这一点。将音量切成小盒子,大小约为radius^3。现在,您只需要检查每个框内的碰撞,以及与其26个邻居的冲突。如果你有很多,很多这些小盒子,只检查27个小盒子是更有效的。

如果使用整数/不动点坐标,就可以很容易地找到正确的方框,而精确的方框大小则是2的幂。例如,如果半径为250,则使方框256x256x256,这样就可以通过除以256来找到正确的方框。这是硬件上的一点变化。

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

https://stackoverflow.com/questions/43844454

复制
相关文章

相似问题

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