5.4. tenes の入力ファイル

  • ファイルフォーマットは TOML 形式

  • parameter, tensor, evolution, observable, correlation の5つのセクションを持ちます。

5.4.1. parameter セクション

更新回数など、 計算にあらわれる種々のパラメータを記述します。 サブセクションとして general, simple_update, full_update, ctm, random を持ちます。

parameter.general

tenes の全般的な設定パラメータ

名前

説明

型

デフォルト

mode

計算モード

文字列

"ground state"

is_real

すべてのテンソルを実数に制限するかどうか

真偽値

false

iszero_tol

演算子テンソルの読み込みにおいてゼロとみなす絶対値カットオフ

実数

0.0

measure

基底状態計算において、物理量測定をするかどうか

真偽値

true

measure_interval

実時間発展・有限温度計算において物理量を測定する頻度

整数 or 整数のリスト

10

output

物理量などを書き込むディレクトリ

文字列

"output"

tensor_save

最適化後のテンソルを書き込むディレクトリ

文字列

""

tensor_load

初期テンソルを読み込むディレクトリ

文字列

""

  • mode

    • 計算モードを指定します

    • "ground state"

      • 基底状態計算

      • tenes_std は虚時間発展演算子 \(U(\tau) = \exp(-\tau \mathcal{H})\) を計算します

    • "time evolution"

      • 実時間発展計算

      • tenes_std は実時間発展演算子 \(U(t) = \exp(-it \mathcal{H})\) を計算します

    • "finite temperature"

      • 有限温度計算

      • tenes_std は虚時間発展演算子 \(U(\tau) = \exp(-\tau \mathcal{H})\) を計算します

  • is_real

    • true にするとテンソルの要素を実数に制限して計算を行います

    • 一つでも複素演算子があるとエラー終了します

  • iszero_tol

    • 各種演算子テンソル要素の実部・虚部の読み込みにおいて、絶対値が iszero_tol 以下はゼロとみなします

  • measure

    • 基底状態計算において、 false にすると物理量計算・保存をスキップします

    • 実行時間 time.dat は常に保存されます

  • measure_interval

    • 実時間発展計算および有限温度計算において、 物理量を測定する頻度を指定します

    • measure_interval ステップ計算した後に物理量を測定します

  • output

    • 物理量などの計算結果をこのディレクトリ以下に保存します

    • 空文字列の場合はカレントディレクトリに保存します

  • tensor_save

    • 最適化後のテンソルをこのディレクトリ以下に保存します

    • 空文字列の場合は保存しません

  • tensor_load

    • 初期テンソルをこのディレクトリ以下から読み込みます

    • 空文字列の場合は読み込みません

parameter.simple_update

simple update に関するパラメータ

名前

説明

型

デフォルト

tau

(虚)時間発展演算子における(虚)時間刻み \(\tau\)

実数 or 実数のリスト

0.01

num_step

simple update の回数

整数 or 整数のリスト

0

lambda_cutoff

simple update において平均場 \(\lambda\) の切り捨て閾値

実数

1e-12

gauge_fix

テンソルのゲージを固定するかどうか

真偽値

false

gauge_maxiter

ゲージ固定操作のループ最大数

整数

100

gauge_convergence_epsilon

ゲージ固定操作の収束判定値

実数

1e-2

  • tau

    • (虚)時間発展演算子における(虚)時間刻み \(\tau\) を指定します

      • tenes_std では時間発展演算子を計算するために用いられます

      • tenes では各ステップでの経過時間・逆温度を求めるために用いられます

        • For finite temperature calculation, note that the inverse temperature increase \(2\tau\) at a step because \(\rho(\beta + 2\tau) = U(\tau)\rho(\beta)\bar{U}(\tau)\)

        • 有限温度計算の場合、 \(\rho(\beta + 2\tau) = U(\tau)\rho(\beta)\bar{U}(\tau)\) なので、 ステップごとに逆温度は \(2\tau\) だけ増加することに注意してください。

    • リストを指定すると、時間発展演算子のグループごとに刻み幅を変えることができます

  • num_step

    • simple update の回数を指定します

    • リストを指定すると、時間発展演算子のグループごとに回数を変えることができます

parameter.full_update

full update に関するパラメータ

名前

説明

型

デフォルト

tau

(虚)時間発展演算子における(虚)時間刻み \(\tau\)

実数 or 実数のリスト

0.01

num_step

full update の回数

整数 or 整数のリスト

0

env_cutoff

full update で環境テンソルを計算する際にゼロとみなす特異値のcutoff

実数

1e-12

inverse_precision

full update で擬似逆行列を計算する際にゼロとみなす特異値のcutoff

実数

1e-12

convergence_epsilon

full update でtruncationの最適化を行う際の収束判定値

実数

1e-6

iteration_max

full update でtruncationの最適化を行う際のiterationの最大回数

整数

100

gauge_fix

テンソルのゲージを固定するかどうか

真偽値

true

fastfullupdate

Fast full update にするかどうか

真偽値

true

parameter.ctm

角転送行列 (CTM) に関するパラメータ

名前

説明

型

デフォルト

dimension

CTM のボンド次元 \(\chi\)

整数

4

projector_cutoff

CTMのprojectorを計算する際にゼロとみなす特異値のcutoff

実数

1e-12

convergence_epsilon

CTMの収束判定値

実数

1e-6

iteration_max

CTMの収束iterationの最大回数

整数

100

projector_corner

CTMのprojector計算で1/4角のテンソルのみを使う

真偽値

true

use_rsvd

SVD を 乱択SVD で置き換えるかどうか

真偽値

false

rsvd_oversampling_factor

乱択SVD 中に計算する特異値の数の、最終的に用いる数に対する比率

実数

2.0

meanfield_env

CTM ではなく simple update で得られる平均場環境を用いる

真偽値

false

乱拓SVDを用いたテンソル繰り込み群の手法については、 S. Morita, R. Igarashi, H.-H. Zhao, and N. Kawashima, Phys. Rev. E 97, 033310 (2018) を参照してください。

parameter.random

疑似乱数生成器に関するパラメータ

名前

説明

型

デフォルト

seed

テンソルの初期化や乱択SVD に用いる疑似乱数生成器のシード

整数

11

MPI 並列において、各プロセスは seed にプロセス番号を足した数を実際のシードとして持ちます。

例

[parameter]
[parameter.general]
is_real = true
[parameter.simple_update]
num_step = 100
tau = 0.01
[parameter.full_update]
num_step = 0  # No full update
tau = 0.01
[parameter.ctm]
iteration_max = 10
dimension = 9 # CHI

5.4.2. tensor セクション

「ユニットセル」の情報を記述します(ボンドの情報は hamiltonian (tenes_std) や evolution (tenes) で与えます)。 ユニットセルは Lx かける Ly の大きさをもつ長方形の形をしています。 また、サブセクション unitcell を持ちます。

名前

説明

型

デフォルト

L_sub

ユニットセルの大きさ

整数または整数のリスト

--

skew

skew 境界条件におけるシフト値

整数

0

L_sub として2つの整数からなるリストを渡した場合、はじめの要素が Lx に、もう片方が Ly になります。 3つ以上の要素からなるリストを渡した場合にはエラー終了します。 L_sub として整数を渡した場合、 Lx と Ly とが等しくなります。

ユニットセル内のサイトは0から順番に番号付けされます。 x 方向から順に並びます。

../_images/tensor_sec_fig1.png

図 5.8 L_sub = [2,3] としたときの例

skew は y 方向にユニットセル1つ分動いたときのx 方向のズレです。

../_images/tensor_sec_fig2.png

図 5.9 L_sub = [3,2], skew = 1 としたときの例 (罫線はユニットセルの区切り)

tensor.unitcell サブセクション

サイトテンソル \(T_{ijkl\alpha}^{(n)}\) の情報を指定します。 ここで \(i,j,k,l\) は virtual bond のインデックス、 \(\alpha\) は physical bond のインデックス、 \(n\) はサイト番号を意味します。

名前

説明

型

index

サイト番号

整数 or 整数のリスト

physical_dim

サイトテンソルの physical bond の次元

整数

virtual_dim

サイトテンソルの virtual bond の次元 \(D\)

整数 or 整数のリスト

initial_state

初期状態

実数のリスト

noise

初期テンソルのゆらぎの大きさ

実数

index にリストを渡すことによって、複数のサイトを同時に指定できます。 空のサイト [] は全サイトを意味します。

virtual_dim にリストを渡すことで、4方向のボンド次元を個別に指定できます。 順番は、左(-x)、上(+y)、右(+x)、下(-y) の順番です。

系全体の初期状態 \(|\Psi\rangle\) は、各サイト \(i\) の初期状態 \(|\Psi_i\rangle\) の直積で与えられます。

\[|\Psi\rangle = \otimes_i |\Psi_i\rangle\]

サイトテンソルはこの直積状態を表現するように初期化されます。 initial_state では各サイト \(i\) の初期状態 \(|\Psi_i\rangle = \sum_\alpha A_\alpha |\alpha\rangle_i\) における実展開係数 \(A_\alpha\) の値を指定します。 係数は自動的に規格化されます。 テンソル自体は、 すべてのvirtual ボンドインデックスが0 である要素が、 \(T_{0000\alpha} = A_\alpha\) のように初期化されます。 他の要素には [-noise, noise) の一様乱数が互いに独立に入力されます。 たとえば、 \(S=1/2\) のとき、 \(S^z\) 方向に向いた状態 \(|\Psi_i\rangle = |\uparrow\rangle = |0\rangle\) を初期値にしたい場合には initial_state = [1.0, 0.0] に、 \(S^x\) 方向に向いた状態 \(|\Psi_i\rangle = \left(|\uparrow\rangle + |\downarrow\rangle\right)/\sqrt{2}\) を初期値にしたい場合には initial_state = [1.0, 1.0] とします。

initial_state にゼロのみからなる配列を渡した場合、テンソルのすべての要素が独立に [-noise, noise) で乱数初期化されます。

5.4.3. observable セクション

物理量測定に関する諸々を記述します。 onesite, twosite と multisite の3種類のサブセクションを持ちます。

observable.onesite

ひとつのサイト上で定義される物理量を示す一体演算子を定義します。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

sites

サイト番号

整数 or 整数のリスト

dim

演算子の次元

整数

elements

演算子の非ゼロ要素

文字列

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group はonesite 演算子の識別番号です。

sites は演算子が作用するサイト番号です。 リストを渡すことで複数同時に定義できます。 空リスト [] は全サイトを意味します。

dim は演算子の次元です。

elements は演算子の非ゼロ要素を指定する文字列です。 1つの要素は、空白で区切られた2つの整数と2つの浮動小数点数からなる1つの行で表されます。

  • 最初の2つはそれぞれ演算子が作用する前と後の状態番号を示します。

  • あとの2つはそれぞれ演算子の要素の実部と虚部を示します。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

例

S=1/2 のSz 演算子

\[\begin{split}S^z = \left(\begin{array}{cc} 0.5 & 0.0 \\ 0.0 & -0.5 \end{array}\right)\end{split}\]

を具体例として説明します。

まず、名前は name = "Sz" として、識別番号は group = 0 としておきます。

次に、演算子の作用するサイトですが、すべてのサイトで同一の演算子を用いる場合には sites = [] とします。 そうではない場合、例えばスピンの大きさが異なるサイトがある場合には、 sites = [0,1] などと具体的なサイト番号を指定します。

演算子の次元は、上に示した行列表示のサイズなので、 dim = 2 です。

最後に演算子の要素です。 非ゼロ要素について、そのインデックス(ゼロ始まり)と要素を順番に並べれば良いので、

elements = """
0 0   0.5 0.0
1 1  -0.5 0.0
"""

となります。

結果として、 S=1/2 の Sz 演算子は次のように定義されます。

[[observable.onesite]]
name = "Sz"
group = 0
sites = []
dim = 2
elements = """
0 0  0.5 0.0
1 1  -0.5 0.0
"""

observable.twosite

ふたつのサイト上で定義される物理量を示す演算子を定義します。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

bonds

ボンド

文字列

dim

演算子の次元

整数のリスト

elements

演算子の非ゼロ要素

文字列

ops

onesite 演算子の識別番号

整数のリスト

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group は twosites 演算子の識別番号です。

bonds は演算子が作用するサイト対の集合を表す文字列です。 3つの整数からなる1行が1つのサイト対を意味します。

  • 最初の整数は 始点サイト (source) の番号です。

  • あとの2つの整数は source site からみた終点サイト (target) の座標 (dx, dy) です。

    • dx, dy ともに \(-3 \le dx \le 3\) の範囲に収まる必要があります。

dim は演算子の次元、すなわち作用するサイトの取りうる状態数です。 例として、2つの \(S=1/2\) スピンの相互作用の場合は、 dim = [2,2] です。

elements は演算子の非ゼロ要素を指定する文字列です。 1つの要素は4つの整数と2つの浮動小数点数を空白区切りからなる1つの行からなります。

  • 最初の2つは演算子が作用する 前 の source site, target site の状態番号を示します。

  • つぎの2つは演算子が作用した 後 の source site, target site の状態番号を示します。

  • 最後の2つはそれぞれ演算子の要素の実部と虚部を示します。

ops を使うと observable.onesite で定義した1体演算子の直積として2体演算子を定義できます。 例えば observable.onesite の group=0 として \(S^z\) を定義していた場合には、 ops = [0,0] として \(S^z_iS^z_j\) を表現できます。

elements と ops を同時に定義した場合にはエラー終了します。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

例

ここでは具体例として、Lsub=[2,2] の正方格子 S=1/2 ハイゼンベルグ模型のボンドハミルトニアンのエネルギーを求めるため、 ハミルトニアン

\[\mathcal{H}_{ij} = S_i^z S_j^z + \frac{1}{2} \left[S_i^+ S_j^- + S_i^- S_j^+ \right]\]

を2体演算子として設定する例を説明します。

まず、名前と識別番号はそれぞれ name = "hamiltonian" と group = 0 としておきます。 それぞれのサイトの状態は \(|\uparrow\rangle\) と \(|\downarrow\rangle\) の2状態の重ね合わせとなるため、次元は 2 となり、 dim = [2,2] となります。

次にボンドです。サイトは 図 5.7 のように並んでいます。 0 番と 1 番をつなぐボンドは、 1番は 0 番から見て (1,0) の位置にあるので 0 1 0 と表現されます。 同様に 1 番と 3 番をつなぐボンドは、 3 番が 1 番から見て (0,1) の位置にあるので 1 0 1 と表現されます。

../_images/obs_sec_fig1.png

図 5.10 Lsub=[2,2] の正方格子 S=1/2 ハイゼンベルグ模型のサイトの並び順

最後に演算子の要素です。 まずはサイトの基底を番号付ける必要がありますが、ここでは \(|\uparrow\rangle\) を0, \(|\downarrow\rangle\) を 1 とします。 この基底と番号を用いると、 例えば対角項の1つ \(\left\langle \uparrow_i \uparrow_j | \mathcal{H}_{ij} | \uparrow_i \uparrow_j \right\rangle = 1/4\) は 0 0 0 0 0.25 0.0 と表現されます。 他に、非対角項の1つ \(\left\langle \uparrow_i \downarrow_j | \mathcal{H}_{ij} | \downarrow_i \uparrow_j \right\rangle = 1/2\) は 1 0 0 1 0.5 0.0 と表現されます。

結果として、 S=1/2 のハイゼンベルグハミルトニアンは次のように定義されます。

[[observable.twosite]]
name = "hamiltonian"
group = 0
dim = [2, 2]
bonds = """
0 0 1
0 1 0
1 0 1
1 1 0
2 0 1
2 1 0
3 0 1
3 1 0
"""
elements = """
0 0 0 0  0.25 0.0
1 0 1 0  -0.25 0.0
0 1 1 0  0.5 0.0
1 0 0 1  0.5 0.0
0 1 0 1  -0.25 0.0
1 1 1 1  0.25 0.0
"""

observable.multisite

みっつ以上のサイト上で定義される物理量を示す演算子を定義します。 サイトごとの1体演算子の直積として定義されます。

名前

説明

型

name

演算子の名前

文字列

group

演算子の識別番号

整数

multisites

サイトの組み合わせ

文字列

ops

onesite 演算子の識別番号

整数のリスト

coeff

演算子にかかる係数(実部)

実数

coeff_im

演算子にかかる係数(虚部)

実数

name は演算子の名前です。

group は multisites 演算子の識別番号です。

multisites は演算子が作用するサイト群の集合を表す文字列です。 整数からなる1行が1つのサイト群を意味します。

  • 最初の整数は 始点サイト (source) の番号です。

  • のこりの整数は source site からみた他サイト (target) の座標の組 (dx, dy) を並べたものです。

    • Nサイトの場合、 source_site dx2 dy2 dx3 dy3 ... dxN dyN という形式です。

    • \(4 \times 4\) の正方形内に収まる必要があります。

ops を用いて observable.onesite で定義した1体演算子の直積として演算子を定義します。 例えば observable.onesite の group=0 として \(S^z\) を定義していた場合には、 ops = [0,0,0] として \(S^z_iS^z_jS^z_k\) を表現できます。

coeff, coeff_im は演算子にかかる係数の実部と虚部です。 省略した場合はそれぞれ 1.0, 0.0 になります。

5.4.4. evolution セクション

simple update, full update で使う(虚)時間発展演算子を記述します。 1サイトおよび隣接2サイトに関する(虚)時間発展を定義できます。 次のようなフィールドを持つ simple, full の2つのサブセクションを持ちます。

名前

説明

型

group

演算子のグループ

整数 (0-)

site

site の番号

整数 (0-)

source_site

source site の番号

整数 (0-)

source_leg

source site から見た target site の方向

整数 (0-3)

dimensions

虚時間発展演算子テンソルの次元

整数のリスト

elements

虚時間発展演算子テンソルの非ゼロ要素

文字列

group は時間発展演算子のグループを指定します。 parameter.simple_update および parameter.full_update における tau や num_steps で刻み幅やステップ数をリストを用いて複数指定したときに、そのインデックスに対応します。

site は1サイト演算子に、 source_site と source_leg は2サイト演算子に使用します。

source_leg は 0 から3までの整数で指定します。 -x 方向から順番に時計回りに、 0:-x, 1:+y, 2:+x, 3:-y として定義されています。

dimensions は observable の dim と異なり、すべての足の次元を指定する必要があります。 足の順番は elements と同様に、 source_initial, target_initial, source_final, target_final の順番です。

例

[evolution]

# One site
[[evolution.simple]]
site = 0
dimensions = [2, 2]
elements = """
0 0  1.0012507815756226 0.0
1 1  0.9987507809245809 0.0
"""

# Two site
[[evolution.simple]]
source_site = 0
source_leg = 2
dimensions = [2, 2, 2, 2]
elements = """
0 0 0 0  0.9975031223974601 0.0
1 0 1 0  1.0025156589209967 0.0
0 1 1 0  -0.005012536523536871 0.0
1 0 0 1  -0.005012536523536871 0.0
0 1 0 1  1.0025156589209967 0.0
1 1 1 1  0.9975031223974601 0.0
"""

5.4.5. correlation セクション

サイト演算子の相関関数 \(C = \left\langle A(\boldsymbol{r}_0)B(\boldsymbol{r}_0+\boldsymbol{r})\right\rangle\) に関する情報を指定するセクションです。 本セクションを省略した場合、相関関数は計算されません。

座標は正方格子TNS の座標系で測られます。すなわち、右隣のテンソルは \(\boldsymbol{r} = (1,0)\) で、真上は \(\boldsymbol{r} = (0,1)\) です。 中心座標 \(\boldsymbol{r}_0\) として、ユニットセル内のすべてのサイトが用いられます。 また、\(\boldsymbol{r}\) は \(x\) ないし \(y\) 軸に平行な方向に、正の向きにのみ動きます。すなわち、

\[\boldsymbol{r} = (0,0), (1,0), (2,0), \dots, (r_\text{max}, 0), (0,1), (0,2), \dots, (0, r_\text{max})\]

です。

名前

説明

型

r_max

相関関数の距離 \(r\) の最大値

整数

operators

相関関数を測る1体演算子 A, B を表す番号

整数のリストのリスト

演算子は observable.onesite セクションで指定したものが用いられます。

例

例えば \(S^z\) が0 番で、 \(S^x\) が1 番として定義されている場合、

[correlation]
r_max = 5
operators = [[0,0], [0,1], [1,1]]

では相関関数 \(S^z(0)S^z(r), S^z(0)S^x(r), S^x(0)S^x(r)\) が、 \(0 \le r \le 5\) の範囲で測定されます。

5.4.6. correlation_length セクション

相関長 \(\xi\) の計算に関する情報を指定するセクションです。

名前

説明

型

デフォルト

measure

相関長を測るかどうか

真偽値

false

num_eigvals

計算する転送行列の固有値の数

整数

4

maxdim_dense_eigensolver

密行列の対角化手法を用いる最大行列サイズ

整数

200

arnoldi_maxdim

Arnoldi 法で生成する Hessenberg 行列の次元

整数

50

arnoldi_restartdim

Arnoldi 法のリスタートで生成する初期ベクトルの本数

整数

20

arnoldi_maxiterations

Arnoldi 法の最大イテレーション回数

整数

1

arnoldi_rtol

Arnoldi 法で目指す相対残差

実数

1e-10

相関長は転送行列の固有値から計算されます。 行列サイズが maxdim_dense_eigensolver 以下のときには密行列対角化(?geev ルーチン)による対角化を、 そうでない場合は Implicit Restart Arnoldi (IRA)法による対角化を用いて固有値を計算します。

IRA 法では、 Arnoldi 過程によって大きさ arnoldi_maxdim のHessenberg 行列を生成し、その固有値を計算します。 収束していない場合は、新たに arnoldi_restartdim 本の初期ベクトルを作成し、 Arnodi 過程をやり直します (restart)。 転送行列の場合は、多くの場合で restart をする必要はありません (arnoldi_maxiterations = 1)。