MPQC 2.3.1
|
00001 // 00002 // scf.h --- definition of the SCF abstract base class 00003 // 00004 // Copyright (C) 1996 Limit Point Systems, Inc. 00005 // 00006 // Author: Edward Seidl <seidl@janed.com> 00007 // Maintainer: LPS 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 00026 // 00027 00028 #ifndef _chemistry_qc_scf_scf_h 00029 #define _chemistry_qc_scf_scf_h 00030 00031 #ifdef __GNUC__ 00032 #pragma interface 00033 #endif 00034 00035 #include <util/group/thread.h> 00036 00037 #include <math/optimize/scextrap.h> 00038 00039 #include <chemistry/qc/basis/tbint.h> 00040 #include <chemistry/qc/wfn/accum.h> 00041 #include <chemistry/qc/wfn/obwfn.h> 00042 00043 namespace sc { 00044 00045 // ////////////////////////////////////////////////////////////////////////// 00046 00049 class SCF: public OneBodyWavefunction { 00050 protected: 00051 int need_vec_; 00052 int compute_guess_; 00053 00054 int keep_guess_wfn_; 00055 Ref<OneBodyWavefunction> guess_wfn_; 00056 00057 int always_use_guess_wfn_; 00058 00059 Ref<SelfConsistentExtrapolation> extrap_; 00060 00061 Ref<AccumH> accumdih_; 00062 Ref<AccumH> accumddh_; 00063 00064 int maxiter_; 00065 int dens_reset_freq_; 00066 int reset_occ_; 00067 int local_dens_; 00068 size_t storage_; 00069 int print_all_evals_; 00070 int print_occ_evals_; 00071 00072 double level_shift_; 00073 00074 Ref<MessageGrp> scf_grp_; 00075 Ref<ThreadGrp> threadgrp_; 00076 int local_; 00077 00078 Ref<TwoBodyInt>* tbis_; // a two body integral evaluator for each thread 00079 virtual void init_threads(); 00080 virtual void done_threads(); 00081 00082 // implement the Compute::compute() function 00083 virtual void compute(); 00084 00085 // calculate the scf vector, returning the accuracy 00086 virtual double compute_vector(double&, double enuclear); 00087 00088 // return the DIIS error matrices 00089 virtual Ref<SCExtrapError> extrap_error(); 00090 00091 // calculate the scf gradient 00092 virtual void compute_gradient(const RefSCVector&); 00093 00094 // calculate the scf hessian 00095 virtual void compute_hessian(const RefSymmSCMatrix&); 00096 00097 // saves state and restart information after every checkpoint_freq() 00098 // SCF iterations 00099 virtual void savestate_iter(int); 00100 00101 // saves state to the given filename 00102 virtual void savestate_to_file(const std::string &filename); 00103 std::string previous_savestate_file_; 00104 00105 // returns the log of the max density element in each shell block 00106 signed char * init_pmax(double *); 00107 00108 // given a matrix, this will convert the matrix to a local matrix if 00109 // it isn't one already, and return that local matrix. it will also 00110 // set the double* to point to the local matrix's data. 00111 enum Access { Read, Write, Accum }; 00112 RefSymmSCMatrix get_local_data(const RefSymmSCMatrix&, double*&, Access); 00113 00114 // create the initial scf vector. either use the eigenvectors in 00115 // guess_wfn_, or use a core Hamiltonian guess. Call this with needv 00116 // equal to 0 if you expect to call it twice with the same geometry 00117 // (eg. when calling from both set_occupations() and init_vector()). 00118 virtual void initial_vector(int needv=1); 00119 00120 // given the total number of density and fock matrices, figure out 00121 // how much memory that will require and then set the local_dens_ 00122 // variable accordingly 00123 void init_mem(int); 00124 00125 void so_density(const RefSymmSCMatrix& d, double occ, int alp=1); 00126 00127 // Returns a new'ed allocation vector if it is in the input, 00128 // otherwise null. 00129 int *read_occ(const Ref<KeyVal> &, const char *name, int nirrep); 00130 public: 00131 SCF(StateIn&); 00191 SCF(const Ref<KeyVal>&); 00192 ~SCF(); 00193 00194 void save_data_state(StateOut&); 00195 00196 RefSCMatrix oso_eigenvectors(); 00197 RefDiagSCMatrix eigenvalues(); 00198 00199 int spin_unrestricted(); // return 0 00200 00201 // return the number of AO Fock matrices needed 00202 virtual int n_fock_matrices() const =0; 00203 00204 // returns the n'th AO Fock matrix 00205 virtual RefSymmSCMatrix fock(int) =0; 00206 00207 // return the effective MO fock matrix 00208 virtual RefSymmSCMatrix effective_fock() =0; 00209 00210 virtual double one_body_energy(); 00211 virtual void two_body_energy(double &ec, double &ex); 00212 00213 void symmetry_changed(); 00214 00215 void obsolete(); 00216 00217 void print(std::ostream&o=ExEnv::out0()) const; 00218 00219 protected: 00220 // the following are scratch and are not checkpointed 00221 RefSCMatrix oso_scf_vector_; 00222 RefSCMatrix oso_scf_vector_beta_; // only used if !spin_restricted 00223 RefSymmSCMatrix hcore_; 00224 00225 // ////////////////////////////////////////////////////////////////////// 00226 // pure virtual member functions follow 00227 00228 // tries to automagically guess the MO occupations 00229 virtual void set_occupations(const RefDiagSCMatrix&) =0; 00230 00231 // ////////////////////////////////////////////////////////////////////// 00232 // do setup for SCF calculation 00233 virtual void init_vector() =0; 00234 virtual void done_vector() =0; 00235 00236 // calculate new density matrices, returns the rms density difference 00237 virtual double new_density() =0; 00238 00239 // reset density diff matrix and zero out delta G matrix 00240 virtual void reset_density() =0; 00241 00242 // return the scf electronic energy 00243 virtual double scf_energy() =0; 00244 00245 // return the DIIS data matrices 00246 virtual Ref<SCExtrapData> extrap_data() =0; 00247 00248 // form the AO basis fock matrices 00249 virtual void ao_fock(double accuracy) =0; 00250 00251 // ////////////////////////////////////////////////////////////////////// 00252 // do setup for gradient calculation 00253 virtual void init_gradient() =0; 00254 virtual void done_gradient() =0; 00255 00256 virtual RefSymmSCMatrix lagrangian() =0; 00257 virtual RefSymmSCMatrix gradient_density() =0; 00258 virtual void two_body_deriv(double*) =0; 00259 00260 // ////////////////////////////////////////////////////////////////////// 00261 // do setup for hessian calculation 00262 virtual void init_hessian() =0; 00263 virtual void done_hessian() =0; 00264 00265 private: 00266 // This experimental function does SVD of Coulomb matrix 00267 // to be used in low-rank reconstruction 00268 void svd_product_basis(); 00269 }; 00270 00271 } 00272 00273 #endif 00274 00275 // Local Variables: 00276 // mode: c++ 00277 // c-file-style: "ETS" 00278 // End: