mVMC 体験記(2018.06.16)
Last Update:2021/12/09
mVMC を使ってみました.なんの予備知識もないところからのゼロスタートです.変分法による計算ということで,厳密対角化よりは大きなサイズの計算ができることを期待しつつ,問題としては,最近いろいろな文脈で頻繁に話題になるキタエフモデルをターゲットにしてみます.インストールでいきなり躓くのはいやなので,今回は,物性研スパコンにすでにインストール済みのものを使います.
■ハバードモデル
以下の紹介ページにあるインストラクションに従って,作業をしてみます.
http://www.issp.u-tokyo.ac.jp/supercom/softwaredev/softwareall/mVMC
sekirei.issp.u-tokyo.ac.jp にログインしたあと,最初は,
$ source /home/issp/materiapps/mVMC/mVMCvars.sh
で,環境変数などのセット.次に入力ファイルを準備しますが,当然すでにあるサンプルファイルを下敷きにするのが楽なので,
$ cp -rf $MVMC_ROOT/sample/Standard/Hubbard/square .
$ cd square
$ $MVMC_ROOT/mvmcdry.out StdFace.def
mvmcdry.out というのが,入力ファイルを生成するためのスクリプトなんでしょうか.中身をみると,StdFace.def は
W = 4
L = 2
Wsub = 2
Lsub = 2
model = “FermionHubbard”
lattice = “Tetragonal”
t = 1.0
U = 4.0
nelec = 8
NSROptItrStep = 500
2Sz = 0
//NVMCCalMode = 1
となっていて,基本的なモデル定義ファイルのようです.”FermionHubbard” とあるので,フェルミハバードモデルの計算をする場合のファイルなんでしょう.さすがに正確な意味はマニュアルを見ないとわかりません.紹介ページからマニュアルへのリンクをクリックしてマニュアルをダウンロードしてみます.userguide_jp.pdf の「4 ファイル仕様」を見てみると,StdFace.def は4×2の正方格子上で定義された,ホッピングコンスタント1,ハバードUが4,電子数が8(格子点数と同じなのでハーフフィリング)の条件で計算をするためのファイルのようです.上の3行のうち最後の行は,この基本的な定義ファイルをもとにして,実行ファイル(vmc.out)が直接処理できる形の入力ファイルを生成しているようです.ただし,どうやら,上記インストラクション3行のうち最後の行は間違いらしく,実際にやってみると mvmcdry.out がないといわれます.結局
$ $MVMC_ROOT/bin/vmcdry.out StdFace.def
とやるとうまくいきました. (/bin をいれて,ファイル名も mvmcdry でなく vmcdry)最初からあった StdFace.def 以外に,〇〇.def というファイルがたくさんできています.
次は,バッチ実行のためのスクリプトファイルの作成ですが,これもまず下敷きになるサンプルをカレントディレクトリにコピーします.
$ cp /home/issp/materiapps/mVMC/sample_jobscript/mVMC.sh .
でコピーされる mVMC.sh の中身は,
#!/bin/sh
#QSUB -queue i18cpu
#QSUB -node 18
#QSUB -mpi 18
#QSUB -omp 24
#QSUB -place pack
#QSUB -over false
#PBS -l walltime=00:10:00
#PBS -N MVMC_TEST
cd ${PBS_O_WORKDIR}
date
source /home/issp/materiapps/mVMC/mVMCvars.sh
mpijob ${MVMC_ROOT}/bin/vmc.out -s ./StdFace.def
date
という感じ.これをバッチキューに投げてみます.
$ qsub mVMC.sh
...しばらくすると無事にジョブが実行されたようです.インストラクションには
「reference/zvo_out_001.dat とエネルギーの値を比較し、平均値が一致しているか確認。」
とありますが,少々意味がわかりにくいです.どうやら,./reference ディレクトリにあるのはあらかじめ同じプログラムで計算されていた結果で,新たに計算された結果は ./output のほうに入っているらしい.また,マニュアルによると,〇〇_out_〇〇.dat というのはエネルギーの値が入っているファイルということです.このファイルの第一コラムはエネルギーの値らしく,それが最適化の時間順に出力されているようです.初期値はランダムなので,reference と output のファイルはぴったり一致する必要はないようです.ただ,最適化が進むほど,同じ結果に収束してほしいので,ファイルの終わりのほうでは値がほぼ一致していることが期待されているようです.ということで,ファイルの終わりのほうをそれぞれ見てみると,
$ tail -10 ./reference/zvo_out_001.dat
-1.021560460690151650e+01 …
-1.021991616830830552e+01 …
-1.020881672105058335e+01 …
-1.023670686972603328e+01 …
-1.020593769708600718e+01 …
$ tail -10 ./output/zvo_out_001.dat
-1.022575026621251126e+01 …
-1.021730759044796599e+01 …
-1.021840491701714981e+01 …
-1.021527622842670802e+01 …
-1.021450060638614410e+01 …
のようになっていて,4桁くらいの精度で一致しています.(なので,多分計算がうまくいったということでしょう.)これで電子系の場合のテスト計算が一応できました.ただし,ここまではインストラクションページをなぞっただけです.(それだけでも多少首をひねらないといけませんでしたが...)
■キタエフモデル
今回目標としているのは,一種のスピンモデルであるキタエフモデルですから,まずスピン系の場合のテストもやってみるべきかと思いサンプルファイルのおいてあるディレクトリを見ると,そもそもキタエフモデルそのもののサンプルファイルがおいてありました.ハバードモデルの場合と同様,
$ cp -rf $MVMC_ROOT/sample/Standard/Spin/Kitaev .
とやると,Kitaev モデル用のテストディレクトリがコピーされるので,そのディレクトリにはいって,StdFace.def をのぞいてみると以下のような中身でした.
W = 2
L = 3
model = “SpinGC”
lattice = “Honeycomb”
J0x = -1.0
J0y = 0.0
J0z = 0.0
J1x = 0.0
J1y = -1.0
J1z = 0.0
J2x = 0.0
J2y = 0.0
J2z = -1.0
nmptrans = 6
NSROptItrStep = 1000
//NVMCCalMode = 1
キタエフモデルの定義を知っている人にとってはとても意味は分かりやすいようになっています.J0?, J1?, J2? というのはハチの巣格子の3つの方向のボンドで,J0x だと,0方向ボンドの Sx Sx 相互作用の係数ということのようです.ボンド番号 0, 1, 2のつけ方については,マニュアルを参照する必要があります.また,標準的な最近接や次近接相互作用でないスピン間の相互作用は,vmcdry.out が出力する格子設定ファイルを直接編集することで定義可能になっているようですが,それには,マニュアルをよく読む必要がありそうです.
あとの作業はハバードモデルの場合と完全に同じで,
$ cp /home/issp/materiapps/mVMC/sample_jobscript/mVMC.sh .
でバッチジョブスクリプトをコピーして,
$ qsub vVMC.sh
で実行.実行結果を確認すると,./reference/zvo_out_001.dat は
-2.350366210527230493e+00 …
-2.354476359601430868e+00 …
-2.361833533712753397e+00 …
-2.371893991048964700e+00 …
-2.379431283262131380e+00 …
一方,./output/zvo_out_001.dat は,
-2.219003948614534316e+00 …
-2.225453799632214125e+00 ,,,
-2.221203301504045768e+00 ,,,
-2.225304665050226838e+00 …
-2.223885643308666449e+00 …
となりました.ハバードモデルの時に比べると,初期値による最終結果の違いが大きいようです.キタエフモデル特有の収束困難性があるようです.
■おわりに
厳密対角化と違って,収束を気にしないといけないという問題はあるものの,かなり簡単な操作で利用できる印象でした.厳密対角化では不可能な大きな系についてテスト計算をやってみないと本当のご利益がわかりませんが,それについてはインストラクションで紹介されている2つの論文
D. Tahara and M. Imada, J. Phys. Soc. Jpn. 77, 114701 (2008)
T. Misawa and M. Imada, Phys. Rev. B 90, 115137 (2014)
の中にハバードモデルに関して比較がされていて,厳密対角化が可能な範囲では結果が一致していて,それよりも大きい場合の計算例も紹介されています.