示例#1
0
void FT_ProExpn_VNA()
{
  int numprocs,myid,ID,tag=999;
  int count,NumSpe;
  int L,i,kj;
  int Lspe,spe,GL,Mul;
  int RestartRead_Succeed;
  double Sr,Dr;
  double norm_k,h,dum0;
  double rmin,rmax,r,sum;
  double kmin,kmax,Sk,Dk;
  double RGL[GL_Mesh + 2];
  double *SumTmp;
  double tmp0,tmp1;
  double **SphB;
  double *tmp_SphB,*tmp_SphBp;
  double TStime, TEtime;
  /* for MPI */
  MPI_Status stat;
  MPI_Request request;
  /* for OpenMP */
  int OMPID,Nthrds,Nprocs;

  char fileFT[YOUSO10];
  char operate[300];
  FILE *fp;
  size_t size; 

  dtime(&TStime);

  /* MPI */
  MPI_Comm_size(mpi_comm_level1,&numprocs);
  MPI_Comm_rank(mpi_comm_level1,&myid);

  if (myid==Host_ID && 0<level_stdout) printf("<FT_ProExpn_VNA>  Fourier transform of VNA separable projectors\n");

  RestartRead_Succeed = 0;

  /***********************************************************
     In case of Scf_RestartFromFile==1, read Spe_VNA_Bessel
  ***********************************************************/

  if (Scf_RestartFromFile){

    /****************************************************
         regenerate radial grids in the k-space
         for the MPI calculation
    ****************************************************/

    for (kj=0; kj<GL_Mesh; kj++){
      kmin = Radial_kmin;
      kmax = PAO_Nkmax;
      Sk = kmax + kmin;
      Dk = kmax - kmin;
      norm_k = 0.50*(Dk*GL_Abscissae[kj] + Sk);
      GL_NormK[kj] = norm_k;
    }

    /***********************************************************
                        read Spe_VNA_Bessel
    ***********************************************************/

    sprintf(fileFT,"%s%s_rst/%s.ftPEvna",filepath,filename,filename);

    if ((fp = fopen(fileFT,"rb")) != NULL){

      RestartRead_Succeed = 1;

      for (spe=0; spe<SpeciesNum; spe++){
        for (L=0; L<=List_YOUSO[35]; L++){
	  for (Mul=0; Mul<List_YOUSO[34]; Mul++){

	    size = fread(&Spe_VNA_Bessel[spe][L][Mul][0],sizeof(double),GL_Mesh,fp);
	    if (size!=GL_Mesh) RestartRead_Succeed = 0;
	  }
        }
      }

      fclose(fp);
    }
    else{
      printf("Could not open a file %s in FT_ProExpn_VNA\n",fileFT);
    }
  }

  /***********************************************************
     if (RestartRead_Succeed==0), calculate Spe_VNA_Bessel
  ***********************************************************/

  if (RestartRead_Succeed==0){

    for (Lspe=0; Lspe<MSpeciesNum; Lspe++){

      spe = Species_Top[myid] + Lspe;

      /* initalize */
      /* tabulation on Gauss-Legendre radial grid */

      rmin = Spe_VPS_RV[spe][0];
      rmax = Spe_Atom_Cut1[spe] + 0.5;
      Sr = rmax + rmin;
      Dr = rmax - rmin;
      for (i=0; i<GL_Mesh; i++){
	RGL[i] = 0.50*(Dr*GL_Abscissae[i] + Sr);
      }

      kmin = Radial_kmin;
      kmax = PAO_Nkmax;
      Sk = kmax + kmin;
      Dk = kmax - kmin;

      /* loop for kj */

#pragma omp parallel shared(List_YOUSO,GL_Weight,GL_Abscissae,Dr,Dk,Sk,RGL,Projector_VNA,Spe_VPS_RV,Spe_Num_Mesh_VPS,Spe_VNA_Bessel)  private(SumTmp,SphB,tmp_SphB,tmp_SphBp,OMPID,Nthrds,Nprocs,kj,norm_k,i,r,L,Mul,tmp0,dum0)

      {

	/* allocate arrays */

	SumTmp = (double*)malloc(sizeof(double)*List_YOUSO[34]);

	SphB = (double**)malloc(sizeof(double*)*(List_YOUSO[35]+3));
	for(L=0; L<(List_YOUSO[35]+3); L++){ 
	  SphB[L] = (double*)malloc(sizeof(double)*GL_Mesh);
	}

	tmp_SphB  = (double*)malloc(sizeof(double)*(List_YOUSO[35]+3));
	tmp_SphBp = (double*)malloc(sizeof(double)*(List_YOUSO[35]+3));

	/* get info. on OpenMP */ 

	OMPID = omp_get_thread_num();
	Nthrds = omp_get_num_threads();
	Nprocs = omp_get_num_procs();

	for ( kj=OMPID; kj<GL_Mesh; kj+=Nthrds ){

	  norm_k = 0.50*(Dk*GL_Abscissae[kj] + Sk);

	  /* calculate SphB */

	  for (i=0; i<GL_Mesh; i++){

	    r = RGL[i];
	    Spherical_Bessel(norm_k*r,List_YOUSO[35],tmp_SphB,tmp_SphBp);

	    for(L=0; L<=List_YOUSO[35]; L++){ 
	      SphB[L][i]  =  tmp_SphB[L]; 
	    }
	  }

	  /* loop for L */
 
	  for (L=0; L<=List_YOUSO[35]; L++){

	    /****************************************************
                      \int jL(k*r)RL r^2 dr 
	    ****************************************************/

	    for (Mul=0; Mul<List_YOUSO[34]; Mul++) SumTmp[Mul] = 0.0;

	    /* Gauss-Legendre quadrature */

	    for (i=0; i<GL_Mesh; i++){

	      r = RGL[i];

	      tmp0 = r*r*GL_Weight[i]*SphB[L][i];
	      for (Mul=0; Mul<List_YOUSO[34]; Mul++){
		dum0 = PhiF(r, Projector_VNA[spe][L][Mul], Spe_VPS_RV[spe], Spe_Num_Mesh_VPS[spe]);   
		SumTmp[Mul] += dum0*tmp0;
	      }
	    }

	    for (Mul=0; Mul<List_YOUSO[34]; Mul++){
	      Spe_VNA_Bessel[spe][L][Mul][kj] = 0.5*Dr*SumTmp[Mul];
	    }

	  } /* L */

	} /* kj */ 

	/* free arrays */

	free(SumTmp);

	for(L=0; L<(List_YOUSO[35]+3); L++){ 
	  free(SphB[L]);
	}
	free(SphB);

	free(tmp_SphB);
	free(tmp_SphBp);

#pragma omp flush(Spe_VNA_Bessel)

      } /* #pragma omp parallel */
    } /* Lspe */

    /****************************************************
         regenerate radial grids in the k-space
         for the MPI calculation
    ****************************************************/

    for (kj=0; kj<GL_Mesh; kj++){
      kmin = Radial_kmin;
      kmax = PAO_Nkmax;
      Sk = kmax + kmin;
      Dk = kmax - kmin;
      norm_k = 0.50*(Dk*GL_Abscissae[kj] + Sk);
      GL_NormK[kj] = norm_k;
    }

    /***********************************************************
        sending and receiving of Spe_VNA_Bessel by MPI
    ***********************************************************/

    for (ID=0; ID<Num_Procs2; ID++){
      NumSpe = Species_End[ID] - Species_Top[ID] + 1;
      for (Lspe=0; Lspe<NumSpe; Lspe++){
	spe = Species_Top[ID] + Lspe;
	for (L=0; L<=List_YOUSO[35]; L++){
	  for (Mul=0; Mul<List_YOUSO[34]; Mul++){
	    MPI_Bcast(&Spe_VNA_Bessel[spe][L][Mul][0],
		      GL_Mesh,MPI_DOUBLE,ID,mpi_comm_level1);
	  }
	}
      }
    }

    /***********************************************************
                      save Spe_VNA_Bessel
    ***********************************************************/

    if (myid==Host_ID){

      sprintf(fileFT,"%s%s_rst/%s.ftPEvna",filepath,filename,filename);

      if ((fp = fopen(fileFT,"wb")) != NULL){

	for (spe=0; spe<SpeciesNum; spe++){
	  for (L=0; L<=List_YOUSO[35]; L++){
	    for (Mul=0; Mul<List_YOUSO[34]; Mul++){
	      fwrite(&Spe_VNA_Bessel[spe][L][Mul][0],sizeof(double),GL_Mesh,fp);
	    }
	  }
	}

	fclose(fp);
      }
      else{
	printf("Could not open a file %s in FT_ProExpn_VNA\n",fileFT);
      }
    }

  } /* if (RestartRead_Succeed==0) */

  /***********************************************************
                         elapsed time
  ***********************************************************/

  dtime(&TEtime);

  /*
  printf("myid=%2d Elapsed Time (s) = %15.12f\n",myid,TEtime-TStime);
  MPI_Finalize();
  exit(0);
  */

}
示例#2
0
文件: FT_VNA.c 项目: rigarash/openmx
void FT_VNA()
{
    int numprocs,myid,ID,tag=999;
    int count,NumSpe;
    int L,i,j;
    int Lspe,spe,GL,Mul;
    int RestartRead_Succeed;
    double Sr,Dr,Sk,Dk,kmin,kmax;
    double norm_k,h,dum0;
    double xmin,xmax,x,r,sum;
    double sj;
    double tmp0,tmp1;
    double *tmp_SphB,*tmp_SphBp;
    double TStime, TEtime;
    /* for MPI */
    MPI_Status stat;
    MPI_Request request;
    /* for OpenMP */
    int OMPID,Nthrds,Nprocs;

    char fileFT[YOUSO10];
    char operate[300];
    FILE *fp;
    size_t size;

    dtime(&TStime);

    /* MPI */
    MPI_Comm_size(mpi_comm_level1,&numprocs);
    MPI_Comm_rank(mpi_comm_level1,&myid);

    if (myid==Host_ID && 0<level_stdout) printf("<FT_VNA>          Fourier transform of VNA potentials\n");

    RestartRead_Succeed = 0;

    /***********************************************************
     In case of Scf_RestartFromFile==1, read Spe_CrudeVNA_Bessel
    ***********************************************************/

    if (Scf_RestartFromFile) {

        /****************************************************
             regenerate radial grids in the k-space
             for the MPI calculation
        ****************************************************/

        for (j=0; j<GL_Mesh; j++) {
            kmin = Radial_kmin;
            kmax = PAO_Nkmax;
            Sk = kmax + kmin;
            Dk = kmax - kmin;
            norm_k = 0.50*(Dk*GL_Abscissae[j] + Sk);
            GL_NormK[j] = norm_k;
        }

        /***********************************************************
                            read Spe_VNA_Bessel
        ***********************************************************/

        sprintf(fileFT,"%s%s_rst/%s.ftCvna",filepath,filename,filename);

        if ((fp = fopen(fileFT,"rb")) != NULL) {

            RestartRead_Succeed = 1;

            for (spe=0; spe<SpeciesNum; spe++) {
                for (L=0; L<=List_YOUSO[35]; L++) {
                    for (Mul=0; Mul<List_YOUSO[34]; Mul++) {

                        size = fread(&Spe_CrudeVNA_Bessel[spe][0],sizeof(double),GL_Mesh,fp);
                        if (size!=GL_Mesh) RestartRead_Succeed = 0;
                    }
                }
            }

            fclose(fp);
        }
        else {
            printf("Could not open a file %s in FT_VNA\n",fileFT);
        }
    }

    /***********************************************************
     if (RestartRead_Succeed==0), calculate Spe_CrudeVNA_Bessel
    ***********************************************************/

    if (RestartRead_Succeed==0) {

        /* loop for Lspe */

        for (Lspe=0; Lspe<MSpeciesNum; Lspe++) {

            spe = Species_Top[myid] + Lspe;

            /****************************************************
                         \int jL(k*r)RL r^2 dr
            ****************************************************/

            /* tabulation on Gauss-Legendre radial grid */

            kmin = Radial_kmin;
            kmax = PAO_Nkmax;
            Sk = kmax + kmin;
            Dk = kmax - kmin;
            xmin = sqrt(Spe_PAO_RV[spe][0]);
            xmax = sqrt(Spe_Atom_Cut1[spe] + 0.5);
            h = (xmax - xmin)/(double)OneD_Grid;

            /* loop for j */

            #pragma omp parallel shared(spe,Dk,Sk,GL_Abscissae,xmin,xmax,h,OneD_Grid,Spe_CrudeVNA_Bessel)  private(OMPID,Nthrds,Nprocs,j,norm_k,sum,x,r,i,tmp_SphB,tmp_SphBp,sj)
            {

                /* allocate arrays */

                tmp_SphB  = (double*)malloc(sizeof(double)*3);
                tmp_SphBp = (double*)malloc(sizeof(double)*3);

                /* get info. on OpenMP */

                OMPID = omp_get_thread_num();
                Nthrds = omp_get_num_threads();
                Nprocs = omp_get_num_procs();

                for ( j=OMPID; j<GL_Mesh; j+=Nthrds ) {

                    norm_k = 0.50*(Dk*GL_Abscissae[j] + Sk);

                    /**************************
                         trapezoidal rule

                          grid: r = x^2
                                dr = 2*x*dx
                    ***************************/

                    sum = 0.0;

                    for (i=0; i<=OneD_Grid; i++) {
                        x = xmin + (double)i*h;
                        r = x*x;

                        Spherical_Bessel(norm_k*r,0,tmp_SphB,tmp_SphBp);
                        sj = tmp_SphB[0];

                        if (i==0 || i==OneD_Grid)
                            sum += r*r*x*sj*VNAF(spe,r);
                        else
                            sum += 2.0*r*r*x*sj*VNAF(spe,r);
                    }
                    sum = sum*h;

                    Spe_CrudeVNA_Bessel[spe][j] = sum;

                } /* j */

                /* free arrays */

                free(tmp_SphB);
                free(tmp_SphBp);

                #pragma omp flush(Spe_CrudeVNA_Bessel)

            } /* #pragma omp parallel */
        } /* Lspe */

        /****************************************************
             regenerate radial grids in the k-space
             for the MPI calculation
        ****************************************************/

        for (j=0; j<GL_Mesh; j++) {
            kmin = Radial_kmin;
            kmax = PAO_Nkmax;
            Sk = kmax + kmin;
            Dk = kmax - kmin;
            norm_k = 0.50*(Dk*GL_Abscissae[j] + Sk);
            GL_NormK[j] = norm_k;
        }

        /***********************************************************
          sending and receiving of Spe_CrudeVNA_Bessel by MPI
        ***********************************************************/

        for (ID=0; ID<Num_Procs2; ID++) {
            NumSpe = Species_End[ID] - Species_Top[ID] + 1;
            for (Lspe=0; Lspe<NumSpe; Lspe++) {
                spe = Species_Top[ID] + Lspe;
                MPI_Bcast(&Spe_CrudeVNA_Bessel[spe][0],
                          GL_Mesh,MPI_DOUBLE,ID,mpi_comm_level1);
            }
        }

        /***********************************************************
                          save Spe_CrudeVNA_Bessel
        ***********************************************************/

        if (myid==Host_ID) {

            sprintf(fileFT,"%s%s_rst/%s.ftCvna",filepath,filename,filename);

            if ((fp = fopen(fileFT,"wb")) != NULL) {

                for (spe=0; spe<SpeciesNum; spe++) {
                    fwrite(&Spe_CrudeVNA_Bessel[spe][0],sizeof(double),GL_Mesh,fp);
                }

                fclose(fp);
            }
            else {
                printf("Could not open a file %s in FT_VNA\n",fileFT);
            }
        }

    } /* if (RestartRead_Succeed==0) */

    /***********************************************************
                           elapsed time
    ***********************************************************/

    dtime(&TEtime);

    /*
    printf("myid=%2d Elapsed Time (s) = %15.12f\n",myid,TEtime-TStime);
    MPI_Finalize();
    exit(0);
    */
}
示例#3
0
文件: FT_NLP.c 项目: certik/openmx
void FT_NLP()
{
  int numprocs,myid,ID,tag=999;
  int count,NumSpe;
  int i,kj,num_k,so;
  int Lspe,spe,L,GL,MaxGL;
  double dk,norm_k;
  double rmin,rmax,r,r2,h,sum[2];
  double **SphB;
  double *tmp_SphB,*tmp_SphBp;
  double TStime, TEtime;
  /* for MPI */
  MPI_Status stat;
  MPI_Request request;
  /* for OpenMP */
  int OMPID,Nthrds,Nprocs;

  dtime(&TStime);

  /* MPI */
  MPI_Comm_size(mpi_comm_level1,&numprocs);
  MPI_Comm_rank(mpi_comm_level1,&myid);
 
  if (myid==Host_ID) printf("<FT_NLP>          Fourier transform of non-local projectors\n");

  for (Lspe=0; Lspe<MSpeciesNum; Lspe++){

    spe = Species_Top[myid] + Lspe;

    num_k = Ngrid_NormK;
    dk = PAO_Nkmax/(double)num_k;
    rmin = Spe_VPS_RV[spe][0];
    rmax = Spe_Atom_Cut1[spe] + 0.5;
    h = (rmax - rmin)/(double)OneD_Grid;

    /* kj loop */

#pragma omp parallel shared(Spe_VPS_List,spe,Spe_Num_RVPS,num_k,dk,OneD_Grid,rmin,h,VPS_j_dependency,Spe_NLRF_Bessel)  private(MaxGL,L,GL,SphB,tmp_SphB,tmp_SphBp,OMPID,Nthrds,Nprocs,norm_k,i,r,r2,sum,so,kj)
    {

      /* allocate SphB */

      MaxGL = -1;
      for (L=1; L<=Spe_Num_RVPS[spe]; L++){
	GL = Spe_VPS_List[spe][L];
	if (MaxGL<GL) MaxGL = GL;
      }      

      SphB = (double**)malloc(sizeof(double*)*(MaxGL+3));
      for(GL=0; GL<(MaxGL+3); GL++){ 
	SphB[GL] = (double*)malloc(sizeof(double)*(OneD_Grid+1));
      }

      tmp_SphB  = (double*)malloc(sizeof(double)*(MaxGL+3));
      tmp_SphBp = (double*)malloc(sizeof(double)*(MaxGL+3));

      /* get info. on OpenMP */ 

      OMPID = omp_get_thread_num();
      Nthrds = omp_get_num_threads();
      Nprocs = omp_get_num_procs();

      for ( kj=OMPID; kj<num_k; kj+=Nthrds ){

	norm_k = (double)kj*dk;

	/* calculate SphB */

	for (i=0; i<=OneD_Grid; i++){

	  r = rmin + (double)i*h;

	  Spherical_Bessel(norm_k*r,MaxGL,tmp_SphB,tmp_SphBp);

	  r2 = r*r;
	  for(GL=0; GL<=MaxGL; GL++){ 
	    SphB[GL][i] = tmp_SphB[GL]*r2; 
	  }
	}

	for(GL=0; GL<=MaxGL; GL++){ 
	  SphB[GL][0] *= 0.5;
	  SphB[GL][OneD_Grid] *= 0.5;
	}

	/* loof for L */

	for (L=1; L<=Spe_Num_RVPS[spe]; L++){

	  GL = Spe_VPS_List[spe][L];

	  /****************************************************
                      \int jL(k*r)*RL*r^2 dr 
	  ****************************************************/

	  sum[0] = 0.0;
	  sum[1] = 0.0;

	  for (i=0; i<=OneD_Grid; i++){
	    r = rmin + (double)i*h;
	    for (so=0; so<=VPS_j_dependency[spe]; so++){
	      sum[so] += Nonlocal_RadialF(spe,L-1,so,r)*SphB[GL][i];
	    }
	  }

	  for (so=0; so<=VPS_j_dependency[spe]; so++){
	    Spe_NLRF_Bessel[so][spe][L][kj] = sum[so]*h;
	  }

	} /* L */
      } /* kj */

      /* free arrays */

      for(GL=0; GL<(MaxGL+3); GL++){ 
	free(SphB[GL]);
      }
      free(SphB);

      free(tmp_SphB);
      free(tmp_SphBp);

#pragma omp flush(Spe_NLRF_Bessel)

    } /* #pragma omp parallel */

  } /* Lspe */

  /****************************************************
     Remedy for MSpeciesNum==0
     generate radial grids in the k-space
  ****************************************************/

  dk = PAO_Nkmax/(double)Ngrid_NormK;
  for (i=0; i<Ngrid_NormK; i++){
    NormK[i] = (double)i*dk;
  }

  /***********************************************************
        sending and receiving of Spe_RF_Bessel by MPI
  ***********************************************************/

  for (ID=0; ID<Num_Procs2; ID++){
    NumSpe = Species_End[ID] - Species_Top[ID] + 1;
    for (Lspe=0; Lspe<NumSpe; Lspe++){
      spe = Species_Top[ID] + Lspe;
      for (so=0; so<=VPS_j_dependency[spe]; so++){
	for (L=1; L<=Spe_Num_RVPS[spe]; L++){
	  MPI_Bcast(&Spe_NLRF_Bessel[so][spe][L][0],
		    List_YOUSO[15],MPI_DOUBLE,ID,mpi_comm_level1);
	}
      }
    }
  }

  /***********************************************************
                         elapsed time
  ***********************************************************/

  dtime(&TEtime);

  /*
  printf("myid=%2d Elapsed Time (s) = %15.12f\n",myid,TEtime-TStime);
  MPI_Finalize();
  exit(0);
  */

}
示例#4
0
void FT_ProductPAO()
{
  int numprocs,myid,ID,tag=999;
  int count,NumSpe;
  int L,i,j,kj,l,Lmax;
  int Lspe,spe,GL,GL1,Mul1,GL2,Mul2;
  double Sr,Dr,Sk,Dk,kmin,kmax;
  double norm_k,h,dum0;
  double rmin,rmax,r,sum;
  double sj,sy,sjp,syp;
  double RGL[GL_Mesh+2];
  double Tmp_RGL[GL_Mesh+2];
  double SumTmp;
  double tmp0,tmp1;
  double ***GL_PAO;
  double **SphB;
  double *tmp_SphB,*tmp_SphBp;
  double TStime, TEtime;
  /* for MPI */
  MPI_Status stat;
  MPI_Request request;
  /* for OpenMP */
  int OMPID,Nthrds,Nprocs;

  dtime(&TStime);

  /* MPI */
  MPI_Comm_size(mpi_comm_level1,&numprocs);
  MPI_Comm_rank(mpi_comm_level1,&myid);

  if (myid==Host_ID) printf("<FT_ProductPAO>   Fourier transform of product of PAOs\n");

  for (Lspe=0; Lspe<MSpeciesNum; Lspe++){

    spe = Species_Top[myid] + Lspe;

    /* initalize */

    rmin = Spe_VPS_RV[spe][0];
    rmax = Spe_Atom_Cut1[spe] + 0.5;
    Sr = rmax + rmin;
    Dr = rmax - rmin;
    for (i=0; i<GL_Mesh; i++){
      RGL[i] = 0.50*(Dr*GL_Abscissae[i] + Sr);
      Tmp_RGL[i] = RGL[i]*RGL[i]*GL_Weight[i];
    }

    kmin = Radial_kmin;
    kmax = PAO_Nkmax;
    Sk = kmax + kmin;
    Dk = kmax - kmin;

#pragma omp parallel shared(Spe_ProductRF_Bessel,RGL,Tmp_RGL,Dr,Dk,Sk,GL_Abscissae,List_YOUSO,Spe_MaxL_Basis,spe,Spe_Num_Basis)  private(GL_PAO,i,j,GL1,Mul1,GL2,Lmax,Mul2,l,SumTmp,sj,r,SphB,GL,tmp_SphB,tmp_SphBp,OMPID,Nthrds,Nprocs,kj,norm_k)
    {

    /****************************************************
                \int RL * RL' * jl(k*r) r^2 dr 
    ****************************************************/

    /* allocation of GL_PAO */

    GL_PAO = (double***)malloc(sizeof(double**)*(List_YOUSO[25]+1));
    for (i=0; i<(List_YOUSO[25]+1); i++){
      GL_PAO[i] = (double**)malloc(sizeof(double*)*List_YOUSO[24]);
      for (j=0; j<List_YOUSO[24]; j++){
        GL_PAO[i][j] = (double*)malloc(sizeof(double)*(GL_Mesh + 2));
      }
    }

    /* calculate GL_PAO */

    for (GL1=0; GL1<=Spe_MaxL_Basis[spe]; GL1++){
      for (Mul1=0; Mul1<Spe_Num_Basis[spe][GL1]; Mul1++){
        for (i=0; i<GL_Mesh; i++){
          r = RGL[i];
          GL_PAO[GL1][Mul1][i] = RadialF(spe,GL1,Mul1,r);
        }
      }
    }

    /* allocate arrays */

    SphB = (double**)malloc(sizeof(double*)*(2*Spe_MaxL_Basis[spe]+3));
    for(GL=0; GL<(2*Spe_MaxL_Basis[spe]+3); GL++){ 
      SphB[GL] = (double*)malloc(sizeof(double)*GL_Mesh);
    }

    tmp_SphB  = (double*)malloc(sizeof(double)*(2*Spe_MaxL_Basis[spe]+3));
    tmp_SphBp = (double*)malloc(sizeof(double)*(2*Spe_MaxL_Basis[spe]+3));

    /* get info. on OpenMP */ 

    OMPID = omp_get_thread_num();
    Nthrds = omp_get_num_threads();
    Nprocs = omp_get_num_procs();

    /* kj loop */

    for ( kj=OMPID; kj<GL_Mesh; kj+=Nthrds ){

      norm_k = 0.50*(Dk*GL_Abscissae[kj] + Sk);

      /* calculate SphB */

      for (i=0; i<GL_Mesh; i++){

        r = RGL[i];

	Spherical_Bessel(norm_k*r,2*Spe_MaxL_Basis[spe],tmp_SphB,tmp_SphBp);

	for(GL=0; GL<=2*Spe_MaxL_Basis[spe]; GL++){ 
	  SphB[GL][i]  =  tmp_SphB[GL]; 
	}
      }

      /*  \tilde{R}_{L,L',l}  */

      for (GL1=0; GL1<=Spe_MaxL_Basis[spe]; GL1++){
	for (Mul1=0; Mul1<Spe_Num_Basis[spe][GL1]; Mul1++){
	  for (GL2=0; GL2<=Spe_MaxL_Basis[spe]; GL2++){

	    if (GL1<=GL2){

	      Lmax = 2*GL2;

	      for (Mul2=0; Mul2<Spe_Num_Basis[spe][GL2]; Mul2++){
		for(l=0; l<=Lmax; l++){

                  /* Gauss-Legendre quadrature */

                  SumTmp = 0.0;
                  for (i=0; i<GL_Mesh; i++){
                    r = RGL[i];
                    sj = SphB[l][i];

                    SumTmp += Tmp_RGL[i]*sj*GL_PAO[GL1][Mul1][i]*GL_PAO[GL2][Mul2][i];
                  }

                  Spe_ProductRF_Bessel[spe][GL1][Mul1][GL2][Mul2][l][kj] = 0.5*Dr*SumTmp;

                }
  	      }
	    }
	  }
	}
      }
    } /* kj */

    /* free arrays */

    for (i=0; i<(List_YOUSO[25]+1); i++){
      for (j=0; j<List_YOUSO[24]; j++){
        free(GL_PAO[i][j]);
      }
      free(GL_PAO[i]);
    }
    free(GL_PAO);

    /* free SphB */

    for(GL=0; GL<(2*Spe_MaxL_Basis[spe]+3); GL++){ 
      free(SphB[GL]);
    }
    free(SphB);

    free(tmp_SphB);
    free(tmp_SphBp);

#pragma omp flush(Spe_ProductRF_Bessel)

    } /* #pragma omp parallel */
  } /* Lspe */

  /****************************************************
         regenerate radial grids in the k-space
         for the MPI calculation
  ****************************************************/

  for (j=0; j<GL_Mesh; j++){
    kmin = Radial_kmin;
    kmax = PAO_Nkmax;
    Sk = kmax + kmin;
    Dk = kmax - kmin;
    norm_k = 0.50*(Dk*GL_Abscissae[j] + Sk);
    GL_NormK[j] = norm_k;
  }

  /***********************************************************
      sending and receiving of Spe_CrudeVNA_Bessel by MPI
  ***********************************************************/

  MPI_Barrier(mpi_comm_level1);

  for (ID=0; ID<Num_Procs2; ID++) {
    NumSpe = Species_End[ID] - Species_Top[ID] + 1;
    for (Lspe=0; Lspe<NumSpe; Lspe++){
      spe = Species_Top[ID] + Lspe;

      for (GL1=0; GL1<=Spe_MaxL_Basis[spe]; GL1++){
	for (Mul1=0; Mul1<Spe_Num_Basis[spe][GL1]; Mul1++){
	  for (GL2=0; GL2<=Spe_MaxL_Basis[spe]; GL2++){

	    if (GL1<=GL2){

	      Lmax = 2*GL2;

	      for (Mul2=0; Mul2<Spe_Num_Basis[spe][GL2]; Mul2++){
		for(l=0; l<=Lmax; l++){
		  MPI_Bcast(&Spe_ProductRF_Bessel[spe][GL1][Mul1][GL2][Mul2][l][0],
			    GL_Mesh,MPI_DOUBLE,ID,mpi_comm_level1);
                  MPI_Barrier(mpi_comm_level1);
		}
	      }
	    }
	  }
	}
      }
    }
  }

  /***********************************************************
                         elapsed time
  ***********************************************************/

  dtime(&TEtime);

  /*
  printf("myid=%2d Elapsed Time (s) = %15.12f\n",myid,TEtime-TStime);
  MPI_Finalize();
  exit(0);
  */

}