#include "dump2analysis.h" /* DOCUMENT */ /* -m rotcorr */ /* 水分子の回転相関時間を計算する。 */ /* 日本化学会編「溶液の分子論的描像」 p.98 (1995) */ /* 室温での水の回転相関時間は1ps程度 */ /* 原子タイプで酸素原子を指定する */ /* idはsortされていてO,H,H O,H.Hの並びになっていること */ /* 酸素原子の後に2つの水分子が続くIDを仮定している */ /* --shfitと--tauを小さくすれば統計が稼げる。ただしシフトが小さすぎる相関が影響を受ける */ /* --shiftでMSDが変わらないようパラメータを調整する。 */ /* A原子(-a, -x, -s)で酸素原子を指定する。 */ /* --shiftは速度相関関数を計算する時にシフトさせるステップ default:1 */ /* --tauは速度相関関数を計算する時間ステップ範囲。-1でMDの全ステップで計算する default:-1 */ /* --dtはMDの時間ステップでの時間(fs単位) default:1.0 */ void ErrorRotationCorr(){ printf("Required arguments atoms A\n"); printf("(-a, -x, -s) atom A\n"); printf("------------------------------------------------------------\n"); printf("Optional arguments for RotationCorr analysis:\n"); printf("--shift time shift for RotationCorr [1]\n"); printf("--tau time period for RotationCorr (-1: all steps [-1]\n"); printf("--dt time period for one step (fs) [1.0]\n"); printf("------------------------------------------------------------\n"); printf("Example:\n"); printf("dump2analysis -m rotcorr -x O --dt 1.0 --tau 2500 --shift 100 -i hoge.lammpstrj -o hoge.rot\n"); exit(0); } void OutputRotationCorr(PARAM *p, double *vcor){ int i; double vsum = 0.0; FILE *f; f = fopen(p->outfile, "w"); fprintf(f, "# %22s ", "time/s"); fprintf(f, "%24s ", "C(t)"); fprintf(f, "%24s ", "sum(C(t)*dt)/s"); fprintf(f, "\n"); for (i=0; ioutfile); fclose(f); } void EstimateRotationCorr(PARAM *param){ int i, j, p, step_counter=0; int matoms; FILE *f; ATOMS a; HEAD head; double **vx, **vy, **vz; /* 水分子のベクトル */ double vvx, vvy, vvz; double xa, ya, za; double *rcor; double vv, ab, norm_a, norm_b, cos2_theta; if (ArgCheckInputOutput(param) != 0) ErrorRotationCorr(); SetAtomsSteps(param); if (CheckArgAtomSelect(param) != 1) ErrorRotationCorr(); /* 選択元素がステップで変わるとおかしくなるので元素選択は全てid */ SetIDfromElemTtype(param); param->Aid = SetIDfromMolecules(param->Aid, 3); Allocate(&a, param->Aid[0] - 1); /* -1の場合は全ステップで計算する */ if (TAU == -1) { TAU = param->steps; TAU_SHIFT = param->steps; } /* 全ステップの水のベクトルを取得 */ matoms = a.atoms/3; f = fopen(param->infile, "r"); vx = malloc(sizeof(double*) * param->steps); vy = malloc(sizeof(double*) * param->steps); vz = malloc(sizeof(double*) * param->steps); for (i=0; isteps; i++){ vx[i] = malloc(sizeof(double)*matoms); vy[i] = malloc(sizeof(double)*matoms); vz[i] = malloc(sizeof(double)*matoms); } for (i=0; isteps; i++){ for (j=0; jsteps; i++){ GetData(f, param, &head, &a, NULL, NULL); for (j=0; jsteps; p=p+TAU_SHIFT){ printf("Rotation correlation step ranging from %d to %d\n", p, p+TAU); for (i=0; i