28 #ifndef _chemistry_qc_dft_functional_h
29 #define _chemistry_qc_dft_functional_h
35 #include <util/state/state.h>
36 #include <math/scmat/vector3.h>
37 #include <chemistry/qc/wfn/wfn.h>
38 #include <chemistry/qc/wfn/density.h>
44 enum {
X=BatchElectronDensity::X,
45 Y=BatchElectronDensity::Y,
46 Z=BatchElectronDensity::Z};
47 enum {XX=BatchElectronDensity::XX,
48 YX=BatchElectronDensity::YX,
49 YY=BatchElectronDensity::YY,
50 ZX=BatchElectronDensity::ZX,
51 ZY=BatchElectronDensity::ZY,
52 ZZ=BatchElectronDensity::ZZ};
75 void compute_derived(
int spin_polarized,
96 void zero(){energy=df_drho_a=df_drho_b=df_dgamma_aa=df_dgamma_bb=df_dgamma_ab=0.0;}
104 int compute_potential_;
108 double lower_bound,
double upper_bound);
118 virtual void set_spin_polarized(
int i);
121 virtual void set_compute_potential(
int i);
125 virtual int need_density_gradient();
128 virtual int need_density_hessian();
132 double *gradient,
int acenter,
134 const double *dmat_a,
const double *dmat_b,
135 int ncontrib,
const int *contrib,
136 int ncontrib_bf,
const int *contrib_bf,
137 const double *bs_values,
const double *bsg_values,
138 const double *bsh_values);
141 virtual double a0()
const;
203 void set_spin_polarized(
int);
204 void set_compute_potential(
int);
205 int need_density_gradient();
291 void init_arrays(
int n);
319 double &ec_local,
double &decrs,
double &deczeta) = 0;
337 void init_constants();
338 double rho_deriv(
double rho_a,
double rho_b,
double mdr,
339 double ec_local,
double ec_local_dra);
340 double gab_deriv(
double rho,
double phi,
double mdr,
double ec_local);
347 int need_density_gradient();
349 void set_spin_polarized(
int);
374 void init_constants();
375 double limit_df_drhoa(
double rhoa,
double gamma,
376 double ec,
double decdrhoa);
384 int need_density_gradient();
387 void set_spin_polarized(
int);
407 void init_constants();
414 int need_density_gradient();
432 void init_constants();
433 double rho_deriv(
double rho_a,
double rho_b,
double mdr);
434 double gab_deriv(
double rho_a,
double rho_b,
double mdr);
442 int need_density_gradient();
469 double Ap_, Af_, A_alpha_;
470 double x0p_mc_, bp_mc_, cp_mc_, x0f_mc_, bf_mc_, cf_mc_;
471 double x0p_rpa_, bp_rpa_, cp_rpa_, x0f_rpa_, bf_rpa_, cf_rpa_;
472 double x0_alpha_mc_, b_alpha_mc_, c_alpha_mc_;
473 double x0_alpha_rpa_, b_alpha_rpa_, c_alpha_rpa_;
474 void init_constants();
476 double F(
double x,
double A,
double x0,
double b,
double c);
477 double dFdr_s(
double x,
double A,
double x0,
double b,
double c);
493 double x0p_, bp_, cp_, x0f_, bf_, cf_;
510 double &,
double &,
double &);
534 int monte_carlo_prefactor_;
550 int monte_carlo_prefactor_;
582 double F(
double x,
double A,
double alpha_1,
double beta_1,
double beta_2,
583 double beta_3,
double beta_4,
double p);
584 double dFdr_s(
double x,
double A,
double alpha_1,
double beta_1,
double beta_2,
585 double beta_3,
double beta_4,
double p);
603 double Fec_rsgt1(
double rs,
double beta_1,
double beta_2,
double gamma);
604 double dFec_rsgt1_drho(
double rs,
double beta_1,
double beta_2,
double gamma,
606 double Fec_rslt1(
double rs,
double A,
double B,
double C,
double D);
607 double dFec_rslt1_drho(
double rs,
double A,
double B,
double C,
double D,
651 int need_density_gradient();
670 void init_constants();
678 int need_density_gradient();
693 void init_constants();
701 int need_density_gradient();
726 double &mpw,
double &dmpw_dr,
double &dmpw_dg);
727 void init_constants();
735 int need_density_gradient();
758 double &mpw,
double &dmpw_dr,
double &dmpw_dg);
759 void init_constants();
767 int need_density_gradient();
786 double &mpw,
double &dmpw_dr,
double &dmpw_dg);
788 enum Func { B88, PW91, mPW91 };
818 int need_density_gradient();
822 void init_constants(Func);
832 void init_constants();
840 int need_density_gradient();