/** * @brief Parent function to calculate two-body green's functions * * @param X data list for calculation * @param vec eigenvectors * * @retval 0 normally finished * @retval -1 unnormally finished * @note the origin of function's name cisajscktalt comes from c=creation, i=ith site, s=spin, a=annihiration, j=jth site and so on. * * @version 0.2 * @details add function to treat the case of general spin * * @version 0.1 * @author Takahiro Misawa (The University of Tokyo) * @author Kazuyoshi Yoshimi (The University of Tokyo) */ int expec_cisajscktaltdc ( struct BindStruct *X, double complex *vec ) { FILE *fp; char sdt[D_FileNameMax]; long unsigned int i,j; long unsigned int irght,ilft,ihfbit; long unsigned int isite1,isite2,isite3,isite4; long unsigned int org_isite1,org_isite2,org_isite3,org_isite4; long unsigned int org_sigma1,org_sigma2,org_sigma3,org_sigma4; long unsigned int tmp_org_isite1,tmp_org_isite2,tmp_org_isite3,tmp_org_isite4; long unsigned int tmp_org_sigma1,tmp_org_sigma2,tmp_org_sigma3,tmp_org_sigma4; long unsigned int isA_up, isB_up; long unsigned int is1_up, is2_up; long unsigned int Asum,Bsum,Adiff,Bdiff; long unsigned int tmp_off=0; long unsigned int tmp_off_2=0; long unsigned int list1_off=0; int tmp_sgn, num1, num2; double complex tmp_V; double complex dam_pr; long int i_max; //For TPQ int step=0; int rand_i=0; //For Kond double complex dmv; if(X->Def.NCisAjtCkuAlvDC <1) return 0; i_max=X->Check.idim_max; X->Large.mode=M_CORR; tmp_V = 1.0+0.0*I; if(GetSplitBitByModel(X->Def.Nsite, X->Def.iCalcModel, &irght, &ilft, &ihfbit)!=0) { return -1; } dam_pr=0.0; //Make File Name for output switch (X->Def.iCalcType) { case Lanczos: if(X->Def.St==0) { sprintf(sdt, cFileName2BGreen_Lanczos, X->Def.CDataFileHead); TimeKeeper(X, cFileNameTimeKeep, cLanczosExpecTwoBodyGStart,"a"); fprintf(stdoutMPI, "%s", cLogLanczosExpecTwoBodyGStart); } else if(X->Def.St==1) { sprintf(sdt, cFileName2BGreen_CG, X->Def.CDataFileHead); TimeKeeper(X, cFileNameTimeKeep, cCGExpecTwoBodyGStart,"a"); fprintf(stdoutMPI, "%s", cLogLanczosExpecTwoBodyGStart); } break; case TPQCalc: step=X->Def.istep; rand_i=X->Def.irand; TimeKeeperWithRandAndStep(X, cFileNameTimeKeep, cTPQExpecTwoBodyGStart, "a", rand_i, step); sprintf(sdt, cFileName2BGreen_TPQ, X->Def.CDataFileHead, rand_i, step); break; case FullDiag: sprintf(sdt, cFileName2BGreen_FullDiag, X->Def.CDataFileHead, X->Phys.eigen_num); break; } if(!childfopenMPI(sdt, "w", &fp)==0) { return -1; } switch(X->Def.iCalcModel) { case HubbardGC: for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; dam_pr=0.0; if(CheckPE(org_isite1-1, X)==TRUE || CheckPE(org_isite2-1, X)==TRUE || CheckPE(org_isite3-1, X)==TRUE || CheckPE(org_isite4-1, X)==TRUE) { isite1 = X->Def.OrgTpow[2*org_isite1-2+org_sigma1] ; isite2 = X->Def.OrgTpow[2*org_isite2-2+org_sigma2] ; isite3 = X->Def.OrgTpow[2*org_isite3-2+org_sigma3] ; isite4 = X->Def.OrgTpow[2*org_isite4-2+org_sigma4] ; if(isite1 == isite2 && isite3 == isite4) { dam_pr = X_GC_child_CisAisCjtAjt_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, 1.0, X, vec, vec); } else if(isite1 == isite2 && isite3 != isite4) { dam_pr = X_GC_child_CisAisCjtAku_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_isite4-1, org_sigma4, 1.0, X, vec, vec); } else if(isite1 != isite2 && isite3 == isite4) { dam_pr = X_GC_child_CisAjtCkuAku_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite2-1, org_sigma2, org_isite3-1, org_sigma3, 1.0, X, vec, vec); } else if(isite1 != isite2 && isite3 != isite4) { dam_pr = X_GC_child_CisAjtCkuAlv_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite2-1, org_sigma2, org_isite3-1, org_sigma3, org_isite4-1, org_sigma4, 1.0, X, vec, vec); } }//InterPE else { child_general_int_GetInfo ( i, X, org_isite1, org_isite2, org_isite3, org_isite4, org_sigma1, org_sigma2, org_sigma3, org_sigma4, tmp_V ); i_max = X->Large.i_max; isite1 = X->Large.is1_spin; isite2 = X->Large.is2_spin; Asum = X->Large.isA_spin; Adiff = X->Large.A_spin; isite3 = X->Large.is3_spin; isite4 = X->Large.is4_spin; Bsum = X->Large.isB_spin; Bdiff = X->Large.B_spin; if(isite1 == isite2 && isite3 == isite4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr += GC_child_CisAisCisAis_element(j, isite1, isite3, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 == isite2 && isite3 != isite4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr += GC_child_CisAisCjtAku_element(j, isite1, isite3, isite4, Bsum, Bdiff, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 != isite2 && isite3 == isite4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr +=GC_child_CisAjtCkuAku_element(j, isite1, isite2, isite3, Asum, Adiff, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 != isite2 && isite3 != isite4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr +=GC_child_CisAjtCkuAlv_element(j, isite1, isite2, isite3, isite4, Asum, Adiff, Bsum, Bdiff, tmp_V, vec, vec, X, &tmp_off_2); } } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf\n",org_isite1-1,org_sigma1, org_isite2-1,org_sigma2, org_isite3-1, org_sigma3, org_isite4-1,org_sigma4, creal(dam_pr), cimag(dam_pr)); }//Intra PE break; case KondoGC: case Hubbard: case Kondo: for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; tmp_V = 1.0; dam_pr=0.0; if(X->Def.iFlgSzConserved ==TRUE) { if(org_sigma1+org_sigma3 != org_sigma2+org_sigma4) { dam_pr=SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",org_isite1-1, org_sigma1, org_isite2-1, org_sigma2, org_isite3-1, org_sigma3, org_isite4-1, org_sigma4, creal(dam_pr), cimag(dam_pr)); continue; } } if(CheckPE(org_isite1-1, X)==TRUE || CheckPE(org_isite2-1, X)==TRUE || CheckPE(org_isite3-1, X)==TRUE || CheckPE(org_isite4-1, X)==TRUE) { isite1 = X->Def.OrgTpow[2*org_isite1-2+org_sigma1] ; isite2 = X->Def.OrgTpow[2*org_isite2-2+org_sigma2] ; isite3 = X->Def.OrgTpow[2*org_isite3-2+org_sigma3] ; isite4 = X->Def.OrgTpow[2*org_isite4-2+org_sigma4] ; if(isite1 == isite2 && isite3 == isite4) { dam_pr = X_child_CisAisCjtAjt_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, 1.0, X, vec, vec); } else if(isite1 == isite2 && isite3 != isite4) { dam_pr = X_child_CisAisCjtAku_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_isite4-1, org_sigma4, 1.0, X, vec, vec); } else if(isite1 != isite2 && isite3 == isite4) { dam_pr = X_child_CisAjtCkuAku_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite2-1, org_sigma2, org_isite3-1, org_sigma3, 1.0, X, vec, vec); } else if(isite1 != isite2 && isite3 != isite4) { dam_pr = X_child_CisAjtCkuAlv_Hubbard_MPI(org_isite1-1, org_sigma1, org_isite2-1, org_sigma2, org_isite3-1, org_sigma3, org_isite4-1, org_sigma4, 1.0, X, vec, vec); } }//InterPE else { child_general_int_GetInfo( i, X, org_isite1, org_isite2, org_isite3, org_isite4, org_sigma1, org_sigma2, org_sigma3, org_sigma4, tmp_V ); i_max = X->Large.i_max; isite1 = X->Large.is1_spin; isite2 = X->Large.is2_spin; Asum = X->Large.isA_spin; Adiff = X->Large.A_spin; isite3 = X->Large.is3_spin; isite4 = X->Large.is4_spin; Bsum = X->Large.isB_spin; Bdiff = X->Large.B_spin; tmp_V = 1.0; dam_pr = 0.0; if(isite1 == isite2 && isite3 == isite4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2) shared(vec,tmp_V) for(j=1; j<=i_max; j++) { dam_pr += child_CisAisCisAis_element(j, isite1, isite3, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 == isite2 && isite3 != isite4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2) shared(vec,tmp_V) for(j=1; j<=i_max; j++) { dam_pr += child_CisAisCjtAku_element(j, isite1, isite3, isite4, Bsum, Bdiff, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 != isite2 && isite3 == isite4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2) shared(vec,tmp_V) for(j=1; j<=i_max; j++) { dam_pr +=child_CisAjtCkuAku_element(j, isite1, isite2, isite3, Asum, Adiff, tmp_V, vec, vec, X, &tmp_off); } } else if(isite1 != isite2 && isite3 != isite4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isite1,isite2,isite4,isite3,Asum,Bsum,Adiff,Bdiff,tmp_off,tmp_off_2) shared(vec,tmp_V) for(j=1; j<=i_max; j++) { dam_pr +=child_CisAjtCkuAlv_element(j, isite1, isite2, isite3, isite4, Asum, Adiff, Bsum, Bdiff, tmp_V, vec, vec, X, &tmp_off_2); } } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf\n",org_isite1-1,org_sigma1, org_isite2-1,org_sigma2, org_isite3-1, org_sigma3, org_isite4-1,org_sigma4, creal(dam_pr), cimag(dam_pr)); } break; case Spin: if(X->Def.iFlgGeneralSpin==FALSE) { for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { tmp_org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; tmp_org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; tmp_org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; tmp_org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; tmp_org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; tmp_org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; tmp_org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; tmp_org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; if(Rearray_Interactions(i, &org_isite1, &org_isite2, &org_isite3, &org_isite4, &org_sigma1, &org_sigma2, &org_sigma3, &org_sigma4, &tmp_V, X)!=0) { //error message will be added fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1,tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,0.0,0.0); continue; } dam_pr = 0.0; if(org_isite1 >X->Def.Nsite && org_isite3>X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal is1_up = X->Def.Tpow[org_isite1 - 1]; is2_up = X->Def.Tpow[org_isite3 - 1]; num1 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is1_up, org_sigma1); num2 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is2_up, org_sigma3); #pragma omp parallel for default(none) reduction (+:dam_pr) shared(vec) \ firstprivate(i_max, num1, num2, tmp_V) private(j) for (j = 1; j <= i_max; j++) { dam_pr += tmp_V*num1*num2*vec[j]*conj(vec[j]); } } else if(org_isite1==org_isite3 && org_sigma1==org_sigma4 && org_sigma2==org_sigma3) { is1_up = X->Def.Tpow[org_isite1 - 1]; num1 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is1_up, org_sigma1); #pragma omp parallel for default(none) reduction (+:dam_pr) shared(vec) \ firstprivate(i_max, num1, num2, tmp_V) private(j) for (j = 1; j <= i_max; j++) { dam_pr += tmp_V*num1*vec[j]*conj(vec[j]); } } else if(org_sigma1==org_sigma4 && org_sigma2==org_sigma3) { //exchange dam_pr += X_child_general_int_spin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else { // other process is not allowed // error message will be added } } else if(org_isite1 > X->Def.Nsite || org_isite3>X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal is1_up = X->Def.Tpow[org_isite1 - 1]; is2_up = X->Def.Tpow[org_isite3 - 1]; num2 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is2_up, org_sigma3); dam_pr=0.0; #pragma omp parallel for default(none) reduction(+:dam_pr)shared(vec) \ firstprivate(i_max, tmp_V, is1_up, org_sigma1, X, num2) private(j, num1) for (j = 1; j <= i_max; j++) { num1 = X_Spin_CisAis(j, X, is1_up, org_sigma1); dam_pr += tmp_V*num1*num2*conj(vec[j])*vec[j]; } } else if(org_sigma1==org_sigma4 && org_sigma2==org_sigma3) { //exchange dam_pr += X_child_general_int_spin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else { // other process is not allowed // error message will be added dam_pr=0.0; } } else { isA_up = X->Def.Tpow[org_isite1-1]; isB_up = X->Def.Tpow[org_isite3-1]; if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2, tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr +=child_CisAisCisAis_spin_element(j, isA_up, isB_up, org_sigma2, org_sigma4, tmp_V, vec, vec, X); } } else if(org_isite1==org_isite3 && org_sigma1==org_sigma4 && org_sigma3==org_sigma2) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv) firstprivate(i_max,X,isA_up, tmp_V) shared(vec, list_1) for(j=1; j<=i_max; j++) { dmv=X_CisAis(list_1[j], X, isA_up); dam_pr += vec[j]*tmp_V*dmv*conj(vec[j]); } } else if(org_sigma1==org_sigma4 && org_sigma2==org_sigma3) { // exchange dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { tmp_sgn = X_child_exchange_spin_element(j,X,isA_up,isB_up,org_sigma2,org_sigma4,&tmp_off); dmv = vec[j]*tmp_sgn; dam_pr += conj(vec[tmp_off])*dmv; } } else { // other process is not allowed // error message will be added dam_pr=0.0; } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1, tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,creal(dam_pr),cimag(dam_pr)); } }//iFlgGeneralSpin = FALSE else { for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { tmp_org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; tmp_org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; tmp_org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; tmp_org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; tmp_org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; tmp_org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; tmp_org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; tmp_org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; if(Rearray_Interactions(i, &org_isite1, &org_isite2, &org_isite3, &org_isite4, &org_sigma1, &org_sigma2, &org_sigma3, &org_sigma4, &tmp_V, X)!=0) { fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1,tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,0.0,0.0); continue; } dam_pr = 0.0; if(org_isite1 >X->Def.Nsite && org_isite3>X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr=X_child_CisAisCjuAju_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_child_CisAitCjuAjv_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4,tmp_V, X, vec, vec); } else { dam_pr=0.0; } } else if(org_isite3 > X->Def.Nsite || org_isite1 > X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr=X_child_CisAisCjuAju_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_child_CisAitCjuAjv_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4,tmp_V, X, vec, vec); } else { dam_pr=0.0; } } else { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X,org_isite1, org_sigma1,org_isite3, org_sigma3, tmp_V) shared(vec,list_1) for(j=1; j<=i_max; j++) { num1=BitCheckGeneral(list_1[j], org_isite1, org_sigma1, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1=BitCheckGeneral(list_1[j], org_isite3, org_sigma3, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[j])*vec[j]; } } } } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X, org_isite1, org_isite3, org_sigma1, org_sigma2, org_sigma3, org_sigma4, tmp_off, tmp_off_2, list1_off, tmp_V) shared(vec, list_1) for(j=1; j<=i_max; j++) { num1 = num1*GetOffCompGeneralSpin(list_1[j], org_isite3, org_sigma4, org_sigma3, &tmp_off, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1 = GetOffCompGeneralSpin(tmp_off, org_isite1, org_sigma2, org_sigma1, &tmp_off_2, X->Def.SiteToBit, X->Def.Tpow); ConvertToList1GeneralSpin(tmp_off_2, X->Check.sdim, &list1_off); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[list1_off])*vec[j]; } } } } else { dam_pr=0.0; } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1, tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4, creal(dam_pr),cimag(dam_pr)); } } break; case SpinGC: if(X->Def.iFlgGeneralSpin==FALSE) { for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { tmp_org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; tmp_org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; tmp_org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; tmp_org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; tmp_org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; tmp_org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; tmp_org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; tmp_org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; if(Rearray_Interactions(i, &org_isite1, &org_isite2, &org_isite3, &org_isite4, &org_sigma1, &org_sigma2, &org_sigma3, &org_sigma4, &tmp_V, X)!=0) { //error message will be added fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1,tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,0.0,0.0); continue; } dam_pr=0.0; if(org_isite1>X->Def.Nsite && org_isite3>X->Def.Nsite) { //org_isite3 >= org_isite1 > Nsite if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr += X_GC_child_CisAisCjuAju_spin_MPIdouble( (org_isite1-1), org_sigma1, (org_isite3-1), org_sigma3, tmp_V, X, vec, vec); } else if(org_isite1 ==org_isite3 && org_sigma1 ==org_sigma4 && org_sigma2 ==org_sigma3) { //diagonal (for spin: cuadcdau=cuau) dam_pr += X_GC_child_CisAis_spin_MPIdouble((org_isite1-1), org_sigma1, tmp_V, X, vec, vec); } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { dam_pr += X_GC_child_CisAisCjuAjv_spin_MPIdouble(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { dam_pr += X_GC_child_CisAitCjuAju_spin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr += X_GC_child_CisAitCiuAiv_spin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } } else if(org_isite3>X->Def.Nsite || org_isite1>X->Def.Nsite) { //org_isite3 > Nsite >= org_isite1 if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr += X_GC_child_CisAisCjuAju_spin_MPIsingle( (org_isite1-1), org_sigma1, (org_isite3-1), org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { dam_pr += X_GC_child_CisAisCjuAjv_spin_MPIsingle(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { dam_pr += X_GC_child_CisAitCjuAju_spin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr += X_GC_child_CisAitCiuAiv_spin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } } else { if(org_isite1==org_isite2 && org_isite3==org_isite4) { isA_up = X->Def.Tpow[org_isite2-1]; isB_up = X->Def.Tpow[org_isite4-1]; if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr +=GC_child_CisAisCisAis_spin_element(j, isA_up, isB_up, org_sigma2, org_sigma4, tmp_V, vec, vec, X); } } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr += GC_child_CisAisCitAiu_spin_element(j, org_sigma2, org_sigma4, isA_up, isB_up, tmp_V, vec, vec, X, &tmp_off); } } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr += GC_child_CisAitCiuAiu_spin_element(j, org_sigma2, org_sigma4, isA_up, isB_up, tmp_V, vec, vec, X, &tmp_off); } } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr = 0.0; #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, tmp_sgn, dmv) firstprivate(i_max,X,isA_up,isB_up,org_sigma2,org_sigma4,tmp_off,tmp_off_2,tmp_V) shared(vec) for(j=1; j<=i_max; j++) { dam_pr += GC_child_CisAitCiuAiv_spin_element(j, org_sigma2, org_sigma4, isA_up, isB_up, tmp_V, vec, vec, X, &tmp_off); } } } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1, tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,creal(dam_pr),cimag(dam_pr)); } } else { for(i=0; i<X->Def.NCisAjtCkuAlvDC; i++) { tmp_org_isite1 = X->Def.CisAjtCkuAlvDC[i][0]+1; tmp_org_sigma1 = X->Def.CisAjtCkuAlvDC[i][1]; tmp_org_isite2 = X->Def.CisAjtCkuAlvDC[i][2]+1; tmp_org_sigma2 = X->Def.CisAjtCkuAlvDC[i][3]; tmp_org_isite3 = X->Def.CisAjtCkuAlvDC[i][4]+1; tmp_org_sigma3 = X->Def.CisAjtCkuAlvDC[i][5]; tmp_org_isite4 = X->Def.CisAjtCkuAlvDC[i][6]+1; tmp_org_sigma4 = X->Def.CisAjtCkuAlvDC[i][7]; if(Rearray_Interactions(i, &org_isite1, &org_isite2, &org_isite3, &org_isite4, &org_sigma1, &org_sigma2, &org_sigma3, &org_sigma4, &tmp_V, X)!=0) { //error message will be added fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1,tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4,0.0,0.0); continue; } dam_pr = 0.0; if(org_isite1 > X->Def.Nsite && org_isite3 > X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr=X_GC_child_CisAisCjuAju_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_GC_child_CisAisCjuAjv_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { dam_pr=X_GC_child_CisAitCjuAju_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_GC_child_CisAitCjuAjv_GeneralSpin_MPIdouble(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4,tmp_V, X, vec, vec); } } else if(org_isite3 > X->Def.Nsite || org_isite1 > X->Def.Nsite) { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal dam_pr=X_GC_child_CisAisCjuAju_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_GC_child_CisAisCjuAjv_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_isite3-1, org_sigma3, org_sigma4, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { dam_pr=X_GC_child_CisAitCjuAju_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, tmp_V, X, vec, vec); } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { dam_pr=X_GC_child_CisAitCjuAjv_GeneralSpin_MPIsingle(org_isite1-1, org_sigma1, org_sigma2, org_isite3-1, org_sigma3, org_sigma4,tmp_V, X, vec, vec); } } else { if(org_sigma1==org_sigma2 && org_sigma3==org_sigma4 ) { //diagonal #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X,org_isite1, org_sigma1,org_isite3, org_sigma3, tmp_V) shared(vec) for(j=1; j<=i_max; j++) { num1=BitCheckGeneral(j-1, org_isite1, org_sigma1, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1=BitCheckGeneral(j-1, org_isite3, org_sigma3, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[j])*vec[j]; } } } } else if(org_sigma1 == org_sigma2 && org_sigma3 != org_sigma4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X, org_isite1, org_isite3, org_sigma1,org_sigma3,org_sigma4, tmp_off, tmp_V) shared(vec) for(j=1; j<=i_max; j++) { num1 = GetOffCompGeneralSpin(j-1, org_isite3, org_sigma4, org_sigma3, &tmp_off, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1=BitCheckGeneral(tmp_off, org_isite1, org_sigma1, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[tmp_off+1])*vec[j]; } } } } else if(org_sigma1 != org_sigma2 && org_sigma3 == org_sigma4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X, org_isite1, org_isite3, org_sigma1,org_sigma2, org_sigma3, tmp_off, tmp_V) shared(vec) for(j=1; j<=i_max; j++) { num1 = BitCheckGeneral(j-1, org_isite3, org_sigma3, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1 = GetOffCompGeneralSpin(j-1, org_isite1, org_sigma2, org_sigma1, &tmp_off, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[tmp_off+1])*vec[j]; } } } } else if(org_sigma1 != org_sigma2 && org_sigma3 != org_sigma4) { #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, num1) firstprivate(i_max,X, org_isite1, org_isite3, org_sigma1, org_sigma2, org_sigma3, org_sigma4, tmp_off, tmp_off_2, tmp_V) shared(vec) for(j=1; j<=i_max; j++) { num1 = GetOffCompGeneralSpin(j-1, org_isite3, org_sigma4, org_sigma3, &tmp_off, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { num1 = GetOffCompGeneralSpin(tmp_off, org_isite1, org_sigma2, org_sigma1, &tmp_off_2, X->Def.SiteToBit, X->Def.Tpow); if(num1 != FALSE) { dam_pr += tmp_V*conj(vec[tmp_off_2+1])*vec[j]; } } } } } dam_pr = SumMPI_dc(dam_pr); fprintf(fp," %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %.10lf %.10lf \n",tmp_org_isite1-1, tmp_org_sigma1, tmp_org_isite2-1, tmp_org_sigma2, tmp_org_isite3-1, tmp_org_sigma3, tmp_org_isite4-1, tmp_org_sigma4, creal(dam_pr),cimag(dam_pr)); } } break; default: return -1; } fclose(fp); if(X->Def.iCalcType==Lanczos) { if(X->Def.St==0) { TimeKeeper(X, cFileNameTimeKeep, cLanczosExpecTwoBodyGFinish,"a"); fprintf(stdoutMPI, "%s", cLogLanczosExpecTwoBodyGFinish); } else if(X->Def.St==1) { TimeKeeper(X, cFileNameTimeKeep, cCGExpecTwoBodyGFinish,"a"); fprintf(stdoutMPI, "%s", cLogCGExpecTwoBodyGFinish); } } else if(X->Def.iCalcType==TPQCalc) { TimeKeeperWithRandAndStep(X, cFileNameTimeKeep, cTPQExpecTwoBodyGFinish, "a", rand_i, step); } //[s] this part will be added /* For FullDiag, it is convinient to calculate the total spin for each vector. Such functions will be added if(X->Def.iCalcType==FullDiag){ if(X->Def.iCalcModel==Spin){ expec_cisajscktaltdc_alldiag_spin(X,vec); }else if(X->Def.iCalcModel==Hubbard || X->Def.iCalcModel==Kondo){ expec_cisajscktaltdc_alldiag(X,vec); }else{// X->Phys.s2=0.0; } } */ //[e] return 0; }
/** * * * @param isite1 * @param isite2 * @param isigma1 * @param isigma2 * @param dtmp_V * @param X * * @author Takahiro Misawa (The University of Tokyo) * @author Kazuyoshi Yoshimi (The University of Tokyo) * @return */ int SetDiagonalInterAll ( const long unsigned int isite1, const long unsigned int isite2, long unsigned int isigma1, long unsigned int isigma2, double dtmp_V, struct BindStruct *X ) { long unsigned int is1_spin; long unsigned int is2_spin; long unsigned int is1_up; long unsigned int is2_up; long unsigned int ibit1_spin; long unsigned int ibit2_spin; long unsigned int num1; long unsigned int num2; long unsigned int j; long unsigned int i_max=X->Check.idim_max; switch (X->Def.iCalcModel){ case HubbardGC: //list_1[j] -> j-1 is1_spin = X->Def.Tpow[2*isite1-2+isigma1]; is2_spin = X->Def.Tpow[2*isite2-2+isigma2]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_spin, is2_spin) private(num1, ibit1_spin, num2, ibit2_spin) for(j = 1;j <= i_max;j++){ num1=0; num2=0; ibit1_spin=(j-1)&is1_spin; num1+=ibit1_spin/is1_spin; ibit2_spin=(j-1)&is2_spin; num2+=ibit2_spin/is2_spin; list_Diagonal[j]+=num1*num2*dtmp_V; } break; case KondoGC: case Hubbard: case Kondo: is1_spin = X->Def.Tpow[2*isite1-2+isigma1]; is2_spin = X->Def.Tpow[2*isite2-2+isigma2]; #pragma omp parallel for default(none) shared(list_Diagonal, list_1) firstprivate(i_max, dtmp_V, is1_spin, is2_spin) private(num1, ibit1_spin, num2, ibit2_spin) for(j = 1;j <= i_max;j++){ num1=0; num2=0; ibit1_spin=list_1[j]&is1_spin; num1+=ibit1_spin/is1_spin; ibit2_spin=list_1[j]&is2_spin; num2+=ibit2_spin/is2_spin; list_Diagonal[j]+=num1*num2*dtmp_V; } break; case Spin: is1_up = X->Def.Tpow[isite1-1]; is2_up = X->Def.Tpow[isite2-1]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_up, is2_up, isigma1, isigma2, X) private(j, num1, num2) for(j = 1;j <= i_max; j++){ num1=X_Spin_CisAis(j, X, is1_up, isigma1); num2=X_Spin_CisAis(j, X, is2_up, isigma2); list_Diagonal[j] += num1*num2*dtmp_V; } break; case SpinGC: is1_up = X->Def.Tpow[isite1-1]; is2_up = X->Def.Tpow[isite2-1]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_up, is2_up, isigma1, isigma2, X) private(j, num1, num2) for(j = 1;j <= i_max; j++){ num1=X_SpinGC_CisAis(j, X, is1_up, isigma1); num2=X_SpinGC_CisAis(j, X, is2_up, isigma2); list_Diagonal[j] += num1*num2*dtmp_V; } return -1; break; default: printf(cErrNoModel, X->Def.iCalcModel); return -1; } return 0; }
/** * * * @param isite1 * @param isite2 * @param isigma1 * @param isigma2 * @param dtmp_V * @param X * * @author Takahiro Misawa (The University of Tokyo) * @author Kazuyoshi Yoshimi (The University of Tokyo) * @return */ int SetDiagonalInterAll ( long unsigned int isite1, long unsigned int isite2, long unsigned int isigma1, long unsigned int isigma2, double dtmp_V, struct BindStruct *X ) { long unsigned int is1_spin; long unsigned int is2_spin; long unsigned int is1_up; long unsigned int is2_up; long unsigned int ibit1_spin; long unsigned int ibit2_spin; long unsigned int num1; long unsigned int num2; long unsigned int j; long unsigned int i_max=X->Check.idim_max; /* Forse isite1 <= isite2 */ if (isite2 < isite1) { j = isite2; isite2 = isite1; isite1 = j; j = isigma2; isigma2 = isigma1; isigma1 = j; } /* When isite1 & site2 are in the inter process regino */ if (isite1 > X->Def.Nsite) { switch (X->Def.iCalcModel) { case HubbardGC: case KondoGC: case Hubbard: case Kondo: is1_spin = X->Def.Tpow[2 * isite1 - 2 + isigma1]; is2_spin = X->Def.Tpow[2 * isite2 - 2 + isigma2]; num1 = 0; ibit1_spin = (unsigned long int)myrank&is1_spin; num1 += ibit1_spin / is1_spin; num2 = 0; ibit2_spin = (unsigned long int)myrank&is2_spin; num2 += ibit2_spin / is2_spin; #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, num2, num1) private(ibit1_spin, j) for (j = 1; j <= i_max; j++) list_Diagonal[j] += num1*num2*dtmp_V; break;/*case HubbardGC, KondoGC, Hubbard, Kondo:*/ case SpinGC: case Spin: if (X->Def.iFlgGeneralSpin == FALSE) { is1_up = X->Def.Tpow[isite1 - 1]; is2_up = X->Def.Tpow[isite2 - 1]; num1 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is1_up, isigma1); num2 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is2_up, isigma2); #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, is1_up, isigma1, X, num1, num2) private(j) for (j = 1; j <= i_max; j++) { list_Diagonal[j] += num1*num2*dtmp_V; } }/*if (X->Def.iFlgGeneralSpin == FALSE)*/ else {//start:generalspin num1 = BitCheckGeneral((unsigned long int)myrank, isite1, isigma1, X->Def.SiteToBit, X->Def.Tpow); num2 = BitCheckGeneral((unsigned long int)myrank, isite2, isigma2, X->Def.SiteToBit, X->Def.Tpow); if (num1 !=0 && num2 != 0) { #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, num1, X) private(j) for (j = 1; j <= i_max; j++) list_Diagonal[j] += dtmp_V*num1; } }/*if (X->Def.iFlgGeneralSpin == TRUE)*/ break;/*case SpinGC, Spin:*/ default: fprintf(stdoutMPI, cErrNoModel, X->Def.iCalcModel); return -1; }/*if (isite1 > X->Def.Nsite)*/ return 0; }/*if (isite1 > X->Def.Nsite)*/ else if (isite2 > X->Def.Nsite) { switch (X->Def.iCalcModel) { case HubbardGC: is1_spin = X->Def.Tpow[2 * isite1 - 2 + isigma1]; is2_spin = X->Def.Tpow[2 * isite2 - 2 + isigma2]; num2 = 0; ibit2_spin = (unsigned long int)myrank&is2_spin; num2 += ibit2_spin / is2_spin; #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, is1_spin, num2) private(num1, ibit1_spin, j) for (j = 1; j <= i_max; j++) { num1 = 0; ibit1_spin = (j - 1)&is1_spin; num1 += ibit1_spin / is1_spin; list_Diagonal[j] += num1*num2*dtmp_V; } break;/*case HubbardGC:*/ case KondoGC: case Hubbard: case Kondo: is1_spin = X->Def.Tpow[2 * isite1 - 2 + isigma1]; is2_spin = X->Def.Tpow[2 * isite2 - 2 + isigma2]; num2 = 0; ibit2_spin = (unsigned long int)myrank&is2_spin; num2 += ibit2_spin / is2_spin; #pragma omp parallel for default(none) shared(list_Diagonal, list_1) \ firstprivate(i_max, dtmp_V, is1_spin, num2) private(num1, ibit1_spin, j) for (j = 1; j <= i_max; j++) { num1 = 0; ibit1_spin = list_1[j] & is1_spin; num1 += ibit1_spin / is1_spin; list_Diagonal[j] += num1*num2*dtmp_V; } break;/*case KondoGC, Hubbard, Kondo:*/ case SpinGC: if (X->Def.iFlgGeneralSpin == FALSE) { is1_up = X->Def.Tpow[isite1 - 1]; is2_up = X->Def.Tpow[isite2 - 1]; num2 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is2_up, isigma2); #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, is1_up, isigma1, X, num2) private(j, num1) for (j = 1; j <= i_max; j++) { num1 = X_SpinGC_CisAis(j, X, is1_up, isigma1); list_Diagonal[j] += num1*num2*dtmp_V; } }/* if (X->Def.iFlgGeneralSpin == FALSE)*/ else {//start:generalspin num2 = BitCheckGeneral((unsigned long int)myrank, isite2, isigma2, X->Def.SiteToBit, X->Def.Tpow); if (num2 != 0) { #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, isite1, isigma1, X) private(j, num1) for (j = 1; j <= i_max; j++) { num1 = BitCheckGeneral(j - 1, isite1, isigma1, X->Def.SiteToBit, X->Def.Tpow); list_Diagonal[j] += dtmp_V*num1; } } }/* if (X->Def.iFlgGeneralSpin == TRUE)*/ break;/*case SpinGC:*/ case Spin: if (X->Def.iFlgGeneralSpin == FALSE) { is1_up = X->Def.Tpow[isite1 - 1]; is2_up = X->Def.Tpow[isite2 - 1]; num2 = X_SpinGC_CisAis((unsigned long int)myrank + 1, X, is2_up, isigma2); #pragma omp parallel for default(none) shared(list_Diagonal) \ firstprivate(i_max, dtmp_V, is1_up, isigma1, X, num2) private(j, num1) for (j = 1; j <= i_max; j++) { num1 = X_Spin_CisAis(j, X, is1_up, isigma1); list_Diagonal[j] += num1*num2*dtmp_V; } }/* if (X->Def.iFlgGeneralSpin == FALSE)*/ else /* if (X->Def.iFlgGeneralSpin == TRUE)*/{ num2 = BitCheckGeneral((unsigned long int)myrank, isite2, isigma2, \ X->Def.SiteToBit, X->Def.Tpow); if (num2 != 0) { #pragma omp parallel for default(none) shared(list_Diagonal, list_1) \ firstprivate(i_max, dtmp_V, isite1, isigma1, X) private(j, num1) for (j = 1; j <= i_max; j++) { num1 = BitCheckGeneral(list_1[j], isite1, isigma1, X->Def.SiteToBit, X->Def.Tpow); list_Diagonal[j] += dtmp_V*num1; } } } /* if (X->Def.iFlgGeneralSpin == TRUE)*/ break;/*case Spin:*/ default: fprintf(stdoutMPI, cErrNoModel, X->Def.iCalcModel); return -1; }/*switch (X->Def.iCalcModel)*/ return 0; }/*else if (isite2 > X->Def.Nsite)*/ switch (X->Def.iCalcModel){ case HubbardGC: //list_1[j] -> j-1 is1_spin = X->Def.Tpow[2*isite1-2+isigma1]; is2_spin = X->Def.Tpow[2*isite2-2+isigma2]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_spin, is2_spin) private(num1, ibit1_spin, num2, ibit2_spin) for(j = 1;j <= i_max;j++){ num1=0; num2=0; ibit1_spin=(j-1)&is1_spin; num1+=ibit1_spin/is1_spin; ibit2_spin=(j-1)&is2_spin; num2+=ibit2_spin/is2_spin; list_Diagonal[j]+=num1*num2*dtmp_V; } break; case KondoGC: case Hubbard: case Kondo: is1_spin = X->Def.Tpow[2*isite1-2+isigma1]; is2_spin = X->Def.Tpow[2*isite2-2+isigma2]; #pragma omp parallel for default(none) shared(list_Diagonal, list_1) firstprivate(i_max, dtmp_V, is1_spin, is2_spin) private(num1, ibit1_spin, num2, ibit2_spin) for(j = 1;j <= i_max;j++){ num1=0; num2=0; ibit1_spin=list_1[j]&is1_spin; num1+=ibit1_spin/is1_spin; ibit2_spin=list_1[j]&is2_spin; num2+=ibit2_spin/is2_spin; list_Diagonal[j]+=num1*num2*dtmp_V; } break; case Spin: if(X->Def.iFlgGeneralSpin==FALSE){ is1_up = X->Def.Tpow[isite1-1]; is2_up = X->Def.Tpow[isite2-1]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_up, is2_up, isigma1, isigma2, X) private(j, num1, num2) for(j = 1;j <= i_max; j++){ num1=X_Spin_CisAis(j, X, is1_up, isigma1); num2=X_Spin_CisAis(j, X, is2_up, isigma2); list_Diagonal[j] += num1*num2*dtmp_V; } } else{ #pragma omp parallel for default(none) shared(list_Diagonal, list_1) firstprivate(i_max, dtmp_V, isite1, isite2, isigma1, isigma2, X) private(j, num1) for(j = 1;j <= i_max; j++){ num1=BitCheckGeneral (list_1[j], isite1, isigma1, X->Def.SiteToBit, X->Def.Tpow); if(num1 != 0){ num1=BitCheckGeneral (list_1[j], isite2, isigma2, X->Def.SiteToBit, X->Def.Tpow); list_Diagonal[j] += dtmp_V*num1; } } } break; case SpinGC: if(X->Def.iFlgGeneralSpin==FALSE){ is1_up = X->Def.Tpow[isite1-1]; is2_up = X->Def.Tpow[isite2-1]; #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, is1_up, is2_up, isigma1, isigma2, X) private(j, num1, num2) for(j = 1;j <= i_max; j++){ num1=X_SpinGC_CisAis(j, X, is1_up, isigma1); num2=X_SpinGC_CisAis(j, X, is2_up, isigma2); list_Diagonal[j] += num1*num2*dtmp_V; } } else{//start:generalspin #pragma omp parallel for default(none) shared(list_Diagonal) firstprivate(i_max, dtmp_V, isite1, isite2, isigma1, isigma2, X) private(j, num1) for(j = 1;j <= i_max; j++){ num1=BitCheckGeneral (j-1, isite1, isigma1, X->Def.SiteToBit, X->Def.Tpow); if(num1 != 0){ num1=BitCheckGeneral (j-1, isite2, isigma2, X->Def.SiteToBit, X->Def.Tpow); list_Diagonal[j] += dtmp_V*num1; } } } break; default: fprintf(stdoutMPI, cErrNoModel, X->Def.iCalcModel); return -1; } return 0; }