ALPS 2.1 Tutorials:ED-05 ED Phase Transition/ja
Languages: |
English • 日本語 (ja) • 繁體中文 (zh-tw) • 简体中文 (zh) |
Contents
第2近接相互作用を持つハイゼンベルグ鎖の臨界点
このチュートリアルでは、ハイゼンベルグ鎖について前回のED-04の補足をおこないます。ハミルトニアンに第2近接結合項を加えてみましょう。
の極限では、このモデルはBethe仮説によって、ハイゼンベルグ鎖の臨界点まで減少します。
でも, [1]や[2]によって解くことが可能です。基底状態は、
になります。
これらのことは、での相転移の過程を示しています。(http://pre.aps.org/pdf/PRE/v76/i6/e061108を参照してください。)
最初のチュートリアルでは、スペクトル(特に異なる対称セクタでのギャップ)が結合を調整することによってどのように変化するか観察し臨界点を特定します。二番目は、臨界鎖のCFTを取り上げます。解析的に、臨界点モデルはハイゼンベルグ鎖として同じCFTによって記述されます。しかし、数値的に有限サイズの補正の損失となる周辺演算子のweightは0になります。したがって、スケーリングの次元はより正確になります。
そこで、基底状態のエネルギーと一重項励起()、3重項 (
)セクタを図示してみましょう。
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を とし、セクタ
でシミュレーションをおこないます。小さいサイズでも影響が観察できるので、系のサイズは
で十分です。
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
次に、セクタから
で起こる状態を取り出す必要があります。各グループが異なる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)一重項状態の第一励起()、(b)三重項(
)の最も低い状態とのエネルギー差で定義されます。
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]を参照してください。