ALPS 2 Tutorials:TEBD-01 bhquench/ja

From ALPS
Jump to: navigation, search

ハードコア・ボゾン模型

このチュートリアルではハードコア・ボゾン模型の振る舞いについて学習します。

 H=-t\sum_{i=1}^{L-1}(b_i^{\dagger}b_{i+1} +b_ib_{i+1}^{\dagger})+V\sum_{i=1}^{L-1}n_in_{i+1}

パラメータ Vは時間によって変化します。half filling近傍でのハードコア・ボゾン模型の定常状態は大きなV/tで電荷密度波(CDW:charge-density wave)絶縁体、小さなV/tでは、定常状態は超流動体(SF:superfluid)であることはよく知られています。系がある相から急激に別の相に変化するような状態、"クエンチ"、ハミルトニアンパラメーターtVがこのような別の相になる場合、どのようなことが起きるのか?非常に面白い問題です。クエンチの最初の簡単な物理的アプローチとして、ある相から別の相へ、そして元の相に戻るクエンチを考えてみましょう。このようなクエンチの特に厳しい判定条件は、終状態がどれだけ初期状態に近いかです。例えば、

 L(t; \gamma)\equiv |\langle\psi\left(t\right)|\psi\left(0\right)\rangle|^2

これはLoschmidtエコーと呼ばれます。この式にある tは時間を表しており、ホッピングパラメータ t ではありません。パラメータ  \gamma は、系がクエンチされた状況に対応する数値です。ALPS TEBDのルーチンでのクエンチの一般的な構造は次のパラメータ化した値で与えられます。

g(t)=g(t_i)+((t-t_i)/\tau)\,^p (g(t_f)-g(t_i))

 gはハミルトニアンのパラメータです。このケースの場合、 gを相互作用パラメータ Vとして取り扱います。CDW域として V/t=10で開始し、SF域( V/t=0)にクエンチし、また、 V/t=10のCDW域に戻ります。このチュートリアルの3つのポイントは、a)線形クエンチでのLoschmidtエコーの時間スケール \tauの影響 b)CDW相に戻る前のSF相の時間 \tau_{\mathrm{hold}}の"holding"の影響 c)クエンチ関数の力 pの変化の影響を調査することです。

線形クエンチ

最初に、CDWからSF相、そしてCDWに戻る線形クエンチの断熱性のクエンチ率 \tau の影響を計算します。

Pythonを用いた計算の実行

Pythonスクリプトtutorial1a.pyを参照してください。

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms=[]
count=0
for A in [5.0, 10.0, 15.0, 25.0, 50.0]:
       count+=1
       parms.append({ 
                 'L'                         : 10,
                 'MODEL'                     : 'hardcore boson',
                 'CONSERVED_QUANTUMNUMBERS'  : 'N',
                 'N' : 5,
                 't'                         : 1.0,
                 'V'                         : 10.0,
                 'ITP_CHIS' : [20, 30, 35],
                 'ITP_DTS' : [0.05, 0.05,0.025],
                 'ITP_CONVS' : [1E-8, 1E-8, 1E-9],
                 'INITIAL_STATE' : 'ground',
                 'CHI_LIMIT' : 40, 
                 'TRUNC_LIMIT' : 1E-12,
                 'NUM_THREADS' : 1,
                 'TAUS' : [A,  A],
                 'POWS' : [1.0, 1.0],
                 'GS' : ['V',  'V'],
                 'GIS' : [10.0,  0.0],
                 'GFS' : [0.0,  10.0],
                 'NUMSTEPS' : [500,  500],
                 'STEPSFORSTORE' : [5, 3],
                 'SIMID' : count
               })

TEBDに特有のパラメータの詳細をみていきます(こちらに[1]全パラメータのリストがあります)。パラメータINITIAL_STATEは定常状態を定義します。ユーザが決めたパラメータで表現したハミルトニアンでの定常状態から計算を始めます。パラメータt,Vは初期ハミルトニアンパラメータ t=1 V=10 とします。定常状態をみつけるため、TEBDは虚数時間での展開をおこないます。このステップをITPとし、ITPを含むすべてのパラメータは定常状態の特性に対応します。ITP_CHIS,ITP_DTS,ITP_CONVSの各ベクターは虚時間伝播法の連続アプリケーション用のエンタングルメントカットオフパラメータ、タイムステップ、そして収束判定基準です。これらはTEBDの主な収束に関するパラメータ群です。そして、収束はこの各パラメータによって常にチェックされます。この収束に関するHOWTOを次に述べていきます。

実時間伝搬パラメータについて説明します。2種類のクエンチのシミュレーションをおこないますが、最初はパラメータ V が線形的に初期値10から0にクエンチする場合です。一般的なクエンチg(t)=g(t_i)+((t-t_i)/\tau)\,^p (g(t_f)-g(t_i))と比較してください。g=V g(t_i)=10 , g(t_f)=0 , p=1 , and  \tau は効果の検証が必要なパラメータです。パラメータリストを見てください。最初の GS, GIS, GFS,POWSベクターの要素はg , g(t_i) , g(t_f) , p にそれぞれ対応します。ベクターTAUSの最初の要素は変数Aを用い、繰り返し指定します。これは、最初にAを定義した \tau =5, 10, 15, 25, 50に対応しています。2つめのクエンチは本質的に、最初の反対です。g=V , g(t_i)=0 , g(t_f)=10 , p=1 ,  \tau は最初と同じです。パラメータリストを比較してください。上記のGS、GIS・・などの2番目の要素に対応しています。

隣り合った2つのサイトにだけ作用する演算をおこない、完全な伝搬関数を近似的に解く方法で時間発展シミュレーションをおこないます。この伝搬関数をもちいた誤差は微小なタイプステップdtの二次のオーダーになります。TEBDは、このような2サイトでの計算の後、状態の標準系への更新をおこなうプロトコルを与えます。この手順の誤差はCHI_LIMITで設定されます。そして、それは、空間エンタングルメント量とTRUNC_LIMITに直接関係があります。これらはDMRGルーチンのTRUNCATION_ERRORと同じです。パラメータNUMSTEPSは各クエンチでのタイムステップを定義します。それはタイムステップdtを定義する \tau も同時に決めることになります。全誤差はCHI_LIMIT, TRUNC_LIMIT, NUMSTEPSの関数で表され、無視できないレベルではあります。次のチュートリアルで適切なパラメータセットを調査し、これらの誤差が重大なレベルにならないように留意します。最後に、 STEPSFORSTOREは、観測値が計算され、ストアされる前に何回タイムステップが実行されるか決めます。SIMIDは異なる \tau をシミュレーションを区別している整数です。

では、実際に計算してみましょう。

baseName='tutorial_1a'
#write output files
nmlnameList=pyalps.writeTEBDfiles(parms, baseName)
#run the application
res=pyalps.runTEBD(nmlnameList)

TEBDルーチンの入力ファイルを準備し、パラメータで決められた \tau のレンジでシミュレーションを実行します。Loschmidtエコーと相互作用パラメータ U を時間の関数としてロードします。

#Load the loschmidt echo and V
LEdata=pyalps.load.loadTimeEvolution(pyalps.getResultFiles(prefix='tutorial_1a'), measurements=['Loschmidt Echo', 'V'])

最後に、プロットをおこないます。

LE=pyalps.collectXY(LEdata, x='Time', y='Loschmidt Echo',foreach=['SIMID'])
for q in LE:
	q.props['label']=r'$\tau=$'+str(q.props['TAUS'][0])
plt.figure()
pyalps.plot.plot(LE)
plt.xlabel('Time $t$')
plt.ylabel('Loschmidt Echo $|< \psi(0)|\psi(t) > |^2$')
plt.title('Loschmidt Echo vs. Time')
plt.legend(loc='lower right')

Ufig=pyalps.collectXY(LEdata, x='Time', y='V',foreach=['SIMID'])
for q in Ufig:
	q.props['label']=r'$\tau=$'+str(q.props['TAUS'][0])

plt.figure()
pyalps.plot.plot(Ufig)
plt.xlabel('Time $t$')
plt.ylabel('V')
plt.title('Interaction parameter $V$ vs. Time')
plt.legend(loc='lower right')
plt.show()

Vistrailsを用いた計算の実行

Vistrailsを用いた実行は、tutorial1a.vtを開き、ワークフロー"tutorial1a"を選択してください。

質疑

  • 重なりの振る舞いは、クエンチの減少にどのように影響を与えますか?
  • 断熱的にクエンチがおこなわれるために、おおよそどれくらいの速度で計算をおこなうべきですか?
  • 断熱の大規模計算は容易ですか?難しいですか? それは何故ですか?
  • これらの特性は、中間相がギャップされているかどうかに応じて影響がありますか? ハードコア・ボゾン模型から(ソフトコア)ボゾンHubbard模型に変更し、また、大きな U/tでのMott絶縁体相からクエンチさせ、大きな VでのCDW相へ変化させることによってテストしてみてください。MI→CDW→MIの系で、どのような点が難しいですか?

ホールド時の線形クエンチ

このセクションでは、CDW相へクエンチする以前の時間 \tau_{\mathrm{hold}} でのSF相の"holding"の影響を調査します。

Pythonを用いた計算の実行

Pythonスクリプトを用いた実行方法です。tutorial1b.pyを参照してください。

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
#prepare the input parameters
parms=[]
count=0
for A in [5.0, 10.0, 15.0, 25.0, 50.0]:
       count+=1
       parms.append({ 
                 'L'                         : 10,
                 'MODEL'                     : 'hardcore boson',
                 'CONSERVED_QUANTUMNUMBERS'  : 'N',
                 'N' : 5,
                 't'                         : 1.0,
                 'V'                         : 10.0,
                 'ITP_CHIS' : [20, 30, 35], 
                 'ITP_DTS' : [0.05, 0.05,0.025],
                 'ITP_CONVS' : [1E-8, 1E-8, 1E-9],
                 'INITIAL_STATE' : 'ground',
                 'CHI_LIMIT' : 80,
                 'TRUNC_LIMIT' : 1E-12,
                 'NUM_THREADS' : 1,
                 'TAUS' : [10.0, A, 10.0],
                 'POWS' : [1.0, 0.0,1.0],
                 'GS' : ['V', 'V', 'V'],
                 'GIS' : [10.0,0.0, 0.0],
                 'GFS' : [0.0, 0.0, 10.0],
                 'NUMSTEPS' : [500, int(A/0.05), 500],
                 'STEPSFORSTORE' : [5,5, 3],
                 'SIMID' : count
               })
    

このケースではGS、GISのような3つのクエンチがあります。すべてのベクターの長さは3です。2番目のクエンチはクエンチ前の時間 \tau_{\mathrm{hold}}  t=1, V=0 のような固定ハミルトニアンパラメータを保持します。入力ファイルを準備し、計算を実行し、出力を得て、最後にプロットをおこないます。

baseName='tutorial_1b'
#write output files
nmlnameList=pyalps.writeTEBDfiles(parms, baseName)
#run the application
res=pyalps.runTEBD(nmlnameList)
#Load the loschmidt echo and U
LEdata=pyalps.load.loadTimeEvolution(pyalps.getResultFiles(prefix='tutorial_1b'), measurements=['Loschmidt Echo', 'V'])
LE=pyalps.collectXY(LEdata, x='Time', y='Loschmidt Echo',foreach=['SIMID'])
for q in LE:
	q.props['label']=r'$\tau_{\mathrm{hold}}=$'+str(q.props['TAUS'][1])
plt.figure()
pyalps.plot.plot(LE)
plt.xlabel('Time $t$')
plt.ylabel('Loschmidt Echo $|< \psi(0)|\psi(t) > |^2$')
plt.title('Loschmidt Echo vs. Time')
plt.legend(loc='lower right')
Ufig=pyalps.collectXY(LEdata, x='Time', y='V',foreach=['SIMID'])
for q in Ufig:
	q.props['label']=r'$\tau_{\mathrm{hold}}=$'+str(q.props['TAUS'][1])
plt.figure()
pyalps.plot.plot(Ufig)
plt.xlabel('Time $t$')
plt.ylabel('V')
plt.title('Interaction parameter $V$ vs. Time')
plt.legend()
plt.show()

Vistrailsを用いた計算の実行

Vistrailsを用いた実行は、tutorial1a.vtを開き、ワークフロー"tutorial1b"を選択してください。

質疑

  • 重なりの振る舞いはどのようにホールドの増加に影響を与えますか?
  • これらの振る舞いはホールド時間で単調に増加しますか?違いますか? 何故ですか?

非線形クエンチ

このセクションでは非線形でのクエンチの影響を調査します。

Pythonを用いた計算の実行

Pythonスクリプトを用いた実行方法です。tutorial1c.pyを参照してください。

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
#prepare the input parameters
parms=[]
count=0
for A in [1.0, 1.5, 2.0, 2.5, 3.0]:
       count+=1
       parms.append({ 
                 'L'                         : 10,
                 'MODEL'                     : 'hardcore boson',
                 'CONSERVED_QUANTUMNUMBERS'  : 'N',
                 'N' : 5,
                 't'                         : 1.0,
                 'V'                         : 10.0,
                 'ITP_CHIS' : [20, 30, 35],
                 'ITP_DTS' : [0.05, 0.05,0.025],
                 'ITP_CONVS' : [1E-8, 1E-8, 1E-9],
                 'INITIAL_STATE' : 'ground',
                 'CHI_LIMIT' : 40,
                 'TRUNC_LIMIT' : 1E-12,
                 'NUM_THREADS' : 1,
                 'TAUS' : [10.0,  10.0],
                 'POWS' : [1.0, A],
                 'GS' : ['V',  'V'],
                 'GIS' : [10.0,  0.0],
                 'GFS' : [0.0,  10.0],
                 'NUMSTEPS' : [1000,  1000],
                 'STEPSFORSTORE' : [10, 5],
                 'SIMID' : count
               })
  

入力ファイルを準備し、計算を実行し、出力を得て、最後にプロットをおこないます。

baseName='tutorial_1c'
#write output files
nmlnameList=pyalps.writeTEBDfiles(parms, baseName)
#run the application
res=pyalps.runTEBD(nmlnameList)
#Load the loschmidt echo and U
LEdata=pyalps.load.loadTimeEvolution(pyalps.getResultFiles(prefix='tutorial_1c'), measurements=['V', 'Loschmidt Echo'])
LE=pyalps.collectXY(LEdata, x='Time', y='Loschmidt Echo',foreach=['SIMID'])
for q in LE:
	q.props['label']=r'$\tau=$'+str(q.props['POWS'][1])
plt.figure()
pyalps.plot.plot(LE)
plt.xlabel('Time $t$')
plt.ylabel('Loschmidt Echo $|< \psi(0)|\psi(t) > |^2$')
plt.title('Loschmidt Echo vs. Time ')
plt.legend(loc='lower left')

Ufig=pyalps.collectXY(LEdata, x='Time', y='V',foreach=['SIMID'])
for q in Ufig:
	q.props['label']=r'$\tau=$'+str(q.props['POWS'][1])
plt.figure()
pyalps.plot.plot(Ufig)
plt.xlabel('Time $t$')
plt.ylabel('U')
plt.title('Interaction parameter $V$ vs. Time')
plt.legend(loc='lower left')
plt.show()

Vistrailsを用いた計算の実行

Vistrailsを用いた実行は、tutorial1a.vtを開き、ワークフロー"tutorial1c"を選択してください。

質疑

  • 重なりの振る舞いはどのようにクエンチに影響をあたえますか?
  • ハードコア・ボゾン模型からボゾン・Hubbard模型に変化させ、非線形でのMI-CDWの相転移のダイナミックスをみてください。線形のときと振る舞いが異なりますか?
  • このサンプルでは、片方は線形、片方は非線形の非対称クエンチを使用しています。もし両方とも非線形にしたらどうなりますか?