ALPS 2 Tutorials:DWA-01 Revisiting MC05/ja

From ALPS
Jump to: navigation, search

Bose-Hubbard 模型 における量子相転移

向き付きワームアルゴリズム(DWA)を実装しているdwa アプリケーションの例として、Bose-Hubbard 模型の量子相転移を調べます。

Bose-Hubbard 模型と超流動密度

コマンドラインツールによる計算の準備と実行

parm1a は 1辺4サイトの周期境界正方格子上の Bose-Hubbard 模型を、いくつかのホッピングパラメータ (t=0.01, 0.02, ..., 0.1) に対して計算するためのパラメータファイルです。

 LATTICE="square lattice";
 L=4;
 
 MODEL="boson Hubbard";
 Nmax = 2;
 U    = 1.0;
 mu   = 0.5;
 
 T    = 0.1;
 
 SWEEPS=5000000;
 THERMALIZATION=100000;
 SKIP=500;
 
 MEASURE[Winding Number]=1
 
 { t=0.01; }
 { t=0.02; }
 { t=0.03; }
 { t=0.04; }
 { t=0.05; }
 { t=0.06; }
 { t=0.07; }
 { t=0.08; }
 { t=0.09; }
 { t=0.1;  }

このパラメータファイルを用いて、DWA 計算は以下の様なALPS の標準的なやり方で行うことができます。

parameter2xml parm1a
dwa --Tmin 5 --write-xml parm1a.in.xml

Python を用いた計算の準備と実行

Python を用いた計算の準備と実行を行うスクリプトは tutorial1a.py です。 Python でALPS/DWA を行う場合、まず最初に必要なモジュールをインポートして、 次に計算したいパラメータをPython の辞書オブジェクトのリストとして用意します。

import pyalps

parms = []
for t in [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]:
   parms.append(
       { 
         'LATTICE'                 : "square lattice", 
         'MODEL'                   : "boson Hubbard",
         'T'                       : 0.1,
         'L'                       : 4 ,
         't'                       : t ,
         'mu'                      : 0.5,
         'U'                       : 1.0 ,
         'Nmax'                    : 2 ,
         'THERMALIZATION'          : 100000,
         'SWEEPS'                  : 2000000,
         'SKIP'                    : 500,
         'MEASURE[Winding Number]' : 1
       }
   )

次にパラメータリストをXML 形式のジョブファイルとして書き出し、それを用いて計算を行います。

input_file = pyalps.writeInputFiles('parm1a', parms)
res = pyalps.runApplication('dwa', input_file, Tmin=5, writexml=True)

Python からの実行でも、コマンドラインから実行した時と同じ出力ファイルが書き出されます。

Python による結果の集計・後処理とプロット

超流動密度(Stiffness として得られます)をホッピングパラメータ tの関数として書いてみましょう。

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot as aplt

data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm1a'),'Stiffness')
rhos = pyalps.collectXY(data,x='t',y='Stiffness')

plt.figure()
aplt.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('Superfluid density $\\rho _s$')
plt.show()

Vistrails を用いた計算の準備と実行

Vistrails を用いて計算を行います。 dwa-01-bosons.vt ファイルをVistrails で開き、そのうちの"L=4" とラベルされたワークフローをフォーカスして、 "Execute" ボタンをクリックすると、パラメータの準備、計算の実行、結果の図示、が順番に行われます。

Mott 相から超流動相への相転移

Mott-SF 相転移の転移点をより正確に求めてみましょう。 それには、様々な大きさ L の正方格子上で超流動密度\rho_s を計算し、 \rho_s L が交わるt を探します。

コマンドラインによる計算

パラメータファイルparm1bでは、 3つのシステムサイズ (L = 4,6,8) について、転移点周りでの計算を行います。


LATTICE="square lattice";

MODEL="boson Hubbard";
Nmax  =2;
U    = 1.0;
mu   = 0.5;

T    = 0.05;

SWEEPS=2000000;
THERMALIZATION=150000;
SKIP=500;

{ L=4; t=0.01; }
{ L=4; t=0.02; }
{ L=4; t=0.03; }
{ L=4; t=0.04; }
{ L=4; t=0.05; }
{ L=4; t=0.06; }
{ L=4; t=0.07; }
{ L=4; t=0.08; }
{ L=4; t=0.09; }
{ L=4; t=0.1;  }

{ L=6; t=0.01; }
{ L=6; t=0.02; }
{ L=6; t=0.03; }
{ L=6; t=0.04; }
{ L=6; t=0.05; }
{ L=6; t=0.06; }
{ L=6; t=0.07; }
{ L=6; t=0.08; }
{ L=6; t=0.09; }
{ L=6; t=0.1;  }

{ L=8; t=0.01; }
{ L=8; t=0.02; }
{ L=8; t=0.03; }
{ L=8; t=0.04; }
{ L=8; t=0.05; }
{ L=8; t=0.06; }
{ L=8; t=0.07; }
{ L=8; t=0.08; }
{ L=8; t=0.09; }
{ L=8; t=0.1;  }

後はALPS 標準のやり方で計算を実行するだけです。

parameter2xml parm1b
dwa --Tmin 5 --write-xml parm1b.in.xml

Python を用いた計算

Python を用いる場合のスクリプトファイルはtutorial1b.pyです。 パラメータは次のように準備します。

parms = []
for L in [4,6,8]:
  for t in [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]:
     parms.append(
        {
          'LATTICE'                 : "square lattice",
          'MODEL'                   : "boson Hubbard",
          'T'                       : 0.1,
          'L'                       : L ,
          't'                       : t ,
          'mu'                      : 0.5,
          'U'                       : 1.0 ,
          'Nmax'                    : 2 ,
          'THERMALIZATION'          : 100000,
          'SWEEPS'                  : 2000000,
          'SKIP'                    : 500,
          'MEASURE[Winding Number]': 1
        }
    )

後はこれを入力XMLファイルに変換して、dwa アプリケーションに渡します。 コマンドラインから実行したのと同じ出力ファイルが書き出されます。

input_file = pyalps.writeInputFiles('parm1b', parms)
res = pyalps.runApplication('dwa', input_file, Tmin=5, writexml=True)

Python による結果の後処理とプロット

転移点を求めるために、システムサイズごとにホッピングパラメータと超流動密度の組をx座標、y座標として集め、 y を\rho_s から\rho_s L に直し、 システムサイズごとにプロットします。

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot as aplt

data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm1b'),'Stiffness')
rhos = pyalps.collectXY(data,x='t',y='Stiffness',foreach=['L'])

for rho in rhos:
  rho.y = rho.y * float(rho.props['L'])

plt.figure()
aplt.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('$\\rho _sL$')
plt.legend()
plt.title('Scaling plot for Bose-Hubbard model')
plt.show()

Vistrails を用いた計算

dwa-01-bosons.vt ファイルをVistrails で開き、"scaling plot" というラベルの付いたワークフローを実行してください。

© 2013 by Matthias Troyer, Ping Nang Ma