#include "dump2analysis.h" /* -m template_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 ErrorTemplateMSD(){ printf("Required arguments atoms A\n"); printf("(-a, -x, -s) atom A\n"); printf("------------------------------------------------------------\n"); printf("Optional arguments for TemplateMSD analysis:\n"); printf("--shift time shift for TemplateMSD [1]\n"); printf("--tau time period for TemplateMSD (-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 OutputTemplateMSD(PARAM *p){ FILE *f; f = fopen(p->outfile, "w"); fclose(f); } void EstimateTemplateMSD(PARAM *param){ int i, j, p, step_counter=0; FILE *f; HEAD head; ATOMS a; if (ArgCheckInputOutput(param) != 0) ErrorTemplateMSD(); SetAtomsSteps(param); if (CheckArgAtomSelect(param) != 1) ErrorTemplateMSD(); /* 選択元素が変わるとおかしくなるので元素選択は全てid */ SetIDfromElemTtype(param); Allocate(&a, param->Aid[0]-1); f = fopen(param->infile, "r"); /* -1の場合は全ステップでMSDを計算する */ if (TAU == -1) { TAU = param->steps; TAU_SHIFT = param->steps; } /* 分率座標のデータを全ステップで取得する */ printf("Loading data...\n"); for (i=0; isteps; i++){ GetData(f, param, &head, &a, NULL, NULL); } /* msdの計算 r, a, b, c*/ for (p=0; p+TAU <= param->steps; p=p+TAU_SHIFT){ printf("TemplateMSD step range: from %d to %d\n", p, p+TAU); for (i=0; i