Skip to content

DMRG-08 Ground State Energies

In this tutorial we put the machinery developed in the DMRG-07 Introduction to work and compute ground state energies of the one-dimensional spinless-fermion chain with the ALPS dmrg application, following the same workflow as DMRG-03 for the spin chains.

Phenomena of interest

The spinless-fermion chain with nearest-neighbor repulsion — the ttVV model — is the simplest interacting fermion model there is. It nevertheless contains the essential physics of one-dimensional metals: at weak coupling it is a Luttinger liquid, a critical metallic state with no quasiparticles, and at strong repulsion (V>2tV > 2t at half filling) it undergoes a transition into a gapped, charge-ordered insulator. Through the Jordan–Wigner transformation derived in the Introduction, it is exactly the XXZ spin chain in disguise, so every result obtained here can be cross-checked against the spin-chain tutorials. As in DMRG-03, we start with the most basic observable — the ground state energy E0E_0 — computed at two points of the phase diagram where exact reference values exist: the free-fermion point V=0V=0, and the interaction strength V=2tV=2t that maps onto the isotropic Heisenberg chain of DMRG-03.

The model

We study the ttVV Hamiltonian on an open chain of LL sites,

H^  =  tj=1L1(c^jc^j+1+c^j+1c^j)  +  Vj=1L1n^jn^j+1    j=1Lμjn^j, \hat H \;=\; -t\sum_{j=1}^{L-1}\Big(\hat c^{\dagger}_j \hat c_{j+1} + \hat c^{\dagger}_{j+1}\hat c_j\Big) \;+\; V \sum_{j=1}^{L-1} \hat n_j\, \hat n_{j+1} \;-\; \sum_{j=1}^{L} \mu_j\, \hat n_j ,

with hopping amplitude tt, nearest-neighbor repulsion VV, and a (possibly site-dependent) chemical potential μj\mu_j. The model is integrable: via the Jordan–Wigner transformation it is equivalent to the XXZ chain solved exactly by Yang and Yang, and its critical phase is the standard lattice realization of the Luttinger liquid.

The dictionary from the Introduction, applied to an open chain bond by bond, reads:

t=J2,V=JΔ, t = \frac{J}{2}, \qquad V = J\Delta, JΔj(n^j12)(n^j+112)=Vjn^jn^j+1V2jzjn^j+V(L1)4, J\Delta\sum_{j}\Big(\hat n_j - \tfrac12\Big)\Big(\hat n_{j+1} - \tfrac12\Big) = V\sum_{j} \hat n_j \hat n_{j+1} - \frac{V}{2}\sum_{j} z_j\, \hat n_j + \frac{V(L-1)}{4},

where zjz_j is the coordination number of site jj (z=2z=2 in the bulk, z=1z=1 at the two ends). The XXZ chain therefore equals the ttVV model with the site-dependent chemical potential μj=V2zj\mu_j = \tfrac{V}{2} z_j, up to the constant V(L1)/4V(L-1)/4 — a bookkeeping detail that we will exploit below to benchmark against DMRG-03.

Running fermions in the boson basis

On an open chain, all Jordan–Wigner strings cancel in nearest-neighbor terms, so the fermionic ttVV chain, the XXZ spin chain, and the hardcore-boson ttVV chain have identical energy spectra, sector by sector in the particle number NN. The ALPS model library defines hardcore boson with exactly the same parameters (t, V, mu#) and the same conserved quantum number N as spinless fermions, so every parameter file below sets MODEL="hardcore boson". This is not just a convenience: the classic dmrg application does not treat the fermionic sign bookkeeping of MODEL="spinless fermions" reliably. DMRG-10 makes the case in full, with the energies and convergence of the two models side by side.

Choice of method

At half filling the relevant Hilbert-space sector has dimension:

dimHN=L/2=(LL/2)    L=32    (3216)6.0×108, \dim \mathcal{H}_{N=L/2} = \binom{L}{L/2} \;\xrightarrow{\;L=32\;}\; \binom{32}{16} \approx 6.0\times 10^{8},

far beyond the reach of full or sparse diagonalization. DMRG is the method of choice for one-dimensional ground states: each of the runs below (a 32-site chain with up to D=100D=100 kept states and 4 sweeps) completes in well under a minute on a laptop, while converging E0E_0 to ten or more significant digits.

Free fermions (V=0V=0)

At V=0V=0 the model is a free-fermion band ε(k)=2tcosk\varepsilon(k) = -2t\cos k. For an open chain the single-particle eigenstates are standing waves with energies:

εn=2tcos ⁣(nπL+1),n=1,,L, \varepsilon_n = -2t\,\cos\!\left(\frac{n\pi}{L+1}\right), \qquad n = 1,\dots,L ,

so the exact ground state energy at filling NN is the sum of the NN lowest εn\varepsilon_n. For L=32L=32, N=16N=16 (half filling):

E0exact=n=116εn=20.0163879005t. E_0^{\text{exact}} = \sum_{n=1}^{16} \varepsilon_n = -20.0163879005\, t .

This gives us a rare luxury: an interacting-code benchmark with an exact finite-size reference value.

Parameters

ParameterMeaningValue
LATTICEbuilt-in open chain, no lattice file required (see the ALPS lattice library)open chain lattice
MODELhardcore-boson ttVV model, Jordan–Wigner equivalent of the spinless-fermion chainhardcore boson
CONSERVED_QUANTUMNUMBERSquantum number held fixed, used to block-diagonalize HHN
N_totalparticle-number sector targeted (half filling)16
tnearest-neighbor hopping amplitude1
Vnearest-neighbor repulsion0
Lchain length32
SWEEPSnumber of DMRG finite-size sweeps4
NUMBER_EIGENVALUESeigenstates requested1
MAXSTATESbond dimension DD kept after truncation100 (single run); 20, 40, 60 (multiple runs)

Note the one structural difference from the spin tutorials: the conserved quantum number is the particle number N alone, and the sector is selected with N_total rather than Sz_total — the fermionic side of the dictionary Stotz=NL/2S^z_{\text{tot}} = N - L/2 from the Introduction. Half filling Ntotal=16N_{\text{total}} = 16 corresponds to the Stotz=0S^z_{\text{tot}}=0 sector used in DMRG-03.

Lattice

The built-in open chain lattice from the ALPS lattice library is all we need: every site is equivalent (μj=0\mu_j = 0), and every bond carries the same hopping tt:

      t       t       t                   t       t
  o-------o-------o-------o  . . .  o-------o-------o
  1       2       3       4         30      31      32

  every bond:  hopping t, interaction V=0
  every site:  chemical potential mu=0

Open boundary conditions are the natural choice for DMRG (see DMRG-01) and have the added benefit here that the Jordan–Wigner mapping is exact, with no boundary parity factor (see the boundary caveat in the Introduction).

Parameter files

The single-run parameter file spinless_free:

LATTICE="open chain lattice"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=1
V=0
SWEEPS=4
NUMBER_EIGENVALUES=1
L=32
{MAXSTATES=100}

and the multiple-run file spinless_free_multiple, which studies the convergence with the number of kept states:

LATTICE="open chain lattice"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=1
V=0
SWEEPS=4
NUMBER_EIGENVALUES=1
L=32
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }

Running the simulation

With the ALPS binaries on your PATH, convert the parameter files to XML and run the dmrg application:

parameter2xml spinless_free
dmrg --write-xml spinless_free.in.xml

parameter2xml spinless_free_multiple
dmrg --write-xml spinless_free_multiple.in.xml

The first pair of commands produces spinless_free.task1.out.xml; the second produces three output files spinless_free_multiple.task#.out.xml, one per MAXSTATES value.

Interacting fermions at the Heisenberg point (V=2tV=2t)

We now switch on the interaction and choose t=12t=\tfrac12, V=1V=1, i.e. J=2t=1J = 2t = 1 and Δ=V/J=1\Delta = V/J = 1: the isotropic Heisenberg chain of DMRG-03 in fermion language. To make the correspondence exact rather than only asymptotic, we must include the site-dependent chemical potential μj=V2zj\mu_j = \tfrac{V}{2} z_j derived above: μ=V\mu = V on bulk sites but μ=V/2\mu = V/2 on the two end sites, which have only one neighbor. The predicted ground state energy is then:

E0tV  =  E0Heis(L=32)V(L1)4  =  13.9973156314  =  21.7473156, E_0^{tV} \;=\; E_0^{\text{Heis}}(L=32) - \frac{V(L-1)}{4} \;=\; -13.9973156 - \frac{31}{4} \;=\; -21.7473156 ,

using the L=32L=32 Heisenberg energy computed in DMRG-03.

Parameters

ParameterMeaningValue
LATTICE_LIBRARYcustom lattice file (shown below)my_lattice.xml
LATTICEopen chain whose two end vertices carry a separate typeopen chain lattice with special edges
MODELhardcore-boson ttVV model, Jordan–Wigner equivalent of the spinless-fermion chainhardcore boson
CONSERVED_QUANTUMNUMBERSquantum number held fixedN
N_totalparticle-number sector targeted (half filling)16
tnearest-neighbor hopping amplitude (J/2J/2)0.5
Vnearest-neighbor repulsion (JΔJ\Delta)1
mu0chemical potential on the two end sites (Vz/2Vz/2 with z=1z=1)0.5
mu1chemical potential on bulk sites (Vz/2Vz/2 with z=2z=2)1
SWEEPSnumber of DMRG finite-size sweeps4
NUMBER_EIGENVALUESeigenstates requested1
MAXSTATESbond dimension DD kept after truncation100 (single run); 20, 40, 60 (multiple runs)

Lattice

The built-in open chain gives every vertex the same type, hence the same chemical potential. To give the two end sites their own μ\mu we reuse the trick of the spin-1 chain in DMRG-03: a custom lattice in which the end vertices have type 0 and the bulk vertices type 1. The ALPS model library then exposes the per-type parameters mu0 and mu1:

   t,V     t,V     t,V                 t,V     t,V
  o-------o-------o------  . . .  ------o-------o
  1       2       3                     31      32

  site 1, 32   (type 0):  mu0 = V/2   (z = 1, one neighbor)
  sites 2..31  (type 1):  mu1 = V     (z = 2, two neighbors)
  every bond   (type 0):  hopping t, interaction V

The same site-graph logic as in DMRG-03 applies, only the reason differs: there the special edges carried a different spin, here they carry a different chemical potential. The full lattice file my_lattice.xml (abridged — the pattern of the omitted vertices and edges is evident):

<LATTICES>
<GRAPH name = "open chain lattice with special edges" dimension="1" vertices="32" edges="31">
<VERTEX id="1" type="0"><COORDINATE>1</COORDINATE></VERTEX>
<VERTEX id="2" type="1"><COORDINATE>2</COORDINATE></VERTEX>
<VERTEX id="3" type="1"><COORDINATE>3</COORDINATE></VERTEX>
<!-- ... vertices 4 to 30, all type="1" ... -->
<VERTEX id="31" type="1"><COORDINATE>31</COORDINATE></VERTEX>
<VERTEX id="32" type="0"><COORDINATE>32</COORDINATE></VERTEX>
<EDGE source="1" target="2" id="1" type="0" vector="1"/>
<EDGE source="2" target="3" id="2" type="0" vector="1"/>
<!-- ... edges 3 to 30 ... -->
<EDGE source="31" target="32" id="31" type="0" vector="1"/>
</GRAPH>
</LATTICES>

It can be generated for any LL with a few lines of Python:

L = 32
print('<LATTICES>')
print(f'<GRAPH name = "open chain lattice with special edges" dimension="1" vertices="{L}" edges="{L-1}">')
for i in range(1, L+1):
    vtype = 0 if i in (1, L) else 1
    print(f'<VERTEX id="{i}" type="{vtype}"><COORDINATE>{i}</COORDINATE></VERTEX>')
for i in range(1, L):
    print(f'<EDGE source="{i}" target="{i+1}" id="{i}" type="0" vector="1"/>')
print('</GRAPH>')
print('</LATTICES>')

Parameter files

The single-run parameter file spinless_tV:

LATTICE_LIBRARY="my_lattice.xml"
LATTICE="open chain lattice with special edges"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=0.5
V=1
mu0=0.5
mu1=1
SWEEPS=4
NUMBER_EIGENVALUES=1
{MAXSTATES=100}

and the multiple-run file spinless_tV_multiple:

LATTICE_LIBRARY="my_lattice.xml"
LATTICE="open chain lattice with special edges"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=0.5
V=1
mu0=0.5
mu1=1
SWEEPS=4
NUMBER_EIGENVALUES=1
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }

Running the simulation

parameter2xml spinless_tV
dmrg --write-xml spinless_tV.in.xml

parameter2xml spinless_tV_multiple
dmrg --write-xml spinless_tV_multiple.in.xml

Evaluating the results

The following Python script (run it with alpspython) loads the converged eigenstate measurements of all runs and the iteration history of the two single runs, prints the energies and truncation errors, and plots the convergence:

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

# converged measurements of all runs
for prefix in ['spinless_free', 'spinless_free_multiple',
               'spinless_tV', 'spinless_tV_multiple']:
    data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix=prefix))
    for run in data:
        print(prefix, '| MAXSTATES =', run[0].props['MAXSTATES'])
        for s in run:
            print('   ', s.props['observable'], ':', s.y[0])

# iteration history of the two single runs
iter = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='spinless_free'),
                          what=['Iteration Energy','Iteration Truncation Error'])

plt.figure()
pyalps.plot.plot(iter[0][0])
plt.title('Iteration history of ground state energy (V=0)')
plt.ylabel('$E_0$')
plt.xlabel('iteration')
plt.show()

Free fermions

MAXSTATES DDTruncation error ϵ\epsilonE0/tE_0/tE0E0exactE_0 - E_0^{\text{exact}}
205.2×1075.2\times10^{-7}20.0163691706-20.01636917061.9×1051.9\times10^{-5}
401.7×1091.7\times10^{-9}20.0163878550-20.01638785504.6×1084.6\times10^{-8}
601.3×10111.3\times10^{-11}20.0163879001-20.01638790014.1×10104.1\times10^{-10}
1003.2×10143.2\times10^{-14}20.0163879005-20.01638790051.4×10121.4\times10^{-12}

At D=100D=100 the DMRG energy E0=20.0163879005tE_0 = -20.0163879005\,t reproduces the exact free-fermion value 20.0163879005t-20.0163879005\,t to twelve digits — from a many-body code that has no knowledge that the model is free. The iteration history shows the familiar pattern from DMRG-03: the energy drops steeply during the infinite-system warmup and settles onto its converged value within the first sweep:

Interacting fermions at V=2tV=2t

MAXSTATES DDTruncation error ϵ\epsilonE0E_0E0(D)E0(D=100)E_0(D) - E_0(D{=}100)
201.6×1071.6\times10^{-7}21.7473088794-21.74730887946.7×1066.7\times10^{-6}
405.7×10105.7\times10^{-10}21.7473155951-21.74731559512.3×1082.3\times10^{-8}
601.3×10111.3\times10^{-11}21.7473156177-21.74731561774.9×10104.9\times10^{-10}
1004.4×10144.4\times10^{-14}21.7473156182-21.7473156182

The D=100D=100 result E0=21.7473156E_0 = -21.7473156 agrees with the Jordan–Wigner prediction E0HeisV(L1)/4=21.7473156E_0^{\text{Heis}} - V(L-1)/4 = -21.7473156 to every digit of the DMRG-03 reference energy — a direct numerical verification of the operator dictionary derived in the Introduction:

In both cases the energy error is, to a good approximation, proportional to the truncation error — the standard rule of thumb used for DD\to\infty extrapolations, which the multiple runs let us check quantitatively:

Summary

DMRG in the particle-number-conserving basis converges the ground state energy of the half-filled spinless-fermion chain essentially to machine precision with D=100D=100 states at L=32L=32: the free point reproduces the exact standing-wave energy 20.0163879005t-20.0163879005\,t to twelve digits, and the interacting point V=2tV=2t reproduces the DMRG-03 Heisenberg energy through the Jordan–Wigner shift V(L1)/4-V(L-1)/4 to all reported digits, with the energy error scaling linearly in the truncation error in both cases.

Questions

  1. Fit E0(D)E_0(D) against the truncation error ϵ(D)\epsilon(D) and extrapolate to ϵ0\epsilon \to 0. How close is the extrapolated free-fermion energy to the exact value, compared to the raw D=20D=20 result?
  2. Move away from half filling by setting N_total=8 (quarter filling). The free-fermion benchmark E0=n=18εnE_0 = \sum_{n=1}^{8}\varepsilon_n is still exact — does the DMRG convergence in DD get easier or harder, and why?
  3. Scan the interaction across the critical point: keep t=12t=\tfrac12 and compute E0(V)E_0(V) for V=0.5,1,1.5,2,3V = 0.5, 1, 1.5, 2, 3. Beyond V=2tV=2t (Δ>1\Delta>1) the half-filled chain develops charge order — can you detect the transition in the convergence behavior or in the local densities?
  4. Verify the Jordan–Wigner equivalence end to end on a small chain: run sparsediag with MODEL="spinless fermions" and with MODEL="hardcore boson" for L=8L=8, Ntotal=4N_{\text{total}}=4, and confirm that the spectra coincide sector by sector.
  5. Repeat the V=2tV=2t run without the special-edge chemical potentials (built-in open chain lattice, uniform mu=1). The result no longer matches the Heisenberg prediction — which term in the bond-by-bond bookkeeping of V(n^j12)(n^j+112)V(\hat n_j-\tfrac12)(\hat n_{j+1}-\tfrac12) is responsible for the difference?