ALPS 2 Tutorials:DMRG-04 Correlations/ja

From ALPS
Jump to: navigation, search

相関関数

多体物理における最も重要な相関関数は、\langle S^+_i S^-_j \rangleのような格子状の2点ijにおけるの2つの物理量の相関です。(近距離相互作用だけからなる系では)近距離の相関からはエネルギーが得られ、長距離の相関からは相関長が求まります。

ボンドエネルギー再訪

すでに説明したように、スピン1/2鎖とスピン1鎖のボンドあたりのエネルギー期待値はともに次式で与えられます。

e_0(i) = \frac{1}{2} (\langle S^+_i S^-_{i+1}\rangle  + \langle S^-_i S^+_{i+1}\rangle ) + \langle S^z_i S^z_{i+1} \rangle

各ボンドごとに個別のエネルギーが得られますが、熱力学的極限では、並進対称性が破れない限り全ボンドは等価であり、すべてのボンドでエネルギーもまた等しくなります。

有限長の鎖では、鎖の中心近くにあるボンドが、最も熱力学的極限でのそれに近い振る舞いをします。 そこで、e_0(L/2)を計算し、鎖長Lを固定したままDを外挿して、その後にL を外挿します。

この計算をおこなう前に、あまり小さすぎないL で、いくつかのD についてiに対するe_0(i) のグラフをプロットしてみてください。(e_0(i) の中の3つの項の値を個別に計算し、それぞれどのような関係にあるかということも考えてみてください。) スピン1/2 とスピン1 のハイゼンベルグ鎖について、どのような結果が得られたでしょうか?

スピン1/2では、ボンドエネルギーは、偶数番目のボンドと奇数番目のボンドとで強く振動します。 スピン1/2反強磁性ハイゼンベルグ鎖は臨界状態にあるのですが、開放端の影響をうけ二量体化し、並進対称性が破れて周期が1から2になるためです。 DL について外挿する前に、2種類のボンドエネルギーの値そのものではなく、それらの平均値を外挿することで、より正確な結果を得ることができます。 この事例は、DMRG でマクロな物理量を求めたい場合でも、局所的な物理量のふるまいを注意深く見ることが重要であることを示す新たな例となっています。

スピン-スピン相関: スピン-1/2

比較的長い鎖(たとえばL=192) で、様々なDに対して \langle S^z_i S^z_j \rangleを計算します。

距離lだけ離れたスピン相関の計算には、C_l = \langle S^z_{L/2-l/2} S^z_{L/2+l/2} \rangleを用います。 これは、鎖の中心で相関を測ることで、可能な限り境界の効果を小さくするためです。他の方法として、同じ距離での相関関数をいくつかのサイトを起点として計算し、その平均をとる方法があります。 系が臨界であり、相関関数がベキ減衰することを確かめたいので、相関関数の両対数プロットを行います。相関関数は正負で振動するため、絶対値をとるか、または反強磁性係数(-1)^lを掛けてください。

相関関数は近距離ではベキ減衰しますが、長距離では指数関数的に減衰していることが見て取れるはずです。これには2つ原因があります。 (i) 有限サイズ効果。ただし、今回は大きな系の計算をしているため、それほど影響を及ぼしません。 (ii) DMRG のアルゴリズム上の問題。DMRG で得られる波動関数はD^2 個の指数関数的に減衰する相関関数を持った状態であり、 それらの重ね合わせによってベキ減衰を(擬似的に)実現しています。長距離では、最も減衰が遅い波動関数だけが生き残り、その結果ベキ減衰が指数関数的減衰に置き換わります。

パラメータファイル

spin_one_halfはサンプル計算のためのパラメータファイルです (簡単のため、システムサイズ・状態数カットオフともに少なめにしてあります)。サイズはL=32で、 複数の異なる状態数カットオフDを、掃引回数6で実行します。得られた相関関数が対称となることを確認してください。

LATTICE="open chain lattice"
MODEL="spin"
CONSERVED_QUANTUMNUMBERS="N,Sz"
Sz_total=0
SWEEPS=6
J=1
NUMBER_EIGENVALUES=1
MEASURE_AVERAGE[Magnetization]=Sz
MEASURE_AVERAGE[Exchange]=exchange
MEASURE_LOCAL[Local magnetization]=Sz
MEASURE_CORRELATIONS[Diagonal spin correlations]=Sz
MEASURE_CORRELATIONS[Offdiagonal spin correlations]="Splus:Sminus"
L=32
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }

Pythonの使用

spin_one_half.pyスクリプトは、上記パラメータのもとでの計算およびその結果のロードを行います。

import pyalps
import numpy as np
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for D in [20,40,60]:
   parms.append( { 
       'LATTICE'                               : 'open chain lattice', 
       'MODEL'                                 : 'spin',
       'CONSERVED_QUANTUMNUMBERS'              : 'N,Sz',
       'Sz_total'                              : 0,
       'J'                                     : 1,
       'SWEEPS'                                : 6,
       'NUMBER_EIGENVALUES'                    : 1,
       'L'                                     : 32,
       'MAXSTATES'                             : D,
       'MEASURE_AVERAGE[Magnetization]'        : 'Sz',
       'MEASURE_AVERAGE[Exchange]'             : 'exchange',
       'MEASURE_LOCAL[Local magnetization]'    : 'Sz',
       'MEASURE_CORRELATIONS[Diagonal spin correlations]'      : 'Sz',
       'MEASURE_CORRELATIONS[Offdiagonal spin correlations]'   : 'Splus:Sminus'
      } )
input_file = pyalps.writeInputFiles('parm_spin_one_half',parms)
res = pyalps.runApplication('dmrg',input_file,writexml=True)
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm_spin_one_half'))

Sz:Sz相関を抽出します。

curves = []
for run in data:
   for s in run:
       if s.props['observable'] == 'Diagonal spin correlations':
           d = pyalps.DataSet()
           d.props['observable'] = 'Sz correlations'
           d.props['label'] = 'D = '+str(s.props['MAXSTATES'])
           L = int(s.props['L'])
           d.x = np.arange(L)
           
           # sites with increasing distance l symmetric to the chain center
           site1 = np.array([int(-(l+1)/2.0) for l in range(0,L)]) + L/2
           site2 = np.array([int(  l   /2.0) for l in range(0,L)]) + L/2
           indices = L*site1 + site2
           d.y = abs(s.y[0][indices])
           
           curves.append(d)

距離に対してプロットします。

plt.figure()
pyalps.plot.plot(curves)
plt.xscale('log')
plt.yscale('log')
plt.legend()
plt.title('Spin correlations in antiferromagnetic Heisenberg chain (S=1/2)')
plt.ylabel('correlations $| \\langle S^z_{L/2-l/2} S^z_{L/2+l/2} \\rangle |$')
plt.xlabel('distance $l$')
plt.show()

Vistrailsの使用

dmrg-04-correlations.vtを使用します。ワークフローの"spin 1/2"ラベルを選択してください。

スピン-スピン相関: スピン1

スピン1鎖では、相関関数は指数関数的に減衰することが予想されます。 DMRG では指数関数的に減衰する波動関数を扱うので、この系ではDMRG の計算が適している事になります。スピン1/2 の時と同様に、長い鎖(L=192)について、いくつかのDでの \langle S^z_i S^z_j \rangleを計算してみましょう。

C_l = \langle S^z_{L/2-l/2} S^z_{L/2+l/2} \rangleをプロットします。指数関数的減衰になっていることを確かめるために、片対数プロットを行います。 正負の振動を忘れずに除去してください。

片対数プロットから、相関長を求めます。これはDを増やすに従って単調増加していきます。 D=300になったとき収束しましたか? 収束の早さについて、局所的な物理量、例えば磁化やボンドエネルギーと比較をおこなってみてください。

実際、相関長の計算は、局所的な量よりも収束が遅く計算が困難です。 DMRG は局所的な量の表現に最適化されていることがわかっています。

パラメータファイルの使用

コマンドでの実行用のパラメータファイルはspin_oneです。前のサンプルと似ていますが、格子モデルが変更されています。

LATTICE_LIBRARY="my_lattices.xml"
LATTICE="open chain lattice with special edges 32"
MODEL="spin"
local_S0=0.5
local_S1=1
CONSERVED_QUANTUMNUMBERS="N,Sz"
Sz_total=0
SWEEPS=6
J=1
NUMBER_EIGENVALUES=1
MEASURE_AVERAGE[Magnetization]=Sz
MEASURE_AVERAGE[Exchange]=exchange
MEASURE_LOCAL[Local magnetization]=Sz
MEASURE_CORRELATIONS[Diagonal spin correlations]=Sz
MEASURE_CORRELATIONS[Offdiagonal spin correlations]="Splus:Sminus"
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }

Pythonの使用

同様に、格子モデルに変更があります。Pythonスクリプトspin_one.pyです。

parms = []
L = 32
for D in [20,40,60]:
   parms.append( { 
       'LATTICE_LIBRARY'                       : 'my_lattices.xml',
       'LATTICE'                               : 'open chain lattice with special edges '+str(L),
       'MODEL'                                 : 'spin',
       'local_S0'                              : 0.5,
       'local_S1'                              : 1,
       'CONSERVED_QUANTUMNUMBERS'              : 'N,Sz',
       'Sz_total'                              : 0,
       'J'                                     : 1,
       'SWEEPS'                                : 4,
       'NUMBER_EIGENVALUES'                    : 1,
       'MAXSTATES'                             : D,
       'MEASURE_AVERAGE[Magnetization]'        : 'Sz',
       'MEASURE_AVERAGE[Exchange]'             : 'exchange',
       'MEASURE_LOCAL[Local magnetization]'    : 'Sz',
       'MEASURE_CORRELATIONS[Diagonal spin correlations]'      : 'Sz',
       'MEASURE_CORRELATIONS[Offdiagonal spin correlations]'   : 'Splus:Sminus'
      } )

計算終了後、相関は以前と同じ手法にて抽出、プロットすることができます。

Vistrailsの使用

Vistrailsのファイルdmrg-04-correlations.vtです。ワークフロー"spin 1"を開いてください。

スピン1鎖の抜け穴

スピン1 の反強磁性ハイゼンベルグ鎖は特殊な系となっていて、相関長を計算するためのある種の特別な手法があります。 これは、開放鎖の第一励起はバルク系には現れないという興味深い事実と関係しています。 このことを次のトイモデルで説明してみましょう。各サイトにある大きさ1のスピンを、大きさ1/2 を持った2つのサブスピンの三重項状態とみなします。 基底状態では、それぞれのサブスピンが、隣のサイトのサブスピンと結合し、一重項状態を組んだものとしてよく表すことができます。

系に(周期的境界条件ではなく)開放端境界条件が課されている時、端のサイトではそれぞれ1つずつ、あわせて2つのサブスピン1/2 が一重項状態をとらずに残されます。 この端状態はエネルギーが同じ4つの状態を持ち、結果としてこのトイモデルの基底状態は4重に縮退します。 実際の有限系では、鎖長が十分長くなり、2つの端スピンが十分離れることで4重縮退が実現します(さもなければ、一重項状態と三重項状態に分離します)。 このことは開放系で全磁化0のセクターと1のセクターとの間にエネルギーギャップがないことの理由でもあります。

これを回避する方法があります。鎖の両端に、大きさ1/2 のスピンを付け加えて、もともと余っていた端スピンと一重項状態を組ませるのです。 実際に計算することで、全磁化0のセクターと1のセクターとの間に有限のエネルギーギャップが開くことを確認できるでしょう!

同様のトリックを使うことで、スピン1の反強磁性ハイゼンベルグ鎖の相関長を計算することができます。 片方の端のみにスピン1/2 をくっつけます。 これにより基底状態は、フリーな端スピンの向きに応じて全磁化+1/2 と-1/2 をとる二重縮退となります。 このフリーな端スピンを起点とした相関関数を計算することで相関長が得られます。

実際に L = 192, D = 200 での計算を行い、サイトごとの局所磁化を片対数プロットしてみましょう。