2.調和振動子のMD計算プログラム
調和振動子の運動をVerlet法で数値的に解くプログラムを以下に示す(VC++)。
#include "stdafx.h"
#include "stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{
double x; // current position
double xb; // position at the previous step
double f; // force
double v; // velocity components
double m; // mass
double C; // spring constant of harmonic oscillator
double tmp; // temporal memory
double t, dt; // duration, time step
double KE; // kinetic energy
double PE; // potential energy
FILE *fp;
fopen_s(&fp,"harmonic.csv", "w");
if(fp == NULL){
printf("ERROR: File open failed.\n"); exit(1);
}
fprintf(fp,"time,kinetic energy,potential energy,Hamiltonian\n");
// Initialize
dt = 0.001; m = 0.5; C = 1.0; x = 1.0; xb = 1.0;
for(t=0.0; t<5.0; t+=dt){
// force and potential energy calculation
f = -C * x;
PE = 0.5 * C * x * x;
// the Verlet algorithm
tmp = x;
x = 2.0 * x - xb + dt * dt * f / m;
xb = tmp;
// kinetic energy calculation
v = (x - xb) / dt;
KE = 0.5 * m * v * v;
// print time,kinetic energy, potentialenergy, and Hamiltonian
fprintf(fp, "%f,%f,%f,%f\n",t, KE, PE, KE+PE);
}
fclose(fp);
return 0;
}