// ■分子動力学法(Molecular Dynamics Method) // 右ボタンで停止、左ボタンで再開します。 #include "myWin.h" #include "stdlib.h" #include "time.h" #include "math.h" #define frand()((double)rand()/(RAND_MAX+1)) #define Xmax 10 // X最大位置 #define Ymax 10 // Y最大位置 #define Nmax 100 // 分子個数の最大数 #define EPSI 1.0 //フィッティングパラメータε(ポテンシャルの深さ) #define SIGMA 1 //フィッティングパラメータσ(衝突直径) typedef struct{ double X, Y;} point; static point F[Nmax]; //分子に働く力 static point R[2][Nmax]; //分子の位置 static point V[2][Nmax]; //分子の速度 double E1; //計算用(E1 = -48ε・σ^13 の値) double E2; //計算用(E2 = 24ε・σ^7 の値) double MG; //質量(分子の質量を1とする) double DT; //時間刻み double TM; //時間(今はカウントのみ。将来拡張用) int N; //分子の数 int ID1, ID2; //現時刻と次時刻切替え用添字, static HDC hBuff; static HBITMAP hBM; //ビットマップ表示用 void drawEllipse(int X1, int Y1, int X2, int Y2, int lColor, int bColor){//■端部の円形 HPEN pen=CreatePen(PS_SOLID, 1, lColor) ; SelectObject(hBuff, pen) ; HBRUSH brush=CreateSolidBrush(bColor) ; SelectObject(hBuff, brush); Ellipse(hBuff,X1,Y1, X2,Y2) ; DeleteObject(brush) ; DeleteObject(pen); } void drawBox(int X1, int Y1, int X2, int Y2, int lColor, int bColor){//■端部の円形 HPEN pen=CreatePen(PS_SOLID, 1, lColor) ; SelectObject(hBuff, pen) ; HBRUSH brush=CreateSolidBrush(bColor) ; SelectObject(hBuff, brush); Rectangle(hBuff,X1-10,Y1-10, X2+10,Y2+10); DeleteObject(brush) ; brush=CreateSolidBrush(0xFFFFFF) ; SelectObject(hBuff, brush); Rectangle(hBuff,X1,Y1, X2,Y2) ; DeleteObject(brush); DeleteObject(pen); } void crearBitmap(){ //■ビットマップクリア SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,1000,400,WHITENESS); } void compForce(){//■力の計算(Lennard-Jones Potentialによる力) for(int i=0; i 0.00001){ for(int i=0;i XM){ R[ID2][i].X = XM; V[ID2][i].X = -abs(V[ID2][i].X);} if(IDY < HS){ R[ID2][i].Y = HS; V[ID2][i].Y = abs(V[ID2][i].Y);} if(IDY > YM){ R[ID2][i].Y = YM; V[ID2][i].Y = -abs(V[ID2][i].Y);} } } void initData(){//初期設定 N=10; DT=0.05; MG = 1; ID1 = 0; ID2 = 1;TM=0; E1 = -48 * EPSI * pow((double)SIGMA ,13); E2 = 24 * EPSI * pow((double)SIGMA , 7); for(int i=0;i Xmax-1)R[0][i].X=1; R[0][i].Y+=2;if(R[0][i].Y> Ymax-1)R[0][i].Y=1; } } } } } void display(){//■表示 crearBitmap(); drawBox(30,20, 30+Xmax*20, 20+Ymax*20, 0,0xFF0000); for (int i = 0; i