箱の中の粒子
ALPS アプリケーション:相互作用のない DMRG
相互作用のない DMRG パッケージは、ALPS プロジェクトのアプリケーションの一つです。1 で示されたサンプルプログラムに基づき、相互作用のない量子系に対する簡略化された DMRG プログラムの汎用的な実装を提供します。 このアプリケーションは、任意の格子上の強束縛系および拡張された強束縛系(例えば次近接ホッピングや外部局所ポテンシャルなどを含むもの)のシミュレーションをサポートしています。系の基底状態エネルギーと基底状態の波動関数を計算します。このプログラムでは相互作用項を扱うことはできないことに注意してください。 このプログラムは本格的な計算ツールとして意図されたものではありません。むしろ、単純な相互作用のない問題を通じて DMRG 法がどのように機能するかを示すことが主な目的です。そのためには、ソースコード自体のコメントが役に立つはずです。
シミュレーションの実行
シミュレーションを実行するには、例えば次のようなパラメータファイルを作成する必要があります。
LATTICE_LIBRARY = "lattices.xml"
LATTICE = "chain lattice"
L = 20
SWEEPS = 100
OUTPUT_LEVEL = 1
WAVEFUNCTION_FILE = "psi.dat"
t = 1.2
V = 0
これらのパラメータは、lattices.xml ファイルで定義された “chain lattice” を用いた、1 粒子の強束縛モデルの計算を記述しています。“chain lattice” は、パラメータ L(この例では L=20 と指定)で与えられる長さの 1 次元周期格子を定義します。ホッピングパラメータ t は格子のボンド間に作用するため、格子が実質的に境界条件を指定することになります(“chain lattice” の場合は周期境界条件です)。DMRG ではよくあることですが、開放境界条件の方が周期境界条件よりも効率的で、はるかに少ないスイープ数で収束します。このシミュレーションでは、100 回の完全な DMRG スイープを実行します。変数 OUTPUT_LEVEL はスイープ中に出力されるデバッグ情報の量を指定し、数値が大きいほど多くの情報が出力されます。計算を開始するには、格子ライブラリ lattices.xml がカレントディレクトリにあることを確認し、単に simple_dmrg < parameters を実行します。得られた波動関数は、標準出力と、WAVEFUNCTION_FILE で指定された出力ファイルに書き出されます。
入力パラメータ
シミュレーションは、パラメータファイルで指定できる以下の入力パラメータによって制御されます。
| 名前 | デフォルト値 | 説明 |
|---|---|---|
| LATTICE_LIBRARY | lattices.xml | 格子の記述を含むファイルへのパス |
| LATTICE | 格子の名前 | |
| t | 1 | 最近接ホッピング項の強さ |
| t# | 0 | タイプ # (#=0,1,…) のボンド上のホッピングパラメータ |
| V | 0 | すべてのサイトに加える局所ポテンシャル |
| V# | 0 | タイプ # (#=1,2,…) のサイト上の局所ポテンシャル |
| SWEEPS | 有限系スイープの回数 | |
| OUTPUT_LEVEL | 1 | スイープ中の出力情報の量 |
| WAVEFUNCTION_FILE | 出力ファイル | |
| PRECISION | 10 | 出力ストリームの精度 |
系の性質:境界条件と広がり
境界条件と(1 次元または高次元での)系の広がりは、格子ライブラリで記述されます。
次近接ホッピング項
最近接サイト以外へのホッピング項は、格子を指定する際に別の単位胞を用いることで指定できます。異なるホッピング項は異なるボンドタイプに対応させ、そのホッピングパラメータはパラメータファイル中の t# で制御します。t0 のデフォルトは t であり、それ以外の t# のデフォルトはすべて 0 です。
局所ポテンシャル
パラメータ V は、外部ポテンシャルとして用いられる関数を指定します。一様な追加ポテンシャルはその強さを表す 1 つの数値で指定しますが、より興味深いのは、V を格子サイトの座標の関数とすることで空間的に変化するポテンシャルを与える場合です。例えば、次のパラメータファイルは 1 次元調和ポテンシャル中の粒子をシミュレートします。
LATTICE_LIBRARY = "lattices.xml"
LATTICE = "chain lattice"
L = 200
SWEEPS = 20
V = 4 * (x/L - 0.5) * (x/L - 0.5)
周期ポテンシャルは、そのフーリエ級数展開によって指定できます。例えば、幅 N/L の三角波ポテンシャルは近似的に次のように指定されます。
K = 2*3.1415927*N/L
V = cos(K*x) + cos(3*K*x) / 9 + cos(5*K*x) / 25 + cos(7*K*x) / 36
V は格子のすべてのサイトに加えられる外部ポテンシャルを指定することに注意してください。特定のサイトタイプにのみポテンシャルを割り当てることも可能で、これは関数 V#(# は格子の記述で指定されたサイトタイプ)を指定することで行います。V# ポテンシャルが定義されている場合、該当するサイトでは全体のポテンシャル V に加算されます。 繰り返しになりますが、周期系や複雑なポテンシャルの場合、収束はかなり遅くなることがあります。三角波ポテンシャルの場合、N=4 で 40 サイトなら 100 回のスイープで十分に良い収束が得られますが、100 サイトで N=10 の場合と比較してみてください。これは、最初の本来の DMRG スイープの前に波動関数を構築する方法が単純すぎることが一因です。
出力
出力は、パラメータ OUTPUT_LEVEL、WAVEFUNCTION_FILE、PRECISION によって制御されます。 OUTPUT_LEVEL パラメータは 0 から 4 までの値を取ります。値が大きいほど、有限系スイープ中に出力される情報量が多くなります。デフォルトは 1 で、各スイープの終わりにエネルギーを表示します。レベル 4 では大量の出力が生成され、デバッグや計算の詳細を非常に細かく追う場合にのみ役立ちます。 出力ファイルは WAVEFUNCTION_FILE で指定し、パラメータ PRECISION で出力結果の精度を設定します。WAVEFUNCTION_FILE は、xmgrace で直接プロットできる形式になっています(例えば “xmgrace psi.dat”)。
測定
このシンプルな dmrg アプリケーションでは、基底状態エネルギーと基底状態の波動関数のみが計算されます。観測量は、出力された波動関数に基づいて後から計算できます。
貢献者
以下の方々が相互作用のない dmrg アプリケーションに貢献しました。
- Salvatore Manmana
- Ian McCulloch
- Matthias Troyer
- Reinhard Noack
I. Peschel, X. Wang, M. Kaulke, and K. Hallberg, Chapter 3 of “Density Matrix Renormalization - A New Numerical Method in Physics” (Springer, Berlin, 1999). ↩︎