Open10

Wannier90

ultimatileultimatile
pw.x < graphene.scf.in > graphene.scf.out
pw.x < graphene.nscf.in > graphene.nscf.out
  • graphene.scf.in
  • graphene.nscf.in
  • graphene.win
    • num_bandsnbnd

基本的な使い方

wannier90.x [-pp] [seedname] # serial
mpirun -np NUMPROCS wannier90.x [-pp] [seedname] # MPI parallel
  • seedname: input file名. seedname.winも可能. defaultはwannier
  • -pp: 前処理計算を行うためのoption. 結果はseedname.nnkpが出力される
  • NUMPROCS: 並列process数

parameterの分類はsystem, control, disentanglement

http://www.cmpt.phys.tohoku.ac.jp/~koretsune/SATL_qe_tutorial/wannier.html
https://qiita.com/hiro949/items/b9fd1d345b463e298c99
https://qiita.com/Yasushi-Shinohara/items/ca58fba8878d2eed0aa3
https://qiita.com/hiro949/items/80e178ed964135044790

ultimatileultimatile

pw2wannier90.xの並列化は-nk-nbが無効
残りの-nt, -ni, -ndが有効option.
ただしdefaultのslub分解と-ntの組み合わせが不可
実行時optionに-pd .true.を指定してpencil分解を使う必要がある

ultimatileultimatile

-nd 1じゃないと壊れがちなので指定
Ohtakaの128 threadsの1 nodeでsrun pw2wannier90.x -nd 1 < pw2wan.in > pw2wan.outに対してprocess数(-n)とthreads per node (-c)を変えて計測.

  • -n 2 -c 64: CPU Efficiency: 0.99% of 11:07:44 core-walltime
  • -n 4 -c 32: CPU Efficiency: 1.92% of 11:33:20 core-walltime
  • -n 8 -c 16: CPU Efficiency: 4.56% of 11:03:28 core-walltime
  • -n 16 -c 8 CPU Efficiency: 9.15% of 10:48:32 core-walltime
  • -n 32 -c 4 CPU Efficiency: 0.00% of 11:14:08 core-walltime

-n 16 -c 8が一番速そう

ultimatileultimatile

wannier90.xもMPI並列できるらしい
QEについてくるwannier90.xはmpirunできなかったので, QE本体をMPI buildしてもwannier90.xはserial buildされているっぽい?

  • srun -n 32 wannier90.xから途中で止まるようになる
  • -nを増やしてもserialから速くなってない...
ultimatileultimatile
ultimatileultimatile
wannier90 format for mvmcdry 
8
343
1 1 1 1 1 1 1 1 1 1 1 1 1
...
-3 -3 -3 1 1 0.0004104251 -0.0000000000
-3 -3 -3 1 2 0.0001515941 -0.0000000006
-3 -3 -3 1 3 -0.0001515941 0.0000000002
...
  • 1行目: file header, 何が書いてあっても問題ない(はず)
    • Wannier90.xで出力した場合は出力した日時が記載される
  • 2行目: Wannier函数の数
  • 3行目: supercellの数nrpts
  • 4~5+int(nrpts/15)行目: 各supercellでの縮退値
  • 6+int(nrpts/15)行目以降:
    • 1-3列目: supercellの格子vector\bm{R}.
    • 4列目: 原点のWannier軌道のindex
    • 5列目: \bm{R}のWannier軌道のindex
    • 6列目: hoppingの実部
    • 7列目: hoppingの虚部
ultimatileultimatile

4~5+int(nrpts/15)行目がよくわからない

  • manualは

the degeneracy of each Wigner-Seitz grid point

と言っている. 何もわからない.

  • 関係ありそうなsourceはsrc/hamiltonian.f90`.
  • seedname_hr.datをopenしているのはこのfileのここだけ
  • ここ4~5+int(nrpts/15)行目を書き込んでいる.
  • 書き込まれている変数はndegen(i)
  • write (file_unit, '(15I5)') (ndegen(i), i=1, nrpts)
    • iを1からnrptsまで操作してndegen(i)を書き込んでいる.
  • ここから関係なさそうな部分を一部省略して抜粋:
src/hamiltonian.F90
          dist_min = minval(dist)
          if (abs(dist((dist_dim + 1)/2) - dist_min) .lt. ws_region%ws_distance_tol**2) then
            nrpts = nrpts + 1
            if (.not. count_pts) then
              ndegen(nrpts) = 0
              do i = 1, dist_dim
                if (abs(dist(i) - dist_min) .lt. ws_region%ws_distance_tol**2) &
                  ndegen(nrpts) = ndegen(nrpts) + 1
              end do
          end if
  • dist|r-R|^2の配列. rが原点でRが格子点に対応してnrpts個ある.

  • dist_minがその最小値.

  • ws_region%ws_distance_tol**2は距離の分解能に対応する量だと思う

  • なので上記のif文はdist((dist_dim + 1)/2)\approxdist_mindist(i)\approxdist_minに対応すると考えられる.

  • 以上から距離の分解能より小さい距離に存在する2点は縮退しているとして扱われており, その縮退値がndegenであると考えられる.

  • 積分の出力値を縮退値で割るのが正しいらしい[要確認]

https://twitter.com/cometscome_phys/status/1706917501236339194