#include "dump2analysis.h" /* -m template_msd */ /* lammpstrjから指定した原子のvan Hove関数を時間シフトしながら計算する */ /* 原子タイプで指定しても最初のステップのidで原子を選択する */ /* --tauでジャンプさせるステップ数を指定する */ /* --shfitを指定すれば、複数のtau期間をサンプリングしvan Hoveを計算する */ /* --shfitを指定しなければ、tauが小さくても1セットのtauだけで計算する */ /* --shiftを指定する時は、--shftで関数が変わらないよう調整する。 */ /* --drでrの刻みを指定する default=0.01 */ /* A原子(-a, -x, -s)を指定する。 */ /* --shiftはMSDを計算する時にシフトさせるステップ default:1 */ /* --tauはval Hove関数のt。defaultでtotal step */ /* --dtはMDの時間ステップでの時間(fs単位) default:1.0 */ void ErrorVanHove(){ printf("Required arguments atoms A\n"); printf("(-a, -x, -s) atom A\n"); printf("------------------------------------------------------------\n"); printf("Optional arguments for van Hove analysis:\n"); printf("--tau time period for van Hove function (-1: total steps [-1]\n"); printf("--shift time shift for van Hove function [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 OutputVanHove(PARAM *p, double *g){ int i, RDATA; double r; FILE *f; RDATA = floor((RMAX-RMIN)/DR); f = fopen(p->outfile, "w"); fprintf(f, "# step: %d\n", TAU); fprintf(f, "# time/fs: %lf\n", TAU*DT); for (i=0; iAid[0]-1); f = fopen(param->infile, "r"); /* メモリー確保 */ x = malloc(sizeof(double*) * param->steps); y = malloc(sizeof(double*) * param->steps); z = malloc(sizeof(double*) * param->steps); for (i=0; isteps; i++){ x[i] = malloc(sizeof(double)*a.atoms); y[i] = malloc(sizeof(double)*a.atoms); z[i] = malloc(sizeof(double)*a.atoms); } head = malloc(sizeof(HEAD) * param->steps); /* -1の場合は全ステップのtでvan Hove関数を計算する */ if (TAU == -1) TAU = param->steps; if (TAU_SHIFT == -1) TAU_SHIFT = param->steps; /* 分率座標のデータを全ステップで取得する */ printf("Loading data...\n"); for (i=0; isteps; i++){ GetData(f, param, &head[i], &a, NULL, NULL); for (j=0; jsteps, a.atoms, x, y, z); /* 絶対座標に変換 */ for (i=0; isteps; i++){ for (j=0; jsteps; p=p+TAU_SHIFT){ printf("VanHove step range: from %d to %d\r", p, p+TAU); fflush(stdout); for (j=0; j