Skip to content

DMRG-05 Local Observables

We consider observables that are linked to one specific site to be local observables. In the case of spin chains, the meaningful local observable is the local magnetization Siz\langle S^z_i \rangle .

Excitations in the Spin-1 Chain

Take a chain of length L=96L=96 and D=200D=200, and calculate the local magnetization Siz\langle S^z_i \rangle. Plot it versus the site ii for the ground states in the magnetization sectors 0, 1, and 2.

What you should obtain is an essentially flat curve for sector 0, a magnetisation which is essentially concentrated at the chain ends for sector 1, and a magnetisation which is both at the chain ends and in the bulk of the chain for sector 2. This means that the first excitation of the open chain is a boundary excitation, which would not exist on a closed system, and the second excitation of the open chain is a boundary plus a bulk excitation, which is the one we are interested in. For an as of now unknown reason, the energy of the first bulk excitation therefore has to be extracted from comparing sectors 1 and 2.

The moral of the story is that by looking at this local observable, we can distinguish boundary from bulk excitations in the spin-1 chain.

Using parameter files

The following parameter file spin_one will setup three individual runs, one for each spin sector (same as before, we shall use a smaller system and number of states for illustration):

LATTICE_LIBRARY="my_lattices.xml"
LATTICE="open chain lattice with special edges 32"
MODEL="spin"
local_S0=0.5
local_S1=1
CONSERVED_QUANTUMNUMBERS="N,Sz"
J=1
NUMBER_EIGENVALUES=1
SWEEPS=4
MEASURE_LOCAL[Local magnetization]=Sz
MAXSTATES=40
{ Sz_total=0 }
{ Sz_total=1 }
{ Sz_total=2 }

Using the usual sequence of commands to convert and run it:

parameter2xml spin_one
dmrg --write-xml spin_one.in.xml

Using Python

The script spin_one.py runs one simulation for each of the three spin sectors:

import pyalps
import numpy as np
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for sz in [0,1,2]:
    parms.append( { 
        'LATTICE_LIBRARY'           : 'my_lattices.xml',
        'LATTICE'                   : 'open chain lattice with special edges 32',
        'MODEL'                     : "spin",
        'local_S0'                  : '0.5',
        'local_S1'                  : '1',
        'CONSERVED_QUANTUMNUMBERS'  : 'N,Sz',
        'Sz_total'                  : sz,
        'J'                         : 1,
        'SWEEPS'                    : 4,
        'NUMBER_EIGENVALUES'        : 1,
        'MAXSTATES'                 : 40,
        'MEASURE_LOCAL[Local magnetization]'   : 'Sz'
} )

input_file = pyalps.writeInputFiles('parm_spin_one',parms)
res = pyalps.runApplication('dmrg',input_file,writexml=True)

After loading the data files, we can extract the results for the local magnetization:

data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm_spin_one'))

curves = []
for run in data:
    for s in run:
        if s.props['observable'] == 'Local magnetization':
            sz = s.props['Sz_total']
            s.props['label'] = '$S_z = ' + str(sz) + '$'
            s.y = s.y.flatten()
            curves.append(s)

and plot them:

plt.figure()
pyalps.plot.plot(curves)
plt.legend()
plt.title('Magnetization of antiferromagnetic Heisenberg chain (S=1)')
plt.ylabel('local magnetization')
plt.xlabel('site')
plt.show()

Magnetisation in the Spin-1/2 Chain

Repeat a similar calculation for the spin-1/2 chain in the lowest magnetisation sectors.

Using parameter files

The following parameter file will accomplish this task, downloadable here:

LATTICE="open chain lattice"
MODEL="spin"
CONSERVED_QUANTUMNUMBERS="N,Sz"
SWEEPS=4
J=1
NUMBER_EIGENVALUES=1
MEASURE_LOCAL[Local magnetization]=Sz
L=32
MAXSTATES=40
{ Sz_total=0 }
{ Sz_total=1 }
{ Sz_total=2 }

parameter2xml spin_one_half
dmrg --write-xml spin_one_half.in.xml

Using Python

Apart from the obvious parameter changes, the script spin_one_half.py is the same as the spin_one script explained above.

Summary

The local magnetization profile cleanly separates boundary excitations from bulk excitations in the open spin-1 chain, which is why the physically relevant (bulk) gap studied in DMRG-04 must be read off between magnetization sectors 1 and 2 rather than 0 and 1.

Questions

  • Repeating the local-magnetization calculation for the spin-1/2 chain in its lowest magnetisation sectors, what do you observe, compared to the spin-1 case above?