ALPS 2 Tutorials:DMRG-04 Correlations/ja

From ALPS
Revision as of 06:57, 23 February 2012 by Kota (talk | contribs) (Created page with "{{Languages|ALPS_2_Tutorials:DMRG-04_Correlations}} = 相関関数 = <!--The most important correlation functions in many-body physics are two-point correlators, i.e. correlato…")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

相関関数

多体物理における最も重要な相関関数は、\langle S^+_i S^-_j \rangleのようなijの2つの相関についてです。近距離の相関はエネルギーを決め、長距離のものは相関長を決めます。

Another Go At The Energy Per Bond

すでに説明したように、スピン-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を外挿します。

個の計算をおこなう前に、あまり小さすぎないLe_0(i)にてiに対してDのいくつかの値をプロットしてみてください。(プログラムのチェックとして、3つの値がどのような関係にあるか考えてみてください。)

スピン-1、スピン-1/2ではそれぞれどうでしたか?

スピン-1/2では、結合エネルギーは奇数と偶数の間で強く振動します。理由は、開放端自体が非常に強く臨界に起因する影響をうけ、スピン-1/2鎖が2量化するからです。たとえば、定常状態での並進対称の自発的な破壊によって2つめの周期に落ちるということです。すなわち、平均的なエネルギーを外挿することは有益であり、すぐに正確な計算値を得ることができるでしょう。様々な局所的な計算結果を詳細にみて考察してみてください。

スピン-スピン相関: スピン-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をプロットしてみます。目的は、鎖中心の相関子について、可能な限り境界の効果を小さくするためです。他にも、同じサイト距離での、いくつかの相関子の平均をとる方法があります。べき法則となるので、log-logでプロットします。絶対値をとるか、または反強磁性係数(-1)^lを掛けてください。

理解すべきことは、近距離でのべき乗則ですが、長距離で指数関数的に減衰していることです。ことことは2つの理由があります。(i)有限サイズの系ではべき則相関をカットオフしますが、ここでは大規模サイズを取り扱っていますので、あまり影響はありません。(ii)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スクリプトは異なる3タイプのDを計算し、結果のロードをおこないます。

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の相関子の指数関数的特性がよく適合しなくてはなりません。再び、長鎖(L=192)を選択し、いくつかのDでの \langle S^z_i S^z_j \rangleを計算してみましょう。

スピン-1/2の時と同様に、C_l = \langle S^z_{L/2-l/2} S^z_{L/2+l/2} \rangleをプロットします。log-linプロットを用いて、負符号を排除します。指数関数的プロットになることが予想されます。

log-linプロットから、相関長を抽出します。(単調に増加し)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"を開いてください。

Sometimes There Is A Way Out

スピン-1の特殊なケースで、相関長の計算で抜け穴があります。それは第一励起がバルク励起ではないという怪しい計算結果に関連しています。スピン-1鎖の良いモデルでは次のように与えられます。各スピン-1サイトに、2つのスピン-1/2を入れ、各サイトで2つのスピン-1/2の三重項状態からspin-1状態を構築します。それから、定常状態は、一重項状態によってneighbouringサイトで2つのスピン-1/2をリンクする状態によって近似します。

この構造は、開境界条件で、最初と最後のサイトはパートナーを持たず、2つの孤立なスピン-1/2を持つことになります。この2つのスピン-1/2は、小さなモデルに縮退している、4つの状態を形勢することができます。定常状態は4重縮退です。実際のスピン-1鎖では、この四重縮退(1つのトータルスピン0と3つのトータルスピン1)は2つのスピンがお互い完全に離れた状態にある熱力学的極限でのみ見られます。磁化のセクタ0と1にギャップが無かった理由はここにあります。第一バルク励起は磁化2を必要とします。

これに対処するために、どうすればいいか?最初のサイトの前、最後のサイトの後に、同じbondハミルトニアンをとり、1つのスピン-1/2を追加することです。2つの孤立スピンにリンクさせるということです。磁化のセクタ0、1のギャップを確認してみてください。

相関長を計算するために、次のようなテクニックを紹介します。1つだけスピン-1/2を添付する方法です。これは、定常状態は磁化セクタ+1/2や-1/2で二重に縮退することを意味します。そして、スピン-1/2が存在しない境界サイトで特徴付けられます。

鎖長L=192D=200で、定常状態の磁化を計算してみてください。(符号の振動を除去し)サイトに対して、log-linプロットし、相関長を抽出してみてください。どのようになりますか?