5.2. tenes_simple の入力ファイル

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

  • model, lattice, parameter, correlation の4つのセクションを持ちます。

    • parameter セクションはそのままスタンダードモードの入力へとコピーされます。

5.2.1. model セクション

計算する模型を指定します。 スピン系 (spin)、ボソン系 (boson)、スピンレスフェルミオン系 (spinless fermion)、フェルミオン Hubbard 模型 (hubbard) が定義済みです。

名前

説明

型

デフォルト

type

模型の種類 ("spin" / "boson" / "spinless fermion" / "hubbard")

文字列

--

模型の種類によって相互作用などのパラメータ名が変わります。

スピン系 spin

スピン系

\[\mathcal{H} = \sum_{i < j}\left[\sum_\alpha^{x,y,z} J^\alpha_{ij} S^\alpha_i S^\alpha_j + B_{ij} \left(\vec{S}_i\cdot\vec{S}_j\right)^2 \right] - \sum_i \sum_\alpha^{x,y,z} h^\alpha S^\alpha_i - D \sum_i \left(S^z_i\right)^2\]

一体項のパラメータは次の通り。

名前

説明

型

デフォルト

S

局所スピンの大きさ

実数(整数もしくは半整数)

0.5

hx

\(S^x\) 方向の磁場 \(h^x\)

実数

0.0

hy

\(S^y\) 方向の磁場 \(h^y\)

実数

0.0

hz

\(S^z\) 方向の磁場 \(h^z\)

実数

0.0

D

オンサイトスピン異方性 D

実数

0.0

交換相互作用 \(J\) にはボンド依存性をもたせることができます。

名前

説明

型

デフォルト

J0

最近接・第0方向ボンドの交換相互作用

実数

0.0

J1

最近接・第1方向ボンドの交換相互作用

実数

0.0

J2

最近接・第2方向ボンドの交換相互作用

実数

0.0

J0'

次近接・第0方向ボンドの交換相互作用

実数

0.0

J1'

次近接・第1方向ボンドの交換相互作用

実数

0.0

J2'

次近接・第2方向ボンドの交換相互作用

実数

0.0

J0''

三次近接・第0方向ボンドの交換相互作用

実数

0.0

J1''

三次近接・第1方向ボンドの交換相互作用

実数

0.0

J2''

三次近接・第2方向ボンドの交換相互作用

実数

0.0

次近接、三次近接相互作用を与える場合には、名前をダブルクォーテーションマーク " で囲んでください。 ボンドの方向は lattice セクションで定義される格子に依存します。 例えば正方格子では x方向 (0) と y方向 (1) の2種類のボンド方向ごとに定義できます。 方向を示す番号を省略することで、すべての方向について一度に指定できます。 また、最後に xyz のうち一文字を追加するとイジング的な相互作用を指定できます。 同一ボンド・同一成分を2回以上指定するとエラー終了します。

../_images/J.png

双二次相互作用 \(B\) も \(J\) と同様にボンド依存性をもたせられます。

名前

説明

型

デフォルト

B0

最近接・第0方向ボンドの双二次相互作用

実数

0.0

B1

最近接・第1方向ボンドの双二次相互作用

実数

0.0

B2

最近接・第2方向ボンドの双二次相互作用

実数

0.0

B0'

次近接・第0方向ボンドの双二次相互作用

実数

0.0

B1'

次近接・第1方向ボンドの双二次相互作用

実数

0.0

B2'

次近接・第2方向ボンドの双二次相互作用

実数

0.0

B0''

三次近接・第0方向ボンドの双二次相互作用

実数

0.0

B1''

三次近接・第1方向ボンドの双二次相互作用

実数

0.0

B2''

三次近接・第2方向ボンドの双二次相互作用

実数

0.0

物理量測定に使われる1サイト物理量として、 \(S^z\) と \(S^x\) 、(parameter.general.is_real = false ならば) \(S^y\) が自動的に定義されます。 また、2サイト物理量として、ボンドハミルトニアン

\[\mathcal{H}_{ij} = \left[\sum_\alpha^{x,y,z} J^\alpha_{ij} S^\alpha_i S^\alpha_j + B_{ij} \left(\vec{S}_i\cdot\vec{S}_j\right)^2 \right] - \frac{1}{z} \left[ \sum_\alpha^{x,y,z} h^\alpha \left(S^\alpha_i + S^\alpha_j \right) + D \left(\left(S^z_i\right)^2 + \left(S^z_j\right)^2 \right) \right],\]

および最近接ボンド上の相関 \(S_i^\alpha S_j^\alpha\) ( \(\alpha=x, y, z\) )が自動的に定義されます。 ここで、ボンドハミルトニアンのうち、 \(z\) はひとつのサイトから伸びる最近接ボンドの本数で、また一体項の寄与は最近接ボンドにのみ定義されます。

ボソン系 boson

ボソン系

\[\mathcal{H} = \sum_{i<j}\left[ -t_{ij} \left(b^\dagger_i b_j + b^\dagger_j b_i \right) + V_{ij} n_i n_j \right] + \sum_i \left[U\frac{n_i(n_i-1)}{2} - \mu n_i\right]\]

ここで \(b\) と \(b^\dagger\) はボース粒子の生成消滅演算子で、 \(n = b^\dagger b\) は数演算子。

一体項のパラメータは次の通り。

名前

説明

型

デフォルト

nmax

1サイトに入る粒子の最大数

整数

1

U

オンサイト斥力

実数

0.0

mu

化学ポテンシャル

実数

0.0

ホッピング \(t\) およびオフサイト斥力 \(V\) にはボンド依存性をもたせることができます。 2近接ボンドには t' と v'、3近接ボンドには t'' と v'' を使います。 t0' や v1'' のような形式では、近接シェル内のボンド種別を指定します。

名前

説明

型

デフォルト

t0

最近接・第0方向ボンドのホッピング

実数

0.0

t1

最近接・第1方向ボンドのホッピング

実数

0.0

t2

最近接・第2方向ボンドのホッピング

実数

0.0

t0'

次近接・第0方向ボンドのホッピング

実数

0.0

t1'

次近接・第1方向ボンドのホッピング

実数

0.0

t2'

次近接・第2方向ボンドのホッピング

実数

0.0

t0''

三次近接・第0方向ボンドのホッピング

実数

0.0

t1''

三次近接・第1方向ボンドのホッピング

実数

0.0

t2''

三次近接・第2方向ボンドのホッピング

実数

0.0

V0

最近接・第0方向ボンドのオフサイト斥力

実数

0.0

V1

最近接・第1方向ボンドのオフサイト斥力

実数

0.0

V2

最近接・第2方向ボンドのオフサイト斥力

実数

0.0

V0'

次近接・第0方向ボンドのオフサイト斥力

実数

0.0

V1'

次近接・第1方向ボンドのオフサイト斥力

実数

0.0

V2'

次近接・第2方向ボンドのオフサイト斥力

実数

0.0

V0''

三次近接・第0方向ボンドのオフサイト斥力

実数

0.0

V1''

三次近接・第1方向ボンドのオフサイト斥力

実数

0.0

V2''

三次近接・第2方向ボンドのオフサイト斥力

実数

0.0

ボンドの方向は lattice セクションで定義される格子に依存します。 例えば正方格子では x方向 (0) と y方向 (1) の2種類のボンド方向ごとに定義できます。 方向を示す番号を省略することで、すべての方向について一度に指定できます。

物理量測定に使われる1サイト物理量として、 \(n\) と \(b\), \(b^\dagger\) が自動的に定義されます。 また、2サイト物理量として、ボンドハミルトニアン

\[\mathcal{H}_{ij} = \left[ -t_{ij} \left(b^\dagger_i b_j + b^\dagger_j b_i \right) + V_{ij} n_i n_j \right] + \frac{1}{z} \left[\left(U\frac{n_i(n_i-1)}{2} - \mu n_i\right) + (i \leftrightarrow j)\right]\]

および最近接ボンド上の相関 \(n_i n_j\), \(b^\dagger_i b\), \(b_i b^\dagger_j\) が自動的に定義されます。 ここで、ボンドハミルトニアンのうち、 \(z\) はひとつのサイトから伸びる最近接ボンドの本数で、また一体項の寄与は最近接ボンドにのみ定義されます。

スピンレスフェルミオン系 spinless fermion

スピンレスフェルミオン系

\[\mathcal{H} = \sum_{i<j}\left[ -t_{ij} \left(c^\dagger_i c_j + c^\dagger_j c_i \right) + V_{ij} n_i n_j \right] - \sum_i \mu n_i\]

ここで \(c\) と \(c^\dagger\) はフェルミ粒子の生成消滅演算子で、 \(n = c^\dagger c\) は数演算子です。 局所ヒルベルト空間の次元 physical_dim は 2 で、局所基底は \(|0\rangle\), \(|1\rangle\) です。

一体項のパラメータは次の通り。

名前

説明

型

デフォルト

mu

化学ポテンシャル

実数

0.0

ホッピング \(t\) およびオフサイト斥力 \(V\) にはボンド依存性をもたせることができます。 2近接ボンドには t' と v'、3近接ボンドには t'' と v'' を使います。 t0' や v1'' のような形式では、近接シェル内のボンド種別を指定します。

名前

説明

型

デフォルト

t

最近接ボンドのホッピング

実数

0.0

v

最近接ボンドのオフサイト斥力

実数

0.0

物理量測定に使われる1サイト物理量として、 0: n、 1: cdag、 2: c が自動的に定義されます。 パリティ奇の cdag と c は ops 形式の2サイト物理量と相関関数で使えます。1サイト期待値としては常に 0 が出力されます。 また、2サイト物理量として、最近接ボンド上の hopping と nn が自動的に定義されます。 tenes_simple 自身が出力する2サイト物理量は最近接ボンド上のものだけです。 長距離の2サイト物理量を測定する場合は、生成された std.toml に [[observable.twosite]] を追記してから tenes_std を実行してください。

Hubbard 模型 hubbard

フェルミオン Hubbard 模型

\[\mathcal{H} = \sum_{i<j}\left[ -t_{ij} \sum_{\sigma=\uparrow,\downarrow} \left(c^\dagger_{i\sigma} c_{j\sigma} + c^\dagger_{j\sigma} c_{i\sigma} \right) + V_{ij} n_i n_j \right] + \sum_i \left[U n_{i\uparrow} n_{i\downarrow} - \mu n_i - h S^z_i\right]\]

これはフェルミオン Hubbard 模型です。Bose-Hubbard 模型は type = "boson" で指定します。 局所ヒルベルト空間の次元 physical_dim は 4 で、局所基底は \(|0\rangle\), \(|\uparrow\rangle\), \(|\downarrow\rangle\), \(|\uparrow\downarrow\rangle\) です。 ここで \(|\uparrow\downarrow\rangle = c^\dagger_\uparrow c^\dagger_\downarrow |0\rangle\) の順序を用います。

一体項のパラメータは次の通り。

名前

説明

型

デフォルト

u

オンサイト斥力

実数

0.0

mu

化学ポテンシャル

実数

0.0

h

\(S^z\) 方向の磁場

実数

0.0

ホッピング \(t\) およびオフサイト斥力 \(V\) にはボンド依存性をもたせることができます。

名前

説明

型

デフォルト

t

最近接ボンドのホッピング

実数

0.0

v

最近接ボンドのオフサイト斥力

実数

0.0

物理量測定に使われる1サイト物理量として、 0: n、 1: n_up、 2: n_dn、 3: Sz、 4: doublon、 5: holon、 6: cdag_up、 7: c_up、 8: cdag_dn、 9: c_dn が自動的に定義されます。 パリティ奇の cdag_up、 c_up、 cdag_dn、 c_dn は ops 形式の2サイト物理量と相関関数で使えます。1サイト期待値としては常に 0 が出力されます。 また、2サイト物理量として、最近接ボンド上の hopping、 nn、 SzSz、 SxSx、 SySy が自動的に定義されます。 スピン演算子は \(S^\alpha = \frac{1}{2}\sum_{ss'} c^\dagger_s \sigma^\alpha_{ss'} c_{s'}\) です。 density.dat の2サイト物理量はサイトあたりの値(ボンドの和を、物理次元が 1 より大きいサイト、すなわち空孔以外のサイトの数で割ったもの)なので、正方格子では最近接ボンド1本あたりの相関の2倍になります。 tenes_simple 自身が出力する2サイト物理量は最近接ボンド上のものだけです。 長距離の2サイト物理量を測定する場合は、生成された std.toml に [[observable.twosite]] を追記してから tenes_std を実行してください。

fermion モードの最近接を超えるハミルトニアンボンドは simple update のみで利用でき、full update の num_step が正の場合は拒否されます。 tenes_simple がフェルミオン模型で対応する格子と近接範囲は lattice セクションを参照してください。 CTM 環境では、2サイト物理量は 4 x 4 の窓(|dx| <= 3 かつ |dy| <= 3)で測定でき、明示的な elements 形式と ops = [A, B] 形式のどちらも使えます。 meanfield_env = true でも同じ長距離2サイト物理量と相関関数を使えます。この場合、測定窓の外側は simple update の \(\lambda\) で閉じる平均場近似になります。

5.2.2. lattice セクション

計算する格子を指定します。 正方格子 (square) と 三角格子 (triangular), 蜂の巣格子 (honeycomb) , かごめ格子 (kagome) が定義されています。 TeNeS では波動関数を正方格子状に並べられたテンソルによるテンソル積状態で表現し、計算を行います。 そのため、これらの格子(物理格子)と、計算される正方格子との対応についても記述します。

名前

説明

型

デフォルト

type

格子名 (square, triangular, honeycomb, もしくは kagome)

文字列

--

L

ユニットセルのx 方向の大きさ

整数

--

W

ユニットセルのy 方向の大きさ

整数

L

virtural_dim

ボンド次元

整数

--

initial

初期状態

文字列

random

noise

初期テンソルの揺らぎ

実数

1e-2

initial と noise は波動関数の初期状態を決めるパラメータです。 なお、 parameter.general で tensor_load が設定されている場合には、そちらが優先され、テンソルをファイルから読み込みます。

  • initial

    • "ferro" : 強磁性状態。

      • スピン系では、各サイトで \(S^z=S`\) となる状態。

      • ボソン系では、各サイトで \(n=n_{\text{max}}`\) となる状態。

    • "antiferro" : 反強磁性状態。

      • スピン系では、

        正方格子、蜂の巣格子で \(S^z = S\) と \(S^z = -S\) が互いに並んだNeel 秩序。 三角格子、かごめ格子で スピンが \((\theta, \phi) = (0, 0), (2\pi/3, 0), (2\pi/3, \pi)\) 方向に向いた120 度秩序。

      • ボソン系では、一つの副格子で \(n=n_{\text{max}}\) となり、他の副格子では \(n=0\) となる状態。

    • "random" : 各サイトバラバラなランダム状態。

    • フェルミオン模型では、スピンレスフェルミオン系で "random" と "vacuum"、Hubbard 模型で "random"、"vacuum"、"full"、"cdw" が使えます。

      "ferro" と "antiferro" は、パリティ奇の局所状態を含むプロダクト状態を構成できないため使えません。

  • noise

    • テンソルの要素に付与されるゆらぎの大きさ。

フェルミオン模型では、 tenes_simple は正方格子、三角格子、蜂の巣格子、かごめ格子で3近接までのハミルトニアンボンドを扱えます。 かごめ格子では、一方向の最近接ボンドが正方格子埋め込み上で2ホップの鎖になります。そのため最近接だけのかごめ模型でも長距離ゲート鎖を使い、それらのボンドがある場合は simple update のみに制限されます。

正方格子 square lattice

正方格子 type = "square lattice" では、 サイトが \((1,0)\) 方向に L 個、 \((0,1)\) 方向に W 個並びます。 具体例として、 L=3, W=3 のときのサイトの並びを 図 5.1 (a) に示します。 また、最近接、次近接、三次近接のボンドタイプの定義を 図 5.1 (b), (c), (d) にそれぞれ示します。 青線は bondtype = 0 のボンドを, 赤線は bondtype = 1 のボンドを表します。

../_images/SquareLattice.png

図 5.1 正方格子 (square) のサイト・ボンド。 (a) L=3, W=3 としたときのサイトの並び。 (b) 最近接ボンド。 bondtype=0 (青) は 0 度方向に、 bondtype=1 (赤) は 90度方向に伸びる。 (c) 次近接ボンド。 bondtype=0 (青) は 45 度方向に、 bondtype=1 (赤) は -45度方向に伸びる。 (d) 三次近接ボンド。 bondtype=0 (青) は 0 度方向に、 bondtype=1 (赤) は 90度方向に伸びる。

三角格子 triangular lattice

三角格子 type = "triangular lattice" では、 サイトが \((1,0)\) 方向に L 個、 \((1/2, \sqrt{3}/2)\) 方向に W 個並びます。 具体例として、 L=3, W=3 のときのサイトの並びを 図 5.2 (a) に示します。 また、最近接、次近接、三次近接のボンドタイプの定義を 図 5.2 (b), (c), (d) にそれぞれ示します。 青線は bondtype = 0 のボンドを、 赤線は bondtype = 1 のボンドを、 緑線は bondtype = 2 のボンドを、それぞれ表します。 図 5.2 (e) 図は (a) に等価な正方格子をあらわしています。

../_images/TriangularLattice.png

図 5.2 三角格子 (triangular) のサイト・ボンド。 (a) L=3, W=3 としたときのサイトの並び。 (b) 最近接ボンド。 bondtype=0 (青) は 0 度方向に、 bondtype=1 (赤) は 60度方向に、 bondtype=2 (緑)は 120度方向にそれぞれ伸びる。 (c) 次近接ボンド。 bondtype=0 (青) は 90 度方向に、 bondtype=1 (赤) は -30度方向に、 bondtype=2 (緑)は 30度方向にそれぞれ伸びる。 (d) 三次近接ボンド。 bondtype=0 (青) は 0 度方向に、 bondtype=1 (赤) は 60度方向に、 bondtype=2 (緑)は 120度方向にそれぞれ伸びる。 (e) 正方格子テンソル積状態との対応。

蜂の巣格子 honeycomb lattice

蜂の巣格子 type = "honeycomb lattice" では、 座標 \((0, 0)\) と \((\sqrt{3}/2, 1/2)\) の2つのサイトからなるユニットが、 \((\sqrt{3},0)\) 方向に L 個、 \((1/2, 3/2)\) 方向に W 個並びます。 具体例として、L=2, W=2 のときのサイトの並びを 図 5.3 (a) に示します。 破線はユニットを表します。 また、最近接、次近接、三次近接のボンドタイプの定義を 図 5.3 (b), (c), (d) にそれぞれ示します。 青線は bondtype = 0 のボンドを、 赤線は bondtype = 1 のボンドを、 緑線は bondtype = 2 のボンドを、それぞれ表します。 図 5.3 (e) 図は (a) に等価な正方格子をあらわしています。 青サイトから上に伸びるボンドなど、正方格子にはあるものの蜂の巣格子には存在しないものは、ボンド次元が 1 のボンドとして表現されます。

../_images/HoneycombLattice.png

図 5.3 蜂の巣格子 (honeycomb) のサイト・ボンド。 (a) L=2, W=2 としたときのサイトの並び。 破線で表されるユニットが L かける W 個並ぶ。 (b) 最近接ボンド。 bondtype=0 (青) は 30 度方向に、 bondtype=1 (赤) は 150度方向に、 bondtype=2 (緑)は -90度方向にそれぞれ伸びる。 (c) 次近接ボンド。 bondtype=0 (青) は 120 度方向に、 bondtype=1 (赤) は 60度方向に、 bondtype=2 (緑)は 0度方向にそれぞれ伸びる。 (d) 三次近接ボンド。 bondtype=0 (青) は -30 度方向に、 bondtype=1 (赤) は -150度方向に、 bondtype=2 (緑)は 90度方向にそれぞれ伸びる。 (e) 正方格子テンソル積状態との対応。大きな破線はユニットセルの境界を表し、周りにある薄いユニットセルは中心にあるユニットセルのコピーである。 ユニットセルの並びが少しずれていること、また、 (a) で一番右上にあった赤いサイトが (e) では等価な左上に移動することに注意。

かごめ格子 kagome lattice

かごめ格子 type = "kagome lattice" では、 座標 \((0, 0)\), \((1, 0)\), \((1/2, \sqrt{3}/2)\) の3つのサイトからなるユニット(上向き三角)が、 \((2,0)\) 方向に L 個、 \((1, \sqrt{3})\) 方向に W 個並びます。 具体例として、L=2, W=2 のときのサイトの並びを 図 5.4 (a) に示します。 破線はユニットは破線を表します。 また、最近接、次近接、三次近接のボンドタイプの定義を 図 5.4 (b), (c), (d) にそれぞれ示します。 青線は bondtype = 0 のボンドを、 赤線は bondtype = 1 のボンドを表します。 フェルミオン模型では、この正方格子埋め込みのダミーテンソルは物理次元 1、偶パリティの空孔になります。 tenes は density.dat のエネルギーを物理次元が 1 より大きいサイトあたりで出力するので、かごめ格子では空孔を除いたサイトあたりの値になります。

../_images/KagomeLattice.png

図 5.4 かごめ格子 (kagome) のサイト・ボンド。 (a) L=2, W=2 としたときのサイトの並び。 破線で表されるユニットが L かける W 個並ぶ。 (b) 最近接ボンド。 bondtype=0 (青) は 上向き三角形を、 bondtype=1 (赤) は 下向き三角形を作る。 (c) 次近接ボンド。 (d) 三次近接ボンド。 bondtype=0 (青) はサイトを横切り、 bondtype=1 (赤) は横切らない。 (e) 正方格子テンソル積状態との対応。点線で描かれた白丸はすべての次元が1のダミーサイト。

5.2.3. parameter セクション

tenes_simple では使われず、 tenes_std の入力ファイルとしてそのままコピーされます。

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

parameter.general

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

名前

説明

型

デフォルト

mode

計算モード

文字列

"ground state"

is_real

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

真偽値

false

fermion

フェルミオン系として扱うかどうか(実験的機能)

真偽値

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 にするとテンソルの要素を実数に制限して計算を行います

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

  • fermion

    • 実験的機能です。 true にすると、サイトテンソルをフェルミオン(Z2 グレーディング付き)テンソルとして扱い、ボンド更新・測定時のフェルミオン交換符号を自動的に生成します

    • 実装は、フェルミオン系のテンソルネットワークの Z2 グレード付き(超ベクトル空間)の定式化に基づきます。各脚がパリティを持ち、転置・縮約・分解のたびに交換符号を生成します。定式化については Q. Mortier et al., SciPost Phys. 18, 012 (2025); N. Bultinck, D. J. Williamson, J. Haegeman, and F. Verstraete, Phys. Rev. B 95, 075108 (2017); N. Bultinck, D. J. Williamson, J. Haegeman, and F. Verstraete, J. Phys. A: Math. Theor. 51, 025202 (2018) を参照してください。測定で bra と ket の層が交差する箇所の符号は、等価な定式化である swap gate ( P. Corboz, R. Orús, B. Bauer, and G. Vidal, Phys. Rev. B 81, 165104 (2010) ) にあたります

    • 各サイトの物理基底のパリティを tensor.unitcell セクションの parity キーで指定する必要があります。パリティはサイト内の生成演算子順序を固定した上で定義します(tensor.unitcell セクション参照)

    • 演算子・ゲートの行列要素: 2サイト演算子の elements (i1 i2 o1 o2) は、順序付き2サイト Fock 基底

      \[|i_1 i_2\rangle = A^\dagger_1(i_1)\, A^\dagger_2(i_2)\, |0\rangle\]

      (\(A^\dagger(i)\) は固定した内部順序による局所基底 \(i\) の生成演算子列、サイト1 = source_site)における行列要素 \(\langle o_1 o_2 | O | i_1 i_2 \rangle\) です。この行列要素は フェルミオンの反交換関係込みで 評価してください。

      • 例: スピンあり電子では \(\langle \uparrow\downarrow, 0 |\, c^\dagger_{1\uparrow} c_{2\uparrow} \,| \downarrow, \uparrow \rangle = -1\) となります。符号を手で書くのではなく、関与するモードの2サイト Fock 空間を数値的に構成(Jordan-Wigner)して行列要素を読み出すことを推奨します

      \[\langle \uparrow\downarrow, 0 |\, c^\dagger_{1\uparrow} c_{2\uparrow} \,| \downarrow, \uparrow \rangle = \langle 0 |\, c_{1\downarrow} c_{1\uparrow} c^\dagger_{1\uparrow} c_{2\uparrow} c^\dagger_{1\downarrow} c^\dagger_{2\uparrow} \,| 0 \rangle = \langle 0 |\, c_{1\downarrow} c_{1\uparrow} c^\dagger_{1\uparrow} \left(- c^\dagger_{1\downarrow} c_{2\uparrow}\right) c^\dagger_{2\uparrow} \,| 0 \rangle = -1\]
    • サイト 間 の交換符号(2次元幾何由来のものを含む)はすべて TeNeS が生成します。ユーザーが与えるのは上記の符号込み局所行列のみです

    • 時間発展ゲートと2サイト演算子はフェルミオンパリティを保存する必要があります。1サイト観測量はパリティ奇でも定義できますが、その1サイト期待値は厳密に 0 になります。パリティ奇の1サイト演算子は、 ops 形式の2サイト物理量や [correlation] の因子として使えます

      • 例えば1粒子生成消滅演算子の期待値は 0 として出力されます。

    • 現バージョンでは基底状態計算と実時間発展(mode = "time evolution")に対応しています(simple update および full update)。simple update の環境は CTM または平均場、full update は CTM 環境のみです。2サイト物理量は明示的な elements 形式と ops = [A, B] 形式のどちらでも指定でき、4 x 4 の窓(|dx| <= 3 かつ |dy| <= 3)で測定できます。 [correlation] も利用でき、左または下の演算子を \(A\) とした \(\langle A_s B_t\rangle\) を出力します。パリティが異なる演算子の組は 0 として出力されます。 meanfield_env = true での長距離2サイト物理量と相関関数は、測定窓または相関鎖の外側を simple update の \(\lambda\) で閉じて評価します。最近接を超えるハミルトニアンボンドは fermion モードの simple update で利用できますが、 full_update.num_step > 0 のとき full update はそのようなボンドを拒否します。4 x 4 の窓の外にあるハミルトニアンボンドは、fermion モードではエネルギーを測定できないため拒否されます。 Use_RSVD 、 Simple_Gauge_Fix 、有限温度計算、マルチサイト演算子、サイトが自分自身と最近接になるユニットセル(LX = 1 、または LY = 1 かつ skew = 0)は非対応で、入力読み込み時にエラーになります。相関長も非対応で、 tenes_simple はフェルミオン模型に対する [correlation_length] をエラーとし、ソルバーは測定時に警告を出して測定を無効化します

    • fermion モードの実時間発展は、偶パリティのサイトだけからなる直積状態(真空や、二重占有と空のサイトの組み合わせなど)、偶パリティのランダム状態、または tensor_load で読み込んだ状態(基底状態からのクエンチなど)から始められます。奇パリティのサイトを含む直積状態は、基底状態計算と同じく拒否されます。大きいボンド次元(例えば D = 8)で直積状態から直接 full update を始めると、仮想空間のほとんどがまだ空のため、最初の数ステップのパリティ射影で止まることがあります。小さい D から始めるか、simple update を使ってください。

    • 最近接を超えるハミルトニアンボンドを含む場合、小さいボンド次元、例えば D = 2 では、ランダム初期状態が真空に落ちてそのまま残ることがあります。最近接項だけで収束させた状態から tensor_save と tensor_load で始めるか、より大きい D を使ってください。

    • fermion モードでは、出力添字に非ゼロ要素を一つも持たない2サイトゲートは、最近接ボンドであっても入力読み込み時に拒否されます。射影演算子のような非可逆なゲートがこの形になりえますが、 \(\exp(-\tau h)\) の形のゲートは影響を受けません。

  • iszero_tol

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

  • measure

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

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

  • measure_interval

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

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

  • output

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

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

  • tensor_save

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

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

    • 保存の仕組みと、保存が中断されたときの対処は、下の「チェックポイントのファイル」を参照してください

  • tensor_load

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

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

    • tensor_save と同じディレクトリを指定できます。下の「チェックポイントのファイル」を参照してください

チェックポイントのファイル(tensor_save と tensor_load)

計算はテンソルをチェックポイントとして tensor_save のディレクトリへ保存し、後の計算が tensor_load から読み込みます。両方に同じディレクトリを指定すると、各計算が前の計算のチェックポイントから続きを行い、それを置き換えます。

  • 保存

    • 保存は、<保存先>/.tenes-save-tmp/ という作業用ディレクトリへ書き込み、完成してから1ファイルずつ保存先へ移す形で行われます。書き込み中にジョブが強制終了しても、保存先には直前のチェックポイントがそのまま残ります。作業用ディレクトリは保存の完了時に削除され、異常終了した run が残したものは次回の保存で削除されます

    • 移動の直前は作業用ディレクトリとチェックポイントが同時に存在するため、ディスク使用量が一時的にチェックポイント 2 個分になります

    • その保存が書かなかったチェックポイントのファイルは保存先から削除されます。サイト数や並列数を減らした計算で同じディレクトリへ保存しても、以前の計算のファイルは残りません。チェックポイント以外のファイルには手を触れません

    • 複数の計算を同時に走らせる場合、同じ tensor_save を指定しないでください。互いの作業用ディレクトリを上書きします

    • 保存できなかった場合、``tenes`` は非ゼロの終了コードで終わります。 測定量のファイルはそれまでどおり書き出されます。チェックポイントのファイルは、各 MPI プロセスが書くテンソルのデータも含めて書き終えた後にすべて確かめるので、ディスク満杯やクォータで途中までしか書けなかったファイルも失敗として扱います。保存の失敗で計算を捨てるのは惜しいものの、終了コードが 0 のままだと、前段の保存を後段が読む形の連鎖(tenes A && tenes B)で、後段が古いチェックポイントから黙ってやり直してしまうためです。ファイルシステムが後になって報告するエラーや、保存後にファイルが壊れたことは検出できません

  • ファイルの移動中に保存が中断された場合

    • チェックポイントを保存先へ移している途中で計算が終了したり、ファイルを移せなかったりすると、<保存先>/.tenes-save-incomplete が残ります。このとき保存先には新しいチェックポイントと直前のチェックポイントが混ざっている可能性があるため、tensor_load はそのチェックポイントの読み込みを拒否し、このファイルの内容を表示します

    • 手で直すには、<保存先>/.tenes-save-tmp/ に残っているファイルをすべて保存先へ移し、.tenes-save-incomplete を削除してください。このファイルにも同じ手順が、作業用ディレクトリの絶対パスとともに書かれています

    • 同じ保存先へ次に保存するときは、書き込みを始める前にこの修復を自動で行います。そこでもファイルを移せなかった場合は、そのファイルで止まり、何も保存せずに非ゼロの終了コードで終わります。まだ移していないファイルは作業用ディレクトリに、.tenes-save-incomplete も保存先に残っているので、上の手順で手で直せます

    • 保存の最後、またはこの自動修復の後で .tenes-save-incomplete だけを削除できなかった場合も、その旨を表示して非ゼロの終了コードで終わります。このときファイルはすべて移し終えているので、このファイルを手で削除すれば読み込めます

  • 読み込み

    • チェックポイントのサイト数が入力と異なる場合や、チェックポイントと入力の一方だけがフェルミオン系である場合は、すべての MPI プロセスで読み込みを拒否します

    • 実数の計算(is_real = true)で保存したテンソルは、基底状態から始める実時間発展のような複素数の計算で読み込めます。読み込み時に複素数へ変換されます。複素数の計算で保存したテンソルは is_real = true の計算では読み込めず、読み込みを拒否します。ヘッダに要素型(value_type)が記録されていないテンソルファイルも、読み込みを拒否します。リリース版の TeNeS が保存したファイルには必ず記録されています

    • 元のテンソルからボンド次元を変更することが可能です。大きくする場合にはゼロ埋めされ、小さくする場合には単純に切り捨てられます。ただしフェルミオン系では、仮想ボンドのパリティ台帳を矛盾無く切り捨てる必要があるため、現在のバージョンでは小さくすることができません。

    • ボンド次元を大きくした場合、拡張された成分はゼロなので、広げた空間を実際に使うには読み込み後に simple update あるいは full update を回す必要があります。測定するだけでは広がりません。

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

  • 諸注意

    • full update は CTM 環境のみ対応しており、meanfield_env = true との組み合わせはエラーになります

    • 非高速版(fastfullupdate = false)ではボンドごとに CTM を再収束するため、fast full update より遅くなります(自由フェルミオン D = 3、chi = 12 で約 9 倍)。フェルミオン系ではこの再収束を直前の環境を初期値として行います(warm start)。ボソン系の非高速版は従来どおり毎回一様ベクトルから収束させます

    • full update が forbidden parity ガードで停止するのは CTM が収束していないためで、多くの場合は状態に対して dimension (chi) が小さすぎます(CTM が落ち着かずに周期的に振れ続けます)。まず [parameter.ctm] の dimension を上げ、次に iteration_max を増やしてください。状態そのものが収束していなければ simple update も長くしてください

    • full update の環境(2サイト環境テンソル)はフェルミオンパリティを保存する必要があり、CTM の収束不足などで破れが閾値(1e-8 と [parameter.ctm] の convergence_epsilon の 100 倍の大きい方)を超えるとエラーで停止します。その場合は [parameter.ctm] の iteration_max を増やすか convergence_epsilon を小さくしてください

    • ボンド次元が小さいとき(例: 自由フェルミオンの D = 2)、simple update で収束した状態から full update を始めるとエネルギーが 上がる ことがあります。これは射影虚時間発展の固定点が、表現力不足の状態空間では simple update の固定点より高くなりうるためです。

parameter.ctm

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

名前

説明

型

デフォルト

dimension

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

整数

4

projector_cutoff

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

実数

1e-12

convergence_epsilon

CTMの収束判定値

実数

1e-6

use_onesite_rdm_convergence

CTMの収束判定に1サイト縮約密度行列の反復間距離も用いる

真偽値

true

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 で得られる平均場環境を用いる。フェルミオン系でも使用でき、測定窓または相関鎖の外側を simple update の lambda で閉じて評価するため CTM 版より大幅に軽いが、精度は simple update 相当

真偽値

false

use_onesite_rdm_convergence が true の場合、角転送行列の特異値スペクトルに加えて、1サイト縮約密度行列の反復間距離を用いて CTM の収束を判定します。 距離は全サイト・全行列要素に対する max 要素ノルムを、その密度行列のトレースで割ったものです(密度行列の形の変化とノルムの相対変化の両方が含まれます)。 次元1の仮想ボンドによってテンソルネットワークが独立な部分に分解する構成、例えば横方向の仮想ボンド次元を1とした擬一次元的な計算では、角スペクトルだけでは収束を誤検知することがあるため、その対策として使われます(アルゴリズムの説明も参照してください)。 (なお、そのような擬一次元的な計算を推奨しているわけではないことに注意してください。TeNeS が対象としているのは2次元格子です。) false にすると、従来の角スペクトルのみの収束判定に戻ります。 収束時の観測量の残差はおおむね convergence_epsilon 程度のスケールになるため、より高精度が必要な場合は convergence_epsilon を小さくしてください。

乱拓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.2.4. correlation セクション

tenes_simple では相関関数 C = <A(0)B(r)> はデフォルトでは計算されません。 相関関数を計算したい場合は、 tenes の入力ファイルで指定する correlation セクションと共通のフォーマットで指定することができます。詳細は、tenes の入力ファイル の correlation セクションをご覧ください。 フェルミオンのスピンレス模型で operators を省略すると [[0, 0], [1, 2]] が使われます。 フェルミオン Hubbard 模型では [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 7], [8, 9]] が使われます。 フェルミオンの相関関数は CTM 環境と meanfield_env = true の両方で使えます。平均場の場合は、相関鎖の外側を simple update の \(\lambda\) で閉じる近似です。パリティが異なる演算子の組は 0 として出力されます。

5.2.5. correlation_length セクション

tenes_simple では使われず、 tenes_std の入力ファイルとしてそのままコピーされます。

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

名前

説明

型

デフォルト

measure

相関長を測るかどうか

真偽値

true

num_eigvals

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

整数

4

maxdim_dense_eigensolver

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

整数

200

arnoldi_maxdim

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

整数

0 (自動)

arnoldi_restartdim

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

整数

0 (自動)

arnoldi_maxiterations

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

整数

0 (自動)

arnoldi_rtol

Arnoldi 法で目指す相対残差

実数

1e-10

eigensolver

転送行列の固有値ソルバ(auto / arpack / builtin)

文字列

auto

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

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

arnoldi_maxdim ・ arnoldi_restartdim ・ arnoldi_maxiterations に 0 以下の値を指定すると(デフォルト)、使用するソルバに応じた値が自動的に使われます。

  • ARPACK-NG: arnoldi_maxdim は \(\max(2 \times \text{num\_eigvals} + 1, 25)\) 、 arnoldi_maxiterations は 10。ARPACK-NG は restart により小さい部分空間でも 確実に収束できるため、小さめの部分空間と多めの restart 回数が効率的です。

  • 組み込みソルバ: arnoldi_maxdim は \(\max(2 \times \text{num\_eigvals} + 1, 50)\) 、 arnoldi_maxiterations は 1。restart に頼らず 1 回の Arnoldi 過程で 収束する大きさの部分空間を使います。

  • arnoldi_restartdim は \(\max(\text{num\_eigvals} + 1, \text{arnoldi\_maxdim} / 2)\) です。

収束に必要な部分空間の次元は固有値の分布(ギャップ)で決まり、行列サイズには ほとんど依存しません。相関長が大きい(臨界点に近い)系では転送行列のスペクトルが 密になり収束が遅くなるため、 arnoldi_maxdim を増やすか、restart 回数 arnoldi_maxiterations を増やしてください。 ARPACK-NG 使用時に部分空間が不足すると、 arnoldi_maxdim が自動(0 以下)の 場合は部分空間を 2 倍(上限は行列サイズ)にしながら収束するまで自動的に再試行します。 arnoldi_maxdim を明示的に指定した場合は再試行せず、未収束の固有値は NaN として 出力され、相関長 \(\xi\) の列も NaN になります (組み込みソルバは未収束でも近似値をそのまま返します)。

行列サイズが maxdim_dense_eigensolver より大きい場合に使う反復固有値ソルバは eigensolver で選べます。

  • "auto" (デフォルト): ARPACK-NG 付きでビルドされていれば ARPACK-NG を、 そうでなければ組み込みの IRA 法を使います。

  • "arpack": ARPACK-NG を使います。ARPACK-NG なしでビルドされたバイナリでは 入力エラーになります(CMake オプション -DENABLE_ARPACK=ON でビルドしてください)。

  • "builtin": 組み込みの IRA 法を使います。

ARPACK-NG を使う場合、 arnoldi_maxdim は Krylov 部分空間の次元 (ncv)、 arnoldi_maxiterations は implicit restart の最大回数、 arnoldi_rtol は Ritz 値の相対残差の許容値として引き継がれます。 arnoldi_restartdim は組み込みソルバでのみ意味を持ちます。