我使用跳跃算法编写了一个简单的 N 体代码。现在我想做的是创造一个近距离接触的条件。我希望代码让我知道每当两个粒子接近某个距离时。这就是我想出的,在我看来它应该可以工作,但事实并非如此。它在 c++ 中:在代码中:num 是粒子的数量,r[num][3] 是一个全局 2d 数组,它保存每个粒子的 3d 位置(x,y,z 坐标)。我只是在写函数check_collisions,它在主函数中执行,在一个时间循环下,对系统进行进化。我试图做的是存储任何给定粒子对之间的距离,并将它们与某个距离进行比较(在本例中为 rad[i]+rad[j],其中 rad[num] 是半径的全局数组每个粒子)。如果 2 个粒子之间的距离小于 rad[i]+rad[j],那么我希望变量 dummy 增加。然后我想对那些粒子做一些事情,让其他的保持完整。问题是 dummy 无论如何仍然为 0。我独立检查我的一个试验中的 2 个粒子在几个时间步长内实际上彼此接近,但虚拟变量保持为零。这是功能
int check_collisions(int num, double dt)
{ double rji[3]; double r2, dis; int dummy = 0;
double rad_sum[num][num]; double coll_dis[num][num];
for (int l = 0; l < num; l++)
{ for (int m = 0; m < num; m++)
{ coll_dis[l][m] = 10000; rad_sum[l][m] = 0;} }
for (int i = 0; i < num; i++)
{ for (int j = i+1; j < num; j++)
{
for (int k = 0; k < 3; k++)
{ rji[k] = r[j][k] - r[i][k]; }
for (int k = 0; k < 3; k++)
{ r2 += rji[k] * rji[k]; }
dis = sqrt(r2);
coll_dis[i][j] = dis;
rad_sum[i][j] = rad[i]+rad[j];
}//end for j
}//end for i
for (int i = 0; i < num; i++)
{ for (int j = i+1; j < num; j++)
{
if ( coll_dis[i][j] <= rad_sum[i][j] )
{ dummy++;
}
if (dummy != 0)
{ do { some stuff involving dt
} while (coll_dis[i][j] <= rad_sum[i][j]);
}
}
}
}