![]()
|
scf.h00001 //
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&);
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 // returns the log of the max density element in each shell block
00098 signed char * init_pmax(double *);
00099
00100 // given a matrix, this will convert the matrix to a local matrix if
00101 // it isn't one already, and return that local matrix. it will also
00102 // set the double* to point to the local matrix's data.
00103 enum Access { Read, Write, Accum };
00104 RefSymmSCMatrix get_local_data(const RefSymmSCMatrix&, double*&, Access);
00105
00106 // create the initial scf vector. either use the eigenvectors in
00107 // guess_wfn_, or use a core Hamiltonian guess. Call this with needv
00108 // equal to 0 if you expect to call it twice with the same geometry
00109 // (eg. when calling from both set_occupations() and init_vector()).
00110 virtual void initial_vector(int needv=1);
00111
00112 // given the total number of density and fock matrices, figure out
00113 // how much memory that will require and then set the local_dens_
00114 // variable accordingly
00115 void init_mem(int);
00116
00117 void so_density(const RefSymmSCMatrix& d, double occ, int alp=1);
00118
00119 // Returns a new'ed allocation vector if it is in the input,
00120 // otherwise null.
00121 int *read_occ(const Ref<KeyVal> &, const char *name, int nirrep);
00122 public:
00123 SCF(StateIn&);
00176 SCF(const Ref<KeyVal>&);
00177 ~SCF();
00178
00179 void save_data_state(StateOut&);
00180
00181 RefSCMatrix oso_eigenvectors();
00182 RefDiagSCMatrix eigenvalues();
00183
00184 int spin_unrestricted(); // return 0
00185
00186 // return the number of AO Fock matrices needed
00187 virtual int n_fock_matrices() const =0;
00188
00189 // returns the n'th AO Fock matrix
00190 virtual RefSymmSCMatrix fock(int) =0;
00191
00192 // return the effective MO fock matrix
00193 virtual RefSymmSCMatrix effective_fock() =0;
00194
00195 virtual double one_body_energy();
00196 virtual void two_body_energy(double &ec, double &ex);
00197
00198 void symmetry_changed();
00199
00200 void obsolete();
00201
00202 void print(std::ostream&o=ExEnv::out0()) const;
00203
00204 protected:
00205 // the following are scratch and are not checkpointed
00206 RefSCMatrix oso_scf_vector_;
00207 RefSCMatrix oso_scf_vector_beta_; // only used if !spin_restricted
00208 RefSymmSCMatrix hcore_;
00209
00210 // //////////////////////////////////////////////////////////////////////
00211 // pure virtual member functions follow
00212
00213 // tries to automagically guess the MO occupations
00214 virtual void set_occupations(const RefDiagSCMatrix&) =0;
00215
00216 // //////////////////////////////////////////////////////////////////////
00217 // do setup for SCF calculation
00218 virtual void init_vector() =0;
00219 virtual void done_vector() =0;
00220
00221 // calculate new density matrices, returns the rms density difference
00222 virtual double new_density() =0;
00223
00224 // reset density diff matrix and zero out delta G matrix
00225 virtual void reset_density() =0;
00226
00227 // return the scf electronic energy
00228 virtual double scf_energy() =0;
00229
00230 // return the DIIS data matrices
00231 virtual Ref<SCExtrapData> extrap_data() =0;
00232
00233 // form the AO basis fock matrices
00234 virtual void ao_fock(double accuracy) =0;
00235
00236 // //////////////////////////////////////////////////////////////////////
00237 // do setup for gradient calculation
00238 virtual void init_gradient() =0;
00239 virtual void done_gradient() =0;
00240
00241 virtual RefSymmSCMatrix lagrangian() =0;
00242 virtual RefSymmSCMatrix gradient_density() =0;
00243 virtual void two_body_deriv(double*) =0;
00244
00245 // //////////////////////////////////////////////////////////////////////
00246 // do setup for hessian calculation
00247 virtual void init_hessian() =0;
00248 virtual void done_hessian() =0;
00249 };
00250
00251 }
00252
00253 #endif
00254
00255 // Local Variables:
00256 // mode: c++
00257 // c-file-style: "ETS"
00258 // End:
Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |