Exact diagonalization of the S=1/2 Heisenberg chain
(using semi-momentum states)
Program: hchan_mkp
Note that except for k=0 and k=pi (integer label k=N/2), the symmetric (p=1) and anti-symmetric (p=-1) states are degenerate (just as regular momentum states with momentum k and -k are degenerate). The program therefore does the calculation for both p=-1 and p=+1 only for k=0 and pi, and only p=+1 for other momenta.
Input: File read.in containing:
Column 1: System size N (integer)
Column 2: Estimated maximum block hilbert space size rm (integer)
Example read.in (N=8, rm=20)
8 20
Output: File eig.dat containing:
For each sector of fixed number of up spins nu and momentum k
(integer, k=0,...,N/2), and p (-1 and +1):
Line 1: nu,k,p and the block size nst, followed by nst lines with:
Column 1: Eigenvalue number (integer)
Column 2: Energy eigenvalue (real)
Column 3: Spin quantum number (real)
File low.dat containing lowest eigenstate for each sector:
Column 1: nu (integer)
Column 2: k (integer)
Column 3: p (integer)
Column 4: Energy eigenvalue (real)
Column 5: Spin quantum number (real)
nu = 0 k = 0 p = -1 nst = 0 nu = 0 k = 0 p = 1 nst = 1 0 0.0000000000 3.0000000000 nu = 0 k = 1 p = 1 nst = 0 nu = 0 k = 2 p = 1 nst = 0 nu = 0 k = 3 p = -1 nst = 0 nu = 0 k = 3 p = 1 nst = 0 nu = 1 k = 0 p = -1 nst = 0 nu = 1 k = 0 p = 1 nst = 1 0 0.0000000000 3.0000000000 nu = 1 k = 1 p = 1 nst = 1 0 0.0000000000 2.0000000000 nu = 1 k = 2 p = 1 nst = 1 0 0.0000000000 2.0000000000 nu = 1 k = 3 p = -1 nst = 1 0 0.0000000000 2.0000000000 nu = 1 k = 3 p = 1 nst = 0 nu = 2 k = 0 p = -1 nst = 0 nu = 2 k = 0 p = 1 nst = 3 0 -2.1180339887 1.0000000000 1 0.1180339887 1.0000000000 2 0.0000000000 3.0000000000 nu = 2 k = 1 p = 1 nst = 2 0 -1.0000000000 1.0000000000 1 1.0000000000 2.0000000000 nu = 2 k = 2 p = 1 nst = 3 0 -1.2807764064 1.0000000000 1 0.0000000000 2.0000000000 2 0.0000000000 1.0000000000 nu = 2 k = 3 p = -1 nst = 1 0 0.0000000000 2.0000000000 nu = 2 k = 3 p = 1 nst = 1 0 0.0000000000 1.0000000000 nu = 3 k = 0 p = -1 nst = 1 0 0.0000000000 0.0000000000 nu = 3 k = 0 p = 1 nst = 3 0 -2.1180339887 1.0000000000 1 0.1180339887 1.0000000000 2 0.0000000000 3.0000000000 nu = 3 k = 1 p = 1 nst = 3 0 -1.0000000000 1.0000000000 1 -0.5000000000 0.0000000000 2 0.0000000000 2.0000000000 nu = 3 k = 2 p = 1 nst = 3 0 -1.2807764064 1.0000000000 1 -0.0000000000 2.0000000000 2 0.0000000000 1.0000000000 nu = 3 k = 3 p = -1 nst = 3 0 -2.8027756377 0.0000000000 1 -0.5000000000 2.0000000000 2 0.0000000000 0.0000000000 nu = 3 k = 3 p = 1 nst = 1 0 0.0000000000 1.0000000000
The file low.dat (lowest-energy state in each sector containing states):
0 0 1 0.0000000000 3.0000000000 1 1 0 1 0.0000000000 3.0000000000 1 1 1 1 0.0000000000 2.0000000000 1 1 2 1 0.0000000000 2.0000000000 1 1 3 -1 0.0000000000 2.0000000000 1 2 0 1 -2.1180339887 1.0000000000 3 2 1 1 -1.0000000000 1.0000000000 2 2 2 1 -1.2807764064 1.0000000000 3 2 3 -1 0.0000000000 2.0000000000 1 2 3 1 0.0000000000 1.0000000000 1 3 0 -1 0.0000000000 0.0000000000 1 3 0 1 -2.1180339887 1.0000000000 3 3 1 1 -1.0000000000 1.0000000000 3 3 2 1 -1.2807764064 1.0000000000 3 3 3 -1 -2.8027756377 0.0000000000 3 3 3 1 0.0000000000 1.0000000000 1
It is interesting to look at the states with nu=2 and k=pi for N=8. When parity is not used, there are 3 degenerate states with energy E=0 and different total spin. A diagonalization then delivers non-integer S, as discussed with the program hchain_mk;
nu = 2 k = 4 nst = 4 0 -0.0000000000 2.0009877794 1 0.0000000000 2.9990995860 2 0.0000000000 2.0002724281 3 1.0000000000 2.0000000000
When parity is used, some of this degeneracy is lifted. The states in the p=-1 and p=+1 sectors are
nu = 2, k = 4, p = -1, nst = 2 0 0.0000000000 2.7015621187 1 0.0000000000 2.3722813233 nu = 2, k = 4, p = 1, nst = 2 0 0.0000000000 2.0000000000 1 1.0000000000 2.0000000000
There is one state with E=0 in the p=+1 sector, with spin S=2. In the p=-1 sector there are still 2 degenerate states with different spins that are not resolved by this diagonalization (although based on the information obtained we could still in principle compute the spins, since only one particular mixing of two integer spins could give the expectation values delivered by the program).