Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 3D数组在编译时拾取不现实的值,而不是已设置的值_C++_Arrays_Performance_Multidimensional Array - Fatal编程技术网

C++ 3D数组在编译时拾取不现实的值,而不是已设置的值

C++ 3D数组在编译时拾取不现实的值,而不是已设置的值,c++,arrays,performance,multidimensional-array,C++,Arrays,Performance,Multidimensional Array,以下代码是在3D晶格中模拟分子动力学的第一部分。我在3D数组拾取垃圾值时遇到问题。不是在所有位置,而是在某些位置,因为这些位置导致整个结果出错。我还注意到,当数组的维数为5*5*5以后时,会发生错误(对于此特定模拟,立方体边的最小长度应为3)。此外,代码的完成时间比预期的要长得多。如果可能的话,请对此问题发表评论。请忽略明显的注释,比如每个函数都做了什么,我这样做是为了让我不会忘记。提前谢谢 #include <iostream> #include <cstdlib> /

以下代码是在3D晶格中模拟分子动力学的第一部分。我在3D数组拾取垃圾值时遇到问题。不是在所有位置,而是在某些位置,因为这些位置导致整个结果出错。我还注意到,当数组的维数为5*5*5以后时,会发生错误(对于此特定模拟,立方体边的最小长度应为3)。此外,代码的完成时间比预期的要长得多。如果可能的话,请对此问题发表评论。请忽略明显的注释,比如每个函数都做了什么,我这样做是为了让我不会忘记。提前谢谢

#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”埃博格