////////////////////////////////////////////////////////////////////////// // // // Program : S Y M _ w i t h _ a p B C . c p p // // // // Creation : April 2000, revised August 2001 // // // // Class : Main program // // // // Programmer : Uwe Trittmann // // // // Purpose : PGR for calculating the spectrum of SYM(1+1) with // // anti-periodic boundary conditions, see paper // // S.Pinsky, U.Trittmann, Phys.Rev. D62 (2000) 087701 // // (hep-th/0005055). // // // //----------------------------------------------------------------------// // // // Subroutines : NAGdiagII.h ; diagonalization routines // // allocation.h ; allocation of vectors // // // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include "NAGdiagII.h" // diagonalization routines #define KKK 10 // maximal KK #define max_nos 15000 #define ef_relevance 1e-3 // cutoff for showing ef contribution #define TRUNC 10 // parton number trunc., TRUNC=KKK: no trunc. #define TruncType 0 // 0/1 bosons/fermions don't make sense int KK; // harmonic resolution (must be even!) int state[max_nos][TRUNC+4]; // the states int out_state[max_nos][TRUNC+4];// out-states double amplitude[max_nos]; // amplitude of out-states double norm[max_nos]; // norm of states int nos,nos2,nos3,nos4; // number of out-states int sector[TRUNC+4]; // array of sector boundarys int K_min; // minimal K, K_min >= 4 int noos; // number of out-states int off[TRUNC+4]; // unused momenta for permutations int R[TRUNC+4]; // return of function R() int perm_nr; // permutation number for get_state() double *Ham,*Ham2,*Ham3; // variables for NAGLIB diagonalization double *r,*v,*e; // variables for NAGLIB diagonalization int test; // test==1 gives print-outs int *numb; // ef number after sorting of evs //-------------------------------------------------------------------- void free_Intvector(int* v, long nl, long nh) // free a int vector allocated with intvector() { free((char*) (v+nl-1)); } void init_Ham(int dim) // initialize Hamiltonian matrix for NAGLib diagonalization { Ham = dvector(0,dim*dim - 1); Ham2= dvector(0,dim*dim - 1); Ham3= dvector(0,dim*dim - 1); } void free_Ham(int dim) // initialize Hamiltonian matrix for NAGLib diagonalization { free_dvector(Ham,0,dim*dim - 1); free_dvector(Ham2,0,dim*dim - 1); free_dvector(Ham3,0,dim*dim - 1); } // ---------------------------------------------------------------------- int mod(int i, int b) // calculate i modulo b { if (i<0) mod(i+b,b); if (i>b) return mod(i-b,b); else return i; } int RRR(int j, int n, int nr) // calculate shifted momentum string, input in , output in // - momenta, shifts to right { int i,k,count=0,found; for (i=1; i<=n; ++i) { found=0; for (k=1; k<=off[0]; ++k) if (off[k]==i+j) { ++found; break; } if (found==0) { /*R[mod(count-j+state[nr][0]-off[0],state[nr][0]-off[0])-1] =state[nr][i];*/ R[count]=state[nr][mod(i+j,state[nr][0])]; ++count; } } } int symmetry_factor(int n) /* calculate symmetry factor of state, no symm. => s=0 */ { int j,k,b,sym,equiv; sym = 0; b = state[n][0]; for (k=1; k\n",nos); sym=symmetry_factor(nos-1); if (sym>0) norm[nos-1]=1.0/sqrt(sym+1.0); else norm[nos-1]=1.0; } } } } void find_state_trunc(int b, int remaining_K, int p) /* find states with up to

partons */ { int n,m; double sym; for (n=1; n<=remaining_K; n+=2) { state[nos][b] = n; if ((n\n",nos); if (test==1) { printf("n=%3d: Tr [",nos-1); for (m=1; m<=b; ++m) printf("B^+(%1d)",state[nos-1][m]); printf("]/N^{%1d/2}",state[nos-1][0]); } sym=symmetry_factor(nos-1); if (sym>0) norm[nos-1]=1.0/sqrt(sym+1.0); else norm[nos-1]=1.0; if (test==1) { if (symmetry_factor(nos-1)>0) printf("/%5.3f\n",norm[nos-1]); else printf("\n"); } } } } } int get_state(int nr) /* find state that is cyclic permutation of out_state[nr] */ { int i,j,k,b,found,equiv; found=0; i=0; b=out_state[nr][0]; while ((found==0)&&(i1/2 on state , =+/-1 */ { int i,k,j; for (i=1; i<=state[nr][0]; ++i) { for (k=1; k2) { amplitude[noos]=1; if ((i+1)%2!=0) amplitude[noos]*=-1; if ((state[nr][0]*i)%2!=0) amplitude[noos]*=-1; amplitude[noos]*=- /* i^2 */ 2.0*(1.0/state[nr][mod(i-1+state[nr][0],state[nr][0])] -1.0/(state[nr][i] +state[nr][mod(i-1+state[nr][0],state[nr][0])]+plus) +1.0/state[nr][i]); out_state[noos][0]=state[nr][0]-1; out_state[noos][1]=state[nr][i] +state[nr][mod(i-1+state[nr][0],state[nr][0])]+plus; off[0]=2; off[1]=i; off[2]=mod(i+state[nr][0]-1,state[nr][0]); RRR(i-1,state[nr][0],nr); for (j=1; j<=state[nr][0]-2; ++j) out_state[noos][j+1]=R[j-1]; ++noos; } } } void create_states() /* creates Fock states from K=(even!) to K=+1 */ { int l; nos=0; /* -------------------- create fermion states */ sector[K_min-3]=0; for (l=K_min-1; l<=KK+1; l+=2) { find_state(1,l); sector[l]=nos; } nos2=nos; /* -------------------- create boson states */ sector[K_min-2]=nos; for (l=K_min; l<=KK+2; l+=2) { find_state(1,l); sector[l]=nos; } } void create_states_trunc(int p) /* creates Fock states from K=(even!) to K=+1, truncate to

*/ /* partons */ { int l; nos=0; /* -------------------- create fermion states */ sector[K_min-3]=0; for (l=K_min-1; l<=KK+1; l+=2) { find_state_trunc(1,l,p+1); sector[l]=nos; } nos2=nos; /* -------------------- create boson states */ sector[K_min-2]=nos; for (l=K_min; l<=KK+2; l+=2) { find_state_trunc(1,l,p); sector[l]=nos; } } void construct_Q_minus(double *Q_Minus, int sign) /* construct Q^-_{1/2} */ { int i,j,k,no,index=0; if (abs(sign)!=1) { if (sign>0) sign=1; else sign=-1; } for (i=0; i=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) Q_Minus[no+k*nos]+=amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) Q_Minus[no+k*nos]+=amplitude[i]/norm[no]*norm[k]; else Q_Minus[no+k*nos]-=amplitude[i]/norm[no]*norm[k]; } } } } } void construct_Hamiltonian(double *P, double *Q1, double *Q2) /* construct Hamiltonian P^-={Q_+1/2,Q_-1/2} */ { int i,j,k; printf("Hamiltonian:\n------------\n"); for (i=0; i=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) F[no+(k-nos2)*dimF]+=amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) F[no+(k-nos2)*dimF]+=amplitude[i]/norm[no]*norm[k]; else F[no+(k-nos2)*dimF]-=amplitude[i]/norm[no]*norm[k]; } } } } for (k=nos2; k=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) F2[no-sector[KK-1]+(k-nos2)*dimF2]+= amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) F2[no-sector[KK-1]+(k-nos2)*dimF2]+= amplitude[i]/norm[no]*norm[k]; else F2[no-sector[KK-1]+(k-nos2)*dimF2]-= amplitude[i]/norm[no]*norm[k]; } } } } if ((TRUNC>=KK)||(TruncType==0)) { for (k=sector[KK]; k=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) F3[no-sector[KK-1]+(k-sector[KK])*dimF2]+= amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) F3[no-sector[KK-1]+(k-sector[KK])*dimF2]+= amplitude[i]/norm[no]*norm[k]; else F3[no-sector[KK-1]+(k-sector[KK])*dimF2]-= amplitude[i]/norm[no]*norm[k]; } } } } } for (k=0; k=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) B[no-nos2+k*dimB]+=amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) B[no-nos2+k*dimB]+=amplitude[i]/norm[no]*norm[k]; else B[no-nos2+k*dimB]-=amplitude[i]/norm[no]*norm[k]; } } } } for (k=dimF; k=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) B2[no-nos2+(k-dimF)*dimB]+=amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) B2[no-nos2+(k-dimF)*dimB]+=amplitude[i]/norm[no]*norm[k]; else B2[no-nos2+(k-dimF)*dimB]-= amplitude[i]/norm[no]*norm[k]; } } } } if ((TRUNC>=KK)||(TruncType==0)) { for (k=dimF; k=\n",k); for (i=0; i\n"); } no=get_state(i); if (no>=0) { if ((perm_nr==0)||(out_state[i][0]%2!=0)) B3[no-sector[KK]+(k-dimF)*dimB2]+= amplitude[i]/norm[no]*norm[k]; else { if (perm_nr%2==0) B3[no-sector[KK]+(k-dimF)*dimB2]+= amplitude[i]/norm[no]*norm[k]; else B3[no-sector[KK]+(k-dimF)*dimB2]-= amplitude[i]/norm[no]*norm[k]; } } } } counter=0; for (i=0; i1e-8) ++counter; /*printf("%5.3f ",B3[i*dimB2+j]);*/ } /*printf("\n");*/ } printf("Non-zero in B3: %2d = %5.3f percent\n", counter,1.0*counter/dimF2/dimB2); for (i=0; i the incomplete parts, */ /* i.e. the first and last block of both fermions and bosons, */ /* puts result in and */ { int i,j,k,index=0; for (k=K_min-1; k<=KK+1; k+=2) /* loop over all sectors */ { for (i=sector[k-2]; i=sector[K_min-1])) { fmat[(i-sector[K_min-1])*(sector[KK+1]-sector[K_min-1]) +j-sector[K_min-1]]=Ham[index]; } ++index; } } } /* bosons */ for (k=K_min; k<=KK; k+=2) /* loop over all sectors except last one */ { for (i=sector[k-2]; i */ /* =0 --> boson */ /* output file "evs_K.dat" */ { int i,shift=0; char *name; FILE *fp; name=(char *)malloc(80); if (fb==1) shift=1; sprintf(name,"evs_%1dK%1d.dat",fb,KK+shift); fp=fopen(name,"w"); cout<<"Writing eigenvalues into <"<"<-1 stored in of dimension */ /* =0 --> boson */ /* output file "efs_K.dat" */ { int i,j,k,count=0,shift; char *name; FILE *fp; name=(char *)malloc(80); if (fb==1) sprintf(name,"efs_%1dK%1d.dat",fb,KK+1); else sprintf(name,"efs_%1dK%1d.dat",fb,KK); fp=fopen(name,"w"); cout<<"Writing eigenfunctions into <"<"<=\n",k,r[k]); for (i=0; ief_relevance) { if (count%3==0) fprintf(fp,"\n"); fprintf(fp,"+(%5.3f)|%1d; %1d", mat[i*dim+numb[k]],state[i+shift][0],state[i+shift][1]); for (j=2; j<=state[i+shift][0]; ++j) fprintf(fp,",%1d",state[i+shift][j]); fprintf(fp,">"); ++count; } } fprintf(fp,"\n\n"); } fclose(fp); } void sort_evs(int dim, double *evs, int *nr) /* sort eigenvalues of dimension , store eigenfunction nr. in */ { int i,j,count=0,dim2,lowj; double low; dim2=0; for (i=0; idim2; --i) { evs[i]=evs[i-1]; nr[i]=nr[i-1]; } evs[dim2]=low; nr[dim2]=lowj; ++dim2; low=evs[dim2]; } } void main() { int i,ii,j,fdim,bdim; double *fermions,*bosons; cout<=KK)||(TruncType==0)) fermions=dvector(0,fdim*fdim-1); else fermions=dvector(0,1); bosons=dvector(0,bdim*bdim-1); test=0; printf("Constructing Hamiltonian...\n"); construct_essential_Hamiltonian(fermions,bosons); test=0; if ((TRUNC>=KK)||(TruncType==0)) { diagonalize_symmetric(&fermions,fdim,&r,&v); for (i=0; i