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 double lindep_tol_;
00066 OverlapOrthog::OrthogMethod orthog_method_;
00067 Ref<OverlapOrthog> orthog_;
00068
00069 int print_nao_;
00070 int print_npa_;
00071
00072 void init_orthog();
00073
00074 protected:
00075
00076 int debug_;
00077
00078 double min_orthog_res();
00079 double max_orthog_res();
00080
00081 void copy_orthog_info(const Ref<Wavefunction> &);
00082
00083 public:
00084 Wavefunction(StateIn&);
00117 Wavefunction(const Ref<KeyVal>&);
00118 virtual ~Wavefunction();
00119
00120 void save_data_state(StateOut&);
00121
00122 double density(const SCVector3&);
00123 double density_gradient(const SCVector3&,double*);
00124 double natural_orbital(const SCVector3& r, int iorb);
00125 double natural_orbital_density(const SCVector3& r,
00126 int orb, double* orbval = 0);
00127 double orbital(const SCVector3& r, int iorb, const RefSCMatrix& orbs);
00128
00129 double orbital_density(const SCVector3& r,
00130 int iorb,
00131 const RefSCMatrix& orbs,
00132 double* orbval = 0);
00133
00135 double charge();
00137 virtual int nelectron() = 0;
00138
00140 virtual RefSymmSCMatrix density() = 0;
00142 virtual RefSymmSCMatrix ao_density();
00144 virtual RefSCMatrix natural_orbitals();
00146 virtual RefDiagSCMatrix natural_density();
00147
00149 virtual int spin_polarized() = 0;
00150
00152 virtual RefSymmSCMatrix alpha_density();
00154 virtual RefSymmSCMatrix beta_density();
00156 virtual RefSymmSCMatrix alpha_ao_density();
00158 virtual RefSymmSCMatrix beta_ao_density();
00159
00161 virtual RefSCMatrix nao(double *atom_charges=0);
00162
00164 virtual RefSymmSCMatrix overlap();
00166 virtual RefSymmSCMatrix core_hamiltonian();
00167
00169 RefSCDimension ao_dimension();
00171 RefSCDimension so_dimension();
00173 RefSCDimension oso_dimension();
00175 Ref<SCMatrixKit> basis_matrixkit();
00177 Ref<GaussianBasisSet> basis() const;
00179 Ref<Integral> integral();
00180
00181
00182 void symmetry_changed();
00183
00190 RefSCMatrix so_to_orthog_so();
00191
00194 RefSCMatrix so_to_orthog_so_inverse();
00195
00197 OverlapOrthog::OrthogMethod orthog_method() const;
00198
00200 double lindep_tol() const;
00201
00202 void obsolete();
00203
00204 void print(std::ostream& = ExEnv::out0()) const;
00205 };
00206
00207 }
00208
00209 #endif
00210
00211
00212
00213
00214