nbody问题的初始条件

计算科学 模拟 保护
2021-11-27 14:38:02

注意:我已经编辑了原始问题以试图更清楚。

我正在尝试使用 Barnes-Hut 算法模拟引力 nbody 问题,其中物体以随机速度从均匀球体开始。因此,初始角动量几乎为零。我已经用太阳系之类的东西测试了代码,并将其结果与蛮力算法进行了比较,它似乎工作正常。

尽管使用了非常低的时间步长(我使用的是速度 verlet 积分器,如果这很重要),角动量增加了很多,根本不守恒。此图显示了动量的典型增加(稍后我将显示更详细的数据)

L 增加

您可以看到能量完全守恒,但角动量随着物体的加速而不断增加。所有角动量都是根据集群的实际质心计算的。

当一个物体近距离接触并被驱逐出星团时,角动量和能量都会增加很多:

身体被驱逐

我尝试了不同的时间步长(从δt=108t0δt=103t0)和重力软化参数ϵ(从Fijrij(ϵ+rij3)1) 从1光年到105光年(物体之间的初始分离是6ly),并且它们都有相同的一般结果(每行有 8 个系列,但偏差很小):

系统演进

线条的突然上升是由于近距离接触而被驱逐的身体引起的。我主要关心的是角动量的初始增加,因为它不会伴随总能量的变化。因为真实的星系有角动量,我想也许我应该从非零角动量开始模拟。

我的问题是:

  • 这类问题的标准初始条件是什么?它们涉及一个小的初始角动量,还是使用“旋转”集群开始模拟?

  • 在 nbody 模拟中,哪些角动量和能量的变化可以被认为是合理的?

编辑:我没有应用重力软化,但它不会改变结果。

编辑:这是角动量的相关代码,我可以看到一个缺陷,但谁知道......

double acc = 0;
for(int i=0;i<nstars;i++){
    double r[3] = { x[i]-cmx , y[i]-cmy , z[i]-cmz };
    double v[3] = { vx[i] , vy[i] , vz[i] };
    double li[3] = { r[1]*v[2]-r[2]*v[1], -(r[0]*v[2] - r[2]*v[0]),  r[0]*v[1] - r[1]*v[0] };
    // Li = Rᵢ×Vᵢ
    acc += m[i]*norm(li);
    // acc += m⋅R×V
    }
return acc;

cmx, cmy, cmz 是质量的坐标(刚刚检查过,它没有移动一点,它应该在哪里)。使用固定的参考系没有区别。

编辑:刚刚尝试了重力软化(实施得很糟糕)。它有助于避免物体飞走,但对角动量的不断增加没有影响。

重力软化

0个回答
没有发现任何回复~