MC-05 Bosons
The Bose-Hubbard model describes interacting bosons on a lattice:
where is the hopping amplitude, the on-site repulsion, and the chemical potential. At integer filling and large the system is a Mott insulator: bosons are localized by interactions and the superfluid density . As increases, quantum fluctuations eventually drive a transition to a superfluid phase with . This tutorial uses the ALPS worm QMC code to locate this quantum phase transition on a two-dimensional square lattice at filling (set by ).
Superfluid density across the transition
We first scan a wide range of hopping values on a lattice to observe how the superfluid density (called “Stiffness” in ALPS) evolves across the transition.
The Hilbert space is truncated at Nmax=2 bosons per site, which is a good approximation near the Mott lobe at unit filling.
Command line
The parameter file parm5a:
LATTICE="square lattice"
L=4
MODEL="boson Hubbard"
NONLOCAL=0
U=1.0
mu=0.5
Nmax=2
T=0.1
SWEEPS=500000
THERMALIZATION=10000
{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;}NONLOCAL=0 disables non-local measurements to keep the output compact.
parameter2xml parm5a
worm --Tmin 10 --write-xml parm5a.in.xml--Tmin 10 sets the checkpoint interval to 10 seconds; --write-xml writes XML output files that pyalps can read alongside the HDF5 results.
Python
The script tutorial5a.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
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",
'L' : 4,
'MODEL' : "boson Hubbard",
'NONLOCAL' : 0,
'U' : 1.0,
'mu' : 0.5,
'Nmax' : 2,
'T' : 0.1,
'SWEEPS' : 500000,
'THERMALIZATION' : 10000,
't' : t
}
)
input_file = pyalps.writeInputFiles('parm5a', parms)
pyalps.runApplication('worm', input_file, Tmin=10)Evaluating and plotting
Load the superfluid stiffness and plot it as a function of hopping:
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm5a'), 'Stiffness')
rhos = pyalps.collectXY(data, x='t', y='Stiffness')
plt.figure()
pyalps.plot.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('Superfluid density $\\rho_s$')
plt.title('Bose-Hubbard model on a $4\\times 4$ lattice')
plt.show()should be small (consistent with zero) for small and grow to a finite value for large , with a crossover near the critical hopping .
Locating the critical point
To pin down more precisely we exploit finite-size scaling. At the quantum critical point, where is the dimension and is the dynamical exponent for this universality class (3D XY). For , this gives , so the combination is dimensionless at criticality and curves for different cross at .
We simulate three system sizes on a fine grid of hopping values around the expected critical point.
Command line
The parameter file parm5b:
LATTICE="square lattice"
MODEL="boson Hubbard"
NONLOCAL=0
U=1.0
mu=0.5
Nmax=2
T=0.05
SWEEPS=600000
THERMALIZATION=150000
{L=4; t=0.045;}
{L=4; t=0.05;}
{L=4; t=0.0525;}
{L=4; t=0.055;}
{L=4; t=0.0575;}
{L=4; t=0.06;}
{L=4; t=0.065;}
{L=6; t=0.045;}
{L=6; t=0.05;}
{L=6; t=0.0525;}
{L=6; t=0.055;}
{L=6; t=0.0575;}
{L=6; t=0.06;}
{L=6; t=0.065;}
{L=8; t=0.045;}
{L=8; t=0.05;}
{L=8; t=0.0525;}
{L=8; t=0.055;}
{L=8; t=0.0575;}
{L=8; t=0.06;}
{L=8; t=0.065;}The lower temperature () and longer runs compared to parm5a are needed to resolve the crossing clearly.
parameter2xml parm5b
worm --Tmin 10 --write-xml parm5b.in.xmlPython
The script tutorial5b.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for L in [4, 6, 8]:
for t in [0.045, 0.05, 0.0525, 0.055, 0.0575, 0.06, 0.065]:
parms.append(
{
'LATTICE' : "square lattice",
'L' : L,
'MODEL' : "boson Hubbard",
'NONLOCAL' : 0,
'U' : 1.0,
'mu' : 0.5,
'Nmax' : 2,
'T' : 0.05,
'SWEEPS' : 600000,
'THERMALIZATION' : 150000,
't' : t
}
)
input_file = pyalps.writeInputFiles('parm5b', parms)
pyalps.runApplication('worm', input_file, Tmin=10)Evaluating and plotting
Load the stiffness for each system size, multiply by , and plot:
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm5b'), 'Stiffness')
rhos = pyalps.collectXY(data, x='t', y='Stiffness', foreach=['L'])
for s in rhos:
s.y = s.y * float(s.props['L'])
plt.figure()
pyalps.plot.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('$\\rho_s L$')
plt.legend()
plt.title('Finite-size scaling: Bose-Hubbard model')
plt.show()The curves for should cross near . The exact result for the 2D Bose-Hubbard model at unit filling is
Questions
- At what hopping value does first become clearly nonzero in the coarse scan? Does this agree with the crossing in the plot?
- Where do the curves cross? How does your estimate compare with the exact value ?
- The finite-temperature simulations systematically overestimate . Why? What would happen to the crossing point if you lowered further?
- Try increasing
Nmaxto 3. How much do the results change? At what filling or interaction strength wouldNmax=2become a poor approximation? - (Bonus) Repeat the finite-size scaling analysis with larger system sizes. How does the quality of the crossing improve?