00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _chemistry_qc_dft_integrator_h
00029 #define _chemistry_qc_dft_integrator_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <util/state/state.h>
00036 #include <util/group/thread.h>
00037 #include <chemistry/qc/dft/functional.h>
00038 #include <chemistry/qc/basis/extent.h>
00039 #include <chemistry/qc/wfn/density.h>
00040
00041 namespace sc {
00042
00044 class DenIntegrator: virtual public SavableState {
00045 protected:
00046 Ref<GaussianBasisSet> basis_;
00047 Ref<Integral> integral_;
00048
00049
00050 Ref<BatchElectronDensity> den_;
00051
00052 Ref<ThreadGrp> threadgrp_;
00053 Ref<MessageGrp> messagegrp_;
00054
00055 double value_;
00056 double accuracy_;
00057
00058 double *alpha_vmat_;
00059 double *beta_vmat_;
00060
00061
00062
00063
00064
00065 int spin_polarized_;
00066
00067 int need_density_;
00068 double density_;
00069 int nbasis_;
00070 int nshell_;
00071 int n_integration_center_;
00072 int natom_;
00073 int compute_potential_integrals_;
00074
00075 int linear_scaling_;
00076 int use_dmat_bound_;
00077
00078 void init_integration(const Ref<DenFunctional> &func,
00079 const RefSymmSCMatrix& densa,
00080 const RefSymmSCMatrix& densb,
00081 double *nuclear_gradient);
00082 void done_integration();
00083
00084 void init_object();
00085 public:
00087 DenIntegrator();
00089 DenIntegrator(const Ref<KeyVal> &);
00091 DenIntegrator(StateIn &);
00092 ~DenIntegrator();
00093 void save_data_state(StateOut &);
00094
00096 const Ref<GaussianBasisSet> &basis() const { return basis_; }
00099 const Ref<Integral> &integral() const { return integral_; }
00101 double value() const { return value_; }
00102
00104 void set_accuracy(double a);
00105 double get_accuracy(void) {return accuracy_; }
00108 void set_compute_potential_integrals(int);
00111 const double *alpha_vmat() const { return alpha_vmat_; }
00114 const double *beta_vmat() const { return beta_vmat_; }
00115
00119 virtual void init(const Ref<Wavefunction> &);
00122 virtual void init(const Ref<GaussianBasisSet> &,
00123 const Ref<Integral> &);
00125 virtual void done();
00129 virtual void integrate(const Ref<DenFunctional> &,
00130 const RefSymmSCMatrix& densa =0,
00131 const RefSymmSCMatrix& densb =0,
00132 double *nuclear_grad = 0) = 0;
00133
00135 bool spin_polarized() const { return spin_polarized_; }
00136 };
00137
00138
00140 class IntegrationWeight: virtual public SavableState {
00141
00142 protected:
00143
00144 Ref<Molecule> mol_;
00145 double tol_;
00146
00147 void fd_w(int icenter, SCVector3 &point, double *fd_grad_w);
00148
00149 public:
00150 IntegrationWeight();
00151 IntegrationWeight(const Ref<KeyVal> &);
00152 IntegrationWeight(StateIn &);
00153 ~IntegrationWeight();
00154 void save_data_state(StateOut &);
00155
00156 void test(int icenter, SCVector3 &point);
00157 void test();
00158
00160 virtual void init(const Ref<Molecule> &, double tolerance);
00162 virtual void done();
00167 virtual double w(int center, SCVector3 &point, double *grad_w = 0) = 0;
00168 };
00169
00170
00172 class BeckeIntegrationWeight: public IntegrationWeight {
00173
00174 int n_integration_centers;
00175 SCVector3 *centers;
00176 double *atomic_radius;
00177
00178 double **a_mat;
00179 double **oorab;
00180
00181 void compute_grad_p(int gc, int ic, int wc, SCVector3&r, double p,
00182 SCVector3&g);
00183 void compute_grad_nu(int gc, int bc, SCVector3 &point, SCVector3 &grad);
00184
00185 double compute_t(int ic, int jc, SCVector3 &point);
00186 double compute_p(int icenter, SCVector3&point);
00187
00188 public:
00189 BeckeIntegrationWeight();
00190 BeckeIntegrationWeight(const Ref<KeyVal> &);
00191 BeckeIntegrationWeight(StateIn &);
00192 ~BeckeIntegrationWeight();
00193 void save_data_state(StateOut &);
00194
00195 void init(const Ref<Molecule> &, double tolerance);
00196 void done();
00197 double w(int center, SCVector3 &point, double *grad_w = 0);
00198 };
00199
00201 class RadialIntegrator: virtual public SavableState {
00202 protected:
00203 int nr_;
00204 public:
00205 RadialIntegrator();
00206 RadialIntegrator(const Ref<KeyVal> &);
00207 RadialIntegrator(StateIn &);
00208 ~RadialIntegrator();
00209 void save_data_state(StateOut &);
00210
00212 virtual int nr() const = 0;
00216 virtual double radial_value(int ir, int nr, double radii,
00217 double &multiplier) = 0;
00218 };
00219
00220
00222 class AngularIntegrator: virtual public SavableState{
00223 protected:
00224 public:
00225 AngularIntegrator();
00226 AngularIntegrator(const Ref<KeyVal> &);
00227 AngularIntegrator(StateIn &);
00228 ~AngularIntegrator();
00229 void save_data_state(StateOut &);
00230
00231 virtual int nw(void) const = 0;
00232 virtual int num_angular_points(double r_value, int ir) = 0;
00233 virtual double angular_point_cartesian(int iangular, double r,
00234 SCVector3 &integration_point) const = 0;
00235 };
00236
00237
00240 class EulerMaclaurinRadialIntegrator: public RadialIntegrator {
00241 public:
00242 EulerMaclaurinRadialIntegrator();
00243 EulerMaclaurinRadialIntegrator(int i);
00247 EulerMaclaurinRadialIntegrator(const Ref<KeyVal> &);
00248 EulerMaclaurinRadialIntegrator(StateIn &);
00249 ~EulerMaclaurinRadialIntegrator();
00250 void save_data_state(StateOut &);
00251
00252 int nr() const;
00253 double radial_value(int ir, int nr, double radii, double &multiplier);
00254
00255 void print(std::ostream & =ExEnv::out0()) const;
00256 };
00257
00299 class LebedevLaikovIntegrator: public AngularIntegrator {
00300 protected:
00301 int npoint_;
00302 double *x_, *y_, *z_, *w_;
00303
00304 void init(int n);
00305 public:
00306 LebedevLaikovIntegrator();
00312 LebedevLaikovIntegrator(const Ref<KeyVal> &);
00313 LebedevLaikovIntegrator(StateIn &);
00314 LebedevLaikovIntegrator(int);
00315 ~LebedevLaikovIntegrator();
00316 void save_data_state(StateOut &);
00317
00318 int nw(void) const;
00319 int num_angular_points(double r_value, int ir);
00320 double angular_point_cartesian(int iangular, double r,
00321 SCVector3 &integration_point) const;
00322 void print(std::ostream & =ExEnv::out0()) const;
00323 };
00324
00327 class GaussLegendreAngularIntegrator: public AngularIntegrator {
00328 protected:
00329 int ntheta_;
00330 int nphi_;
00331 int Ktheta_;
00332 int ntheta_r_;
00333 int nphi_r_;
00334 int Ktheta_r_;
00335 double *theta_quad_weights_;
00336 double *theta_quad_points_;
00337
00338 int get_ntheta(void) const;
00339 void set_ntheta(int i);
00340 int get_nphi(void) const;
00341 void set_nphi(int i);
00342 int get_Ktheta(void) const;
00343 void set_Ktheta(int i);
00344 int get_ntheta_r(void) const;
00345 void set_ntheta_r(int i);
00346 int get_nphi_r(void) const;
00347 void set_nphi_r(int i);
00348 int get_Ktheta_r(void) const;
00349 void set_Ktheta_r(int i);
00350 int nw(void) const;
00351 double sin_theta(SCVector3 &point) const;
00352 void gauleg(double x1, double x2, int n);
00353 public:
00354 GaussLegendreAngularIntegrator();
00361 GaussLegendreAngularIntegrator(const Ref<KeyVal> &);
00362 GaussLegendreAngularIntegrator(StateIn &);
00363 ~GaussLegendreAngularIntegrator();
00364 void save_data_state(StateOut &);
00365
00366 int num_angular_points(double r_value, int ir);
00367 double angular_point_cartesian(int iangular, double r,
00368 SCVector3 &integration_point) const;
00369 void print(std::ostream & =ExEnv::out0()) const;
00370 };
00371
00374 class RadialAngularIntegrator: public DenIntegrator {
00375 private:
00376 int prune_grid_;
00377 double **Alpha_coeffs_;
00378 int gridtype_;
00379 int **nr_points_, *xcoarse_l_;
00380 int npruned_partitions_;
00381 double *grid_accuracy_;
00382 int dynamic_grids_;
00383 int natomic_rows_;
00384 int max_gridtype_;
00385 protected:
00386 Ref<IntegrationWeight> weight_;
00387 Ref<RadialIntegrator> radial_user_;
00388 Ref<AngularIntegrator> angular_user_;
00389 Ref<AngularIntegrator> ***angular_grid_;
00390 Ref<RadialIntegrator> **radial_grid_;
00391 public:
00392 RadialAngularIntegrator();
00433 RadialAngularIntegrator(const Ref<KeyVal> &);
00434 RadialAngularIntegrator(StateIn &);
00435 ~RadialAngularIntegrator();
00436 void save_data_state(StateOut &);
00437
00438 void integrate(const Ref<DenFunctional> &,
00439 const RefSymmSCMatrix& densa =0,
00440 const RefSymmSCMatrix& densb =0,
00441 double *nuclear_gradient = 0);
00442 void print(std::ostream & =ExEnv::out0()) const;
00443 AngularIntegrator *get_angular_grid(double radius, double atomic_radius,
00444 int charge, int deriv_order);
00445 RadialIntegrator *get_radial_grid(int charge, int deriv_order);
00446 void init_default_grids(void);
00447 int angular_grid_offset(int i);
00448 void set_grids(void);
00449 int get_atomic_row(int i);
00450 void init_parameters(void);
00451 void init_parameters(const Ref<KeyVal>& keyval);
00452 void init_pruning_coefficients(const Ref<KeyVal>& keyval);
00453 void init_pruning_coefficients(void);
00454 void init_alpha_coefficients(void);
00455 int select_dynamic_grid(void);
00456 Ref<IntegrationWeight> weight() { return weight_; }
00457 };
00458
00459 }
00460
00461 #endif
00462
00463
00464
00465
00466