/************************************************************************/ /* */ /* Program : B D K . c p p */ /* */ /* Creation : 30/05/02 */ /* */ /* Class : Main program */ /* */ /* Programmer : Uwe Trittmann */ /* */ /* Purpose : PGR for calculating QCD_1+1 a la */ /* Bhanot/Demeterfi/Klebanov */ /************************************************************************/ #include using namespace std; #include #include #include #include #include #include #include #include #include #include #include #include "NAGdiagIV.h" // diagonalization routines //#include "diagonalization.h" #define PI 3.141592653589793 #define ONE 2 #define KK 30 /* Maximal harmonic resolution */ #define max_nos 40000 /* maximal number of states */ int state[max_nos][KK+1]; int T_partner[max_nos]; // stores T partner of state and Z_2 QN int nos; // number of states int nos_odd, nos_even; int state_ket[max_nos][KK+3]; int matches[KK]; int indexHam,test; int dim_even,dim_odd; // dimensions of the Z_2 even/odd Hamiltonians double *Ham; // variables for NAGLIB diagonalization double *eigenvalues,*eigenfunctions; // Variables for diagonalization double norm[max_nos]; // norm of the states /*======================================================================== */ int mod(int i,int b) { if (i>b) return i-b; else return i; } int perm(int n, int b) { if (b%2!=0) return 1; else { if (n%2!=0) return -1; else return 1; } } int symmetry_factor(int n) { int j,k,b,sym,equiv; sym = 0; b = state[n][0]; for (k=1; k exists already in list of states in some permutation // return: 0 if not, (number of state + 1)*sign if yes { int i,j,k,found,equiv,b=state[nr][0]; found = 0; i = 0; while ((found==0)&&(i0) printf("/sqrt{%1d}\n",symmetry_factor(nos-1)+1); else printf("\n"); } } } } } void T_image(int nr) // create image of state under T operation // (flip of color indices and sign), result is state { int b=state[nr][0]; state[nos+1][0]=b; state[nos+1][b]=state[nr][b]; for (int i=1; i under T operation incl. fermion permutations // return sign { int b=state[nr][0],sign=1; for (int i=1; ii) { T_partner[i]=nr; ++dim_even; } else { T_partner[i]=-nr; ++dim_odd; } } else { if (sign>0) { T_partner[i]=nr; ++dim_even; } else { T_partner[i]=-nr; ++dim_odd; } } //printf("T(%2d)=%2d\n",i,T_partner[i]); } //printf("Even states: %2d\nOdd states: %2d\n",dim_even,dim_odd); } void count_states() { int i; nos_odd = nos_even = 0; for (i=0; i<=nos-1; ++i) { if (state[i][0]%2==0) ++nos_even; else ++nos_odd; } printf("nos_even= %3d\n",nos_even); printf("nos_odd = %3d\n",nos_odd); } double V_f(int n) /* kinetic energy */ { int i,b; double sum; b = state[n][0]; sum = 0.0; for (i=1; i<=b; ++i) sum += 1.0/state[n][i]; return sum; } double T_f_1(int out, int n) /* potential energy */ { int i,m,b; double sum; if (out!=n) return 0.0; b = state[n][0]; sum = 0.0; for (i=1; i<=b; ++i) for (m=1; m<=state[n][i]-2; m+=ONE) sum += 2.0/(state[n][i]-m)/(state[n][i]-m); return sum; } double function_Tf2(int n1, int n2, int n4) { if (n4-n2!=0) return 1.0/(n4-n2)/(n4-n2)-1.0/(n1+n2)/(n1+n2); else return -1.0/(n1+n2)/(n1+n2); } double function_Tf3(int n1, int n2, int n3) { return -1.0/(n3+n2)/(n3+n2)+1.0/(n1+n2)/(n1+n2); } double T_f_3(int out, int in) /* potential energy, 3rd part */ /* B^+(k)B(l)B(i)B(j) */ { int i,j,b_in,b_out,nok,nosk,m,nr; int ket[100][KK+1]; double sum,sum2; b_in = state[in][0]; b_out = state[out][0]; sum = 0.0; if (b_in==b_out+2) sum = T_f_3(in,out); if (b_in+2==b_out) { nok = 0; for (i=1; i<=b_in; ++i) { ket[nok][b_in]=i; ket[nok][0]=1; if ((b_in%2==0)&&(i%2==0)) ket[nok][0] *= -1; for (j=1; j = |",i); for (j=0; j<=b_in; ++j) printf("%2d ",ket[i][j]); printf(">\n"); } } nosk = 0; for (nr=0; nr = |",i); for (j=0; j<=b_out; ++j) printf("%2d ",state[out][j]); printf(">\n"); for (i=0; i = |",i); for (j=0; j<=b_in+3; ++j) printf("%2d ",state_ket[i][j]); printf(">*%2d:",skp(out,i)); for (j=0; j = |",i); for (j=0; j<=b_in; ++j) printf("%2d ",ket[i][j]); printf(">\n"); } } nosk = 0; for (nr=0; nr = |",i); for (j=0; j<=b_in; ++j) printf("%2d ",state[out][j]); printf(">\n"); for (i=0; i = |",i); for (j=0; j<=b_in; ++j) printf("%2d ",state_ket[i][j]); printf(">*%2d:",skp(out,i)); for (j=0; j0) { norm_in=1.0; sign_in=1; if (abs(T_partner[i])-1!=i) { norm_in=1.0/sqrt(2.0); T_image(i); // T image into if (Z*test_state(nos+1)*T_sign(i)<0) sign_in=-1; } for (j=0; j0) { norm_out=1.0; sign_out=1; if (abs(T_partner[j])-1!=j) { norm_out=1.0/sqrt(2.0); T_image(j); // T image into if (Z*test_state(nos+1)*T_sign(j)<0) sign_out=-1; } Ham[indexHam]=0.0; if (i==j) Ham[indexHam]+=V_f(i)*x; Ham[indexHam]+=2*(T_f_1(i,j)+T_f_2(i,j)+T_f_3(i,j)); if (norm_in!=1.0) { if (abs(T_partner[i])-1==j) Ham[indexHam]+=sign_in*V_f(abs(T_partner[i])-1)*x; Ham[indexHam]+=sign_in*2*(T_f_1(abs(T_partner[i])-1,j) +T_f_2(abs(T_partner[i])-1,j) +T_f_3(abs(T_partner[i])-1,j)); if (norm_out!=1.0) { if (abs(T_partner[i])-1==abs(T_partner[j])-1) Ham[indexHam]+= sign_in*sign_out*V_f(abs(T_partner[j])-1)*x; Ham[indexHam]+=sign_in*sign_out*2*( T_f_1(abs(T_partner[i])-1,abs(T_partner[j])-1) +T_f_2(abs(T_partner[i])-1,abs(T_partner[j])-1) +T_f_3(abs(T_partner[i])-1,abs(T_partner[j])-1)); } } if (norm_out!=1.0) { if (i==abs(T_partner[j])-1) Ham[indexHam]+=sign_out*V_f(abs(T_partner[j])-1)*x; Ham[indexHam]+=sign_out*2*(T_f_1(i,abs(T_partner[j])-1) +T_f_2(i,abs(T_partner[j])-1) +T_f_3(i,abs(T_partner[j])-1)); } Ham[indexHam]*=norm_in*norm_out; ++indexHam; } } } if (test==1) { indexHam=0; for (i=0; i0) { for (j=0; j0) { printf("%5.3f ",Ham[indexHam]); ++indexHam; } printf("\n"); } } } } void generate_unsym_Hamiltonian(int n, double x, int K, int test) // generates Hamiltonian not Z_2 symmetrized { int i,j; indexHam=0; for (i=0; i sector { int m,b,count=0; for (int i=0; i0) { b=state[i][0]; printf("n=%3d: Tr[",count); for (m=1; m<=b; ++m) printf("B^+(%1d)",state[i][m]); printf("]/N^{%1d/2}",state[i][0]); if (norm[i]!=1.0) printf("/%5.3f\n",norm[i]+1); else printf("\n"); if (abs(T_partner[i])-1!=i) { printf(" +Tr["); for (m=1; m<=b; ++m) printf("B^+(%1d)",state[abs(T_partner[i])-1][m]); printf("]/N^{%1d/2}",state[abs(T_partner[i])-1][0]); if (norm[abs(T_partner[i])-1]!=1.0) printf("/%5.3f\n",norm[abs(T_partner[i])-1]+1); else printf("\n"); } ++count; } } void default_test() // tests if BDK 1993 results are reproduced { int dim,i; printf("Default test ===============================================\n\n"); printf("States and Hamiltonian (up to signs) should be the same \n"); printf("as Eqs. (28)-(31) of BDK, Phys.Rev D48 (1993) 4980\n\n"); test=0; printf("Z+ sector:\n-----------\n"); find_apBC_state(1,10); find_T_partners(); dim=dim_even; printf("%1d States:\n------------\n",dim); display_states(1); printf("\nZ+ Hamiltonian:\n---------------\n"); test=0; Ham=dvector(0,dim*dim-1); generate_Hamiltonian(nos,0.0,10,1,1); printf("\n"); diagonalize_symmetric(&Ham,dim,&eigenvalues,&eigenfunctions); printf("\n%1d Eigenvalues:\n---------------\n",dim); for (i=0; i0) dim=dim_even; else dim=dim_odd; printf("Dimension of Hamiltonian: %1d\n",dim); test=0; //dim=nos; Ham=dvector(0,dim*dim-1); generate_Hamiltonian(nos,1.0,K,Z,0); //generate_unsym_Hamiltonian(nos,1.0,K,0); diagonalize_symmetric(&Ham,dim,&eigenvalues,&eigenfunctions); if (Z>0) sprintf(name,"EVs_K%1dx%3.2fZp.dat",K,x); else sprintf(name,"EVs_K%1dx%3.2fZm.dat",K,x); fp=fopen(name,"w"); printf("\nLowest eigenvalues (max. 100):\n------------------------------\n"); for (i=0; i.\n",name); if (Z>0) sprintf(name,"EFs_K%1dx%3.2fZp.dat",K,x); else sprintf(name,"EFs_K%1dx%3.2fZm.dat",K,x); printf("Store eigenfunctions? [neg.=>all, 0=>none] "); scanf("%d",&Z); if (Z!=0) { if ((Z<0)||(Z>dim)) Z=dim; fp=fopen(name,"w"); fprintf(fp,"%1d ",Z); for (int j=0; j; eigenvalues in first row [Needs test!].\n",name); } free_dvector(Ham,0,dim*dim-1); free_dvector(eigenvalues,0,dim-1); free_dvector(eigenfunctions,0,dim*dim-1); return 0; }