C++ 3D数组在编译时拾取不现实的值,而不是已设置的值
以下代码是在3D晶格中模拟分子动力学的第一部分。我在3D数组拾取垃圾值时遇到问题。不是在所有位置,而是在某些位置,因为这些位置导致整个结果出错。我还注意到,当数组的维数为5*5*5以后时,会发生错误(对于此特定模拟,立方体边的最小长度应为3)。此外,代码的完成时间比预期的要长得多。如果可能的话,请对此问题发表评论。请忽略明显的注释,比如每个函数都做了什么,我这样做是为了让我不会忘记。提前谢谢C++ 3D数组在编译时拾取不现实的值,而不是已设置的值,c++,arrays,performance,multidimensional-array,C++,Arrays,Performance,Multidimensional Array,以下代码是在3D晶格中模拟分子动力学的第一部分。我在3D数组拾取垃圾值时遇到问题。不是在所有位置,而是在某些位置,因为这些位置导致整个结果出错。我还注意到,当数组的维数为5*5*5以后时,会发生错误(对于此特定模拟,立方体边的最小长度应为3)。此外,代码的完成时间比预期的要长得多。如果可能的话,请对此问题发表评论。请忽略明显的注释,比如每个函数都做了什么,我这样做是为了让我不会忘记。提前谢谢 #include <iostream> #include <cstdlib> /
#include <iostream>
#include <cstdlib> // has rand(),srand().
#include <ctime> // has time.
#include <fstream> // enables file handling.
#include <math.h>
using namespace std;
float rand_gen(); //full function written after main().
//int pbc(int,int,int);
int main()
{
srand((int)time(0)); //sets time as the seed for the random no. generation.
int dim=5;
int i,j,k,iup,idown,jup,jdown,kup,kdown;//indices
float x;
int l[dim][dim][dim];
float M=0.0,E=0.0;
for(i=1;i<=dim;i++)
{
for(j=1;j<=dim;j++)
{
for(k=1;k<=dim;k++)
{
x=rand_gen();
if(x<=0.5)
{
l[i][j][k]=-1; //sets the value in that particular location.
}
else
{
l[i][j][k]=1; //sets the value in that particular location.
}
M=M+l[i][j][k];
}
}
}
cout<<"Total magnetisation= "<<M<<endl;
for(i=1;i<=dim;i++)
{
for(j=1;j<=dim;j++)
{
for(k=1;k<=dim;k++)
{
if(i==1)iup=dim; //*********************************
else iup=i-1;
if(i==dim)idown=1;
else idown=i+1;
if(j==1)jup=dim;
else jup=j-1; //periodic boundary condition.
if(j==dim)jdown=1;
else jdown=j+1;
if(k==1)kup=dim;
else kup=k-1;
if(k==dim)kdown=1;
else kdown=k+1; // ends here//
E=E-(l[i][j][k]*(l[iup][j][k]+l[idown][j][k]+l[i][jup][k]+l[i][jdown][k]+l[i][j][kup]+l[i][j][kdown]))/2.0;
}
}
}
cout<<"Average E= "<<E/(dim*dim*dim)<<endl;
//cout<<"Testing: "<<l[5][4][3]<<" "<<l[5][4][3]<<endl;;
//**************************ALL FINE TILL HERE IT SEEMS****************************************************//
int n=100; //Number of iterations.
int no,site;
int ri,rj,rk,riup,ridown,rjup,rjdown,rkup,rkdown;
float eng=0.0,mag=M;float E_check=0.0;
float E_b4,E_aft,E_diff;
float T=4.2;
float a;
ofstream file ("Energy_check"); //file created to write the results into.
//ofstream file1 ("ENERGY1.txt");
for(no=1;no<=n;no++)
{
for(site=1;site<=(dim*dim*dim);site++)
{
float v1=rand_gen();
float v2=rand_gen();
float v3=rand_gen();
ri= int(v1*dim)+1;
rj= int(v2*dim)+1;
rk= int(v3*dim)+1;
//if((ri>=1&&ri<=dim)&&(rj>=1&&rj<=dim)&&(rk>=1&&rk<=dim))
{if(ri==1)riup=dim; //periodic boundary condition like above
else riup=ri-1;
if(ri==dim)ridown=1;
else ridown=ri+1;
if(rj==1)rjup=dim;
else rjup=rj-1;
if(rj==dim)rjdown=1;
else rjdown=rj+1;
if(rk==1)rkup=dim;
else rkup=rk-1;
if(rk==dim)rkdown=1;
else rkdown=rk+1; // ends here
}
E_b4=-(l[ri][rj][rk]*(l[riup][rj][rk]+l[ridown][rj][rk]+l[ri][rjup][rk]+l[ri][rjdown][rk]+l[ri][rj][rkup]+l[ri][rj][rkdown]))/2.0;
E_aft=-(E_b4);
E_diff=-2.0*(E_b4);
E_check=E_check+E_b4;
if(E_diff<0)
{
l[ri][rj][rk]=-l[ri][rj][rk];
eng=eng+E_diff;
mag=mag-2*l[ri][rj][rk];
}
else
{
a=rand_gen();
if(a<pow(exp(1.0),-E_diff/T))
{
l[ri][rj][rk]=-l[ri][rj][rk];
eng=eng+E_diff;
mag=mag-2*l[i][j][k];
}
}
if(file.is_open())
{ // THE FOLLOWING CODE IS SUPPOSED TO SHOW THE VALUES OF THE ARRAY CORRESPONDING TO ITS INDICES. bUT IM GETTING GARBAGE VALUES WHEN I RUN THIS.
file<<no<<" "<<ri<<rj<<rk<<" "<<l[ri][rj][rk]<<" "<<riup<<rj<<rk<<" "<<l[riup][rj][rk]<<" "<<ridown<<rj<<rk<<" "<<l[ridown][rj][rk]<<" "<<ri<<rjup<<rk<<" "<<l[ri][rjup][rk]<<" "<<ri<<rjdown<<rk<<" "<<l[ri][rjdown][rk]<<" "<<ri<<rj<<rkup<<" "<<l[ri][rj][rkup]<<" "<<ri<<rj<<rkdown<<" "<<l[ri][rj][rkdown]<<" "<<E_b4<<" "<<E_check<<endl;
}
}
E=(E+eng)/(dim*dim*dim);
/*if(file1.is_open())
{
file1<<no<<"\t"<<E<<endl;
}*/
}
file.close();
//file1.close();
cout<<"E_check_avg= "<<E_check/(dim*dim*dim)<<endl;
return 0;
}
float rand_gen() //function to generate random number.
{
return (static_cast <float> (rand()) / static_cast <float> (RAND_MAX));// random no. generated.
}
#包括
#include//has rand()、srand()。
#我有时间。
#include//启用文件处理。
#包括
使用名称空间std;
浮动随机数根()//在main()之后写入的完整函数。
//int pbc(int,int,int);
int main()
{
srand((int)time(0));//将时间设置为随机编号生成的种子。
int-dim=5;
inti,j,k,iup,idown,jup,jdown,kup,kdown;//索引
浮动x;
int l[dim][dim][dim];
浮动M=0.0,E=0.0;
对于(i=1;IO您确实知道数组索引是零的),即它们从零到大小减去一个。在您的情况下,从<代码> 0 <代码>到<代码>昏暗1 - />(包含)。抬头:VLAs不是标准C++(AFAIK)哦,技术上,你的程序不是一个有效的C++程序,因为C++没有。你能详细说明可变长度数组吗?你是说我不能做数组[DIM] [DIM]?“?嘿,谢谢大家的帮助。当我将索引从0更改为dim-1时,它开始工作。但我仍然不明白我的数组是如何变长的数组,因为我在声明时设置了'dim'的值,而不是在运行时设置,这意味着数组的大小将在编译过程中确定,对吗?@JoachimPil”EbgOrgy确实知道数组索引是零的,即它们从零到大小减去一个。在你的例子中,从<代码> 0 >代码>到代码>昏暗- 1 < /代码>(包括)。抬头:VLAs不是标准C++(AFAIK)哦,技术上,你的程序不是一个有效的C++程序,因为C++没有。你能详细说明可变长度数组吗?你是说我不能做数组[DIM] [DIM]?“?嘿,谢谢大家的帮助。当我将索引从0更改为dim-1时,它开始工作。但我仍然不明白我的数组是如何变长的数组,因为我在声明时设置了'dim'的值,而不是在运行时设置,这意味着数组的大小将在编译过程中确定,对吗?@JoachimPil”埃博格