예제 #1
0
파일: lapack_diag.c 프로젝트: QLMS/HPhi
/** 
 * 
 * 
 * @param X 
 * 
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 * @return 
 */
int lapack_diag(struct BindStruct *X){
  
  FILE *fp;
  char sdt[D_FileNameMax]="";
  int i,j,i_max,xMsize;
 
  i_max=X->Check.idim_max;   

  for(i=0;i<i_max;i++){
    for(j=0;j<i_max;j++){
     Ham[i][j] =Ham[i+1][j+1];
    }
  }
  xMsize = i_max;
  //DSEVvector(xMsize, Ham, v0, L_vec);
  ZHEEVall(xMsize, Ham, v0, L_vec);
  strcpy(sdt,cFileNameEigenvalue_Lanczos);
  if(childfopenMPI(sdt,"w",&fp)!=0){
    return -1;
  }
  for(i=0;i<i_max;i++){
    fprintf(fp," %d %.10lf \n",i, creal(v0[i]));
  }
  fclose(fp);
  return 0;
}
예제 #2
0
파일: HPhiTrans.c 프로젝트: QLMS/HPhi
/** 
 * 
 * 
 * @param X 
 * 
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 *
 * @return 
 */
int HPhiTrans(struct BindStruct *X){ 
  FILE *fp_err;
  char sdt_err[D_FileNameMax];

  int i,k;
  int cnt_trans;
 
  strcpy(sdt_err, cFileNameWarningOnTransfer);
  if(childfopenMPI(sdt_err, "w", &fp_err)!=0){
    return -1;
  }
  fclose(fp_err);
	 
  //Transefer
  cnt_trans=0;
  
  for(i=0;i<X->Def.EDNTransfer;i++){
    // eliminate double counting
    for(k=0;k<cnt_trans;k++){
      if( X->Def.EDGeneralTransfer[i][1] == X->Def.EDGeneralTransfer[k][1]
	  && X->Def.EDGeneralTransfer[i][3] == X->Def.EDGeneralTransfer[k][3]){
	if(X->Def.EDGeneralTransfer[i][0] == X->Def.EDGeneralTransfer[k][0]
	   && X->Def.EDGeneralTransfer[i][2] == X->Def.EDGeneralTransfer[k][2]){
	  sprintf(sdt_err,"%s",cErrTransfer);
	  childfopenMPI(sdt_err,"a", &fp_err);
	  fprintf(fp_err,cErrDoubleCounting, X->Def.EDGeneralTransfer[k][0] ,X->Def.EDGeneralTransfer[k][2], X->Def.EDGeneralTransfer[k][1], X->Def.EDGeneralTransfer[k][3]);
	  fclose(fp_err);
//	  return -1;
	}
      }
    }
    cnt_trans+=1;
  }
  
  //fprintf(stdoutMPI, cProEDNTrans, cnt_trans);
  //fprintf(stdoutMPI, cProEDNChemi, cnt_chemi);

  return 0;
}    
예제 #3
0
int OutputTMComponents(
        struct EDMainCalStruct *X,
        double *_alpha,
        double *_beta,
        double _dnorm,
        int liLanczosStp
)
{
    char sdt[D_FileNameMax];
    unsigned long int i;
    FILE *fp;

    sprintf(sdt, cFileNameTridiagonalMatrixComponents, X->Bind.Def.CDataFileHead);
    childfopenMPI(sdt,"w", &fp);
    fprintf(fp, "%d \n",liLanczosStp);
    fprintf(fp, "%.10lf \n",_dnorm);
    for( i = 1 ; i <= liLanczosStp; i++){
        fprintf(fp,"%.10lf %.10lf \n", alpha[i], beta[i]);
    }
    fclose(fp);
    return TRUE;
}
예제 #4
0
int ReadTMComponents(
        struct EDMainCalStruct *X,
        double *_dnorm,
        unsigned long int *_i_max
){
    char sdt[D_FileNameMax];
    char ctmp[256];

    unsigned long int idx;
    unsigned long int i_max;
    double dnorm;
    FILE *fp;
    idx=1;
    sprintf(sdt, cFileNameTridiagonalMatrixComponents, X->Bind.Def.CDataFileHead);
    childfopenMPI(sdt,"r", &fp);

    fgetsMPI(ctmp, sizeof(ctmp)/sizeof(char), fp);
    sscanf(ctmp,"%ld \n", &i_max);
    if(X->Bind.Def.iFlgCalcSpec == RECALC_INOUT_TMComponents_VEC||
       X->Bind.Def.iFlgCalcSpec == RECALC_FROM_TMComponents_VEC) {
        alpha=(double*)realloc(alpha, sizeof(double)*(i_max + X->Bind.Def.Lanczos_max + 1));
        beta=(double*)realloc(beta, sizeof(double)*(i_max + X->Bind.Def.Lanczos_max + 1));
    }
    else if(X->Bind.Def.iFlgCalcSpec==RECALC_FROM_TMComponents){
        alpha=(double*)realloc(alpha, sizeof(double)*(i_max + 1));
        beta=(double*)realloc(beta, sizeof(double)*(i_max + 1));
    }
    fgetsMPI(ctmp, sizeof(ctmp)/sizeof(char), fp);
    sscanf(ctmp,"%lf \n", &dnorm);
    while(fgetsMPI(ctmp, sizeof(ctmp)/sizeof(char), fp) != NULL){
        sscanf(ctmp,"%lf %lf \n", &alpha[idx], &beta[idx]);
        idx++;
    }
    fclose(fp);
    *_dnorm=dnorm;
    *_i_max=i_max;
    return TRUE;
}
예제 #5
0
/** 
 * @brief A main function to calculate eigenvalues and eigenvectors by Lanczos method 
 * 
 * @param[in,out] X CalcStruct list for getting and pushing calculation information 
 * @retval 0 normally finished
 * @retval -1 unnormally finished
 *
 * @version 0.2
 * @date 2015/10/20 add function of using a flag of iCalcEigenVec
 * @version 0.1
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 * 
 */
int CalcByLanczos(		 
                  struct EDMainCalStruct *X
                         )
{
  char sdt[D_FileNameMax];
  double diff_ene,var;
  long int i;
  long int i_max=0;
  FILE *fp;
  
  if(X->Bind.Def.iInputEigenVec==FALSE){
    // this part will be modified
    switch(X->Bind.Def.iCalcModel){
    case HubbardGC:
    case SpinGC:
    case KondoGC:
    case SpinlessFermionGC:
      initial_mode = 1; // 1 -> random initial vector
      break;
    case Hubbard:
    case Kondo:
    case Spin:
    case SpinlessFermion:

      if(X->Bind.Def.iFlgGeneralSpin ==TRUE){
        initial_mode=1;
      }
      else{
        if(X->Bind.Def.initial_iv>0){
          initial_mode = 0; // 0 -> only v[iv] = 1
        }else{
          initial_mode = 1; // 1 -> random initial vector
        }
      }
      break;
    default:
      //fclose(fp);
      exitMPI(-1);
    }
 
    if(Lanczos_EigenValue(&(X->Bind))!=0){
      fprintf(stderr, "  Lanczos Eigenvalue is not converged in this process.\n");      
      return(FALSE);
    }

    if(X->Bind.Def.iCalcEigenVec==CALCVEC_NOT){
       fprintf(stdoutMPI, "  Lanczos EigenValue = %.10lf \n ",X->Bind.Phys.Target_energy);
      return(TRUE);
    }

    fprintf(stdoutMPI, cLogLanczos_EigenVecStart);
//    printf("debug: X->Bind.Check.idim_maxMPI=%d\n", X->Bind.Check.idim_maxMPI);

    if(X->Bind.Check.idim_maxMPI != 1){
      Lanczos_EigenVector(&(X->Bind));
      expec_energy(&(X->Bind));
      //check for the accuracy of the eigenvector
      var      = fabs(X->Bind.Phys.var-X->Bind.Phys.energy*X->Bind.Phys.energy)/fabs(X->Bind.Phys.var);
      diff_ene = fabs(X->Bind.Phys.Target_energy-X->Bind.Phys.energy)/fabs(X->Bind.Phys.Target_energy);
      
      fprintf(stdoutMPI, "\n");
      fprintf(stdoutMPI, "  Accuracy check !!!\n");
      fprintf(stdoutMPI, "  LanczosEnergy = %.14e \n  EnergyByVec   = %.14e \n  diff_ene      = %.14e \n  var           = %.14e \n",X->Bind.Phys.Target_energy,X->Bind.Phys.energy,diff_ene,var);
      if(diff_ene < eps_Energy && var< eps_Energy){
        fprintf(stdoutMPI, "  Accuracy of Lanczos vectors is enough.\n");
        fprintf(stdoutMPI, "\n");
      }
      /*
      else{
         Comment out: Power Lanczos method
           fprintf(stdoutMPI, "  Accuracy of Lanczos vectors is NOT enough\n");
           iconv=1;
           fprintf(stdoutMPI, "Eigenvector is improved by power Lanczos method \n");
           fprintf(stdoutMPI, "Power Lanczos starts\n");
           flag=PowerLanczos(&(X->Bind));
           fprintf(stdoutMPI, "Power Lanczos ends\n");
           if(flag==1){
           var      = fabs(X->Bind.Phys.var-X->Bind.Phys.energy*X->Bind.Phys.energy)/fabs(X->Bind.Phys.var);
           diff_ene = fabs(X->Bind.Phys.Target_energy-X->Bind.Phys.energy)/fabs(X->Bind.Phys.Target_energy);
           fprintf(stdoutMPI,"\n");
           fprintf(stdoutMPI,"Power Lanczos Accuracy check !!!\n");
           fprintf(stdoutMPI,"%.14e %.14e: diff_ene=%.14e var=%.14e \n ",X->Bind.Phys.Target_energy,X->Bind.Phys.energy,diff_ene,var);
           fprintf(stdoutMPI,"\n");
	
           }
     else if(X->Bind.Def.iCalcEigenVec==CALCVEC_LANCZOSCG && iconv==1){     
 */
      else if(X->Bind.Def.iCalcEigenVec==CALCVEC_LANCZOSCG){        
        fprintf(stdoutMPI, "  Accuracy of Lanczos vectors is NOT enough\n\n");
        X->Bind.Def.St=1;
        CG_EigenVector(&(X->Bind));
        expec_energy(&(X->Bind));
        var      = fabs(X->Bind.Phys.var-X->Bind.Phys.energy*X->Bind.Phys.energy)/fabs(X->Bind.Phys.var);
        diff_ene = fabs(X->Bind.Phys.Target_energy-X->Bind.Phys.energy)/fabs(X->Bind.Phys.Target_energy);
        fprintf(stdoutMPI, "\n");
        fprintf(stdoutMPI, "  CG Accuracy check !!!\n");
        fprintf(stdoutMPI, "  LanczosEnergy = %.14e\n  EnergyByVec   = %.14e\n  diff_ene      = %.14e\n  var           = %.14e \n ",X->Bind.Phys.Target_energy,X->Bind.Phys.energy,diff_ene,var);
        fprintf(stdoutMPI, "\n");
        //}
      }
    }
    else{//idim_max=1
      v0[1]=1;
      expec_energy(&(X->Bind));
    }
  }
  else{// X->Bind.Def.iInputEigenVec=false :input v1:
    fprintf(stdoutMPI, "An Eigenvector is inputted.\n");
    sprintf(sdt, cFileNameInputEigen, X->Bind.Def.CDataFileHead, X->Bind.Def.k_exct-1, myrank);
    childfopenALL(sdt, "rb", &fp);
    if(fp==NULL){
      fprintf(stderr, "Error: A file of Inputvector does not exist.\n");
      exitMPI(-1);
    }
    fread(&i_max, sizeof(long int), 1, fp);
    if(i_max != X->Bind.Check.idim_max){
      fprintf(stderr, "Error: A file of Inputvector is incorrect.\n");
      exitMPI(-1);
    }
    fread(v1, sizeof(complex double),X->Bind.Check.idim_max+1, fp);
    
    fclose(fp);
  }

  fprintf(stdoutMPI, cLogLanczos_EigenVecEnd);
  // v1 is eigen vector
    
  if(!expec_cisajs(&(X->Bind), v1)==0){
    fprintf(stderr, "Error: calc OneBodyG.\n");
    exitMPI(-1);
  }
  
  if(!expec_cisajscktaltdc(&(X->Bind), v1)==0){
    fprintf(stderr, "Error: calc TwoBodyG.\n");
    exitMPI(-1);
  }
  
  /* For ver.1.0
     if(!expec_totalspin(&(X->Bind), v1)==0){
     fprintf(stderr, "Error: calc TotalSpin.\n");
     exitMPI(-1);
     }
  */
  
  if(!expec_totalSz(&(X->Bind), v1)==0){
    fprintf(stderr, "Error: calc TotalSz.\n");
    exitMPI(-1);
  }

  if(X->Bind.Def.St==0){
    sprintf(sdt, cFileNameEnergy_Lanczos, X->Bind.Def.CDataFileHead);
  }else if(X->Bind.Def.St==1){
    sprintf(sdt, cFileNameEnergy_CG, X->Bind.Def.CDataFileHead);
  }
  
  if(childfopenMPI(sdt, "w", &fp)!=0){
    exitMPI(-1);
  }  


  fprintf(fp,"Energy  %.16lf \n",X->Bind.Phys.energy);
  fprintf(fp,"Doublon  %.16lf \n",X->Bind.Phys.doublon);
  fprintf(fp,"Sz  %.16lf \n",X->Bind.Phys.sz);
  //    fprintf(fp,"total S^2  %.10lf \n",X->Bind.Phys.s2);    
  fclose(fp);

  if(X->Bind.Def.iOutputEigenVec==TRUE){
    sprintf(sdt, cFileNameOutputEigen, X->Bind.Def.CDataFileHead, X->Bind.Def.k_exct-1, myrank);
    if(childfopenALL(sdt, "wb", &fp)!=0){
      exitMPI(-1);
    }
    fwrite(&X->Bind.Check.idim_max, sizeof(X->Bind.Check.idim_max),1,fp);
    fwrite(v1, sizeof(complex double),X->Bind.Check.idim_max+1, fp);    
    fclose(fp);
  }

  return TRUE;
}
예제 #6
0
/** 
 * 
 * 
 * @param X 
 * 
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 * @return 
 */
int Lanczos_EigenValue(struct BindStruct *X)
{

  fprintf(stdoutMPI, "%s", cLogLanczos_EigenValueStart);
  FILE *fp;
  char sdt[D_FileNameMax],sdt_2[D_FileNameMax];
  int stp, iproc;
  long int i,iv,i_max;      
  unsigned long int i_max_tmp, sum_i_max;
  int k_exct,Target;
  int iconv=-1;
  double beta1,alpha1; //beta,alpha1 should be real
  double  complex temp1,temp2;
  double complex cbeta1;
  double E[5],ebefor;
  int mythread;

// for GC
  double dnorm;
  double complex cdnorm;
  long unsigned int u_long_i;
  dsfmt_t dsfmt;

#ifdef lapack
  double **tmp_mat;
  double *tmp_E;
  int    int_i,int_j,mfint[7];
#endif
      
  sprintf(sdt_2, cFileNameLanczosStep, X->Def.CDataFileHead);

  i_max=X->Check.idim_max;      
  k_exct = X->Def.k_exct;

  if(initial_mode == 0){

    sum_i_max = SumMPI_li(X->Check.idim_max);
    X->Large.iv = (sum_i_max / 2 + X->Def.initial_iv) % sum_i_max + 1;
    iv=X->Large.iv;
    fprintf(stdoutMPI, "  initial_mode=%d normal: iv = %ld i_max=%ld k_exct =%d \n\n",initial_mode,iv,i_max,k_exct);       
#pragma omp parallel for default(none) private(i) shared(v0, v1) firstprivate(i_max)
    for(i = 1; i <= i_max; i++){
      v0[i]=0.0;
      v1[i]=0.0;
    }

    sum_i_max = 0;
    for (iproc = 0; iproc < nproc; iproc++) {

      i_max_tmp = BcastMPI_li(iproc, i_max);
      if (sum_i_max <= iv && iv < sum_i_max + i_max_tmp) {

        if (myrank == iproc) {
          v1[iv - sum_i_max+1] = 1.0;
          if (X->Def.iInitialVecType == 0) {
            v1[iv - sum_i_max+1] += 1.0*I;
            v1[iv - sum_i_max+1] /= sqrt(2.0);
          }
        }/*if (myrank == iproc)*/
      }/*if (sum_i_max <= iv && iv < sum_i_max + i_max_tmp)*/

      sum_i_max += i_max_tmp;

    }/*for (iproc = 0; iproc < nproc; iproc++)*/
  }/*if(initial_mode == 0)*/
  else if(initial_mode==1){
    iv = X->Def.initial_iv;
    fprintf(stdoutMPI, "  initial_mode=%d (random): iv = %ld i_max=%ld k_exct =%d \n\n",initial_mode,iv,i_max,k_exct);       
    #pragma omp parallel default(none) private(i, u_long_i, mythread, dsfmt) \
            shared(v0, v1, iv, X, nthreads, myrank) firstprivate(i_max)
    {

#pragma omp for
      for (i = 1; i <= i_max; i++) {
        v0[i] = 0.0;
      }
      /*
       Initialise MT
      */
#ifdef _OPENMP
      mythread = omp_get_thread_num();
#else
      mythread = 0;
#endif
      u_long_i = 123432 + labs(iv) + mythread + nthreads * myrank;
      dsfmt_init_gen_rand(&dsfmt, u_long_i);

      if (X->Def.iInitialVecType == 0) {
#pragma omp for
        for (i = 1; i <= i_max; i++)
          v1[i] = 2.0*(dsfmt_genrand_close_open(&dsfmt) - 0.5) + 2.0*(dsfmt_genrand_close_open(&dsfmt) - 0.5)*I;
      }
      else {
#pragma omp for
        for (i = 1; i <= i_max; i++)
          v1[i] = 2.0*(dsfmt_genrand_close_open(&dsfmt) - 0.5);
      }

    }/*#pragma omp parallel*/

    cdnorm=0.0;
#pragma omp parallel for default(none) private(i) shared(v1, i_max) reduction(+: cdnorm) 
    for(i=1;i<=i_max;i++){
     cdnorm += conj(v1[i])*v1[i];
    }
    cdnorm = SumMPI_dc(cdnorm);
    dnorm=creal(cdnorm);
    dnorm=sqrt(dnorm);
    #pragma omp parallel for default(none) private(i) shared(v1) firstprivate(i_max, dnorm)
    for(i=1;i<=i_max;i++){
      v1[i] = v1[i]/dnorm;
    }
  }/*else if(initial_mode==1)*/
  
  //Eigenvalues by Lanczos method
  TimeKeeper(X, cFileNameTimeKeep, cLanczos_EigenValueStart, "a");
  mltply(X, v0, v1);
  stp=1;
  TimeKeeperWithStep(X, cFileNameTimeKeep, cLanczos_EigenValueStep, "a", stp);

    alpha1=creal(X->Large.prdct) ;// alpha = v^{\dag}*H*v

  alpha[1]=alpha1;
  cbeta1=0.0;
  
#pragma omp parallel for reduction(+:cbeta1) default(none) private(i) shared(v0, v1) firstprivate(i_max, alpha1)
  for(i = 1; i <= i_max; i++){
    cbeta1+=conj(v0[i]-alpha1*v1[i])*(v0[i]-alpha1*v1[i]);
  }
  cbeta1 = SumMPI_dc(cbeta1);
  beta1=creal(cbeta1);
  beta1=sqrt(beta1);
  beta[1]=beta1;
  ebefor=0;

/*
      Set Maximum number of loop to the dimention of the Wavefunction
    */
  i_max_tmp = SumMPI_li(i_max);
  if(i_max_tmp < X->Def.Lanczos_max){
    X->Def.Lanczos_max = i_max_tmp;
  }
  if(i_max_tmp < X->Def.LanczosTarget){
    X->Def.LanczosTarget = i_max_tmp;
  }
  if(i_max_tmp == 1){
    E[1]=alpha[1];
    vec12(alpha,beta,stp,E,X);		
    X->Large.itr=stp;
    X->Phys.Target_energy=E[k_exct];
    iconv=0;
    fprintf(stdoutMPI,"  LanczosStep  E[1] \n");
    fprintf(stdoutMPI,"  stp=%d %.10lf \n",stp,E[1]);
  }
  else{
#ifdef lapack
    fprintf(stdoutMPI, "  LanczosStep  E[1] E[2] E[3] E[4] E_Max/Nsite\n");
#else
    fprintf(stdoutMPI, "  LanczosStep  E[1] E[2] E[3] E[4] \n");
#endif
  for(stp = 2; stp <= X->Def.Lanczos_max; stp++){
#pragma omp parallel for default(none) private(i,temp1, temp2) shared(v0, v1) firstprivate(i_max, alpha1, beta1)
    for(i=1;i<=i_max;i++){
      temp1 = v1[i];
      temp2 = (v0[i]-alpha1*v1[i])/beta1;
      v0[i] = -beta1*temp1;
      v1[i] =  temp2;
    }

      mltply(X, v0, v1);
      TimeKeeperWithStep(X, cFileNameTimeKeep, cLanczos_EigenValueStep, "a", stp);
    alpha1=creal(X->Large.prdct);
    alpha[stp]=alpha1;
    cbeta1=0.0;

#pragma omp parallel for reduction(+:cbeta1) default(none) private(i) shared(v0, v1) firstprivate(i_max, alpha1)
    for(i=1;i<=i_max;i++){
      cbeta1+=conj(v0[i]-alpha1*v1[i])*(v0[i]-alpha1*v1[i]);
    }
    cbeta1 = SumMPI_dc(cbeta1);
    beta1=creal(cbeta1);
    beta1=sqrt(beta1);
    beta[stp]=beta1;

    Target  = X->Def.LanczosTarget;
        
    if(stp==2){      
     #ifdef lapack
      d_malloc2(tmp_mat,stp,stp);
      d_malloc1(tmp_E,stp+1);

       for(int_i=0;int_i<stp;int_i++){
         for(int_j=0;int_j<stp;int_j++){
           tmp_mat[int_i][int_j] = 0.0;
         }
       } 
       tmp_mat[0][0]   = alpha[1]; 
       tmp_mat[0][1]   = beta[1]; 
       tmp_mat[1][0]   = beta[1]; 
       tmp_mat[1][1]   = alpha[2]; 
       DSEVvalue(stp,tmp_mat,tmp_E);
       E[1] = tmp_E[0];
       E[2] = tmp_E[1];
       E[3] = tmp_E[2];
       E[4] = tmp_E[3];
       d_free1(tmp_E,stp+1);
       d_free2(tmp_mat,stp,stp);
     #else
       bisec(alpha,beta,stp,E,4,eps_Bisec);
     #endif
       ebefor=E[Target];
       
       childfopenMPI(sdt_2,"w", &fp);
#ifdef lapack
       fprintf(stdoutMPI, "  stp = %d %.10lf %.10lf xxxxxxxxxx xxxxxxxxx xxxxxxxxx \n",stp,E[1],E[2]);

       fprintf(fp, "LanczosStep  E[1] E[2] E[3] E[4] E_Max/Nsite\n");
       fprintf(fp, "stp = %d %.10lf %.10lf xxxxxxxxxx xxxxxxxxx xxxxxxxxx \n",stp,E[1],E[2]);
#else
       fprintf(stdoutMPI, "  stp = %d %.10lf %.10lf xxxxxxxxxx xxxxxxxxx \n",stp,E[1],E[2]);
       fprintf(fp, "LanczosStep  E[1] E[2] E[3] E[4] \n");
       fprintf(fp,"stp = %d %.10lf %.10lf xxxxxxxxxx xxxxxxxxx \n",stp,E[1],E[2]);
#endif
       fclose(fp);
    }
            
    if(stp>2 && stp%2==0){
      
      childfopenMPI(sdt_2,"a", &fp);
      
#ifdef lapack
      d_malloc2(tmp_mat,stp,stp);
      d_malloc1(tmp_E,stp+1);

       for(int_i=0;int_i<stp;int_i++){
         for(int_j=0;int_j<stp;int_j++){
           tmp_mat[int_i][int_j] = 0.0;
         }
       } 
       tmp_mat[0][0]   = alpha[1]; 
       tmp_mat[0][1]   = beta[1]; 
       for(int_i=1;int_i<stp-1;int_i++){
         tmp_mat[int_i][int_i]     = alpha[int_i+1]; 
         tmp_mat[int_i][int_i+1]   = beta[int_i+1]; 
         tmp_mat[int_i][int_i-1]   = beta[int_i]; 
       }
       tmp_mat[int_i][int_i]       = alpha[int_i+1]; 
       tmp_mat[int_i][int_i-1]     = beta[int_i]; 
       DSEVvalue(stp,tmp_mat,tmp_E);
       E[1] = tmp_E[0];
       E[2] = tmp_E[1];
       E[3] = tmp_E[2];
       E[4] = tmp_E[3];
       E[0] = tmp_E[stp-1];
       d_free1(tmp_E,stp+1);
       d_free2(tmp_mat,stp,stp);       
       fprintf(stdoutMPI, "  stp = %d %.10lf %.10lf %.10lf %.10lf %.10lf\n",stp,E[1],E[2],E[3],E[4],E[0]/(double)X->Def.NsiteMPI);
       fprintf(fp,"stp=%d %.10lf %.10lf %.10lf %.10lf %.10lf\n",stp,E[1],E[2],E[3],E[4],E[0]/(double)X->Def.NsiteMPI);
#else
       bisec(alpha,beta,stp,E,4,eps_Bisec);
       fprintf(stdoutMPI, "  stp = %d %.10lf %.10lf %.10lf %.10lf \n",stp,E[1],E[2],E[3],E[4]);
       fprintf(fp,"stp=%d %.10lf %.10lf %.10lf %.10lf\n",stp,E[1],E[2],E[3],E[4]);
#endif 
       fclose(fp);

      if(fabs((E[Target]-ebefor)/E[Target])<eps_Lanczos || fabs(beta[stp])<pow(10.0, -14)){
        vec12(alpha,beta,stp,E,X);		
        X->Large.itr=stp;       
        X->Phys.Target_energy=E[k_exct];
	iconv=0;
	break;
      }

      ebefor=E[Target];            
    }
  }        
  }

  sprintf(sdt,cFileNameTimeKeep,X->Def.CDataFileHead);
  if(iconv!=0){
    sprintf(sdt,  cLogLanczos_EigenValueNotConverged);
    return -1;
  }

  TimeKeeper(X, cFileNameTimeKeep, cLanczos_EigenValueFinish, "a");
  fprintf(stdoutMPI, "%s", cLogLanczos_EigenValueEnd);

  return 0;
}
예제 #7
0
/**
 * @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;
}
예제 #8
0
파일: check.c 프로젝트: QLMS/HPhi
/** 
 * @brief A program to check size of dimension for hirbert-space.
 * 
 * @param[in,out] X  Common data set used in HPhi.
 * 
 * @retval TRUE normally finished
 * @retval FALSE unnormally finished
 * @retval MPIFALSE CheckMPI unormally finished
 * @version 0.2
 * @details add function of calculating hirbert space for canonical ensemble.
 *  
 * @version 0.1
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 */
int check(struct BindStruct *X){
    
  FILE *fp;
  long unsigned int i,tmp_sdim;
  int NLocSpn,NCond,Nup,Ndown;
  long unsigned int u_tmp;
  long unsigned int tmp;
  long unsigned int Ns,comb_1,comb_2,comb_3,comb_sum, comb_up, comb_down;
  int u_loc;
  int mfint[7];
  long int **comb;    
  long unsigned int idimmax=0;
  long unsigned int idim=0;
  long unsigned int isite=0;
  int tmp_sz=0;
  int iMinup=0;
  int iAllup=X->Def.Ne;

  /*
    Set Site number per MPI process 
  */
  if(CheckMPI(X)!=TRUE){
    return MPIFALSE;
  }

  Ns = X->Def.Nsite;

  li_malloc2(comb, Ns+1,Ns+1);

  //idim_max
  switch(X->Def.iCalcModel){
  case HubbardGC:
    //comb_sum = 2^(2*Ns)=4^Ns
    comb_sum = 1;
    for(i=0;i<2*X->Def.Nsite;i++){
      comb_sum= 2*comb_sum;     
    }
    break;
  case SpinGC:
    //comb_sum = 2^(Ns)
    comb_sum = 1;
    if(X->Def.iFlgGeneralSpin ==FALSE){
      for(i=0;i<X->Def.Nsite;i++){
	comb_sum= 2*comb_sum;     
      }
    }
    else{
      for(i=0; i<X->Def.Nsite;i++){
	comb_sum=comb_sum*X->Def.SiteToBit[i];
      }
    }
    break;

  case Hubbard:
    comb_up= Binomial(Ns, X->Def.Nup, comb, Ns);
    comb_down= Binomial(Ns, X->Def.Ndown, comb, Ns);
    comb_sum=comb_up*comb_down;
    break;

  case HubbardNConserved:
    comb_sum=0;
    if(X->Def.Ne > X->Def.Nsite){
      iMinup = X->Def.Ne-X->Def.Nsite;
      iAllup = X->Def.Nsite;
    }

    for(i=iMinup; i<= iAllup; i++){
      comb_up= Binomial(Ns, i, comb, Ns);
      comb_down= Binomial(Ns, X->Def.Ne-i, comb, Ns);
      comb_sum +=comb_up*comb_down;
    }
    break;
    
  case Kondo:
    //idim_max
    // calculation of dimension
    // Nup      = u_loc+u_cond
    // Ndown    = d_loc+d_cond
    // NLocSpn  = u_loc+d_loc
    // Ncond    = Nsite-NLocSpn
    // idim_max = \sum_{u_loc=0}^{u_loc=Nup} 
    //              Binomial(NLocSpn,u_loc)
    //             *Binomial(NCond,Nup-u_loc)
    //             *Binomial(NCond,Ndown+u_loc-NLocSpn)
    //comb_1 = Binomial(NLocSpn,u_loc)
    //comb_2 = Binomial(NCond,Nup-u_loc)
    //comb_3 = Binomial(NCond,Ndown+u_loc-NLocSpn)
    Nup     = X->Def.Nup;
    Ndown   = X->Def.Ndown;
    NCond   = X->Def.Nsite-X->Def.NLocSpn;
    NLocSpn = X->Def.NLocSpn;
    comb_sum = 0;
    for(u_loc=0;u_loc<=X->Def.Nup;u_loc++){
      comb_1     = Binomial(NLocSpn,u_loc,comb,Ns);
      comb_2     = Binomial(NCond,Nup-u_loc,comb,Ns);
      comb_3     = Binomial(NCond,Ndown+u_loc-NLocSpn,comb,Ns);
      comb_sum  += comb_1*comb_2*comb_3;
    }
    break;
  case KondoGC:
    comb_sum = 1;
    NCond   = X->Def.Nsite-X->Def.NLocSpn;
    NLocSpn = X->Def.NLocSpn;
    //4^Nc*2^Ns
    for(i=0;i<(2*NCond+NLocSpn);i++){
      comb_sum= 2*comb_sum;     
    }
    break;
  case Spin:

    if(X->Def.iFlgGeneralSpin ==FALSE){
      if(X->Def.Nup+X->Def.Ndown != X->Def.Nsite){
	fprintf(stderr, " 2Sz is incorrect.\n");
	return FALSE;
      }
      comb_sum= Binomial(Ns, X->Def.Ne, comb, Ns);
    }
    else{
      idimmax = 1;
      X->Def.Tpow[0]=idimmax;
      for(isite=0; isite<X->Def.Nsite;isite++){
	idimmax=idimmax*X->Def.SiteToBit[isite];
	X->Def.Tpow[isite+1]=idimmax;
      }
      comb_sum=0;
#pragma omp parallel for default(none) reduction(+:comb_sum) private(tmp_sz, isite) firstprivate(idimmax, X) 
      for(idim=0; idim<idimmax; idim++){
	tmp_sz=0;
	for(isite=0; isite<X->Def.Nsite;isite++){
	  tmp_sz += GetLocal2Sz(isite+1,idim, X->Def.SiteToBit, X->Def.Tpow );	  
	}
	if(tmp_sz == X->Def.Total2Sz){
	  comb_sum +=1;
	}
      }
      
    }
    
    break;
  default:
    fprintf(stderr, cErrNoModel, X->Def.iCalcModel);
    i_free2(comb, Ns+1, Ns+1);
    return FALSE;
  }  

  if(comb_sum==0){
    fprintf(stderr, "%s", cErrNoHilbertSpace);
    //    return FALSE;
  }
  
  //fprintf(stdoutMPI, "comb_sum= %ld \n",comb_sum);

  X->Check.idim_max = comb_sum;
  switch(X->Def.iCalcType){
  case Lanczos:
    switch(X->Def.iCalcModel){
    case Hubbard:
    case HubbardNConserved:
    case Kondo:
    case KondoGC:
    case Spin:
      X->Check.max_mem=5.5*X->Check.idim_max*8.0/(pow(10,9));
      break;
    case HubbardGC:
    case SpinGC:
      X->Check.max_mem=4.5*X->Check.idim_max*8.0/(pow(10,9));
      break;
    }
    break;
  case TPQCalc:
    switch(X->Def.iCalcModel){
    case Hubbard:
    case HubbardNConserved:
    case Kondo:
    case KondoGC:
    case Spin:
      if(X->Def.iFlgCalcSpec != CALCSPEC_NOT){
        X->Check.max_mem=(2)*X->Check.idim_max*16.0/(pow(10,9));
      }
      else {
        X->Check.max_mem = 4.5 * X->Check.idim_max * 16.0 / (pow(10, 9));
      }
      break;
    case HubbardGC:
    case SpinGC:
      if(X->Def.iFlgCalcSpec != CALCSPEC_NOT){
        X->Check.max_mem=(2)*X->Check.idim_max*16.0/(pow(10,9));
      }
      else {
        X->Check.max_mem = 3.5 * X->Check.idim_max * 16.0 / (pow(10, 9));
      }
      break;
    }
    break;
  case FullDiag:
    X->Check.max_mem=X->Check.idim_max*8.0*X->Check.idim_max*8.0/(pow(10,9));
    break;
  default:
    return FALSE;
    //break;
  }

  //fprintf(stdoutMPI, "  MAX DIMENSION idim_max=%ld \n",X->Check.idim_max);
  //fprintf(stdoutMPI, "  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n",X->Check.max_mem);
  unsigned long int li_dim_max=MaxMPI_li(X->Check.idim_max);
  fprintf(stdoutMPI, "  MAX DIMENSION idim_max=%ld \n",li_dim_max);
  double dmax_mem=MaxMPI_d(X->Check.max_mem);
  fprintf(stdoutMPI, "  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n",dmax_mem);
  if(childfopenMPI(cFileNameCheckMemory,"w", &fp)!=0){
    i_free2(comb, Ns+1, Ns+1);
    return FALSE;
  }
  fprintf(fp,"  MAX DIMENSION idim_max=%ld \n", li_dim_max);
  fprintf(fp,"  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n", dmax_mem);

  
  /*
  fprintf(fp,"  MAX DIMENSION idim_max=%ld \n",X->Check.idim_max);
  fprintf(fp,"  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n",X->Check.max_mem);
  */
  fclose(fp);

  //sdim 
  tmp=1;
  tmp_sdim=1;

  switch(X->Def.iCalcModel){
  case HubbardGC:
  case KondoGC:
  case HubbardNConserved:
  case Hubbard:
  case Kondo:
    while(tmp <= X->Def.Nsite){
      tmp_sdim=tmp_sdim*2;
      tmp+=1;
    }
    break;
  case Spin:
  case SpinGC:
    if(X->Def.iFlgGeneralSpin==FALSE){ 
      while(tmp <= X->Def.Nsite/2){
	tmp_sdim=tmp_sdim*2;
	tmp+=1;
      }
    }
    else{
      GetSplitBitForGeneralSpin(X->Def.Nsite, &tmp_sdim, X->Def.SiteToBit);
    }
    break;
  default:
    fprintf(stdoutMPI, cErrNoModel, X->Def.iCalcModel);
    i_free2(comb, Ns+1, Ns+1);
    return FALSE;
  }  
  X->Check.sdim=tmp_sdim;
  
  if(childfopenMPI(cFileNameCheckSdim,"w", &fp)!=0){
    i_free2(comb, Ns+1, Ns+1);
    return FALSE;
  }

  switch(X->Def.iCalcModel){
  case HubbardGC:
  case KondoGC:
  case HubbardNConserved:
  case Hubbard:
  case Kondo:
    //fprintf(stdoutMPI, "sdim=%ld =2^%d\n",X->Check.sdim,X->Def.Nsite);
    fprintf(fp,"sdim=%ld =2^%d\n",X->Check.sdim,X->Def.Nsite);
    break;
  case Spin:
  case SpinGC:
    if(X->Def.iFlgGeneralSpin==FALSE){
      //fprintf(stdoutMPI, "sdim=%ld =2^%d\n",X->Check.sdim,X->Def.Nsite/2);
      fprintf(fp,"sdim=%ld =2^%d\n",X->Check.sdim,X->Def.Nsite/2);
    }
    break;
  default:
    break;
  }  
 
  i_free2(comb, Ns+1, Ns+1);

  u_tmp=1;
  X->Def.Tpow[0]=u_tmp;
  switch(X->Def.iCalcModel){
  case HubbardGC:
  case KondoGC:
    for(i=1;i<=2*X->Def.Nsite;i++){
      u_tmp=u_tmp*2;
      X->Def.Tpow[i]=u_tmp;
      fprintf(fp,"%ld %ld \n",i,u_tmp);
    }
    break;
  case HubbardNConserved:
  case Hubbard:
  case Kondo:
    for(i=1;i<=2*X->Def.Nsite-1;i++){
      u_tmp=u_tmp*2;
      X->Def.Tpow[i]=u_tmp;
      fprintf(fp,"%ld %ld \n",i,u_tmp);
    }
    break;
 case SpinGC:
   if(X->Def.iFlgGeneralSpin==FALSE){
     for(i=1;i<=X->Def.Nsite;i++){
       u_tmp=u_tmp*2;
       X->Def.Tpow[i]=u_tmp;
       fprintf(fp,"%ld %ld \n",i,u_tmp);
     }
   }
   else{
     X->Def.Tpow[0]=u_tmp;
     fprintf(fp,"%d %ld \n", 0, u_tmp);
      for(i=1;i<X->Def.Nsite;i++){
	u_tmp=u_tmp*X->Def.SiteToBit[i-1];
	X->Def.Tpow[i]=u_tmp;
	fprintf(fp,"%ld %ld \n",i,u_tmp);
      }
   }
   break;
 case Spin:
   if(X->Def.iFlgGeneralSpin==FALSE){
     for(i=1;i<=X->Def.Nsite-1;i++){
       u_tmp=u_tmp*2;
       X->Def.Tpow[i]=u_tmp;
       fprintf(fp,"%ld %ld \n",i,u_tmp);
     }
   }
   else{
     for(i=0;i<X->Def.Nsite;i++){
       fprintf(fp,"%ld %ld \n",i,X->Def.Tpow[i]);
     }
   }     
    break;
  default:
    fprintf(stdoutMPI, cErrNoModel, X->Def.iCalcModel);
    i_free2(comb, Ns+1, Ns+1);
    return FALSE;
  }  
  fclose(fp);	 
  /*
    Print MPI-site information and Modify Tpow 
    in the inter process region.
  */
  CheckMPI_Summary(X);
  
  return TRUE;
}    
예제 #9
0
파일: time.c 프로젝트: QLMS/HPhi
void OutputTimer(struct BindStruct *X) {
  char fileName[D_FileNameMax];
  FILE *fp;
  sprintf(fileName, "CalcTimer.dat"); //TBC
  childfopenMPI(fileName,"w", &fp);
  //fp = fopen(fileName, "w");
  //fp = childfopenMPI(fileName, "w");
  StampTime(fp, "All", 0);
  StampTime(fp, "  sz", 1000);
  StampTime(fp, "  diagonalcalc", 2000);
  if(X->Def.iFlgCalcSpec == CALCSPEC_NOT){
    if(X->Def.iCalcType==TPQCalc) {
      StampTime(fp, "  CalcByTPQ", 3000);
      StampTime(fp, "    FirstMultiply", 3100);
      StampTime(fp, "      rand   in FirstMultiply", 3101);
      StampTime(fp, "      mltply in FirstMultiply", 3102);
      StampTime(fp, "    expec_energy_flct        ", 3200);
      StampTime(fp, "      calc flctuation in expec_energy_flct ", 3201);
      StampTime(fp, "      mltply in expec_energy_flct ", 3202);
      StampTime(fp, "    expec_onebody            ", 3300);
      StampTime(fp, "    expec_twobody            ", 3400);
      StampTime(fp, "    Multiply                 ", 3500);
      StampTime(fp, "    FileIO                   ", 3600);
    }
    else if(X->Def.iCalcType==Lanczos){
      StampTime(fp, "  CalcByLanczos", 4000);
      StampTime(fp, "    LanczosEigenValue", 4100);
      StampTime(fp, "      mltply      in LanczosEigenValue", 4101);
      StampTime(fp, "      vec12       in LanczosEigenValue", 4102);
      StampTime(fp, "      DSEVvalue   in LanczosEigenValue", 4103);
      StampTime(fp, "    LanczosEigenVector", 4200);
      StampTime(fp, "      mltply      in LanczosEigenVector", 4201);
      StampTime(fp, "    expec_energy_flct", 4300);
      StampTime(fp, "      calc flctuation in expec_energy_flct ", 4301);
      StampTime(fp, "      mltply in expec_energy_flct ", 4302);
      StampTime(fp, "    CGEigenVector", 4400);
      StampTime(fp, "      mltply in CGEigenVector ", 4401);
      StampTime(fp, "    expec_onebody            ", 4500);
      StampTime(fp, "    expec_twobody            ", 4600);
      StampTime(fp, "    expec_TotalSz            ", 4700);
      StampTime(fp, "    FileIO                   ", 4800);
      StampTime(fp, "      Read Input Eigenvec ", 4801);    
    }
    else if(X->Def.iCalcType==FullDiag){
      StampTime(fp, "  CalcByFullDiag", 5000);
      StampTime(fp, "    MakeHam", 5100);
      StampTime(fp, "    LapackDiag", 5200);
      StampTime(fp, "    CalcPhys", 5300);
    StampTime(fp, "      calc flctuation in expec_energy_flct ", 5301);
    StampTime(fp, "      mltply in expec_energy_flct ", 5302);
        StampTime(fp, "    Output", 5400);
      StampTime(fp, "    OutputHam", 5500);
    }
  }
  else{ 
    StampTime(fp, "  CalcSpectrum by Lanczos method", 6000);
    StampTime(fp, "    Make excited state", 6100);
    StampTime(fp, "      Read origin state", 6101);
    StampTime(fp, "      Multiply excited operator", 6102);
    StampTime(fp, "    Calculate spectrum", 6200);
    if(X->Def.iCalcType==Lanczos){
      StampTime(fp, "      Read vector for recalculation", 6201);
      StampTime(fp, "      Read tridiagonal components for recalculation", 6202);
      StampTime(fp, "      Calculate tridiagonal components", 6203);
      StampTime(fp, "      Output tridiagonal components", 6204);
      StampTime(fp, "      Calculate spectrum by Lanczos method", 6205);
      StampTime(fp, "      Output vectors for recalculation", 6206);
    }
    else if(X->Def.iCalcType==FullDiag){
      StampTime(fp, "      MakeHam", 6301);
      StampTime(fp, "      lapackdiag", 6302);
      StampTime(fp, "      Calculate v1", 6303);
      StampTime(fp, "      Calculate spectrum", 6304);
    }
  }
  
  fprintf(fp,"================================================\n");
  
  StampTime(fp,"All mltply",1);
  StampTime(fp,"  diagonal", 100);

  switch(X->Def.iCalcModel){
  case HubbardGC:
    StampTime(fp,"  HubbardGC", 200);
    StampTime(fp,"    trans    in HubbardGC", 210);
    StampTime(fp,"      double", 211);
    StampTime(fp,"      single", 212);
    StampTime(fp,"      inner", 213);
    StampTime(fp,"    interall in HubbardGC", 220);
    StampTime(fp,"      interPE", 221);
    StampTime(fp,"      inner", 222);
    StampTime(fp,"    pairhopp in HubbardGC", 230);
    StampTime(fp,"      interPE", 231);
    StampTime(fp,"      inner", 232);
    StampTime(fp,"    exchange in HubbardGC", 240);
    StampTime(fp,"      interPE", 241);
    StampTime(fp,"      inner", 242);
    break;
    
  case Hubbard:
    StampTime(fp,"  Hubbard", 300);
    StampTime(fp,"    trans    in Hubbard", 310);
    StampTime(fp,"      double", 311);
    StampTime(fp,"      single", 312);
    StampTime(fp,"      inner", 313);
    StampTime(fp,"    interall in Hubbard", 320);
    StampTime(fp,"      interPE", 321);
    StampTime(fp,"      inner", 322);
    StampTime(fp,"    pairhopp in Hubbard", 330);
    StampTime(fp,"      interPE", 331);
    StampTime(fp,"      inner", 332);
    StampTime(fp,"    exchange in Hubbard", 340);
    StampTime(fp,"      interPE", 341);
    StampTime(fp,"      inner", 342);
    break;
    
  case Spin:
    fprintf(fp,"\n");
    StampTime(fp,"  Spin", 400);
    StampTime(fp,"    interall in Spin", 410);
    StampTime(fp,"      double", 411);
    StampTime(fp,"      single1", 412);
    StampTime(fp,"      single2", 413);
    StampTime(fp,"      inner", 414);
    StampTime(fp,"    exchange in Spin", 420);
    StampTime(fp,"      double", 421);
    StampTime(fp,"      single1", 422);
    StampTime(fp,"      single2", 423);
    StampTime(fp,"      inner", 424);
    break;
    
  case SpinGC:
    StampTime(fp,"  SpinGC", 500);
    StampTime(fp,"    trans    in SpinGC", 510);
    StampTime(fp,"      double", 511);
    StampTime(fp,"      inner", 512);
    StampTime(fp,"    interall in SpinGC", 520);
    StampTime(fp,"      double", 521);
    StampTime(fp,"      single", 522);
    StampTime(fp,"      inner", 523);
    StampTime(fp,"    exchange in SpinGC", 530);
    StampTime(fp,"      double", 531);
    StampTime(fp,"      single", 532);
    StampTime(fp,"      inner", 533);
    StampTime(fp,"    pairlift in SpinGC", 540);
    StampTime(fp,"      double", 541);
    StampTime(fp,"      single", 542);
    StampTime(fp,"      inner", 543);
    break;

  default:
    break;
  }
  fprintf(fp,"================================================\n");

  fclose(fp);
  free(Timer);
  free(TimerStart);
}
예제 #10
0
/** 
 * @fn function for calculating diagonal components
 * 
 * @param X 
 * 
 * @author Takahiro Misawa (The University of Tokyo)
 * @author Kazuyoshi Yoshimi (The University of Tokyo)
 * @return 
 */
int diagonalcalc
(
 struct BindStruct *X
 ){
    
  FILE *fp;
  long unsigned int i,j;
  long unsigned int isite1,isite2;
  long unsigned int spin;
  double tmp_V;

  /*[s] For InterAll*/
  long unsigned int A_spin,B_spin;
  /*[e] For InterAll*/
  long unsigned int i_max=X->Check.idim_max;

  fprintf(stdoutMPI, "%s", cProStartCalcDiag);
  
#pragma omp parallel for default(none) private(j) shared(list_Diagonal) firstprivate(i_max)
  for(j = 1;j <= i_max; j++){
    list_Diagonal[j]=0.0;
  }
  
  if(X->Def.NCoulombIntra>0){
    if(childfopenMPI(cFileNameCheckCoulombIntra, "w", &fp)!=0){
      return -1;
    }
    for(i = 0; i < X->Def.NCoulombIntra; i++){
      isite1 = X->Def.CoulombIntra[i][0]+1;
      tmp_V  = X->Def.ParaCoulombIntra[i];     
      fprintf(fp,"i=%ld isite1=%ld tmp_V=%lf \n",i,isite1,tmp_V);    
      SetDiagonalCoulombIntra(isite1, tmp_V, X);
    }
    fclose(fp);
  }

  if(X->Def.EDNChemi>0){
    if(childfopenMPI(cFileNameCheckChemi,"w", &fp)!=0){
      return -1;
    }
    for(i = 0; i < X->Def.EDNChemi; i++){
      isite1 = X->Def.EDChemi[i]+1;
      spin   = X->Def.EDSpinChemi[i];
      tmp_V  = -X->Def.EDParaChemi[i];
      fprintf(fp,"i=%ld spin=%ld isite1=%ld tmp_V=%lf \n",i,spin,isite1,tmp_V);
      if(SetDiagonalChemi(isite1, tmp_V,spin,  X) !=0){
	return -1;
      }
    }
    fclose(fp);	
  }
   
  if(X->Def.NCoulombInter>0){
    if(childfopenMPI(cFileNameCheckInterU,"w", &fp)!=0){
      return -1;
    }
    for(i = 0; i < X->Def.NCoulombInter; i++){
      isite1 = X->Def.CoulombInter[i][0]+1;
      isite2 = X->Def.CoulombInter[i][1]+1;
      tmp_V  = X->Def.ParaCoulombInter[i];
      fprintf(fp,"i=%ld isite1=%ld isite2=%ld tmp_V=%lf \n",i,isite1,isite2,tmp_V);
      if(SetDiagonalCoulombInter(isite1, isite2, tmp_V,  X) !=0){
	return -1;
      }
    }
    fclose(fp);   
  }
  if(X->Def.NHundCoupling>0){
    if(childfopenMPI(cFileNameCheckHund,"w", &fp) !=0){
      return -1;
    }
    for(i = 0; i < X->Def.NHundCoupling; i++){
      isite1 = X->Def.HundCoupling[i][0]+1;
      isite2 = X->Def.HundCoupling[i][1]+1;
      tmp_V  = -X->Def.ParaHundCoupling[i];
      if(SetDiagonalHund(isite1, isite2, tmp_V,  X) !=0){
	return -1;
      }
      fprintf(fp,"i=%ld isite1=%ld isite2=%ld tmp_V=%lf \n",i,isite1,isite2,tmp_V);    
    }
    fclose(fp);   
  }

  if(X->Def.NInterAll_Diagonal>0){    
    if(childfopenMPI(cFileNameCheckInterAll,"w", &fp) !=0){
      return -1;
    }
    for(i = 0; i < X->Def.NInterAll_Diagonal; i++){
      isite1=X->Def.InterAll_Diagonal[i][0]+1;
      A_spin=X->Def.InterAll_Diagonal[i][1];
      isite2=X->Def.InterAll_Diagonal[i][2]+1;
      B_spin=X->Def.InterAll_Diagonal[i][3];
      tmp_V =  X->Def.ParaInterAll_Diagonal[i];
      fprintf(fp,"i=%ld isite1=%ld A_spin=%ld isite2=%ld B_spin=%ld tmp_V=%lf \n", i, isite1, A_spin, isite2, B_spin, tmp_V);
      SetDiagonalInterAll(isite1, isite2, A_spin, B_spin, tmp_V, X);
    }      
     fclose(fp);   
    }
  
  TimeKeeper(X, cFileNameTimeKeep, cDiagonalCalcFinish, "w");
  fprintf(stdoutMPI, "%s", cProEndCalcDiag);
  return 0;
}