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_wfn_density_h
00029 #define _chemistry_qc_wfn_density_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <math/isosurf/volume.h>
00036 #include <chemistry/qc/wfn/wfn.h>
00037 #include <chemistry/qc/basis/extent.h>
00038 #include <chemistry/molecule/molrender.h>
00039
00040 namespace sc {
00041
00044 class ElectronDensity: public Volume {
00045 protected:
00046 Ref<Wavefunction> wfn_;
00047 virtual void compute();
00048 public:
00049 ElectronDensity(const Ref<KeyVal>&);
00050 ElectronDensity(const Ref<Wavefunction>&);
00051 ~ElectronDensity();
00052 virtual void boundingbox(double valuemin,
00053 double valuemax,
00054 SCVector3& p1, SCVector3& p2);
00055 };
00056
00062 class BatchElectronDensity: public Volume {
00063 void zero_pointers();
00064 protected:
00065 Ref<Wavefunction> wfn_;
00066
00067 Ref<GaussianBasisSet> basis_;
00068
00069
00070 double *alpha_dmat_;
00071 double *beta_dmat_;
00072 double *dmat_bound_;
00073 ShellExtent *extent_;
00074
00075
00076 GaussianBasisSet::ValueData *valdat_;
00077 int ncontrib_;
00078 int *contrib_;
00079 int ncontrib_bf_;
00080 int *contrib_bf_;
00081 double *bs_values_;
00082 double *bsg_values_;
00083 double *bsh_values_;
00084
00085 int nshell_;
00086 int nbasis_;
00087 int spin_polarized_;
00088 int linear_scaling_;
00089 int use_dmat_bound_;
00090
00091 bool need_hessian_, need_gradient_;
00092 bool need_basis_hessian_, need_basis_gradient_;
00093
00094 bool using_shared_data_;
00095
00096 double accuracy_;
00097 virtual void init_common_data(bool initialize_density_matrices);
00098
00099
00100 virtual void init_scratch_data();
00101 void compute_basis_values(const SCVector3&r);
00102 void compute_spin_density(const double *dmat,
00103 double *rho, double *grad, double *hess);
00104
00105 virtual void compute();
00106 public:
00107
00109 enum {X=0, Y=1, Z=2};
00111 enum {XX=0, YX=1, YY=2, ZX=3, ZY=4, ZZ=5};
00112
00113 BatchElectronDensity(const Ref<KeyVal>&);
00114 BatchElectronDensity(const Ref<Wavefunction>&, double accuracy=DBL_EPSILON);
00125 BatchElectronDensity(const Ref<BatchElectronDensity>& d,
00126 bool reference_parent_data=false);
00127 ~BatchElectronDensity();
00129 virtual void boundingbox(double valuemin,
00130 double valuemax,
00131 SCVector3& p1, SCVector3& p2);
00132
00134 void clear();
00135
00138 void compute_density(const SCVector3 &r,
00139 double *alpha_density,
00140 double *alpha_density_grad,
00141 double *alpha_density_hessian,
00142 double *beta_density,
00143 double *beta_density_grad,
00144 double *beta_density_hessian);
00145
00155 virtual void init(bool initialize_density_matrices = true);
00156
00161 virtual void set_densities(const RefSymmSCMatrix &aden,
00162 const RefSymmSCMatrix &bden);
00163
00166 void set_linear_scaling(bool b) { linear_scaling_ = b; }
00167
00169 void set_accuracy(double a) { accuracy_ = a; }
00170
00172 void set_use_dmat_bound(bool b) { use_dmat_bound_ = b; }
00173
00180 double *alpha_density_matrix() { return alpha_dmat_; }
00182 double *beta_density_matrix()
00183 { return (spin_polarized_?beta_dmat_:alpha_dmat_); }
00184 int ncontrib() { return ncontrib_; }
00185 int *contrib() { return contrib_; }
00186 int ncontrib_bf() { return ncontrib_bf_; }
00187 int *contrib_bf() { return contrib_bf_; }
00188 double *bs_values() { return bs_values_; }
00189 double *bsg_values() { return bsg_values_; }
00190 double *bsh_values() { return bsh_values_; }
00193 void set_need_basis_gradient(bool b) { need_basis_gradient_ = b; }
00194 void set_need_basis_hessian(bool b) { need_basis_hessian_ = b; }
00196 };
00197
00198 class DensityColorizer: public MoleculeColorizer {
00199 protected:
00200 Ref<Wavefunction> wfn_;
00201 double scale_;
00202 double reference_;
00203 int have_scale_;
00204 int have_reference_;
00205 public:
00206 DensityColorizer(const Ref<KeyVal>&);
00207 ~DensityColorizer();
00208
00209 void colorize(const Ref<RenderedPolygons> &);
00210 };
00211
00212 class GradDensityColorizer: public MoleculeColorizer {
00213 protected:
00214 Ref<Wavefunction> wfn_;
00215 double scale_;
00216 double reference_;
00217 int have_scale_;
00218 int have_reference_;
00219 public:
00220 GradDensityColorizer(const Ref<KeyVal>&);
00221 ~GradDensityColorizer();
00222
00223 void colorize(const Ref<RenderedPolygons> &);
00224 };
00225
00226 }
00227
00228 #endif
00229
00230
00231
00232
00233