【发布时间】:2020-03-07 19:41:21
【问题描述】:
虽然我知道 -1.#IND00 表示我试图将某个值除以零,但我的程序给出了 -1.#IND00 而我没有进行任何除法。
我正在尝试编写一个记录晶格中粒子距离的代码,我告诉程序忽略它试图通过忽略该迭代来减去同一个粒子的位置的情况,然后继续下一个。但是,使用公式:
comparative_distance[par_num][current_par]=sqrt((position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+(position[current_par][0]-position[par_num][0])*(position[current_par][1]-position[par_num][1])+(position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));,
这只是 sqrt(x^2+y^2+z^2),它给了我 -1.#IND00 的几个结果,我认为我们不能忽略这些情况,因为这些信息将被用于计算粒子间势和力(当把势相加时,我认为当需要将一个整数与 -1.#IND00 结果相加时,计算机将不知道该怎么做)。
也许我对 -1.#IND00 的含义有误解,但是输出想要说明 -1.#IND00 的含义是什么?
如果你需要看一下,这是整个代码(它还没有完成):
#include <stdlib.h>
#include <math.h>
#define Kb 8.6173324e-5 //Boltzmann constant (in eV/K)
#define PI 3.14159265
#define C 299792.458 // in angstrom/ps
#define temp 298 // in K
#define mass 3.72112e10 //in eV/c^2
#define upsilon 1.03e-2 //in eV
#define rho 3.4//in Angstrom
//Initialization
double Box_Muller_Transformationx(double box1) //this is the algorithm for Box-Muller transformation
{
double vx = (sqrt(-2*log(box1))*cos(2*PI*box1))*sqrt(Kb*temp/mass);
return vx;
}
double Box_Muller_Transformationy(double box2) //this is the algorithm for Box-Muller transformation
{
double vy = (sqrt(-2*log(box2))*cos(2*PI*box2))*sqrt(Kb*temp/mass);
return vy;
}
double Box_Muller_Transformationz(double box3) //this is the algorithm for Box-Muller transformation
{
double vz = (sqrt(-2*log(box3))*cos(2*PI*box3))*sqrt(Kb*temp/mass);
return vz;
}
int par_num = 125, b = 3, a=0, coordinates=3, current_par=124; //this is the lattice size, boundary is set as 10 in each direction
double t=0, box1, box2, box3;
int main()
{
double i=0, j=0, k=0, vx=0, vy=0, vz=0; //generating the 125 particles as a 3D lattice with random velocities
double velocity[125][3];
double position[125][3];
double potential[125][125];
double comparative_distance[125][125];
double v_new[125][3];
double force[125][3];
double rho_term[125][125];
double each_total_V[par_num][1];
double vx_sum;
double vy_sum;
double vz_sum;
double vx_final;
double vy_final;
double vz_final;
double r;
//finding the altered velocities after initializing velocities
for (par_num=0;par_num<125;par_num++)
{
vx_sum+=velocity[par_num][0];
vy_sum+=velocity[par_num][1];
vz_sum+=velocity[par_num][2];
}
vx_final=vx_sum/125;
vy_final=vy_sum/125;
vz_final=vz_sum/125;
FILE *fp;
fp = fopen ("lab2testing.txt", "w+");
fprintf(fp, "%d \n%s \n", 125, "particle");
for (i=0, par_num=0; par_num<125; i++, par_num++)
{
double box1 = (rand()/ (double)RAND_MAX);
double box2 = (rand()/ (double)RAND_MAX);
double box3 = (rand()/ (double)RAND_MAX);
position[par_num][0]=i; //position components, i=-1 because if we want the particle to be placed at 0 again, but the big for-loop will generate i=1 unless we tune it down.
position[par_num][1]=j;
position[par_num][2]=k;
double vx = Box_Muller_Transformationx(box1); //velocity components
double vy = Box_Muller_Transformationy(box2);
double vz = Box_Muller_Transformationz(box3);
velocity[par_num][0]=vx;
velocity[par_num][1]=vy;
velocity[par_num][2]=vz;
v_new[par_num][0]=velocity[par_num][0]-vx_final;
v_new[par_num][1]=velocity[par_num][1]-vy_final;
v_new[par_num][2]=velocity[par_num][2]-vz_final;
if(par_num%5==4)
{
i=-1;
j++;
}
if(par_num%25==24)
{
i=-1;
j=0;
k++;
}
if(par_num==125)
{
position[par_num][2]=5;
}
fprintf(fp, "%s %lf %lf %lf\n ","Ar", position[par_num][0], position[par_num][1], position[par_num][2]);
printf("%s %lf %lf %lf\n ","Ar", position[par_num][0], position[par_num][1], position[par_num][2]);
}
//Iteration......
double p,q;
fprintf(fp, "%d \n%s \n", 125, "particle");
for (coordinates=0; coordinates<3; coordinates++) //coordinates loop
{
for (par_num=0; par_num<125; par_num++) //calculating for each particle
{
for (current_par=0; current_par<125; current_par++) //counting from 1st until 125th particle
{
comparative_distance[par_num][current_par]=sqrt((position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+(position[current_par][0]-position[par_num][0])*(position[current_par][1]-position[par_num][1])+(position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));
if(comparative_distance[par_num][current_par]==0 || par_num==current_par)
{
continue;
}
rho_term[par_num][current_par] = rho/comparative_distance[par_num][current_par];
p = rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par];
q = rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par];
potential[par_num][current_par]=4*upsilon*(q-p);
printf("%lf\n", comparative_distance[par_num][current_par]);
}
}
}
return(0);
}
【问题讨论】:
标签: c arrays loops if-statement