@Gauss”g‘©ƒvƒƒOƒ‰ƒ€
#include <stdio.h>
#include <math.h>

#define LMAX 256
#define PI 3.14159265

void calc_F(double F[], double f[], double V[], double dx);
void RK4(double y_r[], double y_i[], double V[], double dx, double dt);

int main(int argc, char* argv[])
{
	double y_r[LMAX], y_i[LMAX], V[LMAX], Vo;
	double dx, dt, k;
	double center, delta, gauss; /*gaussian wave packet parameters */
	int ix, time, time_max, w_time;

	Vo = 0.5;
	/* set potential */
	for(ix=0;ix LMAX/2 && ix < LMAX/2 + 10 ) V[ix]=Vo;
		else V[ix] = 0.0;
	}
    
	dx = 1.; k = 2.*PI / (dx*10);
	center = 50.; delta = 10.;
	/* set initial wave function */
        for(ix=0;ix < LMAX;ix++){
       gauss = exp(- (ix*dx - center)*(ix*dx - center)/delta/delta);
	   y_r[ix] = gauss * cos (k*ix*dx);
	   y_i[ix] = gauss * sin (k*ix*dx);
	}
		
	    printf("0\n");
		for(ix=0;ix<LMAX;ix++)printf("%f\t",V[ix]);
		printf("\n");          
		for(ix=0;ix<LMAX;ix++)printf("%f\t",y_r[ix]);
		printf("\n");
		for(ix=0;ix<LMAX;ix++)printf("%f\t",y_i[ix]);
		printf("\n");
		printf("\n");		   

	w_time = 100; dt=0.1;time_max=2000;
	for(time=1;time<=time_max;time++){
       RK4(y_r, y_i, V, dx, dt);
	   if(time%w_time==0){
		  printf("%d\n", time);
		  for(ix=0; ix<LMAX; ix++)printf("%f\t",y_r[ix]);
		  printf("\n");
		  for(ix=0; ix<LMAX; ix++)printf("%f\t",y_i[ix]);
		  printf("\n");
		  printf("\n");
	   }
	}
	return 0;
}

void calc_F(double F[], double f[], double V[], double dx){
	int ix;
	for(ix=1; ix<LMAX-1; ix++){
		F[ix]= (f[ix+1] - 2.* f[ix] + f[ix-1])/dx/dx - V[ix]*f[ix];
	}

	return;
}

void RK4(double y_r[], double y_i[], double V[], double dx, double dt){
    static double  F[LMAX];
	static double k1_r[LMAX], k1_i[LMAX], k2_r[LMAX], k2_i[LMAX],
		          k3_r[LMAX], k3_i[LMAX], k4_r[LMAX], k4_i[LMAX];
	static double y_k_i[LMAX], y_k_r[LMAX];
	static int ix;
	
	/* k1 calculation */
	calc_F(F, y_r, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k1_i[ix] = F[ix]*dt;
	}
	calc_F(F, y_i, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k1_r[ix] = -F[ix]*dt;
	}

	/* k2 calculation */
	for(ix=0; ix<LMAX; ix++){
		y_k_i[ix] = y_i[ix] + 0.5*k1_i[ix]; /* y + 0.5*k1 */
		y_k_r[ix] = y_r[ix] + 0.5*k1_r[ix];
	}
	calc_F(F, y_k_r, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k2_i[ix] = F[ix]*dt;
	}
	calc_F(F, y_k_i, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k2_r[ix] = -F[ix]*dt;
	}

		/* k3 calculation */
	for(ix=0; ix<LMAX; ix++){
		y_k_i[ix] = y_i[ix] + 0.5*k2_i[ix]; /* y + 0.5*k2 */
		y_k_r[ix] = y_r[ix] + 0.5*k2_r[ix];
	}
	calc_F(F, y_k_r, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k3_i[ix] = F[ix]*dt;
	}
	calc_F(F, y_k_i, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k3_r[ix] = -F[ix]*dt;
	}

		/* k4 calculation */
	for(ix=0; ix<LMAX; ix++){
		y_k_i[ix] = y_i[ix] + k3_i[ix]; /* y + k3 */
		y_k_r[ix] = y_r[ix] + k3_r[ix];
	}
	calc_F(F, y_k_r, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k4_i[ix] = F[ix]*dt;
	}
	calc_F(F, y_k_i, V, dx);
    for(ix=1; ix<LMAX-1; ix++){
		k4_r[ix] = -F[ix]*dt;
	}

	for(ix=0; ix<LMAX; ix++){
		y_i[ix] += (k1_i[ix] + 2.*(k2_i[ix] + k3_i[ix]) + k4_i[ix])/6.; /* y + k3 */
		y_r[ix] += (k1_r[ix] + 2.*(k2_r[ix] + k3_r[ix]) + k4_r[ix])/6.;
	}

	return;
}