ALPS 2 Tutorials:ED-03 Spectra/ja

From ALPS
Jump to: navigation, search


1次元量子系のスペクトル

このチュートリアルでは、様々な1次元格子上での量子ハイゼンベルグモデルのスペクトルの計算方法を説明します。反復対角化ソルバーであるLanczos 法で実装されているsparsediagが計算のメイン部分です。

ハイゼンベルグ鎖

コマンドラインでのシミュレーションの実行

最初に、S=1/2反強磁性ハイゼンベルグ鎖を計算します。 パラメータファイルparm_chainは、L=10,...16、S_z=0のEDシミュレーションを設定します。

   LATTICE = "chain lattice", 
   MODEL = "spin",
   local_S = 0.5,
   J = 1,
   CONSERVED_QUANTUMNUMBERS = "Sz"
   Sz_total = 0
   { L = 10; }
   { L = 12; }
   { L = 14; }
   { L = 16; }

次の手順で、対角化の計算を実行してください。計算が終了したら、計算結果parm_chain.out.xmlをブラウザで確認してください。

parameter2xml parm_chain
sparsediag --write-xml parm_chain.in.xml

Pythonでのシミュレーションの実行

Pythonを使った計算の実行方法を記述したスクリプトchain.pyを使用します。計算の実行には、Python起動ツールalpspythonやvispythonを使用します。

どのように入力データを定義するかは、次のスクリプトを参照してください。

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

parms=[]
for l in [10, 12, 14, 16]:
    parms.append(
      { 
        'LATTICE'                   : "chain lattice", 
        'MODEL'                     : "spin",
        'local_S'                   : 0.5,
        'J'                         : 1,
        'L'                         : l,
        'CONSERVED_QUANTUMNUMBERS'  : 'Sz',
        'Sz_total'                  : 0
      }
    )

次に、入力パラメーターをXMLジョブファイルに記述し、sparsediag計算を実行します。

input_file = pyalps.writeInputFiles('parm_chain',parms)
res = pyalps.runApplication('sparsediag',input_file)

スペクトルをプロットするために、計算結果のHDF5ファイルをロードします。

data = pyalps.loadSpectra(pyalps.getResultFiles(prefix='parm_chain'))

各システムサイズLDataSetごとにエネルギーを集めます。集めた全固有値から基底エネルギーを求め、この基底エネルギーからの差を運動量の関数としてプロットします。 ここできれいなグラフを作るために、各々のグラフの線種line やラベルlabel を指定します。

spectra = {}
for sim in data:
  l = int(sim[0].props['L'])
  all_energies = []
  spectrum = pyalps.DataSet()
  for sec in sim:
    all_energies += list(sec.y)
    spectrum.x = np.concatenate((spectrum.x,np.array([sec.props['TOTAL_MOMENTUM'] for i in range(len(sec.y))])))
    spectrum.y = np.concatenate((spectrum.y,sec.y))
  spectrum.y -= np.min(all_energies)
  spectrum.props['line'] = 'scatter'
  spectrum.props['label'] = 'L='+str(l)
  spectra[l] = spectrum

次の手順で、1つの図に異なるサイズで求めたスペクトルをプロットします。

plt.figure()
pyalps.pyplot.plot(spectra.values())
plt.legend()
plt.title('Antiferromagnetic Heisenberg chain (S=1/2)')
plt.ylabel('Energy')
plt.xlabel('Momentum')
plt.xlim(0,2*3.1416)
plt.ylim(0,2)
plt.show()

Vistrailsでのシミュレーションの実行

Vistrailsを用いた計算の実行のチュートリアルed-03-spectra.vtを開き、"Chain"のワークフローを見てください。入力ファイルの生成、計算の実行、計算の出力を設定する"Execute"をクリックしてください。

二本足ハイゼンベルグ梯子

上記の計算例の入力パラメータを修正することで、二本足ハイゼンベルグ梯子のスペクトルを計算することができます。修正したパラメータはparm_ladderです。

LATTICE = "ladder"
MODEL = "spin"
local_S = 0.5
J0 = 1
J1 = 1
CONSERVED_QUANTUMNUMBERS = "Sz"
Sz_total = 0
{ L = 6; }
{ L = 8; }
{ L = 10; }

"chain lattice"を"ladder"に変更します。また、legs,rungsの2つの相互作用J0, J1を定義します。他に、梯子は2 L個のスピンを持つのでシステムサイズLを縮小します。pythonスクリプトでも同様の修正をおこないます。修正後のスクリプトは、ladder.pyです。

Vistrailsを用いた計算の実行のチュートリアルed-03-spectra.vtを開き、"Ladder"のワークフローを見てください。入力ファイルの生成、計算の実行、計算の出力を設定する"Execute"をクリックしてください。

ダイマー

梯子格子でJ0 = 0 とすることで、L 個の孤立ダイマーの計算ができます。パラメータファイルはparm_dimers、Pythonスクリプトはdimers.py、Vistrailsのワークフローファイルはed-03-spectra.vt、です。

問題

  • 様々なサイズから得られるスペクトルは、どのようなバンドをとるのか確認してください。
  • ハイゼンベルグ梯子で、束縛状態があることを示してください。
  • ハイゼンベルグ鎖、ハイゼンベルグ梯子のスペクトルで、最も大きな差は何ですか?
  • 孤立ダイマーのスペクトルはどうなっていますか?
  • 梯子格子で相互作用を変化させることで、ハイゼンベルグ鎖と孤立ダイマーの両極限の間で、どのようにスペクトルが変化するのかを見てください。
  • おまけ:システムサイズに対する鎖のスペクトルの変化をよく観察してみてください。L/2が偶数か奇数かで違いがありますが、説明できますか?熱力学的極限(TDL)、つまりLが無限大の極限ではどうなるでしょうか?