2016-09-22 63 views
1

我正在写一个2d原行星盘的模拟,现在最耗时的代码是计算引力吸引力。这是我目前使用的代码。优化一个n体引力算法

for(int i=0; i<particleCount; i++){ 
    if(boolArray[i]){ //boolArray is linked with particleArray, false means the linked particle has collided with another particle and no longer exists 
     double iX = particleArray[i].getXPosition(); 
     double iY = particleArray[i].getYPosition(); 
     double iM = particleArray[i].getMass(); 
     for(int j=0; j<particleCount; j++){ 
      if(i!=j&&boolArray[j]){ 
       double rX = iX-particleArray[j].getXPosition(); 
       double rY = iY-particleArray[j].getYPosition(); 
       double rT = Math.sqrt(rX*rX+rY*rY); 
       double rF = rT*rT*rT; 
       double fT = -constantGravity*iM*particleArray[j].getMass()/rF; 
       particleArray[i].updateForce(rX*fT, rY*fT); 
      } 
     } 
    } 
} 

有没有人有关于如何加快它的任何想法?我认为sqrt在

double rT = Math.sqrt(rX*rX+rY*rY); 

是最大的罪魁祸首,但我不知道我是否可以摆脱它。

编译准备代码能够在https://github.com/quietsamurai98/2D-Accretion-Simulation/tree/Trails-png

+0

Java使用Smart Power算法用于sqrt函数,其复杂度为O(log n),其速度很快。这不是延迟的原因 – Rishi

+0

您是否考虑过使用扇区而不是粒子作为均匀区域(尘埃......)?这应该会大大降低物体的粗糙度,精度会稍微降低,但如果您意识到离散积分与现实无关......那么拉伸精度应该不会有太大的影响。为了确保你在比较结果后几次迭代与展位方法,他们应该+/- +/- – Spektre

回答

1

找到你的每对点的计算两次。 试试这个。

for (int i = 0; i < particleCount; i++) { 
    if (boolArray[i]) { // boolArray is linked with particleArray, false 
         // means the linked particle has collided with 
         // another particle and no longer exists 
     double iX = particleArray[i].getXPosition(); 
     double iY = particleArray[i].getYPosition(); 
     double iM = particleArray[i].getMass(); 
     for (int j = i + 1; j < particleCount; j++) { 
      if (boolArray[j]) { 
       double rX = iX - particleArray[j].getXPosition(); 
       double rY = iY - particleArray[j].getYPosition(); 
       double rT = Math.sqrt(rX * rX + rY * rY); 
       double rF = rT * rT * rT; 
       double fT = -constantGravity * iM * particleArray[j].getMass()/rF; 
       particleArray[i].updateForce(rX * fT, rY * fT); 
       particleArray[j].updateForce(-rX * fT, -rY * fT); 
      } 
     } 
    } 
} 
+0

这绝对有帮助! – quietsamurai98

0

您还可以使用四叉树(或八叉树的3d)。然后,您可以计算同一个单元内每个物体的重力,然后计算每个外部单元的单元内质量的总和,并从该单元的中心与所述质量计算重力。这将失去精度,但是具有平衡良好的四叉树,并且非常大量的N体将看起来非常现实。 https://en.wikipedia.org/wiki/Barnes%E2%80%93Hut_simulation