コンテンツにスキップ
ED-01 Sparse Diagonalization

ED-01 Sparse Diagonalization

このチュートリアルでは、反復的な Lanczos アルゴリズムによって量子ハミルトニアンの最低固有状態を求めるスパース対角化プログラム sparsediag の使い方と、得られた固有状態上で任意の物理量を読み出す方法を学びます。

一次元ハイゼンベルク鎖上の測定

最初の例として、スピン S=1 の等方的な反強磁性ハイゼンベルク鎖を考えます。

H=Ji,jSiSj,J>0, H = J \sum_{\langle i,j \rangle} \mathbf{S}_i \cdot \mathbf{S}_j , \qquad J>0 ,

和は周期的な鎖上の最近接ボンドについて取られます。この模型は整数スピン反強磁性体の典型例です。Haldane は、この模型が一意でギャップを持つ基底状態を持ち、スピン相関が指数関数的に減衰し、運動量 q=πq=\pi に短距離反強磁性秩序のピークが現れることを予言し、その後の数値計算によって確認されました(F.D.M. Haldane, Phys. Rev. Lett. 50, 1153 (1983))。厳密対角化を用いると、有限鎖の基底状態波動関数に直接アクセスでき、そこから任意の相関関数や構造因子を厳密に計算できます——本チュートリアルでは、sparsediag からこうした測定を要求する方法を示します。有限サイズギャップそのものは次のチュートリアル ED-02 の主題です。

パラメータ

パラメータ意味
LATTICE内蔵の周期的一次元格子chain lattice
MODEL量子スピン模型spin
local_S各サイトのスピン量子数1
J最近接ハイゼンベルク結合1
Lサイト数4
CONSERVED_QUANTUMNUMBERSハミルトニアンをブロック対角化するために用いる対称性Sz
MEASURE_CORRELATIONS[...]計算された各固有状態について SizSjz\langle S^z_iS^z_j\rangleSi+Sj\langle S^+_iS^-_j\rangle を要求する下記参照
MEASURE_STRUCTURE_FACTOR[...]相関関数のフーリエ変換を要求するSzS^z

格子

chain latticeALPS格子ライブラリに内蔵されている幾何構造の一つで、L 個のサイトを環状に配置し、強度 J の周期的な最近接ボンドで結びます。

      J     J     J
  o-------o-------o-------o
  0       1       2       3
  |___________________________|
              J   (bond 3-0, periodic)

手法

サイト数 L=4 の S=1 鎖のヒルベルト空間の次元は 34=813^4=81 であり、Sz 量子数を用いると次元19の Sz=0S_z=0 セクターに分解されます。ここでは基底状態のみが必要であり(下記の構造因子と相関関数についても他の固有状態は不要です)、sparsediag が実装する反復的な Lanczos アルゴリズムが自然な選択です。これは、81×8181\times 81 の行列全体を構成したり対角化したりすることなく、わずかな回数の行列-ベクトル積でスパースハミルトニアンの最低固有対を収束させます。

コマンドラインを用いる方法

パラメータファイル parm1a は、4サイトの量子力学的 S=1 鎖の厳密対角化を設定します。

MODEL="spin"
LATTICE="chain lattice"
CONSERVED_QUANTUMNUMBERS="Sz"
MEASURE_STRUCTURE_FACTOR[Structure Factor Sz]=Sz
MEASURE_CORRELATIONS[Diagonal spin correlations]=Sz
MEASURE_CORRELATIONS[Offdiagonal spin correlations]="Splus:Sminus"
local_S=1
J=1
{L=4;}

他のコードと比べて新しいのは、どの演算子平均、局所値、相関関数、構造因子を測定するかを指定する測定パラメータです。これらのカスタム測定の詳細についてはこちらをご覧ください。 標準的な一連のコマンドを使い、まず入力パラメータを XML に変換し、続いてアプリケーション sparsediag を実行します(これらの実行ファイルは ALPS インストールディレクトリの bin ディレクトリにあります。このディレクトリを PATH に追加しておくと ALPS の作業がしやすくなります)。

parameter2xml parm1a
sparsediag --write-xml parm1a.in.xml

最低の固有値と固有状態は、P が全運動量を表す各セクター (Sz,P) ごとに計算されます。出力ファイル parm1a.task1.out.xml には計算されたすべての物理量が含まれており、通常のウェブブラウザで閲覧できます。この場合、基底状態は Sz=0、P=0 のセクターにあります。XML ファイルに示されている対応する対角スピン相関は次のようになります。

Diagonal spin correlations[( 0 ) -- ( 0 )]    (0.666667,0)
Diagonal spin correlations[( 0 ) -- ( 1 )]    (-0.5,0)
Diagonal spin correlations[( 0 ) -- ( 2 )]    (0.333333,0)
Diagonal spin correlations[( 0 ) -- ( 3 )]    (-0.5,0)

上記の括弧内の数字 [( a ) – ( b )] はサイト番号、すなわち Sz(a)*Sz(b) を表します。右側の列にはその相関関数の(複素)値が示されています。 この状態における Sz 構造因子の出力は次のようになります。

Structure Factor Sz[( 0 )]                    5.551115123125783e-17
Structure Factor Sz[( 1.570796326794897 )]    0.333333333333333
Structure Factor Sz[( 3.141592653589793 )]    2
Structure Factor Sz[( -1.5707963267948966 )]    0.3333333333333329

ここで括弧内の数字 [(q)] は波数を表します。 パラメータファイルに次の行を追加することで、Sz セクターを明示的に制限できます。

Sz_total=0

Python を用いる方法

Python でシミュレーションを設定・実行するには、スクリプト tutorial1a.py を使用します。このスクリプトの最初の部分では、必要なモジュール pyalps をインポートし、入力パラメータを Python の辞書のリストとして準備し、入力ファイルを書き出してアプリケーションを実行します。

import pyalps
parms = [{ 
        'LATTICE'                   : "chain lattice", 
        'MODEL'                     : "spin",
        'local_S'                   : 1,
        'J'                         : 1,
        'L'                         : 4,
        'CONSERVED_QUANTUMNUMBERS'  : 'Sz',
        'MEASURE_STRUCTURE_FACTOR[Structure Factor Sz]'       : 'Sz',
        'MEASURE_CORRELATIONS[Diagonal spin correlations]='   : 'Sz',
        'MEASURE_CORRELATIONS[Offdiagonal spin correlations]' : 'Splus:Sminus'
    }]

input_file = pyalps.writeInputFiles('parm1a',parms)
res = pyalps.runApplication('sparsediag',input_file)

これで Python を起動してスクリプト tutorial1a.py を実行できます。コマンドライン版と同じ出力ファイルが得られます。 次に、計算された各固有状態の測定結果を読み込みます。

data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm1a'))

そして基底状態についてのみ結果を表示します。

for sector in data[0]:
    print '\nSector with Sz =', sector[0].props['Sz'], 
    print 'and k =', sector[0].props['TOTAL_MOMENTUM']
    for s in sector:
        if pyalps.size(s.y[0])==1:
            print s.props['observable'], ' : ', s.y[0]
        else:
            for (x,y) in zip(s.x,s.y[0]):
                print  s.props['observable'], '(', x, ') : ', y

まとめ

L=4 の S=1 鎖では、基底状態は (Sz,P)=(0,0)(S_z,P)=(0,0) セクターにあり、対角相関は距離とともに符号が交互に変わりながら減衰する短距離反強磁性的な振る舞いを示し、静的構造因子は q=πq=\pi で強いピーク(値は2、隣接する運動量では約0.33)を持ちます——これは、このように非常に小さな系であってもすでに現れている、ギャップを持つ Haldane 鎖に期待される短距離ネール的秩序の兆候です。

問題

  • Diagonal spin correlations[( 0 ) -- ( b )]bb が 0 から 3 に増加するにつれてなぜ符号が交互に変わるのでしょうか。
  • q=πq=\pi における構造因子のピークは発散せず有限の値(2)を取ります。LL を大きくするにつれて、このピークは増大する、減少する、それとも変わらないと予想されますか?(ED-02 で計算する有限サイズギャップと比較してみてください。)
  • MEASURE_AVERAGE[Energy per bond]=bond_energy を追加する(あるいは全エネルギーを直接読み出す)ことで、SiSj=SizSjz+12(Si+Sj+SiSj+)\mathbf{S}_i\cdot\mathbf{S}_j = S^z_iS^z_j + \tfrac12(S^+_iS^-_j+S^-_iS^+_j) を用いて、上で出力された対角・非対角相関と整合しているかを確認してください。