5.4. tenes
の入力ファイル¶
ファイルフォーマットは TOML 形式
parameter
,tensor
,evolution
,observable
,correlation
の5つのセクションを持ちます。
5.4.1. parameter
セクション¶
更新回数など、 計算にあらわれる種々のパラメータを記述します。
サブセクションとして general
, simple_update
, full_update
,
ctm
, random
を持ちます。
parameter.general
¶
tenes
の全般的な設定パラメータ
名前 |
説明 |
型 |
デフォルト |
---|---|---|---|
|
計算モード |
文字列 |
"ground state" |
|
すべてのテンソルを実数に制限するかどうか |
真偽値 |
false |
|
演算子テンソルの読み込みにおいてゼロとみなす絶対値カットオフ |
実数 |
0.0 |
|
基底状態計算において、物理量測定をするかどうか |
真偽値 |
true |
|
実時間発展・有限温度計算において物理量を測定する頻度 |
整数 or 整数のリスト |
10 |
|
物理量などを書き込むディレクトリ |
文字列 |
"output" |
|
最適化後のテンソルを書き込むディレクトリ |
文字列 |
"" |
|
初期テンソルを読み込むディレクトリ |
文字列 |
"" |
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\) |
実数 or 実数のリスト |
0.01 |
|
simple update の回数 |
整数 or 整数のリスト |
0 |
|
simple update において平均場 \(\lambda\) の切り捨て閾値 |
実数 |
1e-12 |
|
テンソルのゲージを固定するかどうか |
真偽値 |
false |
|
ゲージ固定操作のループ最大数 |
整数 |
100 |
|
ゲージ固定操作の収束判定値 |
実数 |
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\) |
実数 or 実数のリスト |
0.01 |
|
full update の回数 |
整数 or 整数のリスト |
0 |
|
full update で環境テンソルを計算する際にゼロとみなす特異値のcutoff |
実数 |
1e-12 |
|
full update で擬似逆行列を計算する際にゼロとみなす特異値のcutoff |
実数 |
1e-12 |
|
full update でtruncationの最適化を行う際の収束判定値 |
実数 |
1e-6 |
|
full update でtruncationの最適化を行う際のiterationの最大回数 |
整数 |
100 |
|
テンソルのゲージを固定するかどうか |
真偽値 |
true |
|
Fast full update にするかどうか |
真偽値 |
true |
parameter.ctm
¶
角転送行列 (CTM) に関するパラメータ
名前 |
説明 |
型 |
デフォルト |
---|---|---|---|
|
CTM のボンド次元 \(\chi\) |
整数 |
4 |
|
CTMのprojectorを計算する際にゼロとみなす特異値のcutoff |
実数 |
1e-12 |
|
CTMの収束判定値 |
実数 |
1e-6 |
|
CTMの収束iterationの最大回数 |
整数 |
100 |
|
CTMのprojector計算で1/4角のテンソルのみを使う |
真偽値 |
true |
|
SVD を 乱択SVD で置き換えるかどうか |
真偽値 |
false |
|
乱択SVD 中に計算する特異値の数の、最終的に用いる数に対する比率 |
実数 |
2.0 |
|
CTM ではなく simple update で得られる平均場環境を用いる |
真偽値 |
false |
乱拓SVDを用いたテンソル繰り込み群の手法については、 S. Morita, R. Igarashi, H.-H. Zhao, and N. Kawashima, Phys. Rev. E 97, 033310 (2018) を参照してください。
parameter.random
¶
疑似乱数生成器に関するパラメータ
名前 |
説明 |
型 |
デフォルト |
---|---|---|---|
|
テンソルの初期化や乱択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
を持ちます。
名前 |
説明 |
型 |
デフォルト |
---|---|---|---|
|
ユニットセルの大きさ |
整数または整数のリスト |
-- |
|
skew 境界条件におけるシフト値 |
整数 |
0 |
L_sub
として2つの整数からなるリストを渡した場合、はじめの要素が Lx
に、もう片方が Ly
になります。
3つ以上の要素からなるリストを渡した場合にはエラー終了します。
L_sub
として整数を渡した場合、 Lx
と Ly
とが等しくなります。
ユニットセル内のサイトは0から順番に番号付けされます。 x 方向から順に並びます。
skew
は y 方向にユニットセル1つ分動いたときのx 方向のズレです。
tensor.unitcell
サブセクション¶
サイトテンソル \(T_{ijkl\alpha}^{(n)}\) の情報を指定します。 ここで \(i,j,k,l\) は virtual bond のインデックス、 \(\alpha\) は physical bond のインデックス、 \(n\) はサイト番号を意味します。
名前 |
説明 |
型 |
---|---|---|
|
サイト番号 |
整数 or 整数のリスト |
|
サイトテンソルの physical bond の次元 |
整数 |
|
サイトテンソルの virtual bond の次元 \(D\) |
整数 or 整数のリスト |
|
初期状態 |
実数のリスト |
|
初期テンソルのゆらぎの大きさ |
実数 |
index
にリストを渡すことによって、複数のサイトを同時に指定できます。
空のサイト []
は全サイトを意味します。
virtual_dim
にリストを渡すことで、4方向のボンド次元を個別に指定できます。
順番は、左(-x)、上(+y)、右(+x)、下(-y) の順番です。
系全体の初期状態 \(|\Psi\rangle\) は、各サイト \(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
¶
ひとつのサイト上で定義される物理量を示す一体演算子を定義します。
名前 |
説明 |
型 |
---|---|---|
|
演算子の名前 |
文字列 |
|
演算子の識別番号 |
整数 |
|
サイト番号 |
整数 or 整数のリスト |
|
演算子の次元 |
整数 |
|
演算子の非ゼロ要素 |
文字列 |
|
演算子にかかる係数(実部) |
実数 |
|
演算子にかかる係数(虚部) |
実数 |
name
は演算子の名前です。
group
はonesite 演算子の識別番号です。
sites
は演算子が作用するサイト番号です。
リストを渡すことで複数同時に定義できます。
空リスト []
は全サイトを意味します。
dim
は演算子の次元です。
elements
は演算子の非ゼロ要素を指定する文字列です。
1つの要素は、空白で区切られた2つの整数と2つの浮動小数点数からなる1つの行で表されます。
最初の2つはそれぞれ演算子が作用する前と後の状態番号を示します。
あとの2つはそれぞれ演算子の要素の実部と虚部を示します。
coeff
, coeff_im
は演算子にかかる係数の実部と虚部です。
省略した場合はそれぞれ 1.0, 0.0 になります。
例¶
S=1/2 のSz 演算子
を具体例として説明します。
まず、名前は 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
¶
ふたつのサイト上で定義される物理量を示す演算子を定義します。
名前 |
説明 |
型 |
---|---|---|
|
演算子の名前 |
文字列 |
|
演算子の識別番号 |
整数 |
|
ボンド |
文字列 |
|
演算子の次元 |
整数のリスト |
|
演算子の非ゼロ要素 |
文字列 |
|
onesite 演算子の識別番号 |
整数のリスト |
|
演算子にかかる係数(実部) |
実数 |
|
演算子にかかる係数(虚部) |
実数 |
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 ハイゼンベルグ模型のボンドハミルトニアンのエネルギーを求めるため、
ハミルトニアン
を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
と表現されます。
最後に演算子の要素です。
まずはサイトの基底を番号付ける必要がありますが、ここでは \(|\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体演算子の直積として定義されます。
名前 |
説明 |
型 |
---|---|---|
|
演算子の名前 |
文字列 |
|
演算子の識別番号 |
整数 |
|
サイトの組み合わせ |
文字列 |
|
onesite 演算子の識別番号 |
整数のリスト |
|
演算子にかかる係数(実部) |
実数 |
|
演算子にかかる係数(虚部) |
実数 |
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つのサブセクションを持ちます。
名前 |
説明 |
型 |
---|---|---|
|
演算子のグループ |
整数 (0-) |
|
site の番号 |
整数 (0-) |
|
source site の番号 |
整数 (0-) |
|
source site から見た target site の方向 |
整数 (0-3) |
|
虚時間発展演算子テンソルの次元 |
整数のリスト |
|
虚時間発展演算子テンソルの非ゼロ要素 |
文字列 |
group
は時間発展演算子のグループを指定します(省略した場合 0とみなされます)。
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\) 軸に平行な方向に、正の向きにのみ動きます。すなわち、
です。
名前 |
説明 |
型 |
---|---|---|
|
相関関数の距離 \(r\) の最大値 |
整数 |
|
相関関数を測る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\) の計算に関する情報を指定するセクションです。
名前 |
説明 |
型 |
デフォルト |
---|---|---|---|
|
相関長を測るかどうか |
真偽値 |
false |
|
計算する転送行列の固有値の数 |
整数 |
4 |
|
密行列の対角化手法を用いる最大行列サイズ |
整数 |
200 |
|
Arnoldi 法で生成する Hessenberg 行列の次元 |
整数 |
50 |
|
Arnoldi 法のリスタートで生成する初期ベクトルの本数 |
整数 |
20 |
|
Arnoldi 法の最大イテレーション回数 |
整数 |
1 |
|
Arnoldi 法で目指す相対残差 |
実数 |
1e-10 |
相関長は転送行列の固有値から計算されます。
行列サイズが maxdim_dense_eigensolver
以下のときには密行列対角化(?geev
ルーチン)による対角化を、
そうでない場合は Implicit Restart Arnoldi (IRA)法による対角化を用いて固有値を計算します。
IRA 法では、 Arnoldi 過程によって大きさ arnoldi_maxdim
のHessenberg 行列を生成し、その固有値を計算します。
収束していない場合は、新たに arnoldi_restartdim
本の初期ベクトルを作成し、 Arnodi 過程をやり直します (restart)。
転送行列の場合は、多くの場合で restart をする必要はありません (arnoldi_maxiterations = 1
)。