Skip to content

MC-05 Bosons

The Bose-Hubbard model describes interacting bosons on a lattice:

H=ti,j(aiaj+h.c.)+U2ini(ni1)μini,H = -t \sum_{\langle i,j \rangle} (a_i^\dagger a_j + \text{h.c.}) + \frac{U}{2} \sum_i n_i(n_i-1) - \mu \sum_i n_i,

where tt is the hopping amplitude, UU the on-site repulsion, and μ\mu the chemical potential. At integer filling and large U/tU/t the system is a Mott insulator: bosons are localized by interactions and the superfluid density ρs=0\rho_s = 0. As t/Ut/U increases, quantum fluctuations eventually drive a transition to a superfluid phase with ρs>0\rho_s > 0. This tutorial uses the ALPS worm QMC code to locate this quantum phase transition on a two-dimensional square lattice at filling n=1\langle n \rangle = 1 (set by μ=U/2=0.5\mu = U/2 = 0.5).

Superfluid density across the transition

We first scan a wide range of hopping values on a 4×44 \times 4 lattice to observe how the superfluid density ρs\rho_s (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()

ρs\rho_s should be small (consistent with zero) for small t/Ut/U and grow to a finite value for large t/Ut/U, with a crossover near the critical hopping (t/U)c0.060(t/U)_c \approx 0.060.

Locating the critical point

To pin down (t/U)c(t/U)_c more precisely we exploit finite-size scaling. At the quantum critical point, ρsL(d+z2)\rho_s \sim L^{-(d+z-2)} where d=2d=2 is the dimension and z=1z=1 is the dynamical exponent for this universality class (3D XY). For d=2d=2, z=1z=1 this gives ρsL1\rho_s \sim L^{-1}, so the combination ρsL\rho_s L is dimensionless at criticality and curves for different LL cross at tct_c.

We simulate three system sizes L=4,6,8L = 4, 6, 8 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 (T=0.05T = 0.05) and longer runs compared to parm5a are needed to resolve the crossing clearly.

parameter2xml parm5b
worm --Tmin 10 --write-xml parm5b.in.xml

Python

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 LL, 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 L=4,6,8L = 4, 6, 8 should cross near (t/U)c(t/U)_c. The exact result for the 2D Bose-Hubbard model at unit filling is (t/U)c=0.05974(t/U)_c = 0.05974\ldots

Questions

  • At what hopping value does ρs\rho_s first become clearly nonzero in the coarse scan? Does this agree with the crossing in the ρsL\rho_s L plot?
  • Where do the ρsL\rho_s L curves cross? How does your estimate compare with the exact value (t/U)c=0.05974(t/U)_c = 0.05974?
  • The finite-temperature simulations systematically overestimate (t/U)c(t/U)_c. Why? What would happen to the crossing point if you lowered TT further?
  • Try increasing Nmax to 3. How much do the results change? At what filling or interaction strength would Nmax=2 become a poor approximation?
  • (Bonus) Repeat the finite-size scaling analysis with larger system sizes. How does the quality of the crossing improve?