source: ThirdParty/mpqc_open/src/lib/chemistry/qc/scf/scf.h@ 1513599

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 1513599 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 9.4 KB
Line 
1//
2// scf.h --- definition of the SCF abstract base class
3//
4// Copyright (C) 1996 Limit Point Systems, Inc.
5//
6// Author: Edward Seidl <seidl@janed.com>
7// Maintainer: LPS
8//
9// This file is part of the SC Toolkit.
10//
11// The SC Toolkit is free software; you can redistribute it and/or modify
12// it under the terms of the GNU Library General Public License as published by
13// the Free Software Foundation; either version 2, or (at your option)
14// any later version.
15//
16// The SC Toolkit is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Library General Public License for more details.
20//
21// You should have received a copy of the GNU Library General Public License
22// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24//
25// The U.S. Government is granted a limited license as per AL 91-7.
26//
27
28#ifndef _chemistry_qc_scf_scf_h
29#define _chemistry_qc_scf_scf_h
30
31#ifdef __GNUC__
32#pragma interface
33#endif
34
35#include <util/group/thread.h>
36
37#include <math/optimize/scextrap.h>
38
39#include <chemistry/qc/basis/tbint.h>
40#include <chemistry/qc/wfn/accum.h>
41#include <chemistry/qc/wfn/obwfn.h>
42
43namespace sc {
44
45// //////////////////////////////////////////////////////////////////////////
46
47/** The SCF class is the base for all classes that use a self-consistent
48field procedure to solve an effective one body problem. */
49class SCF: public OneBodyWavefunction {
50 protected:
51 int need_vec_;
52 int compute_guess_;
53
54 int keep_guess_wfn_;
55 Ref<OneBodyWavefunction> guess_wfn_;
56
57 int always_use_guess_wfn_;
58
59 Ref<SelfConsistentExtrapolation> extrap_;
60
61 Ref<AccumH> accumdih_;
62 Ref<AccumH> accumddh_;
63
64 int maxiter_;
65 int dens_reset_freq_;
66 int reset_occ_;
67 int local_dens_;
68 size_t storage_;
69 int print_all_evals_;
70 int print_occ_evals_;
71
72 double level_shift_;
73
74 Ref<MessageGrp> scf_grp_;
75 Ref<ThreadGrp> threadgrp_;
76 int local_;
77
78 Ref<TwoBodyInt>* tbis_; // a two body integral evaluator for each thread
79 virtual void init_threads();
80 virtual void done_threads();
81
82 // implement the Compute::compute() function
83 virtual void compute();
84
85 // calculate the scf vector, returning the accuracy
86 virtual double compute_vector(double&, double enuclear);
87
88 // return the DIIS error matrices
89 virtual Ref<SCExtrapError> extrap_error();
90
91 // calculate the scf gradient
92 virtual void compute_gradient(const RefSCVector&);
93
94 // calculate the scf hessian
95 virtual void compute_hessian(const RefSymmSCMatrix&);
96
97 // saves state and restart information after every checkpoint_freq()
98 // SCF iterations
99 virtual void savestate_iter(int);
100
101 // saves state to the given filename
102 virtual void savestate_to_file(const std::string &filename);
103 std::string previous_savestate_file_;
104
105 // returns the log of the max density element in each shell block
106 signed char * init_pmax(double *);
107
108 // given a matrix, this will convert the matrix to a local matrix if
109 // it isn't one already, and return that local matrix. it will also
110 // set the double* to point to the local matrix's data.
111 enum Access { Read, Write, Accum };
112 RefSymmSCMatrix get_local_data(const RefSymmSCMatrix&, double*&, Access);
113
114 // create the initial scf vector. either use the eigenvectors in
115 // guess_wfn_, or use a core Hamiltonian guess. Call this with needv
116 // equal to 0 if you expect to call it twice with the same geometry
117 // (eg. when calling from both set_occupations() and init_vector()).
118 virtual void initial_vector(int needv=1);
119
120 // given the total number of density and fock matrices, figure out
121 // how much memory that will require and then set the local_dens_
122 // variable accordingly
123 void init_mem(int);
124
125 void so_density(const RefSymmSCMatrix& d, double occ, int alp=1);
126
127 // Returns a new'ed allocation vector if it is in the input,
128 // otherwise null.
129 int *read_occ(const Ref<KeyVal> &, const char *name, int nirrep);
130 public:
131 SCF(StateIn&);
132 /** The KeyVal constructor.
133
134 <dl>
135
136 <dt><tt>maxiter</tt><dd> This integer specifies the maximum number
137 of SCF iterations. The default is 40.
138
139 <dt><tt>density_reset_frequency</tt><dd> This integer specifies how
140 often, in term of SCF iterations, \f$\Delta D\f$ will be reset to
141 \f$D\f$. The default is 10.
142
143 <dt><tt>reset_occuptions</tt><dd> Reassign the occupations after
144 each iteration based on the eigenvalues. This only has an effect
145 for molecules with higher than \f$C_1\f$ symmetry. The default is
146 false.
147
148 <dt><tt>level_shift</tt><dd> The default is 0.
149
150 <dt><tt>extrap</tt><dd> This specifies an object of type
151 SelfConsistentExtrapolation. The default is a DIIS object.
152
153 <dt><tt>memory</tt><dd> The amount of memory that each processor
154 may use. The default is 0 (minimal memory use).
155
156 <dt><tt>local_density</tt><dd> If this is true, a local copy of the
157 density and \f$G\f$ matrix will be made on all nodes, even if a
158 distributed matrix specialization is used. The default is true.
159
160 <dt><tt>guess_wavefunction</tt><dd> This specifies the initial
161 guess for the solution to the SCF equations. This can be either a
162 OneBodyWavefunction object or the name of file that contains the
163 saved state of a OneBodyWavefunction object. By default the
164 one-electron hamiltonian will be diagonalized to obtain the initial
165 guess.
166
167 <dt><tt>keep_guess_wavefunction</tt><dd> The guess wavefunction is
168 normally discarded after it is projected. Setting this boolean
169 variable to true will cause the guess to be kept. This is useful
170 when doing frequencies of symmetric molecules by finite
171 displacements, because the wavefunction is lost whenever the
172 molecule is displaced into lower symmetry.
173
174 <dt><tt>always_use_guess_wavefunction</tt><dd> If the orbitals must
175 be recomputed after they have already been computed once, then the
176 old orbitals are used as the initial guess by default. However, if
177 this option is true, then the guess wavefunction will be used, if
178 available. If a guess wavefunction is not available, then a core
179 Hamiltonian guess will be used. If this option is set to true,
180 then keep_guess_wavefunction should also be set to true.
181
182 <dt><tt>print_evals</tt><dd>Takes a boolean value. If true, print
183 all eigenvalues after the SCF procedure converges. Takes a boolean
184 value. The default is false.
185
186 <dt><tt>print_occ_evals</tt><dd>Takes a boolean value. If true,
187 print the occupied eigenvalues after the SCF procedure converges.
188 The default is false.
189
190 </dl> */
191 SCF(const Ref<KeyVal>&);
192 ~SCF();
193
194 void save_data_state(StateOut&);
195
196 RefSCMatrix oso_eigenvectors();
197 RefDiagSCMatrix eigenvalues();
198
199 int spin_unrestricted(); // return 0
200
201 // return the number of AO Fock matrices needed
202 virtual int n_fock_matrices() const =0;
203
204 // returns the n'th AO Fock matrix
205 virtual RefSymmSCMatrix fock(int) =0;
206
207 // return the effective MO fock matrix
208 virtual RefSymmSCMatrix effective_fock() =0;
209
210 virtual double one_body_energy();
211 virtual void two_body_energy(double &ec, double &ex);
212
213 void symmetry_changed();
214
215 void obsolete();
216
217 void print(std::ostream&o=ExEnv::out0()) const;
218
219 protected:
220 // the following are scratch and are not checkpointed
221 RefSCMatrix oso_scf_vector_;
222 RefSCMatrix oso_scf_vector_beta_; // only used if !spin_restricted
223 RefSymmSCMatrix hcore_;
224
225 // //////////////////////////////////////////////////////////////////////
226 // pure virtual member functions follow
227
228 // tries to automagically guess the MO occupations
229 virtual void set_occupations(const RefDiagSCMatrix&) =0;
230
231 // //////////////////////////////////////////////////////////////////////
232 // do setup for SCF calculation
233 virtual void init_vector() =0;
234 virtual void done_vector() =0;
235
236 // calculate new density matrices, returns the rms density difference
237 virtual double new_density() =0;
238
239 // reset density diff matrix and zero out delta G matrix
240 virtual void reset_density() =0;
241
242 // return the scf electronic energy
243 virtual double scf_energy() =0;
244
245 // return the DIIS data matrices
246 virtual Ref<SCExtrapData> extrap_data() =0;
247
248 // form the AO basis fock matrices
249 virtual void ao_fock(double accuracy) =0;
250
251 // //////////////////////////////////////////////////////////////////////
252 // do setup for gradient calculation
253 virtual void init_gradient() =0;
254 virtual void done_gradient() =0;
255
256 virtual RefSymmSCMatrix lagrangian() =0;
257 virtual RefSymmSCMatrix gradient_density() =0;
258 virtual void two_body_deriv(double*) =0;
259
260 // //////////////////////////////////////////////////////////////////////
261 // do setup for hessian calculation
262 virtual void init_hessian() =0;
263 virtual void done_hessian() =0;
264
265 private:
266 // This experimental function does SVD of Coulomb matrix
267 // to be used in low-rank reconstruction
268 void svd_product_basis();
269};
270
271}
272
273#endif
274
275// Local Variables:
276// mode: c++
277// c-file-style: "ETS"
278// End:
Note: See TracBrowser for help on using the repository browser.