void evalEXC_VXC(size_t N, double *rho, double *sigma, double *eps, double *vrho, double * vsigma) { assert(isGGA_); xc_gga_exc_vxc(&this->functional_,N,rho,sigma,eps,vrho,vsigma); };
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); } }
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]; }