コード例 #1
0
ファイル: test.c プロジェクト: gimunu/octopus_hhg
void test_neg_rho()
{
  xc_func_type func;
  double rho[5][2] = { {9.03897273e-06,-1.00463992e-06}, 
		       {8.48383564e-06,-3.51231267e-07}, 
		       {1.45740621e-08,-2.94546705e-09}, 
		       {2.62778445e-07, -1.00191745e-07}, 
		       {2.55745103e-06, -1.54789964e-06} };
  double sigma[5][3] = { {1.20122271e-08,4.83240746e-09,6.24774836e-09}, 
			 {1.54146602e-07,1.41584609e-07,1.36663204e-07}, 
			 {2.75312438e-08,2.75224049e-08,2.75135719e-08}, 
			 {1.90251649e-07,1.91241798e-07,1.92240989e-07}, 
			 {9.29562712e-09,7.83940082e-09, 8.05714636e-09} };
  double vsigma[5][3];
  double zk[5], vk[5][2];
  int i, func_id;

  for(func_id=1; func_id<1000; func_id++){
    if(xc_func_init(&func, func_id, XC_POLARIZED) != 0) continue;
    if(func_id == XC_LDA_C_2D_PRM || func_id == XC_GGA_X_LB) goto end;

    printf("\n%s:\n", func.info->name);

    switch(func.info->family){
    case XC_FAMILY_LDA:
      xc_lda_exc_vxc(&func, 5, &rho[0][0], zk, &vk[0][0]);
      break;
    case XC_FAMILY_GGA:
      xc_gga_exc_vxc(&func, 5, &rho[0][0], &sigma[0][0], zk, &vk[0][0], &vsigma[0][0]);
      break;
    }

    switch(func.info->family){
    case XC_FAMILY_LDA:
      for(i=0; i<5; i+=1)
	printf("%.8e %.8e %.8e %.8e %.8e\n", 
	       rho[i][0], rho[i][1], zk[i], vk[i][0], vk[i][1]);
      break;
    case XC_FAMILY_GGA:
      for(i=0; i<5; i+=1)
	printf("%.8e %.8e %.8e %.8e %.8e %.8e %.8e %.8e %.8e %.8e %.8e\n", 
	       rho[i][0], rho[i][1], sigma[i][0], sigma[i][1], sigma[i][2], 
	       zk[i], vk[i][0], vk[i][1], vsigma[i][0], vsigma[i][1], vsigma[i][2]);
      break;
    }

  end:
    xc_func_end(&func);
  }
}
コード例 #2
0
ファイル: xc-consistency.c プロジェクト: gimunu/octopus_hhg
double get_point(xc_func_type *func, double point[5], double *e, double der[5], int which)
{
  switch(func->info->family)
    {
    case XC_FAMILY_LDA:
      xc_lda_exc_vxc(func, 1, &(point[0]), e, &(der[0]));
      break;
    case XC_FAMILY_GGA:
    case XC_FAMILY_HYB_GGA:
      xc_gga_exc_vxc(func, 1, &(point[0]), &(point[2]),
		     e, &(der[0]), &(der[2]));
      break;
    }

  if(which == 0)
    return (*e)*(point[0] + point[1]);
  else
    return der[which-1];
}
コード例 #3
0
ファイル: dft.hpp プロジェクト: githubxsli/chronusq_public
 void evalEXC_VXC(size_t N, double *rho, double *eps, double *vxc) {
   assert(not isGGA_);
   xc_lda_exc_vxc(&this->functional_,N,rho,eps,vxc);
 }