玩重力学习CUDA:基本力量

2020-12-08 10:58:24

我们通过学习并编写一些CUDA程序开始了本系列的学习CUDA的工作,然后我们在nVidia显卡上启动并运行了这些程序。这是一个很好的开始,给了我们立即的成就感,但是为了继续朝着建立多体重力模拟的目标前进,我们将不得不脱离CUDA并确保我们了解重力多一点。可以在复杂性的不同级别上对重力进行建模,因此我们将要决定在哪个级别上对其进行建模。我们当然会从简单开始,但是对重力有足够的了解仍然很高兴知道如果我们想要我们可以去哪里以及不值得探索的地方。

尽管科学家们并不确切知道重力是什么-它是与未被发现的粒子相关,由一个场控制还是纯粹是时空的性质-我们确实知道它是宇宙中四个基本力之一。重力,电磁力以及弱和强核力共同控制着我们可以在物质和辐射之间观察到的所有已知相互作用,而重力恰好是这些力中最弱的。这个事实似乎令人惊讶,但是考虑到即使是相对较弱的冰箱磁铁也可以克服整个地球所产生的重力,并且您会感觉到重力的确有多弱。

虽然重力可能很弱,但它的作用是四种力中影响最深的。弱和强核力量仅限于原子核的规模,因此它们的作用极为局限。电磁力是一种带有正负电荷的极化力。在较远的距离上,这些相反的电荷趋于平衡,从而抵消了这些距离处的作用力。可以说,光子在很长的距离内以电磁力的形式辐射电磁波,但是该力的作用仍然相对于光子是局部的。另一方面,重力没有极性,它仅以距离的平方衰减,因此重力场的影响可以比其他力更远地通过空间到达。

用更多的技术术语来说,重力是物体之间的吸引力,它随这些物体的质量以及彼此之间的距离成比例地变化。较重的物体间隔更近会在这些物体之间产生更强的力。这种引力概念是牛顿引力理论。爱因斯坦用广义相对论将牛顿的理论添加到了广义相对论中,该理论更准确地描述了重力的性质和行为。广义相对论代替了质量通过瞬时力在远处彼此直接作用的概念,而是引入了质量引起时空弯曲的概念,而弯曲时空决定了物体如何在其中移动。

广义相对论对运动中的物体有额外的影响。行星不会像行星那样在轨道上的物体一直绕着它们的母恒星旋转,而是实际上会(非常缓慢地)将能量耗散到时空的结构中,并且它们的轨道会在非常非常长的时间尺度上衰减。重力还会影响无质量的物体,例如光子,因为时空的曲率会影响光子的路径,并导致光子在接近大质量时绕其弯曲,这是因为大质量周围的时空曲率较大。广义相对论仍然进行与牛顿引力相同的所有计算和预测,但是它延伸到牛顿引力无法应付或弄错的领域。

我们在重力模拟中有很多潜在的东西可以建模。由于爱因斯坦的广义相对论,物体可能受到多种力的影响,而重力又可能产生次要影响。但是,我们将根据建模的性质来简化操作,因为更简单的计算将使我们能够扩展到更大的系统。

由于重力是如此之弱,直到质量达到行星大小或更大时才产生明显的影响,因此我们将使用物体和距离至少在太阳系尺度上的系统进行建模。在这些规模上,电磁力,弱核力和强核力可以忽略不计,因此我们将忽略它们。我们还将以简化的假设开始,即对象将是点质量的,其自身没有大小。我们可能最终会尝试对具有大小的质量进行建模,但是事实证明,在恒星且肯定是星际距离处,无论如何,大多数物体实际上都是点质量的。

我们还将忽略广义相对论,而是坚持使用牛顿重力模型。虽然广义相对论在描述宇宙时更为准确,但它确实可以与非常大而密集的物体(例如黑洞和中子星)或在很长的时间范围(如水星近日点进动)中一起起作用。因为我们已经将对象建模为点质量并且没有足够长的时间尺度,所以我们将从牛顿引力开始。

我们必须决定如何处理的另一件事是时间。对于多体系统,随着时间的推移,每个对象的质量都会连续影响每个其他对象,但是我们正在使用计算机的有限资源进行模拟,因此我们将无法做到完全连续的计算。我们将通过一次在同一时刻一次计算所有物体上的力,然后计算将来某个时间步上这些物体在太空中的位置来简化作用。时间步长的大小是可以配置的,这将在精度和总模拟时间之间进行权衡。

哦,最后一件事。我们将从2D模拟开始。我们稍后可能会添加第三维,因为将计算扩展到3D很简单,但是其他计算很耗时。我们应该很好地了解没有第三个维度的系统是如何工作的,并且仅通过两个维度就可以扩展到更大的系统。

我们将采用牛顿式的2D重力定义,那么实际的模拟是什么样子?我们需要用计算机可以计算的术语来表达重力的定义。那意味着一个数学方程式。事实证明,我们有以下之一:

F是作用在相应质量m上的力。 G是引力常数6.674×10 -11 m 3⋅kg-1 s s -2。 r是两个质量之间的距离。我们需要将其计算为二维空间的向量,因此该方程实际上有一个附加的向量项:

其中r̂ 21是从对象1到对象2的单位矢量。从对象2到对象1还将有相等但相反的力F12。一旦我们为每个对象计算并求和了所有这些力,我们需要将力转化为物体的运动。这是牛顿的第二运动定律:

其中a是与F方向相同的另一个加速度矢量。我们可以使用计算出的加速度矢量以及前一时间步长的已知速度和位置矢量得出要计算的时间步长的速度和位置矢量:

这些方程式使我们在每个时间步中仿真中每个对象的位置,这是我们运行仿真所需的全部。 我们需要在仿真开始时为每个对象提供v 0和d 0的一些初始条件,以启动第一个时间步,但是之后,仿真将为随后的每个时间步确定这些初始条件。 既然我们对重力有了更多的了解,并且我们将如何简化以构建易于处理的仿真,那么我们已经准备好看看我们是否能够真正做到这一点。 下次,我们将使用这些方程式,看看是否可以编写一个程序来使用GPU上的CUDA至少模拟两个大型物体。