Wannier90
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_bands
はnbnd
-
基本的な使い方
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
pw2wannier90.x
の並列化は-nk
と-nb
が無効
残りの-nt
, -ni
, -nd
が有効option.
ただしdefaultのslub分解と-nt
の組み合わせが不可
実行時optionに-pd .true.
を指定してpencil分解を使う必要がある
-nt
と-ni
を色々変えて試したけど並列化で速くなっている気配がない...
-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
が一番速そう
wannier90.x
もMPI並列できるらしい
QEについてくるwannier90.x
はmpirunできなかったので, QE本体をMPI buildしてもwannier90.x
はserial buildされているっぽい?
-
srun -n 32 wannier90.x
から途中で止まるようになる -
-n
を増やしてもserialから速くなってない...
hr.dat
の読み方(hopping)
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列目:
のWannier軌道のindex\bm{R} - 6列目: hoppingの実部
- 7列目: hoppingの虚部
- 1-3列目: supercellの格子vector
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)
を書き込んでいる.
-
- ここから関係なさそうな部分を一部省略して抜粋:
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)
\approx dist_min
とdist(i)
\approx dist_min
に対応すると考えられる. -
以上から距離の分解能より小さい距離に存在する2点は縮退しているとして扱われており, その縮退値が
ndegen
であると考えられる. -
積分の出力値を縮退値で割るのが正しいらしい[要確認]