#include #include #include "mpi.h" #define M_ARGON 6.6335e-26 //アルゴンの質量 #define E_ARGON 1.67e-21 //アルゴンのイプシロン #define S_ARGON 3.40e-10 //アルゴンのシグマ #define L_ARGON 1.680e-9 //アルゴンのセルの長さ #define DT 1.0e-15 //微小時間 #define STEP 50000 //ステップ数 #define N1 13 //各コアの担当する #define N2 30 //最後の原子の番号 #define N3 50 #define N 100 //分子数 #define MD 7.537499e24 //0.5/M_ARGON void input(FILE *file,double r[][3],double v[][3]); void output(FILE *file,double r[][3]); void next_r(double r[][3],double v[][3],double f[][3]); void result(double v[][3],double total_f0[][3],double total_f1[][3], double f1[][3],int n,int my_rank); double force(double f[][3],double r[][3],int my_rank); int main(int argc,char *argv[]){ FILE *file1,*file2; double r[N][3]; //位置 double v[N][3]; //速度 double f0[N][3]={{0}}; //今の力 double total_f0[N][3]; //f0の和 double f1[N+1][3]={{0}}; //次の力 double total_f1[N+1][3]; //f1の和 int my_rank,nproc; int n; /*MPI初期化*/ MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); MPI_Comm_size(MPI_COMM_WORLD,&nproc); /*初期処理*/ file1=fopen("argon.inp","r"); input(file1,r,v); if(my_rank==1){ printf("cycle \t kinetic \t potential \t total\n"); file2=fopen("mol.arc","w"); } /*初期の力とその和*/ force(f0,r,my_rank); MPI_Allreduce(f0,total_f0,3*N,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); /*以下を繰り返す*/ for(n=0;n0.5*L_ARGON) r[i][j]-=L_ARGON; else if(r[i][j]<-0.5*L_ARGON) r[i][j]+=L_ARGON; } } /*次の速度、力の初期化、エネルギーの計算と表示*/ void result(double v[][3],double total_f0[][3],double total_f1[][3], double f1[][3],int n,int my_rank){ int i,j; double kinetic=0; for(i=0;ivec[k]) vec[k]+=L_ARGON; } dis=pow(vec[0],2)+pow(vec[1],2)+pow(vec[2],2); t1=pow(S_ARGON,2)/dis; t2=t1*t1*t1; t3=1/dis; t4=pow(t2,2); //ポテンシャルを計算 potential+=t4-t2; t5=24*E_ARGON*t3*(2*t4-t2); //力を計算 for(k=0;k<3;k++){ f[i][k]+=t5*vec[k]; f[j][k]-=t5*vec[k]; } } } } else if(my_rank==1){ for(i=N1;ivec[k]) vec[k]+=L_ARGON; } dis=pow(vec[0],2)+pow(vec[1],2)+pow(vec[2],2); t1=pow(S_ARGON,2)/dis; t2=t1*t1*t1; t3=1/dis; t4=pow(t2,2); potential+=t4-t2; t5=24*E_ARGON*t3*(2*t4-t2); for(k=0;k<3;k++){ f[i][k]+=t5*vec[k]; f[j][k]-=t5*vec[k]; } } } } else if(my_rank==2){ for(i=N2;ivec[k]) vec[k]+=L_ARGON; } dis=pow(vec[0],2)+pow(vec[1],2)+pow(vec[2],2); t1=pow(S_ARGON,2)/dis; t2=t1*t1*t1; t3=1/dis; t4=pow(t2,2); potential+=t4-t2; t5=24*E_ARGON*t3*(2*t4-t2); for(k=0;k<3;k++){ f[i][k]+=t5*vec[k]; f[j][k]-=t5*vec[k]; } } } } else{ for(i=N3;ivec[k]) vec[k]+=L_ARGON; } dis=pow(vec[0],2)+pow(vec[1],2)+pow(vec[2],2); t1=pow(S_ARGON,2)/dis; t2=t1*t1*t1; t3=1/dis; t4=pow(t2,2); potential+=t4-t2; t5=24*E_ARGON*t3*(2*t4-t2); for(k=0;k<3;k++){ f[i][k]+=t5*vec[k]; f[j][k]-=t5*vec[k]; } } } } return potential; }