modified dump2sq, iccの-qopenmpでTHREAD>1でS(Q)がおかしい。調査中

This commit is contained in:
2022-03-13 09:03:42 +09:00
parent c684c77be4
commit c86de83c0c
2 changed files with 14 additions and 14 deletions
+9 -8
View File
@@ -26,8 +26,7 @@ https://www.cmu.edu/biolphys/deserno/pdf/gr_periodic.pdf
1ステップ毎に$g(r)$ と$S(Q)$ を計算して最後に時間平均しています。よっ 1ステップ毎に$g(r)$ と$S(Q)$ を計算して最後に時間平均しています。よっ
て、NPT計算でセルサイズが変わったとしても問題なく計算できます。計算コ て、NPT計算でセルサイズが変わったとしても問題なく計算できます。計算コ
ストのほとんどは、原子間距離の計算です。この計算はopenmpで並列化してい ストのほとんどは、原子間距離の計算です。
ます。
* 入力ファイル * 入力ファイル
拡張子で入力ファイルのformatを判断しています。 拡張子で入力ファイルのformatを判断しています。
@@ -78,15 +77,17 @@ https://www.cmu.edu/biolphys/deserno/pdf/gr_periodic.pdf
[[file:dump2sq-1.0.tar.gz][dump2sq-1.0.tar.gz]] [[file:dump2sq-1.0.tar.gz][dump2sq-1.0.tar.gz]]
#+begin_example #+begin_example
make make
#+end_example #+end_example
icc用のMakefileも準備しています。
#+begin_example # iccでOMT_NUM_THREAD > 1にすると、S(Q)がおかしくなる。g(r)は正しいのに…。
make -f Makefile.icc # 原因不明。Threadは1にしとく。
#+end_example # icc用のMakefileも準備しています。
これで、dump2sqが生成されます。 # #+begin_example
# make -f Makefile.icc
# #+end_example
# これで、dump2sqが生成されます。
* 使い方 * 使い方
並列計算のために、環境変数をセットしてスレッド数を指定しておく。 並列計算のために、環境変数をセットしてスレッド数を指定しておく。
+5 -6
View File
@@ -261,7 +261,6 @@ void CalcCn_pp(DATA *data, HEAD *head, TYPE *type, DATASET *cn,
/* ####################################################################### */ /* ####################################################################### */
void CalcSq(HEAD *head, TYPE *type, DATASET *gr, DATASET *sq){ void CalcSq(HEAD *head, TYPE *type, DATASET *gr, DATASET *sq){
int i, j, k; int i, j, k;
double r, q;
double keisuu, sekibun; double keisuu, sekibun;
double **sq_; double **sq_;
@@ -270,15 +269,15 @@ void CalcSq(HEAD *head, TYPE *type, DATASET *gr, DATASET *sq){
for (i=0; i<sq->n; i++) for (i=0; i<sq->n; i++)
for (j=0; j<sq->m; j++ )sq_[i][j] = 0.0; for (j=0; j<sq->m; j++ )sq_[i][j] = 0.0;
/* X線・中性子の散乱理論入門 pp. 143-144 */
for (i=0; i<sq->n; i++){ for (i=0; i<sq->n; i++){
q = sq->x[i]; keisuu = 4.0 * M_PI * head->rho / sq->x[i];
keisuu = 4.0 * M_PI * head->rho / q;
for (j=0; j<type->pairs; j++){ for (j=0; j<type->pairs; j++){
sekibun = 0.0; sekibun = 0.0;
for (k=0; k<gr->n; k++){ /* rで積分 */ for (k=0; k<gr->n; k++){ /* rで積分 */
r = gr->x[k]; sekibun = sekibun + gr->x[k] * (gr->y[k][j] - 1.0)*
sekibun = sekibun + r * (gr->y[k][j] - 1.0)* sin(q * r) * gr->dx; sin(sq->x[i] * gr->x[k]) * gr->dx;
} }
sq_[i][j] = keisuu * sekibun; sq_[i][j] = keisuu * sekibun;
} }