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)
# -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_ud=+1    # u/d-symmetry (only +1,-1 possible, used in case nu=nd)
a0
sym_k= -11 0 -81 3 -1000   # 3fold degenerated
a0
sym_k= -11 2 -81 4 -1000   # 2fold degenerated and complex vectors
a0
sym_k= -11 1 -81 2 -1000   # 6fold degenerated and complex vectors
a0
#sym_k= -11 1 -81 2 -1 2|8 1000 # 6fold degenerated lifted by another long (l=12) sym
#a0
Extracted results will give this spectrum of low lying levels:
 Sz Energy     sym
 14 6.00000000 _0_0 lowest energy of subspace Sz=14
 14 6.00000000 _2_4 lowest energy (special degeneracy)
 14 6.03363446 _0_3 (same as _3_3 and _3_0 = 3fold)
 14 6.03751687 _1_2 (same as _1_2_2 using 3th sym)
 14 6.04048567 _1_2 (same as _1_2_2 using 3th sym)
 14 6.04227373 _0_3
 14 6.05647019 _2_4
 14 6.05716728 _0_0
 14 6.07488495 _1_2_8 # not of interest, because higher level of sym_1_2