Changes are marked red! (version 2016-03-07)

Using spinpack (v2.50) for the Kagome-Model

Authors:

Abstract:

This documentation was intended for users who want a brief introduction how to use the spinpackage for the highly frustrated Kagome model. We choose N=36 as a bigger Heisenberg model for demonstration.

Installation

Download the latest spinpack package and untar the tgz file (you probably did already). Go to the spinpack directory and start ./configure --mpi for clusters or ./configure --mpt for a multicore SMP-system. If you download a newer version than v2.50 reading doc/history.html is probably a good idea. After that start make test to get a default configuration and test files. You also should check that in the file src/config.h NN is set to 36 (or bigger), VecType is set to 5 and - most important - CM(JJ,tJ,tU) is set to JJ which stands for the Heisenberg model. If it is set otherwise correct the values and compile again using make. Now enter the working path exe to go to next step.

Configuration

First we have to generate the model file (daten.def). It will be generated by m_tilings. We generate the exe by gcc -lm -o exe/m_tilings models/m_tilings.c. Now we generate the modelfile by doing exe/m_tilings 8 6 0 2 2 | tee exe/daten.def, where 8 is the number of the tiling (8=kagome) und 6 0 2 2 the two edge vectors of the periodic lattice in a 60 degree base system. The file exe/daten.def should look like this:

# def-file, tiling8 e= 6 0 2 2  v=12
# automaticly generated by m_tilings v1.5 Aug09 JS
# Kagom\'e 3.6.3.6 w4=0 w5=1/6 w6=5/6
# V=12 ROT=0 REF=0 U=(3 -1, 1 0)
# utlf   2   2   0   6
# emin=(0 0) emax=(8 2)
# base: b1=( 1.000, 0.000) b2=( 0.000, 1.000) b3=( 0.500, 0.866) b4=( 0.866, 0.500)
#===base=== 1 0 0 1 ?????
#===uvec=== 2.000 0.000 1.000 1.732 (unitcell)
# geometrical volume of unitcell  3.464102
#===edge=== 12.000 0.000 6.000 3.464
#===pbcf=== 0 0 12.000 0.000 18.000 3.464 6.000 3.464
#+++model+++
# NN=Number_of_sites Nw=Number_of_bonds Nv=Number_of_bonds(2)
36 72 0
# s  X  Y  Z p_e p_U (s=siteindex  (X Y Z)=position  p=index of parameter)
 0  1.000  0.000 0 e8 u7
 1  0.500  0.866 0 e8 u7
...
# Bond s1 s2 p_t p_J p_V p_w
  0  1  0  t0 j1 v0 w6  
  1  1  2  t0 j1 v0 w4  
...    
#---model---
All parameters (e#, u#, t#, j#, v#, w#) are indexed. In our case all exchange integrals J (or j# = j1) are indexed via parameter p1. The indexes could be choosen freely, only index 0 is reserved for "unused". The value J itself is set in the parameter file daten.i and has no influence to the symmetry of the model. The plus-sign is ignored and is only set to signal the periodic bound to some scripts (not explained here), which generate graphics of the lattice from this file.

Next we have to edit the parameter file daten.i. We can also copy doc/daten.i to exe/daten.i to get a base file (make test is doing the same). Have a look to the spinpack documentation to get an overview about all possible parameters. At the moment it is enough to check that pew is set to 2, nev is set to 1 and sisj is set to 1. param is the parameter list where the index of daten.def points to. We need to set the 1st value, which stands for J1. Set the rest to zero. nud is the number of up- and down-spins. sym_ud is the expectation value of the spin inversion symmetry for the case nu=nd and can be set to +1 or -1. sym_ud can also be set to 0 to ignore spin inversion. sym_ud is ignored for the nonsymmetric case nu!=nd (!= stands for nonequal). sym_k is a list of symmetries and will described later. a0 is the trigger for starting the lanczos algorithm. Here is a short excerpt of the relevant part of the parameter file daten.i:

# set J=p1=1.0
param= 1.0, 0, 0, 0, 0, 0
# set nu=4 and nd=32 at the beginning (small matrix)
nud=4,32
# sym_k (4 numbers follow which are described here) 
# -11 stands for "ignore 1st eleven found symmetries" (we are not interested in exotic symmetries)
#  0 stands for k_translation=0..6 in direction of base vector 1 (0 degrees)
# -81 stands for "ignore next 81 found symmetries" (we are not interested in exotic symmetries)
#  0 stands for k_translation=0..6 in direction of base vector 2 (60 degrees)
# -1000 ignore the rest of symmetries (do not think about it)
#  we have 12 points in the BZ but 4 symmetric distinct points only
sym_k= -11 0 -81 0 -1000   # 1fold degenerated
#sym_k= -11 0 -81 3 -1000   # 3fold degenerated
#sym_k= -11 2 -81 4 -1000   # 2fold degenerated and complex vectors
#sym_k= -11 1 -81 2 -1000   # 6fold degenerated and complex vectors
#sym_k= -11 1 -81 2 -2 -1000   # ToDo: use off additional symmetry
sym_ud=+1    # u/d-symmetry (only +1,-1 possible, used in case nu=nd)
a0
 

Running spinpack

Now you can start spinpack by changing to the path by cd exe and calling nohup nice ./spin | tee ooo . Output is also written to the file ooo using the linux tool tee. The lowest energy E0 we get for the choosen symmetry sector Sz=(32-4)/2=14 is E0=6.00000 (an exact solution within the magnetization jump, a special quantum-property of this lattice). You find this energy in the output file on the line starting with erg=. To get the groundstate energy, we need to choose the right symmetry sector. Simplest method to get this sector is to search all possible sectors. The input file looks like this:

nev=0
# set J=p1=1.0
param= 1.0, 0, 0, 0, 0, 0
# set nu=4 and nd=32 at the beginning (small matrix)
nud=4,32
# sym_k (4 numbers follow which are described here) 
# -11 stands for "ignore 1st eleven found symmetries" (we are not interested in exotic symmetries)
#   0 stands for k_translation=0..6 in direction of base vector b00 (0 degrees)
# -81 stands for "ignore next 81 found symmetries" (we are not interested in exotic symmetries)
#   0 stands for k_translation=0..6 in direction of base vector b60 (60 degrees)
# -9999 ignore the rest of found symmetries
#  we have 12 points in the BZ but 4 symmetric distinct points only
sym_k= -11 0 -81 0 -1000   # 1fold degenerated (real vector)
sym_ud=+1    # u/d-symmetry (only +1,-1 possible, used in case nu=nd)
a0
sym_k= -11 0 -81 3 -1000   # 3fold degenerated (real vector)
a0
sym_k= -11 2 -81 4 -1000   # 2fold degenerated, complex vectors
a0
sym_k= -11 1 -81 2 -1000   # 6fold degenerated, complex vectors
a0
# lift 6fold degeneracy by another long (l=12) sym
#sym_k= -11 1 -81 2 -1 2|8 1000 # 
#a0
Extracted results will give this spectrum of low lying levels:
 Sz Energy     sym  BZ-deg (kago=tiling8 ((6 0) (2 2)), M=Sz=(32-4)/2=14)
 14 6.00000000 _0_0 1-fold a4.deg=4 n1=  4947 = E0(Sz=14)
 14 6.00000000 _2_4 2-fold a4.deg=2 n1=  4947 = E0(Sz=14)       (=_4_2)
 14 6.03363446 _0_3 3-fold a4.deg=1 n1=  4896             (=_3_0, _3_3)
 14 6.03751687 _1_2 6-fold a4.deg=1 n1=  4896 (=_4_5,_5_4,_5_1,_1_5,_2_1=_1_2_2(+3th sym))
# sums:        _   12-fold E0.deg=8 n1= 58905 (sym_k= -9999)
#                          E1.deg=3
#                          E2.deg=6
 14 6.04048567 _1_2 6-fold a4.deg=1 (= _1_2_2 using 3th sym, ToDo)
 14 6.04227373 _0_3 3-fold a4.deg=1
 14 6.05647019 _2_4 2-fold a4.deg=1
 14 6.05716728 _0_0 1-fold a4.deg=2
 14 6.06292638 _1_2 6-fold a4.deg=1
 14 6.07203208 _1_2 6-fold a4.deg=1
 14 6.07488495 _1_2 6-fold a4.deg=1 =sym_1_2_8(ToDo n1)
#
# Perf:
#  a4=fulldiag sym_0_0   7m 212MB dsyev.openblas_barcelona-2.3GHz bn8=20ns
#  a4=fulldiag sym_2_4  14m 381MB zheev.openblas_barcelona-2.3GHz
# Remark:
#  startvec=0 # random set one component to 1, may not find full degeneracy
#  startvec=1 #        set one component to 1, may not find full degeneracy
#  startvec=4 # random set all components, OK
#  startvec=5 # random set all signs of component, OK
Alteratively you can choose a longer symmetry in daten.i:
sym_k= -6 0 -9999  # l=12-sym
# cycles (taken from stdout):
#  l=12 0-1-30-31-6-7-18-19-12-13-24-25 2-17-32-29-8-5-20-35-14-11-26-23 3-22-33-16-9-28-21-4-15-34-27-10
# index-shift (taken from output daten.sy2):
#  1 30 17 22 15 20 7 18 5 28 3 26 13 24 11 34 9 32 19 12 35 4 33 2 25 0 23 10 21 8 31 6 29 16 27 14 l=12
a0
or set symmetries directly in daten.sym according to daten.sy2-output.
 Sz Energy     sym  BZ-deg (kago=tiling8 ((6 0) (2 2)), Sz=(32-4)/2=14)
 14 6.00000000 _0   1-fold a4.deg=3 n1=  4923 E0(Sz=14) (maxsym144.deg=2)
 14 6.00000000 _4   2-fold a4.deg=2 n1=  4923 E0(Sz=14) (same as _8)
 14 6.00000000 _6   1-fold a4.deg=1 n1=  4920 E0(Sz=14) 
 14 6.03363446 _3   2-fold a4.deg=1 n1=  4896 same as _9
 14 6.03363446 _6   1-fold a4.deg=1  do_not_sum_n1_to_GS-k-sum its E1(_6)
 14 6.03751687 _1   2-fold a4.deg=1 n1=  4896 same as _11
 14 6.03751687 _2   2-fold a4.deg=1 n1=  4920 same as _10
 14 6.03751687 _5   2-fold a4.deg=1 n1=  4896 same as _7
# GS-k-sum:        12-fold E0.deg=8 n1= 58905 (sym_k= -9999)
#                          E1.deg=3
 14 6.04048567 _5   2-fold a4.deg=1 (same as _7)   (maxsym=12)
 14 6.04048567 _2   2-fold a4.deg=1 (same as _10)  (+3th sym, maxsym=72)
 14 6.04048567 _1   2-fold a4.deg=1 (same as _11)  (no 3th sym, maxsym=12)
 14 6.04227374 _6   1-fold a4.deg=1              (maxsym=144)
 14 6.04227373 _3   2-fold a4.deg=1 (same as _9) (maxsym=24)
 14 6.05647019 _4   2-fold a4.deg=1 (same as _8) (maxsym=72)
 14 6.05716728 _0   1-fold a4.deg=1              (maxsym=144)
# Perf:
# 

Finite Temperature Lanczos Method

add -DCFG_FTLM=1 to Makefile
sample: complex-double nud=26,10 k=-6 0 -999 (l=12) J1=2 
 hnz/n1 * n1  :        30.71 *  21182952
 randvec5-00-4567.r=1+0e+00 rv.t[s]=0.800
 i110= -18.66711540 -18.54338800 -18.38066491 -18.27672768 cnv= 2 1
 #                            EW                bisecEV_0        JSKdsyevEV_0
FTLM: i,ew_i,tri_ev_i[0]=   0 -18.667115398420  -0.000192749911  0.000192749911
FTLM: i,ew_i,tri_ev_i[0]=   1 -18.543388004754  -0.000399449564  0.000399449564
...
FTLM: i,ew_i,tri_ev_i[0]=  43  -0.435907794941   0.167043242674 -0.158703934633
FTLM: i,ew_i,tri_ev_i[0]=  44   0.247362265467  -0.158626857114  0.167691682816
...
FTLM: i,ew_i,tri_ev_i[0]=  99  32.292820773910   0.001276086058  0.000314792018
FTLM: i,ew_i,tri_ev_i[0]= 100  32.445010358179   0.002409339143  0.000590888133
...
FTLM: i,ew_i,tri_ev_i[0]= 104  33.711039074623   0.000735498235  0.000172045897 
FTLM: i,ew_i,tri_ev_i[0]= 105  33.999999999845  -0.001146078770  0.000265290174
...
FTLM: i,ew_i,tri_ev_i[0]= 106  34.024230959315  -0.000524290412  0.000121254742
FTLM: i,ew_i,tri_ev_i[0]= 107  34.026346540340   0.000329251147  0.000076141418
FTLM: i,ew_i,tri_ev_i[0]= 108  36.000000000007  -0.026982368355 -0.026692197319
FTLM: i,ew_i,tri_ev_i[0]= 109  36.000000000033   0.016471333505  0.016474491063
FTLM:    sum tri_ev_i[0]^2=                      1.000015470776  1.
ToDo: maxEtri(It?)=36.00 bei welchem Iterationsschritt erreicht?
weshalb bisec ungenau? trace_tri(it)?