Recent Changes - Search:

HomePage

PmWiki

pmwiki.org

HowtoFrequency

The Single-Magnon Line in the Spin-1 Heisenberg Chain

This is a tutorial on using the correction-vector and lanczos-vector programs to calculate a momentum-resolved Green's function {$G(w,k)$}.

1. Constructing the lattice file and groundstate

If you have previously looked at the DMRG Tutorial (yes yes, this is incomplete still), you will know that the first step of any calculation is to obtain a lattice file, that describes the lattice and the Hamiltonian.

The isotropic spin-1 chain is globally SU(2) invarant, which we can make use of to accelerate the calculation.

The spinchain-su2 program creates a simple chain with nearest neighbor bilinear and, optionally, biquadratic terms. Use

spinchain-su2 -L 60 -S 1 --SpinEdge 0.5 --JEdge 0.7 -o spin1chain.lattice

The parameters we have specified result in the construction of a 60 site lattice, of spin 1. In addition, we have specified that the edge spins (at the open boundaries) are to be spin 1/2 instead, and the edge bonds are to have a different magnitude to the bulk, at JEdge=0.7 (the bulk coupling defaults to 1.0). This generates the file spin1chain.lattice.

Note: The purpose of the spin 1/2's at the boundaries is to supress some excitations that would otherwise appear below the Haldane gap. The purpose of reducing the coupling constant for the boundary bonds is to smooth out fluctuations induced by the open boundaries. For more details, see for example, White and Huse, Phys. Rev. B. 48, 3844 (1993).

We now obtain a groundstate, by the usual procedure TutorialDmrg. 50 SU(2) states is plenty for this model, so in dmrg.conf we set NumStates = 10x5+10 50ws, to increase the number of states from 10 to 50, then save the wavefunction once it has converged. This will take a minute or two.

mp-random spin1chain.lattice 0 10 psi
mp-dmrg-init -H spin1chain.lattice:H -w psi -c dmrg.conf -o spin1gs
mp-dmrg-resume spin1gs
mv spin1gs.psi.6 psi

We now have our spin chain groundstate, named psi. If everything has worked properly, the energy should be approximately -81.6081633. If the output of mp-dmrg-resume has scrolled off the top of the screen, you can see the energy by looking at the .sweep file, or even easier, mp-attr psi will show the value of the Energy attribute.

Note: we can see the effect of the SU(2) symmetry by looking at the degeneracies of the reduced density matrices. Try mp-info -d psi | more has a column for the degeneracy of each eigenstate. This is the degree of the representation, which for SU(2) is 2j+1. For Abelian symmetries, the degree is always 1. mp-info -s psi displays the number of states and the degree in a more compact way, showing that in this case our 50 SU(2) states are equivalent to 192 states without this symmetry. This correspondence only applies to target states which are spin 0 (scalar). For higher spin target states, the determination of the equivalent number of states is more complicated.

2. K-Dependent Operators

Next, we need to construct our momentum-space operators. Strictly speaking we could calculate all expectation values in real-space and perform the Fourier transform at the end, however it is much more convenient to examine {$G(w,k)$} directly. Thus, we need the operators {% mylabel, \mathbf{S}(k) = \sum_{x=1}^L e^{ikx} \; \mathbf{S}(x) %} Since we have open boundary conditions, the momentum k of a state is not well defined (i.e. there is no exact reciprocal lattice). So, there are many choices as to precisely which momenta we choose to evaluate.

One option is to use the momenta of a periodic system, combined with a window function, the effect of which is to smooth the otherwise sharp rectangular cutoff at the open boundary. For more details of this approach, see Kühner and White, Phys. Rev. B 60, 335 (1999).

An alternative option, which we use here, is to choose the k-points at the non-interacting quasimomenta. For a non-interacting system, the single-particle eigenstates are standing waves of definite (absolute) momentum, obtained under the constraint that the wavefunction vanishes at site L+1. Thus, the single particle states can be labelled by a quasimomentum taking values of {$|k|=\frac{n \pi}{L+1}$}, where {$n=1,2,..,L$}. For an interacting system this argument no longer applies. Nevertheless, the quasimomenta should be reasonable choices at which to evaluate the spectral function.

There is a tool called mp-make-k, which generates the operators {%lxx, X_k(n) = \sum_{x=1}^L \sin \frac{n x \pi}{L+1} \; X(x) %} for arbitary operators X. Lets use it on the spin operator:

mp-make-k -l spin1chain.lattice -i S

This adds the operators S_k(n) to the lattice file, for n=1,2,...,60.

3. Calculating the Lanczos Vector

Next, we want to apply our momentum-space operator to the groundstate to generate {$\mathbf{S}(k) |\psi \rangle$}. This state is traditionally known as the Lanczos vector. This procedure is straightforward. Starting from the wavevector closest to pi:

mp-apply spin1chain.lattice 'S_k(60)' psi psi-60

Notice that this increases the number of states in the wavefunction, to a maximum of just under 150. This is excessive: a look at the density matrices via mp-info -s psi-60 shows that many of the eigenvalues are exceptionally small; we might as well limit the number of states back to the original 50. A more sophisticated way of reducing the number of states would be to fix a bound on the truncation error. This is easy to do, but isn't implemented yet in the mp-apply program.

mp-apply spin1chain.lattice 'S_k(60)' psi psi-60 50

(note: mp-apply is one of the few tools that still uses positional parameters, rather than named options. This will probably change sometime)

To save some typing later, we are going to set an attribute of our state psi-60 for the groundstate energy.

mp-attr psi-60 GroundstateEnergy=`mp-attr psi Energy`

This sets the GroundstateEnergy attribute of psi-60 to be equal to the Energy attribute of our groundstate psi. The groundstate energy is needed at several points in the calculation, and this saves us from specifying it by hand.

Why did we start with the wavevector closest to {$\pi$}? Easy, this wavevector has by far the largest integrated spectral weight. This can be determined by looking at {$\langle psi|S(k)^2|psi\rangle$}, which is a sum-rule for the integral of the local density of states. This is shown in the following figure:

The spectral weight goes to zero for {$k \rightarrow 0$}. This is obvious as {$S(k=0)$} is just the total spin operator itself, and since our groundstate is a singlet, {$S(k=0)|\psi\rangle=0$}.

4. Calculating the Spectral Function

Now that we have our initial state, we can proceed to calculate {$G(k,w)$}. As a first step, we want a very quick, if not very accurate, spectral function. To do this, we use the continued-fraction (Lanczos) procedure. Firstly, tri-diagonalize the Hamiltonian in the effective DMRG basis.

mp-tridiag -H spin1chain.lattice:H -w psi-60 > psi-60.diag

This calculates the coefficients {$\alpha$} and {$\beta$} of the tridiagonal form, and writes them to the file psi-60.diag. We do not expect this calculation to be at all accurate, as our basis is optimized for calculating only a single state whereas we are asking for a complete spectrum.

(Note: to see some more details of what is happening here, you can increase the verbosity of the output: mp-tridiag -H spin1chain.lattice:H -w psi-60 -v 2. This is more interesting to do later, when we have more than one state in the DMRG basis.)

Once we have the tridiagonal form, the spectral function can be calculated either from the continued fraction expansion, or, with more numerical stability, by completely diagonalizing the matrix and expanding the Green's function in the Lehmann representation using this eigenbasis. The mp-trispectral program uses the latter approach.

mp-trispectral -m 0 -x 4 --dos -B 0.05 -c 41 < psi-60.diag

The output here is two columns, the frequency and the corresponding density of states. (Without the --dos option, the output would instead be 3 columns, the frequency, and real and imaginary parts of the Green's function.) To visualize this, rather than staring at a screen full of numbers, we can pipe the output directly into a graphing program (we also increase the number of data points to 1000):

mp-trispectral -m 0 -x 4 --dos -B 0.05 -c 1000 < psi-60.diag | xmgrace -pipe

We see immediately that there is a peak in the spectral function at around {$\omega=0.454$}. We can now use the correction vector program to calculate a more precise value of the Green's function at this frequency.

We use the sample gmres.conf (from the conf/ directory in the svn repository), with NumStates = 60x4 60s. The modest increase in the number of states, from 50 to 60, is because this program uses a DMRG basis formed by targetting two states at once; the original Lanczos vector {$\mathbf{S}(k) |\psi \rangle$} as well as the correction vector. There is not yet an automatic convergence criteria for mp-gmres: we guess 5 sweeps total is enough, but it might not be...

mp-gmres-init -H spin1chain.lattice:H -w psi-60 -l psi-60 -c gmres.conf -o cv-0.454 -F 0.454 -B 0.05
mp-gmres-resume cv-0.454

As well as giving as an accurate value for the DOS at this frequency, we can use the output correction vector to improve the Lanczos procedure by using this as an additional state in the DMRG basis.

mp-tridiag -H spin1chain.lattice:H -w psi-60 -w cv-0.454.psi.5 > psi-60.diag
mp-trispectral -m 0 -x 4 --dos -B 0.05 -c 1000 < psi-60.diag | xmgrace -pipe

And our spectral function has changed a bit, the main peak has shifted to a slightly lower frequency and the additional smaller peaks have all but dissappeared. Calculating another correction vector at the new peak position, w=0.4245,

mp-gmres-init -H spin1chain.lattice:H -w psi-60 -l psi-60 -c gmres.conf -o cv-0.4245 -F 0.4245 -B 0.05
mp-gmres-resume cv-0.4245

gives 2070 as the value of the LDOS at this frequency, and gives another correction vector with which to improve our Lanczos calculation:

mp-tridiag -H spin1chain.lattice:H -w psi-60 -w cv-0.454.psi.5 -w cv-0.4245.psi.5 > psi-60.diag
mp-trispectral -m 0 -x 4 --dos -B 0.05 -c 1000 < psi-60.diag | xmgrace -pipe

Our peak position has not changed; it looks like we have found the correct frequency. To be sure, we could calculate a third correction vector at a lower frequency, say w=0.4, so that both sides of the peak are well represented. In this case however, nothing changes: we already have an accurate spectral function.

Our value of the peak position is slightly larger than the Haldane gap {$\Delta_H \simeq 0.4105$}. This is due to the finite size system. To get an accurate result for the thermodynamic limit we would need to calculate the peak position for some larger lattice sizes and extrapolate {$L \rightarrow \infty$}. See figures 5 and 6 of Kühner and White, Phys. Rev. B 60, 335 (1999) for an example of this.

TODO: explain the broadening factor, script this to calculate the peak position for other k vectors, show what happens when the spectral function has multiple peaks. An interesting link for spin-1/2 spectral functions: http://arxiv.org/abs/cond-mat/0611467

Edit - History - Print - Recent Changes - Search
Page last modified on November 21, 2006, at 04:06 AM