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_wfn_h
00029 #define _chemistry_qc_wfn_wfn_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <iostream>
00036
00037 #include <util/misc/compute.h>
00038 #include <math/scmat/matrix.h>
00039 #include <math/scmat/vector3.h>
00040 #include <chemistry/molecule/energy.h>
00041 #include <chemistry/qc/basis/basis.h>
00042 #include <chemistry/qc/basis/integral.h>
00043 #include <chemistry/qc/basis/orthog.h>
00044
00045 namespace sc {
00046
00048 class Wavefunction: public MolecularEnergy {
00049
00050 RefSCDimension aodim_;
00051 RefSCDimension sodim_;
00052 Ref<SCMatrixKit> basiskit_;
00053
00054 ResultRefSymmSCMatrix overlap_;
00055 ResultRefSymmSCMatrix hcore_;
00056 ResultRefSCMatrix natural_orbitals_;
00057 ResultRefDiagSCMatrix natural_density_;
00058
00059 double * bs_values;
00060 double * bsg_values;
00061
00062 Ref<GaussianBasisSet> gbs_;
00063 Ref<Integral> integral_;
00064
00065 Ref<GaussianBasisSet> atom_basis_;
00066 double * atom_basis_coef_;
00067
00068 double lindep_tol_;
00069 OverlapOrthog::OrthogMethod orthog_method_;
00070 Ref<OverlapOrthog> orthog_;
00071
00072 int print_nao_;
00073 int print_npa_;
00074
00075 void init_orthog();
00076
00077 void set_up_charge_types(std::vector<int> &q_pc,
00078 std::vector<int> &q_cd,
00079 std::vector<int> &n_pc,
00080 std::vector<int> &n_cd);
00081
00082 double nuc_rep_pc_pc(const std::vector<int>&,const std::vector<int>&,bool);
00083 double nuc_rep_pc_cd(const std::vector<int>&,const std::vector<int>&);
00084 double nuc_rep_cd_cd(const std::vector<int>&,const std::vector<int>&,bool);
00085 void scale_atom_basis_coef();
00086
00087 void nuc_rep_grad_pc_pc(double **grad,
00088 const std::vector<int>&c1,
00089 const std::vector<int>&c2,
00090 bool uniq);
00091 void nuc_rep_grad_pc_cd(double **grad,
00092 const std::vector<int>&c1,
00093 const std::vector<int>&c2);
00094 void nuc_rep_grad_cd_cd(double **grad,
00095 const std::vector<int>&c1,
00096 const std::vector<int>&c2,
00097 bool uniq);
00098
00099 protected:
00100
00101 int debug_;
00102
00103 double min_orthog_res();
00104 double max_orthog_res();
00105
00106 void copy_orthog_info(const Ref<Wavefunction> &);
00107
00108 public:
00109 Wavefunction(StateIn&);
00142 Wavefunction(const Ref<KeyVal>&);
00143 virtual ~Wavefunction();
00144
00145 void save_data_state(StateOut&);
00146
00147 double density(const SCVector3&);
00148 double density_gradient(const SCVector3&,double*);
00149 double natural_orbital(const SCVector3& r, int iorb);
00150 double natural_orbital_density(const SCVector3& r,
00151 int orb, double* orbval = 0);
00152 double orbital(const SCVector3& r, int iorb, const RefSCMatrix& orbs);
00153
00154 double orbital_density(const SCVector3& r,
00155 int iorb,
00156 const RefSCMatrix& orbs,
00157 double* orbval = 0);
00158
00160 double charge();
00162 virtual int nelectron() = 0;
00163
00165 virtual RefSymmSCMatrix density() = 0;
00167 virtual RefSymmSCMatrix ao_density();
00169 virtual RefSCMatrix natural_orbitals();
00171 virtual RefDiagSCMatrix natural_density();
00172
00174 virtual int spin_polarized() = 0;
00175
00177 virtual RefSymmSCMatrix alpha_density();
00179 virtual RefSymmSCMatrix beta_density();
00181 virtual RefSymmSCMatrix alpha_ao_density();
00183 virtual RefSymmSCMatrix beta_ao_density();
00184
00186 virtual RefSCMatrix nao(double *atom_charges=0);
00187
00189 virtual RefSymmSCMatrix overlap();
00191 virtual RefSymmSCMatrix core_hamiltonian();
00192
00196 virtual double nuclear_repulsion_energy();
00201 void nuclear_repulsion_energy_gradient(double *g);
00206 virtual void nuclear_repulsion_energy_gradient(double **g);
00207
00209 RefSCDimension ao_dimension();
00211 RefSCDimension so_dimension();
00213 RefSCDimension oso_dimension();
00215 Ref<SCMatrixKit> basis_matrixkit();
00217 Ref<Molecule> molecule() const;
00219 Ref<GaussianBasisSet> basis() const;
00221 Ref<GaussianBasisSet> atom_basis() const;
00224 const double *atom_basis_coef() const;
00226 Ref<Integral> integral();
00227
00228
00229 void symmetry_changed();
00230
00237 RefSCMatrix so_to_orthog_so();
00238
00241 RefSCMatrix so_to_orthog_so_inverse();
00242
00244 OverlapOrthog::OrthogMethod orthog_method() const;
00246 void set_orthog_method(const OverlapOrthog::OrthogMethod&);
00247
00249 double lindep_tol() const;
00251 void set_lindep_tol(double);
00252
00253 void obsolete();
00254
00255 void print(std::ostream& = ExEnv::out0()) const;
00256 };
00257
00258 }
00259
00260 #endif
00261
00262
00263
00264
00265