H-waveによるHaldane模型のバンド計算
Last Update:2023/09/25
・はじめに
H-waveは遍歴電子系を非制限Hartree-Fock法によって近似する計算ライブラリです。実空間/波数空間の両方に対応しており、量子モンテカルロ法などと比べた時、(1)負符号問題が発生しない(2)計算コストが軽く大きいシステムサイズを取り扱うことができる、などの利点があります。ここでは、波数空間での一例としてHoneycomb Haldane模型のバンド計算を例にH-waveを紹介していきます。
・インストール
H-waveがお使いの環境にインストールするには以下のコマンドでできます。
git clone https://github.com/issp-center-dev/H-wave.git
cd ./H-wave
pip install .
・Honeycomb Haldane模型の計算
ここで扱うHoneycomb Haldane模型は以下の通りです。
\[ H = -\sum_{\langle i,j \rangle} c_{i}^{\dagger}c_{j} -\sum_{\langle\langle i,j \rangle\rangle}t_{2} e^{i\phi_{ij}}c_{i}^{\dagger}c_{j} \]
ここで\( \langle i,j \rangle \)は最隣接サイト、\( \langle\langle i,j \rangle\rangle\)は次近接のサイトまで添字で和を取っています。(以下の図を参照)
H-waveで上記なようなHaldane模型のハミルトニアンを入力するためには、お使いのエディタで例えば以下のようなファイルを用意します。
######################################### (stan.in) model = "Hubbard" lattice = "honeycomb" W = 18 L = 18 t = 1 t' = 0.0 ,-0.3333333333333333 U = 0.0 calcmode = "uhfk" exportall = 0 EPS = 10 #########################################
ここで\( t,t’\)は\( t_{1}=1,t_{2}=1/3 ,\phi=pi/2 \)の最近接・次近接、サイトのTransferにそれぞれ対応しています。上記の入力ファイルを元にuhf_dry.out を以下のコマンドで実行します。
cd path_to_Hwave/docs/tutorial/Hubbard/UHFk
ln -s path_to_Stdface/build/src/uhf_dry.out .
./uhf_dry.out stan.in
しかしながら、HPhi/mVMCなどで使われている次近接サイトの定義に従うとサイトA to AとサイトB to BのTransferが逆方向になってしまい時間反転対称性を破る入力になりません。そこで相互作用定義ファイルtransfer.datを以下のように編集します。
(transfer.dat) ########################################## Transfer in wannier90-like format for uhfk 2 9 1 1 1 1 1 1 1 1 1 -1 0 0 1 1 0.000000000000 0.333333333333 -1 0 0 1 2 -1.000000000000 0.000000000000 -1 0 0 2 2 0.000000000000 -0.333333333333 -1 1 0 1 1 0.000000000000 0.333333333333 -1 1 0 2 2 0.000000000000 -0.333333333333 0 -1 0 1 1 0.000000000000 0.333333333333 0 -1 0 1 2 -1.000000000000 0.000000000000 0 -1 0 2 2 0.000000000000 -0.333333333333 0 0 0 1 2 -1.000000000000 0.000000000000 0 0 0 2 1 -1.000000000000 0.000000000000 0 1 0 1 1 -0.000000000000 -0.333333333333 0 1 0 2 1 -1.000000000000 0.000000000000 0 1 0 2 2 -0.000000000000 0.333333333333 1 -1 0 1 1 -0.000000000000 -0.333333333333 1 -1 0 2 2 -0.000000000000 0.333333333333 1 0 0 1 1 -0.000000000000 -0.333333333333 1 0 0 2 1 -1.000000000000 0.000000000000 1 0 0 2 2 -0.000000000000 0.333333333333 ####################################
続いて、ハニカム格子用の入力ファイル(input.toml)を用意します。
(input.toml) ###################### [log] print_level = 1 print_step = 1 [mode] mode = "UHFk" #flag_fock = "true" [mode.param] Ncond = 81 IterationMax = 500 EPS = 10 Mix = 0.5 RndSeed = 123456789 T = 0.0 # ene_cutoff = 1.0e+2 # N.B. chain extends along y-axis by convention CellShape = [ 18, 18, 1 ] SubShape = [ 1, 1, 1 ] [file] [file.input] path_to_input = "" # initial = "green_init.dat.npz" [file.input.interaction] path_to_input = "./" Geometry = "geom.dat" Transfer = "transfer.dat" [file.output] path_to_output = "output" energy = "energy.dat" eigen = "eigen.dat" green = "green.dat" ############################
以上でHaldane模型の入力は終了です。バンド計算に関しては、例えば、https://isspns-gitlab.issp.u-tokyo.ac.jp/hwave-dev/hwave-gallery/-/blob/main/samples/UHFk/band_plot/output_band.pyにサンプルファイルで実行することができます。
(output_band.py) ############################ import numpy as np import tomli import hwave.qlms import matplotlib.pyplot as plt #read toml file with open("input.toml", "rb") as fp: toml_dict = tomli.load(fp) #UHFk runs hwave.qlms.run(input_dict=toml_dict) #get eigenvalues data = np.load("output/eigen.dat.npz") eigenvalue = data["eigenvalue"] wavevec_index = data["wavevector_index"] wavevec_unit = data["wavevector_unit"] #the total number of the eigen states neigen = int(eigenvalue.shape[1]) #calc wavevectors from index & reciprocal lattice vectors wavevec = np.dot(wavevec_index, wavevec_unit.T)/np.pi #concatenate wavevector & eigenvalue Ene_k = np.concatenate([wavevec, eigenvalue], axis=1) #output wavenumber & eigenvalues to dat file header_ = "# kx/pi ky/pi kz/pi ene_spin0 ene_spin1" np.savetxt("band.dat", Ene_k, header = header_) # plot dispersion by matplotlib size_list = np.linspace(100,10,neigen) kmin = -1 kmax = 1 krange = np.linspace(kmin,kmax,100) fig = plt.figure() ax = fig.add_subplot(1, 1, 1, projection='3d') [ax.scatter(wavevec[:, 0],wavevec[:, 1], eigenvalue[:,i]) for i in range(neigen)] #[plt.scatter(wavevec[:, 1], eigenvalue[:,i], marker="o", s=size_list[i], label="H-wave: spin{}".format(i)) for i in range(neigen) ] #plt.legend() plt.xlabel("kx/pi") plt.ylabel("ky/pi") # #plt.ylabel("E") plt.savefig("band.png") plt.show() ############################
上記のPythonファイルを実行してみると
python output_band.py
以下のようにバンドが開いており、例えば文献[1]を見るとquantum Hall effect phases 量子ホール効果相であると確認することができます。同様にトポロジカル絶縁体の代表的なBHZ模型のエッジモードなども面白いかもしれません。
[1] F. D. M. Haldane, “Model or a Quantum Hall Effect without Landau Levels: Condensed-Matter Realization of the “Parity Anomaly” Phys. Rev. Lett. 61, 2015, 1998