- Main Page
- Related Pages
- Classes
- Files

# 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 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: