diff --git a/Readme.html b/Readme.html index c22a9d7..667e5fe 100644 --- a/Readme.html +++ b/Readme.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + dump2sq @@ -228,27 +228,29 @@

Table of Contents

@@ -258,9 +260,9 @@

-
-

はじめに

-
+
+

はじめに

+

複数の時間ステップからなる時間ステップの構造データから、動径分布関数 \(g(r)\) 、積算配位数 \(CN(r)\) 、構造因子 \(S(Q)\) を計算するプログラムです。 @@ -283,16 +285,16 @@ Triclinicなセルでも計算できます。原子ペア毎の\(S(Q)\) を計

-
-

入力ファイル

-
+
+

入力ファイル

+

拡張子で入力ファイルのformatを判断しています。

-
-

LAMMPS

-
+
+

LAMMPS

+

dumpコマンドで生成したファイルで、拡張子は.trajectryです。1ス テップ目で原子のならび決めて、2ステップ目以降は、同じ原子の並びとし @@ -301,22 +303,22 @@ dumpコマンドで生成したファイルで、拡張子は.trajectryです。 のため、以下のようにdumpとdump_modifyで元素記号の出力し、idでsortし ておく必要があります。

-
+
 dump              1 all custom 10 hoge.lammpstrj id type element x y z
 dump_modify       1 element Si O sort id
 
-
-

XYZ

-
+
+

XYZ

+

xyz形式で、拡張子は.xyzまたは.10です。す。1行目に原子数、2行目に Step数と、格子定数を記述しておきます。alpha, beta, gammaがない場合 は、90, 90, 90とします。3行目以降にデータがならびます。2ステップ目 以降も同じ形式でデータを並べます。

-
+
 420
 Step      225837   18.4116484 18.4116484 18.4116484 90 90 90
 Si    10.560073  17.438902  6.614775
@@ -330,41 +332,41 @@ O     17.812448   0.110128  0.3462461
 
-
-

出力ファイル

-
+
+

出力ファイル

+

4つのファイルに拡張子を追加して出力します。basenameは、指定しなけれ ば、インプットファイルと同じになります。

-
-

積算配位数

-
+
+

積算配位数

+

拡張子はcnです。原子ペア毎の \(CN(r)\) が保存されています。

-
-

動径分布関数

-
+
+

動径分布関数

+

拡張子はgrです。原子ペア毎の \(g(r)\) と全原子 \(G(r)\) が保存されています。

-
-

構造因子

-
+
+

構造因子

+

拡張子はsqです。原子ペア毎の \(S(Q)\) とX線と中性子で観測される \(S(Q)\) が保存されています。

-
-

原子散乱因子と中性子散乱長

-
+
+

原子散乱因子と中性子散乱長

+

拡張子はcoeffです。中性子散乱長と原子散乱因子を出力します。原子散乱 因子は、xcoeff.fから抽出しています。中性子散乱長は、NISTのデータを @@ -374,9 +376,9 @@ O 17.812448 0.110128 0.3462461

-
-

インストール

-
+
+

インストール

+

プログラムはCで作成しています。Cのコンパイラを準備してmakeしてください。 ダウンロードして単にmakeしてください。 @@ -386,25 +388,25 @@ O 17.812448 0.110128 0.3462461 dump2sq-1.0.tar.gz

-
+
 make
 
-
-

使い方

-
+
+

使い方

+

並列計算のために、環境変数をセットしてスレッド数を指定しておく。

-
+
 export OMP_NUM_THREADS=4
 

example以下のglass.lammpstrjを引数で渡して実行してみます。

-
+
 dump2sq example/glass.lammpstrj
 

@@ -412,7 +414,7 @@ dump2sq example/glass.lammpstrj さの半分としています。プログラムが実行されると、次のように出力されて、 4つのファイルが出力されます。

-
+
 basename: example/glass
 Maximum cell length = 17.284100
 Rmax = 8.642050
@@ -441,7 +443,7 @@ example/glass.sq was generated.
 値です。GRmaxは、セルサイズを超えても計算できますが、物理的な意味は
 ないでしょう。
 

-
+
 ./dump2sq -h
 usage: dump2sq [options] inputfile
 inputfile format
@@ -461,22 +463,23 @@ options:
 
-
-

misc

-
+
+

tools

+
-
-

coeffploter.py

-
+
+

coeffploter.py

+

-元素を指定して、原子散乱因子と中性子散乱長をプロットする。 +元素を指定して、原子散乱因子と中性子散乱長をプロットする。引数に元 +素名を複数していできる。

-
-

gr2sq.py

-
+
+

gr2sq.py

+

Qの刻みを変えて再計算するために、dump2sqで生成したgrファイルから S(Q)を計算しなおす。結晶のパターンを計算するために、\(2\theta\) で\(Q\) @@ -485,6 +488,40 @@ defaultで波長は、CuのK alpha線の1.54183 Åとしている。 \[ Q = \frac{4\pi}{\lambda}\sin(\theta) \] +計算した$S(Q)$はpngとxlsxを生成する +

+
+
+ +
+

cn2Iq.c

+
+

+dump2sqで生成された*.cnと*.coeffから$I(q)$を計算するCプログラム。 +openmpでスレッド並列する。f*fは足していない。sincのwindow関数をかけ +る。コンパイルは、 +

+
+gcc -fopenmp -O3 -Wall cn2Iq.c  -o cn2Iq
+
+

+実行は、*.cnと*.coeffを渡す。I(q)は標準出力に出力されうr. +

+
+./cn2Iq fort.cn fort.cn.coeff
+
+

+複数のcnファイルやxslxに保存したい場合は、cn2Iq.pyを使う。 +

+
+
+ +
+

cn2Iq.py

+
+

+subprocessでCのcn2Iqを呼び出して、I(Q)のpngとxlsxを生成する。Qの範囲 +またはthetaの範囲を指定できる。

@@ -492,7 +529,7 @@ defaultで波長は、CuのK alpha線の1.54183 Åとしている。

Author: 大窪 貴洋

-

Created: 2023-04-23 日 14:57

+

Created: 2023-04-24 月 09:01

Validate

diff --git a/Readme.org b/Readme.org index 2eacdd6..eb7cb70 100644 --- a/Readme.org +++ b/Readme.org @@ -146,9 +146,10 @@ example/glass.sq was generated. -o --output=%s Output basename [basename] #+end_example -* misc +* tools ** coeffploter.py - 元素を指定して、原子散乱因子と中性子散乱長をプロットする。 + 元素を指定して、原子散乱因子と中性子散乱長をプロットする。引数に元 + 素名を複数していできる。 ** gr2sq.py Qの刻みを変えて再計算するために、dump2sqで生成したgrファイルから @@ -158,4 +159,23 @@ example/glass.sq was generated. $$ Q = \frac{4\pi}{\lambda}\sin(\theta) $$ - + 計算した$S(Q)$はpngとxlsxを生成する + +** cn2Iq.c + dump2sqで生成された*.cnと*.coeffから$I(q)$を計算するCプログラム。 + openmpでスレッド並列する。f*fは足していない。sincのwindow関数をかけ + る。コンパイルは、 + #+begin_example + gcc -fopenmp -O3 -Wall cn2Iq.c -o cn2Iq + #+end_example + 実行は、*.cnと*.coeffを渡す。I(q)は標準出力に出力されうr. + #+begin_example + ./cn2Iq fort.cn fort.cn.coeff + #+end_example + 複数のcnファイルやxslxに保存したい場合は、cn2Iq.pyを使う。 + +** cn2Iq.py + subprocessでCのcn2Iqを呼び出して、I(Q)のpngとxlsxを生成する。Qの範囲 + またはthetaの範囲を指定できる。 + + diff --git a/tools/cn2Iq.c b/tools/cn2Iq.c new file mode 100644 index 0000000..9e40e2d --- /dev/null +++ b/tools/cn2Iq.c @@ -0,0 +1,129 @@ +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "math.h" + +typedef struct{ + int m; /* 行 */ + int n; /* 列 */ + double *x; + double **y; +}DATA; + +void Init(FILE *cn, FILE *coeff, DATA *rdata, DATA *qdata, + DATA *cdata){ + char buf[1024]; + int i; + int rsize, qsize, pairsize; + + while (fgets(buf, sizeof(buf), cn)){ + if (buf[0] != '#') break; + } + rsize = 1; + while (fgets(buf, sizeof(buf), cn)){ + rsize++; + } + fgets(buf, sizeof(buf), coeff); + sscanf(buf, "%d", &qsize); + fgets(buf, sizeof(buf), coeff); + sscanf(buf, "%d", &pairsize); + + rdata->m = rsize; + rdata->n = pairsize; + rdata->x = malloc(rsize * sizeof(double)); + rdata->y = malloc(rsize * sizeof(double*)); + for (i=0; iy[i] = malloc(pairsize * sizeof(double)); + } + qdata->m = qsize; + qdata->n = pairsize; + qdata->x = malloc(qsize * sizeof(double)); + qdata->y = malloc(qsize * sizeof(double*)); + cdata->m = qsize; + cdata->n = pairsize; + cdata->x = malloc(qsize * sizeof(double)); + cdata->y = malloc(qsize * sizeof(double*)); + for (i=0; iy[i] = malloc(pairsize * sizeof(double)); + cdata->y[i] = malloc(pairsize * sizeof(double)); + } + rewind(cn); + rewind(coeff); +} + +void SetData(FILE *cn, FILE *coeff, DATA *rdata, DATA *cdata){ + int i, j; + char buf[1024]; + char *tok; + + while (fgets(buf, sizeof(buf), cn)){ + if (buf[0] != '#') break; + } + for (i=0; im; i++){ + tok = strtok(buf, " "); // 半角スペース区切りでパース + rdata->x[i] = atof(tok); + for (j=0; jn; j++) { + tok = strtok(NULL, " "); + rdata->y[i][j] = atof(tok); + } + fgets(buf, sizeof(buf), cn); + } + /* 積算配位数からC(r)に変換 */ + for (i=rdata->m-1; i>0; i--){ + for (j=0; jn; j++){ + rdata->y[i][j] = rdata->y[i][j] - rdata->y[i-1][j]; + } + } + /* 原子散乱因子 */ + for (i=0; i<3; i++){ + fgets(buf, sizeof(buf), coeff); + } + for (i=0; im; i++){ + tok = strtok(buf, " "); // 半角スペース区切りでパース + cdata->x[i] = atof(tok); + for (j=0; jn; j++) { + tok = strtok(NULL, " "); + cdata->y[i][j] = atof(tok); + } + fgets(buf, sizeof(buf), coeff); + } +} + + +int main(int argn, char **argv){ + FILE *cn, *coeff; + DATA rdata, qdata, cdata; + int i, j, k; + double q, r; + double Rc; + + cn = fopen(argv[1], "r"); + coeff = fopen(argv[2], "r"); + Init(cn, coeff, &rdata, &cdata, &qdata); + SetData(cn, coeff, &rdata, &cdata); + for (i=0; i