Difference between revisions of "ALPS 2 Tutorials:ED-05 ED Phase Transition/ja"

From ALPS
Jump to: navigation, search
m (Text replace - "/tutorials2.0.0/" to "/tutorials2.1.0/")
m (Text replace - "http://alps.comp-phys.org/static/tutorials2.1.0" to "http://alps.comp-phys.org/static/tutorials2.2.0")
Line 165: Line 165:
 
== VisTrails、コマンドラインでの実行 ==
 
== VisTrails、コマンドラインでの実行 ==
  
VisTrails用の[http://alps.comp-phys.org/static/tutorials2.1.0/ed-05-nnn-chain/ed-05-nnn-chain.vt ファイル]です。コマンドライン実行用のパラメータファイルは[http://alps.comp-phys.org/static/tutorials2.1.0/ed-05-nnn-chain/parm_nnn-pt こちら]です。
+
VisTrails用の[http://alps.comp-phys.org/static/tutorials2.2.0/ed-05-nnn-chain/ed-05-nnn-chain.vt ファイル]です。コマンドライン実行用のパラメータファイルは[http://alps.comp-phys.org/static/tutorials2.2.0/ed-05-nnn-chain/parm_nnn-pt こちら]です。
  
 
= 第2近接結合を持つハイゼンベルグ鎖: CFT assignments =
 
= 第2近接結合を持つハイゼンベルグ鎖: CFT assignments =
Line 194: Line 194:
  
  
実行スクリプトはED-04のものとよく似ています。こちら[http://alps.comp-phys.org/static/tutorials2.1.0/ed-05-nnn-chain/nnn-heisenberg.py]を参照してください。
+
実行スクリプトはED-04のものとよく似ています。こちら[http://alps.comp-phys.org/static/tutorials2.2.0/ed-05-nnn-chain/nnn-heisenberg.py]を参照してください。
  
 
== VisTrails,コマンドラインでの実行 ==
 
== VisTrails,コマンドラインでの実行 ==
  
VisTrails用の[http://alps.comp-phys.org/static/tutorials2.1.0/ed-05-nnn-chain/ed-05-nnn-chain.vt ファイル]です。コマンドライン実行用のパラメータファイルは[https://alps.comp-phys.org/static/tutorials2.1.0/ed-04-criticality/parm_nnn-heisenberg こちら]です。
+
VisTrails用の[http://alps.comp-phys.org/static/tutorials2.2.0/ed-05-nnn-chain/ed-05-nnn-chain.vt ファイル]です。コマンドライン実行用のパラメータファイルは[https://alps.comp-phys.org/static/tutorials2.1.0/ed-04-criticality/parm_nnn-heisenberg こちら]です。

Revision as of 22:04, 28 September 2013


第2近接相互作用を持つハイゼンベルグ鎖の臨界点

このチュートリアルでは、ハイゼンベルグ鎖について前回のED-04の補足をおこないます。ハミルトニアンに第2近接結合項J_1 \sum_{\langle \langle i,j \rangle \rangle} S_i \cdot S_jを加えてみましょう。

J_2 = 0の極限では、このモデルはBethe仮説によって、ハイゼンベルグ鎖の臨界点まで減少します。 J_2/J_1=0.5でも, [1][2]によって解くことが可能です。基底状態は、
|\Psi\rangle = \left(|\uparrow\rangle_1 |\downarrow\rangle_2 - |\downarrow\rangle_1 |\uparrow\rangle_2\right) (|\uparrow\rangle_3 |\downarrow\rangle_4 - |\downarrow\rangle_3 |\uparrow\rangle_4) (|\uparrow\rangle_5 |\downarrow\rangle_6 - |\downarrow\rangle_5 |\uparrow\rangle_6)になります。

これらのことは、J_1/J_2 \in (0,1/2)での相転移の過程を示しています。(http://pre.aps.org/pdf/PRE/v76/i6/e061108を参照してください。)

最初のチュートリアルでは、スペクトル(特に異なる対称セクタでのギャップ)が結合を調整することによってどのように変化するか観察し臨界点を特定します。二番目は、臨界鎖のCFTを取り上げます。解析的に、臨界点モデルはハイゼンベルグ鎖として同じCFTによって記述されます。しかし、数値的に有限サイズの補正の損失となる周辺演算子のweightは0になります。したがって、スケーリングの次元はより正確になります。

そこで、基底状態のエネルギーと一重項励起(S_z = 0)、3重項 (S_z=1)セクタを図示してみましょう。

Pythonでの実行

次の手順に計算を開始します。

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

量子数QUNATUMNUMBERを S_zとし、セクタS_z=0,1でシミュレーションをおこないます。小さいサイズでも影響が観察できるので、系のサイズはL=6,8で十分です。

prefix = 'alps-nnn-heisenberg'
parms = []
for L in [6,8]:
    for Szt in [0,1]:
      for J1 in np.linspace(0,0.5,6):
          parms.append({
              'LATTICE'              : "nnn chain lattice",
              'MODEL'                : "spin",
              'local_S'              : 0.5,
              'J'                    : 1,
              'NUMBER_EIGENVALUES'   : 2,
              'CONSERVED_QUANTUMNUMBER' : 'Sz',
              'Sz_total'             : Szt,
              'J1'                   : J1,
              'L'                    : L
          })

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

データ解析は以前のチュートリアルのものより少し複雑です。特に、階層的なデータセットに依存しています。物理現象を理解するために、基底状態と第一励起状態のみ見れば十分でしょう。もしあなたがギャップの計算に混乱しているのならば、あまり考えすぎないでください。

最初に、J1、L、Sz_totalのセットに対してエネルギーを結合します。パラメータJ1,L,Sz_totalをグループ化します。groupedループの各要素は、異なる運動量でのデータセットリストを持つことになります。dict_intersectは単にdictionariesのリストを得て、それに当てはまるパートを返します。また、yをソートするインデックスリストを得るためにnumpyのargsort関数を使用しています。


grouped = pyalps.groupSets(pyalps.flatten(data), ['J1', 'L', 'Sz_total'])
nd = []
for group in grouped:
    ally = []
    allx = []
    for q in group:
        ally += list(q.y)
        allx += list(q.x)
    r = pyalps.DataSet()
    sel = np.argsort(ally)
    r.y = np.array(ally)[sel]
    r.x = np.array(allx)[sel]
    r.props = dict_intersect([q.props for q in group])
    nd.append( r )
data = nd


次に、S_z=0セクタからS_z=1で起こる状態を取り出す必要があります。各グループが異なる2つのSz_totalセクターのスペクトルを含むようなJ1、Lによってグループ化します。 subtract_spectrum関数を使用し、データセットから要素を削除します。削除する要素は引数で指定します。

grouped = pyalps.groupSets(pyalps.flatten(data), ['J1', 'L'])
nd = []
for group in grouped:
    if group[0].props['Sz_total'] == 0:
        s0 = group[0]
        s1 = group[1]
    else:
        s0 = group[1]
        s1 = group[0]
    s0 = pyalps.subtract_spectrum(s0, s1)
    nd.append(s0)
    nd.append(s1)
data = nd

そして、基底状態('gs')、第一励起('fe')のエネルギーを含むデータセットのリストを生成します。これを元にcollectXY関数を用いて、gs,feエネルギーと各Lの結合の図を生成することができます。

sector_E = []
grouped = pyalps.groupSets(pyalps.flatten(data), ['Sz_total', 'J1', 'L'])
for group in grouped:
    allE = []
    for q in group:
        allE += list(q.y)
    allE = np.sort(allE)
    
    d = pyalps.DataSet()
    d.props = dict_intersect([q.props for q in group])
    d.x = np.array([0])
    d.y = np.array([allE[0]])
    d.props['which'] = 'gs'
    sector_E.append(d)
    
    d2 = copy.deepcopy(d)
    d2.y = np.array([allE[1]])
    d2.props['which'] = 'fe'
    sector_E.append(d2)

sector_energies = pyalps.collectXY(sector_E, 'J1', 'Energy', ['Sz_total', 'which', 'L'])
plt.figure()
pyalps.pyplot.plot(sector_energies)
plt.xlabel('$J_1/J$')
plt.ylabel('$E_0$')
plt.legend(prop={'size':8})

最後に、一重項、三重項ギャップの計算をおこないます。最もエネルギーの低い状態と(a)一重項状態の第一励起(S_z=0)、(b)三重項(S_z=1)の最も低い状態とのエネルギー差で定義されます。

grouped = pyalps.groupSets( pyalps.groupSets(pyalps.flatten(data), ['J1', 'L']), ['Sz_total'])

gaps = []
for J1g in grouped:
    totalmin = 1000
    for q in flatten(J1g):
        totalmin = min(totalmin, np.min(q.y))
    
    for Szg in J1g:
        allE = []
        for q in Szg:
            allE += list(q.y)
        allE = np.sort(allE)
        d = pyalps.DataSet()
        d.props = pyalps.dict_intersect([q.props for q in Szg])
        d.props['observable'] = 'gap'
        print totalmin,d.props['Sz_total']
        if d.props['Sz_total'] == 0:
            d.y = np.array([allE[1]-totalmin])
        else:
            d.y = np.array([allE[0]-totalmin])
        d.x = np.array([0])
        d.props['line'] = '.-'
        gaps.append(d)

gaps = pyalps.collectXY(gaps, 'J1', 'gap', ['Sz_total', 'L'])

plt.figure()
pyalps.pyplot.plot(gaps)
plt.xlabel('$J_1/J$')
plt.ylabel('$\Delta$')
plt.legend(prop={'size':8})

plt.show()

VisTrails、コマンドラインでの実行

VisTrails用のファイルです。コマンドライン実行用のパラメータファイルはこちらです。

第2近接結合を持つハイゼンベルグ鎖: CFT assignments

有限サイズの補正はJ1-J2の臨界点を調整することによって小さくすることが可能です。異なる結合にもかかわらず、このモデルは同じ臨界場での連続体理論を持ち、この極限値にてスケーリング次元を得ることができます。これらのことの詳細な議論は、I Affleck et al 1989 J. Phys. A: Math. Gen. 22 511を参照してください。

上記の計算で得られた結果を比較してみてください。期待されるスケーリング次元は簡単に理解でき、系を大きくするとより収束が早くなることが分かるでしょう。

Pythonでの実行

次の手順に計算を開始します。

parms_ = {
    'LATTICE'              : "nnn chain lattice",
    'MODEL'                : "spin",
    'local_S'              : 0.5,
    'J'                    : 1,
    'J1'                   : 0.25,
    'NUMBER_EIGENVALUES'   : 5,
    'CONSERVED_QUANTUMNUMBER' : 'Sz',
    'Sz_total' : 0
}
prefix = 'nnn-heisenberg'
parms = []
for L in [10,12]:
    parms_.update({'L':L})
    parms.append(copy.deepcopy(parms_))


実行スクリプトはED-04のものとよく似ています。こちら[3]を参照してください。

VisTrails,コマンドラインでの実行

VisTrails用のファイルです。コマンドライン実行用のパラメータファイルはこちらです。