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
00044 namespace sc {
00045
00047 class Wavefunction: public MolecularEnergy {
00048 public:
00049
00051 enum OrthogMethod { Symmetric=1, Canonical=2, GramSchmidt=3 };
00052
00053 private:
00054 RefSCDimension aodim_;
00055 RefSCDimension sodim_;
00056 Ref<SCMatrixKit> basiskit_;
00057
00058 ResultRefSymmSCMatrix overlap_;
00059 ResultRefSymmSCMatrix hcore_;
00060 ResultRefSCMatrix natural_orbitals_;
00061 ResultRefDiagSCMatrix natural_density_;
00062
00063 double * bs_values;
00064 double * bsg_values;
00065
00066 Ref<GaussianBasisSet> gbs_;
00067 Ref<Integral> integral_;
00068
00069
00070
00071 double lindep_tol_;
00072
00073 OrthogMethod orthog_method_;
00074
00075 RefSCDimension osodim_;
00076
00077 RefSCMatrix orthog_trans_;
00078 RefSCMatrix orthog_trans_inverse_;
00079
00080
00081
00082
00083
00084 double min_orthog_res_;
00085 double max_orthog_res_;
00086
00087 int print_nao_;
00088 int print_npa_;
00089
00090 void compute_overlap_eig(RefSCMatrix& overlap_eigvec,
00091 RefDiagSCMatrix& overlap_isqrt_eigval,
00092 RefDiagSCMatrix& overlap_sqrt_eigval);
00093 void compute_symmetric_orthog();
00094 void compute_canonical_orthog();
00095 void compute_gs_orthog();
00096 void compute_orthog_trans();
00097
00098 protected:
00099
00100 int debug_;
00101
00102 double min_orthog_res() const { return min_orthog_res_; }
00103 double max_orthog_res() const { return max_orthog_res_; }
00104
00105 void copy_orthog_info(const Ref<Wavefunction> &);
00106
00107 public:
00108 Wavefunction(StateIn&);
00141 Wavefunction(const Ref<KeyVal>&);
00142 virtual ~Wavefunction();
00143
00144 void save_data_state(StateOut&);
00145
00146 double density(const SCVector3&);
00147 double density_gradient(const SCVector3&,double*);
00148 double natural_orbital(const SCVector3& r, int iorb);
00149 double natural_orbital_density(const SCVector3& r,
00150 int orb, double* orbval = 0);
00151 double orbital(const SCVector3& r, int iorb, const RefSCMatrix& orbs);
00152
00153 double orbital_density(const SCVector3& r,
00154 int iorb,
00155 const RefSCMatrix& orbs,
00156 double* orbval = 0);
00157
00159 double charge();
00161 virtual int nelectron() = 0;
00162
00164 virtual RefSymmSCMatrix density() = 0;
00166 virtual RefSymmSCMatrix ao_density();
00168 virtual RefSCMatrix natural_orbitals();
00170 virtual RefDiagSCMatrix natural_density();
00171
00173 virtual int spin_polarized() = 0;
00174
00176 virtual RefSymmSCMatrix alpha_density();
00178 virtual RefSymmSCMatrix beta_density();
00180 virtual RefSymmSCMatrix alpha_ao_density();
00182 virtual RefSymmSCMatrix beta_ao_density();
00183
00185 virtual RefSCMatrix nao(double *atom_charges=0);
00186
00188 virtual RefSymmSCMatrix overlap();
00190 virtual RefSymmSCMatrix core_hamiltonian();
00191
00193 RefSCDimension ao_dimension();
00195 RefSCDimension so_dimension();
00197 RefSCDimension oso_dimension();
00199 Ref<SCMatrixKit> basis_matrixkit();
00201 Ref<GaussianBasisSet> basis() const;
00203 Ref<Integral> integral();
00204
00205
00206 void symmetry_changed();
00207
00214 RefSCMatrix so_to_orthog_so();
00215
00218 RefSCMatrix so_to_orthog_so_inverse();
00219
00221 OrthogMethod orthog_method() const { return orthog_method_; }
00222
00224 double lindep_tol() const { return lindep_tol_; }
00225
00226 void obsolete();
00227
00228 void print(std::ostream& = ExEnv::out0()) const;
00229 };
00230
00231 }
00232
00233 #endif
00234
00235
00236
00237
00238