TeNeSによる2次元量子系の計算
Last Update:2024/12/20
TeNeS [1] は2次元格子状で定義された量子系の基底状態を計算するために開発されました.TeNeS で採用している計算手法は波動関数に虚数時間発展演算子を作用させることで徐々に基底状態に近づけていくというもので,一般に Time-Evolving Block Decimation(TEBD)と呼ばれる手法です.波動関数はテンソルネットワークで表現されていて,計算量を発散させないために,有限のボンド次元の範囲内にとどめる近似を行います.このボンド次元が近似の精度を決めるパラメータになっています.熱力学極限の物理量を評価するための手法としては,他の多くの手法において計算する格子サイズが近似精度を決める一つのパラメータになっていますが,TeNeSでは格子サイズは無限大です.ただし,より高精度の計算をする場合には,ボンド次元が有限であることからくる誤差に関して外挿が必要です.この他の特徴としては,量子モンテカルロ法と比較すると,負符号問題がないこと,厳密対角化の計算量やメモリ必要量がサイズの指数関数で増えるのにたいして,TeNeS ではボンド次元の冪で押さえられることなどがあります.
2023年にリリースされた ver.2.0.0 では,実時間発展や有限温度計算もサポートされるようになっていますが,ここでは,このパッケージを使って,まず基本となる基底状態計算の事例を紹介します.例として,2+1次元横磁場イジングモデルについて,横磁場の関数として,転移点で自発磁化が急激にゼロになる様子を計算してみることにします.
まず,インストール後に,
$ source <TENES_ROOT>/tenesvars-2.0.0-0.sh
などで,環境変数を整えたあと,
$ cp -rf $TENES_ROOT/sample/* .
For the 2+1 dimensional transverse field Ising model,として,手元にサンプルスクリプトを含んだフォルダをコピーします.そのあと,たとえば,2+1次元横磁場イジングモデルの場合には,
$ cd 01_transverse_field_ising
$ tenes_simple simple.toml
$ tenes_std std.toml
$ tenes input.toml
で実行されます.(物性研のプリインストール環境では,最後の3行に替えて,あらかじめ sample_jobscripts/tenes.sh などの名前で用意されている実行スクリプトを手元にコピーして,それをバッチジョブとしてサブミットするのが簡単です.)ここで,使用した最初の入力ファイル simple.toml は何も手を入れていない状態では,
hx = 0.0 # hx Sx
のような行を含んでおり,これは,hx(x 方向の磁場)がゼロである場合の計算をするための入力ファイルになっています.つまり,単なる古典2次元イジングモデルの基底状態計算をしていることになります.
この実行によって,output というフォルダが新たに作られ,その中に計算結果が格納されています.今回のテスト計算に必要なスピンの z 方向成分の期待値が記録されているのは,output/onesite_obs.dat というファイルで,このなかの,
0 0 5.00000000000000000e-01 0.00000000000000000e+00
という行がそれに相当します.”5.000…e-01″ つまりスピンの z 成分の期待値は 0.5 ということですが,これは古典イジングモデルの結果としては当然の結果です.
x方向の磁場の関数として,z方向の磁化を計算するには,simple.toml のなかで,hx を指定している行の “0.0” を,”0.1″, “0.2”, “0.3”, … のように変えたものについて上と同じようにプログラムを実行する必要があります.このようにして,磁化を計算した結果をプロットすると下のようになります.
この図では,ボンド次元も (X,D)=(2,2), (8,4), (18,6) の3通りに変化させて計算しています.(X は角テンソルのボンド次元,D はバルクテンソルのボンド次元で,ともに近似精度をコントロールしています.一般には X を D の2乗に比例させることが自然なチョイスです.)これらのボンド次元も simple.toml のなかで定義されています.具体的には以下の行で定義されているので,ここを変えて計算を行うことで,上記のようなプロットに必要な計算結果が得られます.(このレビューでは使いませんでしたが,ver.2.0.0 の sample/01_transverse_field_ising フォルダの中には,上記のようなプロットを得るためのツール tutorial_example.py , tutorial_read.py も含まれています.)
dimension = 2 # Bond dimension of corner transfer matrix
virtual_dim = 2 # Bond dimension of bulk tensors
当然,ボンド次元を大きくすると精度があがると同時に計算時間もより多く必要になります.このレビュー記事では,物性研システムC(2024.02.07時点)1ノードを使いました.この図に必要な全データを集めるのに要した計算資源は 20 min・node 程度でした.正確な転移点は,おおよそ Hx=1.52219 で起きると言われていますが,上の図は,それとコンシステントな結果であるように見えます.
[1] Y. Motoyama, T. Okubo, K. Yoshimi, S. Morita, T. Kato, N. Kawashima: “TeNeS: Tensor network solver for quantum lattice systems”, Computer Physics Communications 279, 108437 (2022).
[2] H. W. J. Blöte, Y. Deng: “Cluster Monte Carlo simulation of the transverse Ising model”, Phys. Rev. E 66, 066110 (2002).