issp-center-dev / HPhi

Quantum Lattice Model Simulator Package
https://www.pasums.issp.u-tokyo.ac.jp/hphi/en/
GNU General Public License v3.0
82 stars 25 forks source link

固有ベクトルの並び順について #88

Closed koji-inui closed 3 months ago

koji-inui commented 4 years ago

固有ベクトルの並び順と電子配置の関係性が中をみてもよく分からなかったので、質問させてください。 物性研 sekireiの中で投げており、バージョンは3.3.0です。

stan.in

model = "Hubbard"
method = "CG"
lattice = "square"
a0W = 4
a0L = 0
a1W = 0
a1L = 2
t = 0.5
U = 1.0
nelec = 8
2Sz = 0
exct = 1

の条件に加えて、

OutputEigenVec   1

に設定し、固有ベクトルを出力し、

https://github.com/issp-center-dev/HPhi/blob/3d16c63714f533c82302761853e9b15dd1446904/src/CalcByLanczos.c#L222-L228 これをみて、

import struct
import itertools
import numpy as np

res = []
for i in range(64): # 64並列計算
    file = f'./zvo/4x2/zvo_eigenvec_0_rank_{i}.dat'
    with open(file, 'rb') as f:
        binary =  f.read()
        len_c = (len(binary)-28)//16
        tmp = 'd'*len_c*2
        if len_c > 0:
            res.append(struct.unpack(f'<{tmp}',binary[28:]))

res_np = list(itertools.chain.from_iterable(res))
v1_tmp = np.array(res_np).reshape(-1,2)
v1 = v1_tmp[:,0] + 1j*v1_tmp[:,1]

のような形で、固有ベクトルを取得しております。

ただ、 各myrank毎に出力される固有ベクトルの要素と、対応する電子配置がわからないのですが、教えてもらえますでしょうか? 各電子の格子番号,スピン に対して、出力される固有ベクトルはどのような対応関係になっていますでしょうか? ソースコードの該当箇所を示してもらえるだけでもありがたいです。

k-yoshimi commented 4 years ago

@koji-inui 電子系の配置ですが、以下の論文に詳細が記載されています。 https://www.sciencedirect.com/sdfe/reader/pii/S0010465517301200/pdf 電子系のLサイトを扱うとして、そのうちプロセス数が4^pとします(4状態のうち、0がempty, 1がアップスピン、2がダウンスピン、3が二重占有状態を表します。詳細は上記論文の3.1を参照してください)。 この時、ランク番号でpサイト分のヒルベルトスペースを表し、残りのL-pサイトを各プロセス内で扱います (こちらの詳細は上記論文の4.1を参照してください)。

プログラムの中身ですが、各プロセス内での固有ベクトルの要素と電子配置の関係は配列のlist_1で管理しています(list_1sz.cで作成しており、作成方法については、http://www.pasums.issp.u-tokyo.ac.jp/wp-content/themes/HPhi/media/develop/tips.pdf に詳しい説明があります)。 ただし、現在のHΦのバージョンではlist_1は出力されていないため、自分で新規に作成する必要があります(次のバージョンではオプションで出力できるようにする予定です)。なお、HΦ内部でlist_1を一緒に出力するよう変更していただいた場合には、

for idx in list_1:
     idx_all  = myrank*4^{L-p} + idx 

とすることで、各ランクのidxから電子配置に対応するidxを得ることができます。

以上が固有ベクトルの要素と電子配置の関係の説明になりますが、 もしご不明な点がありましたら、お気軽にご連絡ください。

koji-inui commented 4 years ago

@k-yoshimi 丁寧に回答ありがとうございます。

プロセス毎に各状態のサブセットを持っている形なのですね。おおよそわかりました。

中身を見てみましたが、 https://github.com/issp-center-dev/HPhi/blob/3d16c63714f533c82302761853e9b15dd1446904/src/HPhiMain.c#L282-L284

この部分の if文を消せば、出力出来ますでしょうか?

そうでない場合は、ちょっとこっちで中身をいじれる気がしないので、次のバージョンを待ちたいと思います。

k-yoshimi commented 4 years ago

@koji-inui 返信が遅れてしまいすみません。 output_listは昔の仕様の名残で、single processのみ対応しております。 そのため、MPIで計算する場合には、ファイル名をプロセス毎に指定するなどの改造を行う必要があります。