| 1 |
|
|---|
| 2 | //
|
|---|
| 3 | // orthog.h -- orthogonalize the basis set
|
|---|
| 4 | //
|
|---|
| 5 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
|---|
| 6 | //
|
|---|
| 7 | // Author: Curtis Janssen <cljanss@ca.sandia.gov>
|
|---|
| 8 | // Maintainer: LPS
|
|---|
| 9 | //
|
|---|
| 10 | // This file is part of the SC Toolkit.
|
|---|
| 11 | //
|
|---|
| 12 | // The SC Toolkit is free software; you can redistribute it and/or modify
|
|---|
| 13 | // it under the terms of the GNU Library General Public License as published by
|
|---|
| 14 | // the Free Software Foundation; either version 2, or (at your option)
|
|---|
| 15 | // any later version.
|
|---|
| 16 | //
|
|---|
| 17 | // The SC Toolkit is distributed in the hope that it will be useful,
|
|---|
| 18 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 19 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 20 | // GNU Library General Public License for more details.
|
|---|
| 21 | //
|
|---|
| 22 | // You should have received a copy of the GNU Library General Public License
|
|---|
| 23 | // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
|
|---|
| 24 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|---|
| 25 | //
|
|---|
| 26 | // The U.S. Government is granted a limited license as per AL 91-7.
|
|---|
| 27 | //
|
|---|
| 28 |
|
|---|
| 29 | #ifndef _chemistry_qc_basis_orthog_h
|
|---|
| 30 | #define _chemistry_qc_basis_orthog_h
|
|---|
| 31 |
|
|---|
| 32 | #include <util/state/state.h>
|
|---|
| 33 | #include <math/scmat/matrix.h>
|
|---|
| 34 |
|
|---|
| 35 | namespace sc {
|
|---|
| 36 |
|
|---|
| 37 | /// This class computes the orthogonalizing transform for a basis set.
|
|---|
| 38 | class OverlapOrthog: virtual public SavableState {
|
|---|
| 39 | public:
|
|---|
| 40 |
|
|---|
| 41 | /// An enum for the types of orthogonalization.
|
|---|
| 42 | enum OrthogMethod { Symmetric=1, Canonical=2, GramSchmidt=3 };
|
|---|
| 43 |
|
|---|
| 44 | private:
|
|---|
| 45 | int debug_;
|
|---|
| 46 |
|
|---|
| 47 | RefSCDimension dim_;
|
|---|
| 48 | RefSCDimension orthog_dim_;
|
|---|
| 49 |
|
|---|
| 50 | // The tolerance for linearly independent basis functions.
|
|---|
| 51 | // The intepretation depends on the orthogonalization method.
|
|---|
| 52 | double lindep_tol_;
|
|---|
| 53 | // The number of linearly dependent functions
|
|---|
| 54 | int nlindep_;
|
|---|
| 55 | // The orthogonalization method
|
|---|
| 56 | OrthogMethod orthog_method_;
|
|---|
| 57 | // The orthogonalization matrices
|
|---|
| 58 | RefSCMatrix orthog_trans_;
|
|---|
| 59 | RefSCMatrix orthog_trans_inverse_;
|
|---|
| 60 | // The maximum and minimum residuals from the orthogonalization
|
|---|
| 61 | // procedure. The interpretation depends on the method used.
|
|---|
| 62 | // For symmetry and canonical, these are the min and max overlap
|
|---|
| 63 | // eigenvalues. These are the residuals for the basis functions
|
|---|
| 64 | // that actually end up being used.
|
|---|
| 65 | double min_orthog_res_;
|
|---|
| 66 | double max_orthog_res_;
|
|---|
| 67 |
|
|---|
| 68 | void compute_overlap_eig(RefSCMatrix& overlap_eigvec,
|
|---|
| 69 | RefDiagSCMatrix& overlap_isqrt_eigval,
|
|---|
| 70 | RefDiagSCMatrix& overlap_sqrt_eigval);
|
|---|
| 71 | void compute_symmetric_orthog();
|
|---|
| 72 | void compute_canonical_orthog();
|
|---|
| 73 | void compute_gs_orthog();
|
|---|
| 74 | void compute_orthog_trans();
|
|---|
| 75 |
|
|---|
| 76 | // WARNING: after a SavableState save/restore, these two members will
|
|---|
| 77 | // be null. There is really no need to store these anyway--should be
|
|---|
| 78 | // removed.
|
|---|
| 79 | RefSymmSCMatrix overlap_;
|
|---|
| 80 | Ref<SCMatrixKit> result_kit_; // this kit is used for the result matrices
|
|---|
| 81 |
|
|---|
| 82 | public:
|
|---|
| 83 | OverlapOrthog(OrthogMethod method,
|
|---|
| 84 | const RefSymmSCMatrix &overlap,
|
|---|
| 85 | const Ref<SCMatrixKit> &result_kit,
|
|---|
| 86 | double lindep_tolerance,
|
|---|
| 87 | int debug = 0);
|
|---|
| 88 |
|
|---|
| 89 | OverlapOrthog(StateIn&);
|
|---|
| 90 |
|
|---|
| 91 | virtual ~OverlapOrthog();
|
|---|
| 92 |
|
|---|
| 93 | void save_data_state(StateOut&);
|
|---|
| 94 |
|
|---|
| 95 | void reinit(OrthogMethod method,
|
|---|
| 96 | const RefSymmSCMatrix &overlap,
|
|---|
| 97 | const Ref<SCMatrixKit> &result_kit,
|
|---|
| 98 | double lindep_tolerance,
|
|---|
| 99 | int debug = 0);
|
|---|
| 100 |
|
|---|
| 101 | double min_orthog_res() const { return min_orthog_res_; }
|
|---|
| 102 | double max_orthog_res() const { return max_orthog_res_; }
|
|---|
| 103 |
|
|---|
| 104 | Ref<OverlapOrthog> copy() const;
|
|---|
| 105 |
|
|---|
| 106 | /// Returns the orthogonalization method
|
|---|
| 107 | OrthogMethod orthog_method() const { return orthog_method_; }
|
|---|
| 108 |
|
|---|
| 109 | /// Returns the tolerance for linear dependencies.
|
|---|
| 110 | double lindep_tol() const { return lindep_tol_; }
|
|---|
| 111 |
|
|---|
| 112 | /** Returns a matrix which does the requested transform from a basis to
|
|---|
| 113 | an orthogonal basis. This could be either the symmetric or
|
|---|
| 114 | canonical orthogonalization matrix. The row dimension is the basis
|
|---|
| 115 | dimension and the column dimension is orthogonal basis dimension.
|
|---|
| 116 | An operator \f$O\f$ in the orthogonal basis is given by \f$X O
|
|---|
| 117 | X^T\f$ where \f$X\f$ is the return value of this function. */
|
|---|
| 118 | RefSCMatrix basis_to_orthog_basis();
|
|---|
| 119 |
|
|---|
| 120 | /** Returns the inverse of the transformation returned by
|
|---|
| 121 | * basis_to_orthog_basis.
|
|---|
| 122 | */
|
|---|
| 123 | RefSCMatrix basis_to_orthog_basis_inverse();
|
|---|
| 124 |
|
|---|
| 125 | RefSCDimension dim();
|
|---|
| 126 | RefSCDimension orthog_dim();
|
|---|
| 127 |
|
|---|
| 128 | /** Returns the number of linearly dependent functions eliminated from
|
|---|
| 129 | the orthogonal basis.
|
|---|
| 130 | */
|
|---|
| 131 | int nlindep();
|
|---|
| 132 | };
|
|---|
| 133 |
|
|---|
| 134 | }
|
|---|
| 135 |
|
|---|
| 136 | #endif
|
|---|