2次元MDプログラム
#include <stdio.h>
#include <math.h>

//#include 

#define Pi 3.141592653

double fai(double r);
double F(double r);
void calc_force(int n_atom, double x[], double f_x[], double y[], double f_y[], double *pot_e);
void initial_cond(int n_atom, double x[], double y[], double v_x[], double v_y[], double v0);
void make_fcc(int n, double x[], double y[]);

void main(void){
	FILE *fpe, *fp, *fpxy;
	
	double x[1000], y[1000], v_x[1000], v_y[1000], f_x[1000], f_y[1000];
	double dt;
	int i, n, n_max;
	int n_atom;
	int z;
	double m, v0;     //mass
	double kin_e, pot_e;
	double constant;

        if((fpe = fopen("./energy.xls","w")) == NULL){
		printf("File not open\n");
		return;
	}
     
	if((fp = fopen("./sample.mgf","w")) == NULL){
		printf("File not open\n");
		return;
	}

	if((fpxy = fopen("./xy.xls","w")) == NULL){
		printf("File not open\n");
		return;
	}

	n_atom = 100;
	dt = 0.01;
	m = 1.0;
	v0 = 1.0;
	n_max = 1000;
	pot_e = 0;
	constant = 0;

	fprintf(fpe,"n\tpot_e + kin_e\tpot_e\tkin_e\t\n");
	fprintf(fp, "# Micro AVS Geom:2.00\n");
	fprintf(fp, "%d\n", n_max);

	initial_cond(n_atom, x, y, v_x, v_y, v0);

	calc_force(n_atom, x, f_x, y, f_y, &pot_e);

	for(n = 0; n <= n_max; n++){
		for(i = 1; i <= n_atom; i++){
			x[i] = x[i] +v_x[i]*dt + 0.5*dt*dt*f_x[i]/ m;
			y[i] = y[i] +v_y[i]*dt + 0.5*dt*dt*f_y[i]/ m;
		}

		for(i = 1; i <= n_atom; i++){
			v_x[i] = v_x[i] + dt*0.5* f_x[i] / m;
			v_y[i] = v_y[i] + dt*0.5* f_y[i] / m;
		}

		calc_force(n_atom, x, f_x, y, f_y, &pot_e);
        
		kin_e = 0;
		for(i = 1; i <= n_atom; i++){
			v_x[i] = v_x[i] + dt*0.5* f_x[i] / m;
			v_y[i] = v_y[i] + dt*0.5* f_y[i] / m;
			kin_e += pow(v_x[i], 2) + pow(v_y[i], 2);
		}
		
		kin_e *= 0.5 * m;

		constant = pot_e + kin_e;

		printf("%d : ", n);
		printf("%f", constant);
		printf("%f %f", pot_e, kin_e);
//      for(i = 1; i <= n_atom; i++) printf("%f ", x[i]);
//      for(i = 1; i <= n_atom; i++) printf("%f", v_x[i]);
        printf("\n");

              if( (n % 100) == 0){	
		fprintf(fpxy,"%d\n", n);
		for(i = 1; i <= n_atom; i++) fprintf(fpxy, "%f\t%f\n", x[i], y[i]);
        fprintf(fpxy,"\n");
              }

		fprintf(fp, "step%d\n", n + 1);
        fprintf(fp, "sphere\n");
        fprintf(fp, "sample\n");
        fprintf(fp, "color\n");
        fprintf(fp, "%d\n", n_atom);
        for(i = 1; i <= n_atom; i++) fprintf(fp,"%9f  %f  0.0  0.5   0.0  1.0  0.0\n", x[i], y[i]);
//      fprintf(fp, "\n");

		fprintf(fpe, "%d\t%f\t%f\t%f\t\n", n, constant ,pot_e, kin_e);

	}
	scanf("&z");
	fclose(fpe);fclose(fp);	fclose(fpxy);
}

double fai(double r){
	return - 2.0 * pow(r, - 6) + pow(r, - 12);
}

double F(double r){
	return 12.0 * (pow(r, - 13) - pow(r, - 7));
}

void calc_force(int n_atom, double x[], double f_x[], double y[], double f_y[], double *pot_e){
	int i, j;
	double r, fx, fy;

	*pot_e = 0;

	for(i = 1; i <= n_atom; i++){
			f_x[i] = 0;
			f_y[i] = 0;
	}

	for(i = 1; i <= n_atom - 1; i++){
		for(j = i + 1; j <= n_atom; j++){
			if(i == j)continue;
			else{
				r = sqrt(pow(x[i] - x[j], 2)+pow(y[i] - y[j], 2));

				if( r > 1.5) continue;
				
				*pot_e += fai(r);

				fx = (x[i] - x[j]) * F(r) / r;
				fy = (y[i] - y[j]) * F(r) / r;

				f_x[i] += fx;
				f_x[j] -= fx; 
				f_y[i] += fy;
				f_y[j] -= fy;
			}
		}
	}
	return;
}

void initial_cond(int n_atom, double x[], double y[], double v_x[], double v_y[], double v0){
    int modul, multi, inc, seed;
	double r, theta, v_av_x, v_av_y;
	int i;

	modul = 2147483647;
	multi = 16897;
	inc = 0;
	seed = 4711;

	make_fcc(n_atom, x, y);

	r = (double)seed;

	for(i = 1; i <= n_atom; i++){
		r=fmod( multi*r+inc, (double)modul);
	    theta = r * 2 * Pi;
	    v_x[i] = v0 * cos(theta);
	    v_y[i] = v0 * sin(theta);
	}

    v_av_x=0; v_av_y=0;
	for(i = 1; i <= n_atom; i++){
	    v_av_x += v_x[i];
	    v_av_y += v_y[i];
	}
	v_av_x /= n_atom;
	v_av_y /= n_atom;

	for(i = 1; i <= n_atom; i++){
	    v_x[i] -= v_av_x;
	    v_y[i] -= v_av_y;
	}


}
	
void make_fcc(int n_atom, double x[], double y[]){
	int i, j;
	int a = 1;
	double n;

	n = (int) sqrt((double)n_atom);

	for(i = 1; i <= n; i++){
		if(i / 2 == (i + 1) / 2){      //偶数
			for(j = 0; j < n; j++){
				x[a] = j;
				y[a] = 0.5*sqrt(3.0)*i;				
				a++;
                
			}
		}
		else{                            //奇数
			for(j = 0; j < n; j++){
				x[a] = j + 0.5;
				y[a] = 0.5*sqrt(3.0)*i;
				a++;
							
			}
		}
		
	}
}