#include "dump2analysis.h" /* DOCUMENT */ /* -m msd */ /* lammpstrjから指定した原子の平均二乗変位(MSD)を時間シフトしながら計算する */ /* 原子タイプで指定しても最初のステップのidで原子を選択する */ /* --shfitと--tauを小さくすればMSDの統計が稼げる。ただしシフトが小さすぎるMSDが変化する。 */ /* --shiftでMSDが変わらないようパラメータを調整する。 */ /* 教科書Pを参照 */ /* A原子(-a, -x, -s)を指定する。 */ /* --shiftはMSDを計算する時にシフトさせるステップ default:1 */ /* --tauはMSDを計算する時間ステップ範囲。-1でMDの全ステップでMSDを計算する default:-1 */ /* --dtはMDの時間ステップでの時間(fs単位) default:1.0 */ void ErrorMSD(){ printf("Required arguments atoms A\n"); printf("(-a, -x, -s) atom A\n"); printf("------------------------------------------------------------\n"); printf("Optional arguments for MSD analysis:\n"); printf("--shift time shift for MSD [1]\n"); printf("--tau time period for MSD (-1: all steps [-1]\n"); printf("--dt time period for one step (fs) [1.0]\n"); printf("------------------------------------------------------------\n"); printf("Example:\n"); printf("dump2analysis -m msd -x Li --dt 1.2 --tau 2500 --shift 100 -i hoge.lammpstrj -o hoge.msd\n"); exit(0); } void OutputMSD(PARAM *p, double **msd, ATOMS *a, int step){ int i; double t; FILE *f; f = fopen(p->outfile, "w"); fprintf(f, "# Atomic list: "); for (i=0; iatoms; i++) fprintf(f, "%s(%d) ", a->elem[i], a->id[i]); fprintf(f, "\n"); fprintf(f, "# TAU: %d\n", TAU); fprintf(f, "# TAU_SHIFT: %d\n", TAU_SHIFT); fprintf(f, "# total TAU step: %d\n", step); fprintf(f, "# atoms: %d\n", a->atoms); fprintf(f, "# %12s ", "time/fs"); fprintf(f, "%14s ", "msd/Ang.2"); fprintf(f, "%14s ", "a/Ang.2"); fprintf(f, "%14s ", "b/Ang.2"); fprintf(f, "%14s ", "c/Ang.2"); fprintf(f, "\n"); for (i=0; iAid[0]-1); head = malloc(sizeof(HEAD) * param->steps); f = fopen(param->infile, "r"); /* -1の場合は全ステップでMSDを計算する */ if (TAU == -1) { TAU = param->steps; TAU_SHIFT = param->steps; } /* steps * atoms * (x, y, z)のメモリ取得 */ xx = malloc(sizeof(double*) * param->steps); yy = malloc(sizeof(double*) * param->steps); zz = malloc(sizeof(double*) * param->steps); for(i=0; isteps; i++){ xx[i] = malloc(sizeof(double) * a.atoms); yy[i] = malloc(sizeof(double) * a.atoms); zz[i] = malloc(sizeof(double) * a.atoms); } /* 分率座標のデータを全ステップで取得する */ printf("Loading data...\n"); fflush(stdout); for (i=0; isteps; i++){ GetData(f, param, &head[i], &a, NULL, NULL); /* xx, yy, zzは分率座標 */ for (j=0; jsteps, a.atoms, xx, yy, zz); /* msdの計算 r, a, b, c*/ /* メモリ確保と初期化 */ msd = malloc(sizeof(double*) * 4); for(i=0; i<4; i++) msd[i] = malloc(sizeof(double) * TAU); for (k=0; k<4; k++) for (i=0; isteps; p=p+TAU_SHIFT){ printf("MSD step range: from %d to %d\n", p, p+TAU); fflush(stdout); for (i=0; isteps; i++){ free(xx[i]); free(yy[i]); free(zz[i]); } free(xx); free(yy); free(zz); for(i=0; i<4; i++) free(msd[i]); free(msd); }