5.4. tenes の入力ファイル

  • ファイルフォーマットは TOML 形式
  • parameter, tensor, evolution, observable, correlation の5つのセクションを持ちます。

5.4.1. parameter セクション

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

simple update およびfull updateの虚時間刻み parameter.simple_update.tauparameter.full_update.tau のみ、 tenes 本体ではなくスタンダードモード tenes_std で使われるパラメータです。

parameter.general

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

名前 説明 デフォルト
is_real すべてのテンソルを実数に制限するかどうか 真偽値 false
iszero_tol 演算子テンソルの読み込みにおいてゼロとみなす絶対値カットオフ 実数 0.0
measure 物理量測定をするかどうか 真偽値 true
output 物理量などを書き込むディレクトリ 文字列 “output”
tensor_save 最適化後のテンソルを書き込むディレクトリ 文字列 “”
tensor_load 初期テンソルを読み込むディレクトリ 文字列 “”
  • is_real
    • true にするとテンソルの要素を実数に制限して計算を行います
    • 一つでも複素演算子があるとエラー終了します
  • iszero_tol
    • 各種演算子テンソル要素の実部・虚部の読み込みにおいて、絶対値が iszero_tol 以下はゼロとみなします
  • measure
    • false にすると物理量計算・保存をスキップします
    • 実行時間 time.dat は常に保存されます
  • output
    • 物理量などの計算結果をこのディレクトリ以下に保存します
    • 空文字列の場合はカレントディレクトリに保存します
  • tensor_save
    • 最適化後のテンソルをこのディレクトリ以下に保存します
    • 空文字列の場合は保存しません
  • tensor_load
    • 各種テンソルをこのディレクトリ以下から読み込みます
    • 空文字列の場合は読み込みません

parameter.simple_update

simple update に関するパラメータ

名前 説明 デフォルト
tau 虚時間発展演算子における虚時間刻み \(\tau\) 実数 0.01
num_step simple update の回数 整数 0
lambda_cutoff simple update において平均場 \(\lambda\) の切り捨て閾値 実数 1e-12

parameter.full_update

full update に関するパラメータ

名前 説明 デフォルト
tau 虚時間発展演算子における虚時間刻み \(\tau\) 実数 0.01
num_step full update の回数 整数 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

乱拓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 として整数を渡した場合、 LxLy とが等しくなります。

ユニットセル内のサイトは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 セクション

物理量測定に関する諸々を記述します。 onesitetwosite の2種類のサブセクションを持ちます。

observable.onesite

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

名前 説明
name 演算子の名前 文字列
group 演算子の識別番号 整数
sites サイト番号 整数 or 整数のリスト
dim 演算子の次元 整数
elements 演算子の非ゼロ要素 文字列

name は演算子の名前です。

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

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

dim は演算子の次元です。

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

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

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 演算子の識別番号 整数のリスト

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.onesitegroup=0 として \(S^z\) を定義していた場合には、 ops = [0,0] として \(S^z_iS^z_j\) を表現できます。

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

ここでは具体例として、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
"""

5.4.4. evolution セクション

simple update, full update で使う2サイト虚時間発展演算子を記述します。 次のようなフィールドを持つ simple, full の2つのサブセクションを持ちます。

名前 説明
source_site source site の番号 整数
source_leg source site から見た target site の方向 整数
dimensions 虚時間発展演算子テンソルの次元 整数のリスト
elements 虚時間発展演算子テンソルの非ゼロ要素 文字列

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

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

[evolution]
[[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\) の範囲で測定されます。