scf.h

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 miniter_;
00066     int dens_reset_freq_;
00067     int reset_occ_;
00068     int local_dens_;
00069     size_t storage_;
00070     int print_all_evals_;
00071     int print_occ_evals_;
00072 
00073     double level_shift_;
00074 
00075     Ref<MessageGrp> scf_grp_;
00076     Ref<ThreadGrp> threadgrp_;
00077     int local_;
00078 
00079     Ref<TwoBodyInt>* tbis_; // a two body integral evaluator for each thread
00080     virtual void init_threads();
00081     virtual void done_threads();
00082     
00083     // implement the Compute::compute() function
00084     virtual void compute();
00085 
00086     // calculate the scf vector, returning the accuracy
00087     virtual double compute_vector(double&, double enuclear);
00088 
00089     // return the DIIS error matrices
00090     virtual Ref<SCExtrapError> extrap_error();
00091 
00092     // calculate the scf gradient
00093     virtual void compute_gradient(const RefSCVector&);
00094     
00095     // calculate the scf hessian
00096     virtual void compute_hessian(const RefSymmSCMatrix&);
00097     
00098     // saves state and restart information after every checkpoint_freq()
00099     // SCF iterations
00100     virtual void savestate_iter(int);
00101 
00102     // saves state to the given filename
00103     virtual void savestate_to_file(const std::string &filename);
00104     std::string previous_savestate_file_;
00105     
00106     // returns the log of the max density element in each shell block
00107     signed char * init_pmax(double *);
00108     
00109     // given a matrix, this will convert the matrix to a local matrix if
00110     // it isn't one already, and return that local matrix.  it will also
00111     // set the double* to point to the local matrix's data.
00112     enum Access { Read, Write, Accum };
00113     RefSymmSCMatrix get_local_data(const RefSymmSCMatrix&, double*&, Access);
00114     
00115     // create the initial scf vector.  either use the eigenvectors in
00116     // guess_wfn_, or use a core Hamiltonian guess.  Call this with needv
00117     // equal to 0 if you expect to call it twice with the same geometry
00118     // (eg. when calling from both set_occupations() and init_vector()).
00119     virtual void initial_vector(int needv=1);
00120     
00121     // given the total number of density and fock matrices, figure out
00122     // how much memory that will require and then set the local_dens_
00123     // variable accordingly
00124     void init_mem(int);
00125     
00126     void so_density(const RefSymmSCMatrix& d, double occ, int alp=1);
00127 
00128     // Returns a new'ed allocation vector if it is in the input,
00129     // otherwise null.
00130     int *read_occ(const Ref<KeyVal> &, const char *name, int nirrep);
00131   public:
00132     SCF(StateIn&);
00202     SCF(const Ref<KeyVal>&);
00203     ~SCF();
00204 
00205     void save_data_state(StateOut&);
00206 
00207     RefSCMatrix oso_eigenvectors();
00208     RefDiagSCMatrix eigenvalues();
00209 
00210     int spin_unrestricted(); // return 0
00211     
00212     // return the number of AO Fock matrices needed
00213     virtual int n_fock_matrices() const =0;
00214 
00215     // returns the n'th AO Fock matrix
00216     virtual RefSymmSCMatrix fock(int) =0;
00217 
00218     // return the effective MO fock matrix
00219     virtual RefSymmSCMatrix effective_fock() =0;
00220 
00221     virtual double one_body_energy();
00222     virtual void two_body_energy(double &ec, double &ex);
00223 
00224     void symmetry_changed();
00225 
00226     void obsolete();
00227 
00228     void print(std::ostream&o=ExEnv::out0()) const;
00229 
00230   protected:
00231     // the following are scratch and are not checkpointed
00232     RefSCMatrix oso_scf_vector_;
00233     RefSCMatrix oso_scf_vector_beta_; // only used if !spin_restricted
00234     RefSymmSCMatrix hcore_;
00235 
00236     // //////////////////////////////////////////////////////////////////////
00237     // pure virtual member functions follow
00238     
00239     // tries to automagically guess the MO occupations
00240     virtual void set_occupations(const RefDiagSCMatrix&) =0;
00241     
00242     // //////////////////////////////////////////////////////////////////////
00243     // do setup for SCF calculation
00244     virtual void init_vector() =0;
00245     virtual void done_vector() =0;
00246 
00247     // calculate new density matrices, returns the rms density difference
00248     virtual double new_density() =0;
00249 
00250     // reset density diff matrix and zero out delta G matrix
00251     virtual void reset_density() =0;
00252 
00253     // return the scf electronic energy
00254     virtual double scf_energy() =0;
00255     
00256     // return the DIIS data matrices
00257     virtual Ref<SCExtrapData> extrap_data() =0;
00258     
00259     // form the AO basis fock matrices
00260     virtual void ao_fock(double accuracy) =0;
00261 
00262     // //////////////////////////////////////////////////////////////////////
00263     // do setup for gradient calculation
00264     virtual void init_gradient() =0;
00265     virtual void done_gradient() =0;
00266 
00267     virtual RefSymmSCMatrix lagrangian() =0;
00268     virtual RefSymmSCMatrix gradient_density() =0;
00269     virtual void two_body_deriv(double*) =0;
00270     
00271     // //////////////////////////////////////////////////////////////////////
00272     // do setup for hessian calculation
00273     virtual void init_hessian() =0;
00274     virtual void done_hessian() =0;
00275 
00276   private:
00277     // This experimental function does SVD of Coulomb matrix
00278     // to be used in low-rank reconstruction
00279     void svd_product_basis();
00280 };
00281 
00282 }
00283 
00284 #endif
00285 
00286 // Local Variables:
00287 // mode: c++
00288 // c-file-style: "ETS"
00289 // End:

Generated at Wed Sep 5 14:02:30 2007 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.5.2.
These pages are hosted on SourceForge.net