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_obwfn_h
00029 #define _chemistry_qc_wfn_obwfn_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <chemistry/qc/wfn/wfn.h>
00036
00037 namespace sc {
00038
00041 class OneBodyWavefunction: public Wavefunction {
00042 protected:
00043 ResultRefSymmSCMatrix density_;
00044 AccResultRefSCMatrix oso_eigenvectors_;
00045 AccResultRefDiagSCMatrix eigenvalues_;
00046 int nirrep_;
00047 int *nvecperirrep_;
00048 double *occupations_;
00049 double *alpha_occupations_;
00050 double *beta_occupations_;
00051
00052 void init_sym_info();
00053
00054
00055
00056
00057
00058 int form_occupations(int *&newocc, const int *oldocc);
00059
00060 public:
00061 OneBodyWavefunction(StateIn&);
00072 OneBodyWavefunction(const Ref<KeyVal>&);
00073 ~OneBodyWavefunction();
00074
00075 void save_data_state(StateOut&);
00076
00077 int nelectron();
00078
00081 void set_desired_value_accuracy(double eps);
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00115 RefSCMatrix so_to_mo();
00117 RefSCMatrix orthog_so_to_mo();
00119 RefSCMatrix mo_to_so();
00122 RefSCMatrix mo_to_orthog_so();
00123
00125 RefSCMatrix eigenvectors();
00128 virtual RefSCMatrix oso_eigenvectors() = 0;
00130 virtual RefDiagSCMatrix eigenvalues() = 0;
00133 virtual double occupation(int irrep, int vectornum) = 0;
00136 double occupation(int vectornum);
00137
00139 virtual int spin_unrestricted() = 0;
00140
00143 virtual double alpha_occupation(int irrep, int vectornum);
00146 virtual double beta_occupation(int irrep, int vectornum);
00149 double alpha_occupation(int vectornum);
00152 double beta_occupation(int vectornum);
00153
00154
00155 virtual RefSCMatrix oso_alpha_eigenvectors();
00156 virtual RefSCMatrix oso_beta_eigenvectors();
00157 virtual RefSCMatrix alpha_eigenvectors();
00158 virtual RefSCMatrix beta_eigenvectors();
00159 virtual RefDiagSCMatrix alpha_eigenvalues();
00160 virtual RefDiagSCMatrix beta_eigenvalues();
00161
00162 virtual RefDiagSCMatrix
00163 projected_eigenvalues(const Ref<OneBodyWavefunction>&, int alp=1);
00166 virtual RefSCMatrix projected_eigenvectors(const Ref<OneBodyWavefunction>&,
00167 int alp=1);
00170 virtual RefSCMatrix hcore_guess();
00174 virtual RefSCMatrix hcore_guess(RefDiagSCMatrix &val);
00175
00176 void symmetry_changed();
00177
00178 double orbital(const SCVector3& r, int iorb);
00179 double orbital_density(const SCVector3& r, int iorb, double* orbval = 0);
00180
00181 void print(std::ostream&o=ExEnv::out0()) const;
00182 };
00183
00184
00185
00186 class HCoreWfn: public OneBodyWavefunction {
00187 private:
00188 int nirrep_;
00189 int *docc_;
00190 int *socc_;
00191 int total_charge_;
00192 int user_occ_;
00193
00194 void fill_occ(const RefDiagSCMatrix &evals,
00195 int ndocc, int *docc, int nsocc = 0, int *socc = 0);
00196
00197 void compute();
00198
00199 public:
00200 HCoreWfn(StateIn&);
00201 HCoreWfn(const Ref<KeyVal>&);
00202 ~HCoreWfn();
00203
00204 void save_data_state(StateOut&);
00205
00206 double occupation(int irrep, int vectornum);
00207
00208 RefSCMatrix oso_eigenvectors();
00209 RefDiagSCMatrix eigenvalues();
00210 RefSymmSCMatrix density();
00211 int spin_polarized();
00212 int spin_unrestricted();
00213
00214 int value_implemented() const;
00215 };
00216
00217 }
00218
00219 #endif
00220
00221
00222
00223
00224