我正在计算 C++ 中大量(~1e5)粒子的势能。为了做到这一点,我正在运行一个双循环,在其中我计算成对距离,并从这些距离计算系统的总势能。下面是相关的代码片段(它没有准备好复制/粘贴,因为需要定义数据,并且有些东西脱离了上下文;该方法仍然有效,这就是我要在这里展示的内容) :
int colstart = 2;
int colend = 4;
double PE = 0;
double p_mass = 8.721e9 * 1.989e30; // mass of sim particle in kg
double mpc_to_m = 3.08567758e22; // meters per mpc
double G = 6.67384e-11; // grav. constant in mks units
// Calculating PE
for(int i = 0; i < data.size()-1; i++) // -1 is for empty line at the end of every file
{
//cout << i << " " << data[i].size() << endl;
for(int j = 0; j < i; j++)
{
double x_i = (double)atof(data[i][2].c_str());
double y_i = (double)atof(data[i][3].c_str());
double z_i = (double)atof(data[i][4].c_str());
double x_j = (double)atof(data[j][2].c_str());
double y_j = (double)atof(data[j][3].c_str());
double z_j = (double)atof(data[j][4].c_str());
double dist_betw = sqrt(pow((x_i-x_j),2) + pow(y_i-y_j,2) + pow(z_i-z_j,2)) * mpc_to_m;
PE += (-1 * G * pow(p_mass,2)) / (dist_betw);
}
}
有没有更快的方法来进行这种类型的计算?我对也涉及近似值的建议持开放态度,也就是说,如果它将总势能返回到大约 1% 左右。
谢谢!