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 int dk_;
00076 Ref<GaussianBasisSet> momentum_basis_;
00077
00078 void init_orthog();
00079
00080 void set_up_charge_types(std::vector<int> &q_pc,
00081 std::vector<int> &q_cd,
00082 std::vector<int> &n_pc,
00083 std::vector<int> &n_cd);
00084
00085 double nuc_rep_pc_pc(const std::vector<int>&,const std::vector<int>&,bool);
00086 double nuc_rep_pc_cd(const std::vector<int>&,const std::vector<int>&);
00087 double nuc_rep_cd_cd(const std::vector<int>&,const std::vector<int>&,bool);
00088 void scale_atom_basis_coef();
00089
00090 void nuc_rep_grad_pc_pc(double **grad,
00091 const std::vector<int>&c1,
00092 const std::vector<int>&c2,
00093 bool uniq);
00094 void nuc_rep_grad_pc_cd(double **grad,
00095 const std::vector<int>&c1,
00096 const std::vector<int>&c2);
00097 void nuc_rep_grad_cd_cd(double **grad,
00098 const std::vector<int>&c1,
00099 const std::vector<int>&c2,
00100 bool uniq);
00101
00102
00103 RefSymmSCMatrix core_hamiltonian_dk(
00104 int dk,
00105 const Ref<GaussianBasisSet> &bas,
00106 const Ref<GaussianBasisSet> &pbas = 0);
00107 void core_hamiltonian_dk2_contrib(const RefSymmSCMatrix &h_pbas,
00108 const RefDiagSCMatrix &E,
00109 const RefDiagSCMatrix &K,
00110 const RefDiagSCMatrix &p2,
00111 const RefDiagSCMatrix &p2K2,
00112 const RefDiagSCMatrix &p2K2_inv,
00113 const RefSymmSCMatrix &AVA_pbas,
00114 const RefSymmSCMatrix &BpVpB_pbas);
00115 void core_hamiltonian_dk3_contrib(const RefSymmSCMatrix &h_pbas,
00116 const RefDiagSCMatrix &E,
00117 const RefDiagSCMatrix &B,
00118 const RefDiagSCMatrix &p2K2_inv,
00119 const RefSCMatrix &so_to_p,
00120 const RefSymmSCMatrix &pxVp);
00121
00122
00123 protected:
00124
00125 int debug_;
00126
00127 double min_orthog_res();
00128 double max_orthog_res();
00129
00130 void copy_orthog_info(const Ref<Wavefunction> &);
00131
00132 public:
00133 Wavefunction(StateIn&);
00166 Wavefunction(const Ref<KeyVal>&);
00167 virtual ~Wavefunction();
00168
00169 void save_data_state(StateOut&);
00170
00171 double density(const SCVector3&);
00172 double density_gradient(const SCVector3&,double*);
00173 double natural_orbital(const SCVector3& r, int iorb);
00174 double natural_orbital_density(const SCVector3& r,
00175 int orb, double* orbval = 0);
00176 double orbital(const SCVector3& r, int iorb, const RefSCMatrix& orbs);
00177
00178 double orbital_density(const SCVector3& r,
00179 int iorb,
00180 const RefSCMatrix& orbs,
00181 double* orbval = 0);
00182
00184 double charge();
00186 virtual int nelectron() = 0;
00187
00189 virtual RefSymmSCMatrix density() = 0;
00191 virtual RefSymmSCMatrix ao_density();
00193 virtual RefSCMatrix natural_orbitals();
00195 virtual RefDiagSCMatrix natural_density();
00196
00198 virtual int spin_polarized() = 0;
00199
00201 int dk() const { return dk_; }
00202
00204 virtual RefSymmSCMatrix alpha_density();
00206 virtual RefSymmSCMatrix beta_density();
00208 virtual RefSymmSCMatrix alpha_ao_density();
00210 virtual RefSymmSCMatrix beta_ao_density();
00211
00213 virtual RefSCMatrix nao(double *atom_charges=0);
00214
00216 virtual RefSymmSCMatrix overlap();
00220 virtual RefSymmSCMatrix core_hamiltonian_for_basis(
00221 const Ref<GaussianBasisSet> &bas,
00222 const Ref<GaussianBasisSet> &pbas = 0);
00224 virtual RefSymmSCMatrix core_hamiltonian();
00225
00226 RefSymmSCMatrix core_hamiltonian_nr(
00227 const Ref<GaussianBasisSet> &bas);
00228
00229
00233 virtual double nuclear_repulsion_energy();
00238 void nuclear_repulsion_energy_gradient(double *g);
00243 virtual void nuclear_repulsion_energy_gradient(double **g);
00244
00246 RefSCDimension ao_dimension();
00248 RefSCDimension so_dimension();
00250 RefSCDimension oso_dimension();
00252 Ref<SCMatrixKit> basis_matrixkit();
00254 Ref<Molecule> molecule() const;
00256 Ref<GaussianBasisSet> basis() const;
00258 Ref<GaussianBasisSet> momentum_basis() const;
00260 Ref<GaussianBasisSet> atom_basis() const;
00263 const double *atom_basis_coef() const;
00265 Ref<Integral> integral();
00266
00267
00268 void symmetry_changed();
00269
00276 RefSCMatrix so_to_orthog_so();
00277
00280 RefSCMatrix so_to_orthog_so_inverse();
00281
00283 OverlapOrthog::OrthogMethod orthog_method() const;
00285 void set_orthog_method(const OverlapOrthog::OrthogMethod&);
00286
00288 double lindep_tol() const;
00290 void set_lindep_tol(double);
00291
00292 void obsolete();
00293
00294 void print(std::ostream& = ExEnv::out0()) const;
00295 };
00296
00297 }
00298
00299 #endif
00300
00301
00302
00303
00304