将质量密度转换为网格上的点质量近似

计算科学 多重网格 网格 粒子 加速度
2021-12-26 11:30:33

在 nbody 重力模拟中,我没有做精确的(全对蛮力)解决方案,而是将每个物体的质量添加到 3D 网格的单元格中(每个单元格只是一个具有质量值的浮点值)。然后使用模板平滑网格。现在我试图从网格中获得点质量的近似值。我已经尝试过直接进行体细胞相互作用(类似于体体,但使用平滑的细胞质量和细胞的中心位置),但这会选择原本不含质量的细胞,就好像它们正在吸引并导致高误差。

执行以下选项之一的最精确(或合乎逻辑)的方法可能是什么:

  • 一个近似位置的单位质量
  • 单位距离和角度处的近似质量
  • 质量和距离的近似值

以便总力量的远程分量正确地与全对蛮力版本(它的远程部分)相同?

或者,除了上层选项之外,还有什么合适的方法?我可以为这些使用质量密度的导数(通过相邻单元)吗?

现在我只计算所有对(但只有远程部分)版本和这个具有平滑质量的单元中心之间的 RMS 误差(仅在远程距离后最近的相邻单元(等于 2 * 单元大小))检查模拟与全对版本的接近程度。

我正在做这个网格平滑,因为我想学习 nbody 的多重网格加速。要逐步学习它(并与以后进行性能比较),仅使用具有简单平滑的单个网格(16x16x16 立方体(作为网格大小)和具有 26 个最近相邻单元的 16 个平滑步骤(使用连续过度松弛)。

最初两个版本都以立方体体积开始。(总粒子只有 3072)

在此处输入图像描述

然后在每个时间步,计算两个版本之间所有身体位置的误差均方根值。

在此处输入图像描述

将点质量添加到单元格非常简单,如下所示

atomic_add(closest_cell_to_current_particle,all_of_current_particle_mass);
1个回答

似乎您正在发明Barnes-Hut型算法,这是一种用于 n 体模拟的基本加速算法。它遵循类似的逻辑:您将质量组合在网格上。但是,它以更精细的方式完成:

  • 当粒子接近时,你仍然使用直接计算(没有组合),否则你会失去准确性。
  • 多极扩展(质心)用于八叉树(3D)以加速远距离相互作用。

由于当您以树形方式处理粒子时存在许多更远距离的交互,这会导致复杂性降低:O(NlogN)对比O(N2)用于直接计算。