ALPS 2 Tutorials:ED-04 Criticality/ja

From ALPS
Jump to: navigation, search


このチュートリアルでは、臨界スピン鎖と共形場理論(CFT)について学びます。

イジング鎖

まず最初に、次のハミルトニアンで与えられる横磁場イジング鎖を例とします。

H=J_{z} \sum_{\langle i,j \rangle} S^i_z S^j_z + \Gamma \sum_i S^i_x

第一項の和は全ての最近接格子対にわたって取ります。\Gammaは横磁場の強さです。系は\Gamma/J=\frac{1}{2}で臨界となります。横磁場のない系の基底状態はJ>0で反強磁性相、J < 0で強磁性相に属します。この系は厳密に解くことができます。(P. Pfeuty, Annals of Physics: 57, 79-90 (1970)).

臨界点では、この系は共形場理論によって記述されます(review by John Cardy) CFT では、低励起状態は場の演算子とみなされ、このエネルギーはその演算子のスケーリング次元と関係があります。物理的には、スケーリング次元は相関関数の振る舞いを記述します。たとえば、ある演算子(準プライマリ場)の二点相関は次のように表されます。
\langle \phi(r_1) \phi(r_2) \rangle \sim |r_1 - r_2|^{-2\Delta}.
上記の式では、\Deltaはその場のスケーリング次元を表します。 このスケーリング場はその次元によっていくつかのグループをなします。 つまり、スケーリング次元\Delta を持つプライマリ場に、 スケーリング次元 \Delta + n, n \in \lbrace 1, 2, 3, ... \rbrace を持つ無数のセカンダリ場が付随したものです。

横磁場イジングモデルの厳密解(上記論文のEq. (3.7))では、スピンの長距離相関は次のように減衰します。
\langle S^i_z S^{i+n}_z \rangle \sim n^{-2*1/8}
\langle S^i_y S^{i+n}_y \rangle \sim n^{-2*(1+1/8)}
\langle S^i_x S^{i+n}_x \rangle \sim n^{-2*1}
さらに、恒等演算子のスケーリング次元は0であるとします。

この結果から、0, 1/8, 1, 1+1/8というスケーリング次元を持つ場がイジングモデルのCFTで現れることが期待されます。 このことを見るために、すべてのエネルギーをE \rightarrow \frac{E-E_0}{8(E_1-E_0)}のようにリスケーリングします。 そうすると、2つの低励起状態が、スケーリング次元として期待していた場所に現れます。

Pythonでの実行

Pythonを使った計算の実行方法を記述したスクリプト[1]を使用します。スクリプトの最初の部分は計算モデルや、入力ファイルのインポートをおこないます。

import pyalps
import pyalps.pyplot
import numpy as np
import matplotlib.pyplot as plt
import copy
import math

2つのシステムサイズパラメータを設定します。縦磁場hではなく、横磁場Gammaを使用すること注意してください。

data = []
for L in [10,12]:
    parms.append({
        'LATTICE'    : "chain lattice",
        'MODEL'      : "spin",
        'local_S'    : 0.5,
        'Jxy'        : 0,
        'Jz'         : -1,
        'Gamma'      : 0.5,
        'NUMBER_EIGENVALUES' : 5,
        'L'          : L
    })

2つの系を計算し、入力データを設定し計算をおこないます。

prefix = 'ising'
input_file = pyalps.writeInputFiles(prefix,parms)
res = pyalps.runApplication('sparsediag', input_file)
# res = pyalps.runApplication('sparsediag', input_file, MPI=2, mpirun='mpirun')
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix=prefix))

ここで、コメントアウトしてある行のように、ジョブ数とMPI 実行ファイルの設定(デフォルトではmpirun です)をおこなうと、複数のCPUを利用してALPSが実行されます。

計算が終わったら、まず、のちのリスケールのために各々のL に対して基底状態と第一励起状態のエネルギーを集めます。

E0 = {}
E1 = {}
for Lsets in data:
    L = pyalps.flatten(Lsets)[0].props['L']
    allE = []
    for q in pyalps.flatten(Lsets):
        allE += list(q.y)
    allE = np.sort(allE)
    E0[L] = allE[0]
    E1[L] = allE[1]

ALPSはシミュレーション(タスク)ごとにグループ化された結果をロードします: つまり、ここでdataは「各システムサイズにおける、運動量とエネルギーの組のリスト」のリストです。

次に、エネルギーを上述の式でリスケールして、運動量の関数となるようにspectrum に集めます。

for q in pyalps.flatten(data):
    L = q.props['L']
    q.y = (q.y-E0[L])/(E1[L]-E0[L]) * (1./8.)
spectrum = pyalps.collectXY(data, 'TOTAL_MOMENTUM', 'Energy', foreach=['L'])

比較のために、プライマリ場\Delta = 1/8, 1とその最初のセカンダリ場もプロットします。

for SD in [0.125, 1, 1+0.125, 2]:
    d = pyalps.DataSet()
    d.x = np.array([0,4])
    d.y = SD+0*d.x
    spectrum += [d]

最後に、図を作成します。

pyalps.pyplot.plot(spectrum)
plt.legend(prop={'size':8})
plt.xlabel("$k$")
plt.ylabel("E_0")
plt.xlim(-0.02, math.pi+0.02)
plt.show()

Vistrailsでの実行

Vistrailsを用いた計算の実行のチュートリアル[2]を参照してください。

コマンドラインでの実行

コマンドラインでの実行に使用するパラメータファイルは、hereを参照してください。

ハイゼンベルグ鎖

次に、もう少し複雑な模型を考えます。スピン1/2の反強磁性ハイゼンベルグ鎖です。ハミルトニアンは

H = \sum_{\langle i,j \rangle} \mathbf{S}^i \cdot \mathbf{S}^j です。

この模型の臨界現象は中心電荷 c=1 を持つCFT を用いて、スケーリング次元 0, 0.5, 1 を持つプライマリ場で表されます。 イジング模型の場合と違って、有限サイズ効果は対数補正を与えます。

このモデルの臨界理論はprimary fields 0,0.5及び1においてcentral charge c=1を持ちます。イジングモデルとは反対に、有限サイズ補正は対数的に消えます。すなわち、このサイズでは明らかな結果となります。 Pythonファイルはイジング模型のものとほとんど同じなので、ここでは詳細の説明は省略します。 主な違いは、この系の計算ではU(1)対称性を利用することができ、その結果低エネルギー状態の解析にはS_z = 0セクターの計算だけで十分なことです。

スペクトルを見て、共形タワーの分類をして、またエネルギースペクトルがシステムサイズの増大にしたがってどのように真の値に近づいていくのかを見てください。 これはとてもむずかしいということがわかるかと思います。 この系に関する詳細な議論は、I Affleck et al 1989 J. Phys. A: Math. Gen. 22 511や、次のチュートリアルも参照してください。

コマンドラインでの実行

パラメータファイルはこちらを参照してください。