fcc晶格的动力学蒙特卡罗模拟

时间:2017-06-15 07:46:44

标签: c montecarlo

我目前正在尝试实施一份研究论文,要求我在C中制作一个fcc晶格。有两个原子A和B以及一个空位,通过这个空位应该进行迁移。在能量计算的情况下,应包括第一个最近邻居和第二近邻。我在编写fcc晶格的邻居时遇到了麻烦。所以,有人可以告诉我如何编码邻居。我提到了我迄今为止编写的代码。

#define N 8
#define mcs 1000
#define SEED 5674599
#define Seed 526897

int main()
{
    FILE *fp;
    int L[N][N][N],i,j,k,x,y,z,a,b,c,mc;
    double t=0;

    srand(SEED);

    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            for(k=0;k<N;k++)
            {
                if((float)rand()/RAND_MAX >= 0.5)
                {
                    L[i][j][k]= 1;  //Atom A    
                }
                else
                {
                    L[i][j][k]= -1;  //Atom B
                }       
            }
        }
    }

    for(i=0;i<N;i++)//applying periodic boundary conditions
        {
            L[i][j][0]=L[i][j][N-1];
            L[i][0][k]=L[i][N-1][k];
            i=(i+N)%N;

            for(j=0;j<N;j++)
            {   
                L[0][j][k]=L[N-1][j][k];
                L[i][j][0]=L[i][j][N-1];    
                j=(j+N)%N;  

                for(k=0;k<N;k++)
                {
                    L[0][j][k]=L[N-1][j][k];
                    L[i][j][0]=L[i][j][N-1];
                    k=(k+N)%N;
                    L[0][0][0]=L[N-1][N-1][N-1];
                }
            }
        }

        srand(Seed);

        x=rand()%N;
        y=rand()%N;
        z=rand()%N;
        L[x][y][z]=0;   //vacant site
        //printf("L[%d][%d][%d]=%d",x,y,z,L[x][y][z]);


        fp=fopen("kmc.dat","w");
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                for(k=0;k<N;k++)
                {
                    L[i][j][k]=L[i][j][k];
                    fprintf(fp,"%d %d %d %d\n",i,j,k,L[i][j][k]);
                }
                fprintf(fp,"\n");
            }
            fprintf(fp,"\n");
        }
        fclose(fp);


        srand(time(NULL));  
        for(mc=0;mc<=1;mc++)
        {
            for(i=0;i<N;i++)
            {
                a=rand()%N;         
                for(j=0;j<N;j++)
                {
                    b=rand()%N;
                    for(k=0;k<N;k++)
                    {
                        c=rand()%N;
                        //printf("\nL[%d][%d][%d]=%d",a,b,c,L[a][b][c]);
                    }


                }
            }

        }
}

0 个答案:

没有答案