| 1 | //
|
|---|
| 2 | // gaussbas.h
|
|---|
| 3 | //
|
|---|
| 4 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
|---|
| 5 | //
|
|---|
| 6 | // Author: Curtis Janssen <cljanss@limitpt.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_basis_gaussbas_h
|
|---|
| 29 | #define _chemistry_qc_basis_gaussbas_h
|
|---|
| 30 |
|
|---|
| 31 | #ifdef __GNUC__
|
|---|
| 32 | #pragma interface
|
|---|
| 33 | #endif
|
|---|
| 34 |
|
|---|
| 35 | #include <vector>
|
|---|
| 36 | #include <iostream>
|
|---|
| 37 |
|
|---|
| 38 | #include <util/state/state.h>
|
|---|
| 39 | #include <util/keyval/keyval.h>
|
|---|
| 40 | #include <math/scmat/matrix.h>
|
|---|
| 41 | #include <math/scmat/vector3.h>
|
|---|
| 42 | #include <chemistry/molecule/molecule.h>
|
|---|
| 43 |
|
|---|
| 44 | namespace sc {
|
|---|
| 45 |
|
|---|
| 46 | class GaussianShell;
|
|---|
| 47 | class BasisFileSet;
|
|---|
| 48 | class Integral;
|
|---|
| 49 |
|
|---|
| 50 | class CartesianIter;
|
|---|
| 51 | class SphericalTransformIter;
|
|---|
| 52 |
|
|---|
| 53 | /** The GaussianBasisSet class is used describe a basis set composed of
|
|---|
| 54 | atomic gaussian orbitals. Inputs for common basis sets are included in the
|
|---|
| 55 | MPQC distribution. They have been obtained from the EMSL Basis Set
|
|---|
| 56 | Database and translated into the MPQC format. The citation for this
|
|---|
| 57 | database is below. The technical citation for each basis set is listed in
|
|---|
| 58 | the individual basis set data files, in MPQC's <tt>lib/basis</tt>
|
|---|
| 59 | directory.
|
|---|
| 60 |
|
|---|
| 61 | Following is a table with available basis sets listing the supported
|
|---|
| 62 | elements for each basis and the number of basis functions for H, \f$n_0\f$,
|
|---|
| 63 | first row, \f$n_1\f$, and second row, \f$n_2\f$, atoms. Basis sets with
|
|---|
| 64 | non-alpha-numerical characters in their name must be given in quotes.
|
|---|
| 65 |
|
|---|
| 66 | <table>
|
|---|
| 67 | <tr><td>Basis Set<td>Elements<td>\f$n_0\f$<td>\f$n_1\f$<td>\f$n_2\f$
|
|---|
| 68 | <tr><td><tt>STO-2G</tt><td>H-Ca<td>1<td>5<td>9
|
|---|
| 69 | <tr><td><tt>STO-3G</tt><td>H-Kr<td>1<td>5<td>9
|
|---|
| 70 | <tr><td><tt>STO-3G*</tt><td>H-Ar<td>1<td>5<td>14
|
|---|
| 71 | <tr><td><tt>STO-6G</tt><td>H-Kr<td>1<td>5<td>9
|
|---|
| 72 | <tr><td><tt>MINI (Huzinaga)</tt><td>H-Ca<td>1<td>5<td>9
|
|---|
| 73 | <tr><td><tt>MINI (Scaled)</tt><td>H-Ca<td>1<td>5<td>9
|
|---|
| 74 | <tr><td><tt>MIDI (Huzinaga)</tt><td>H-Na, Al-K<td>2<td>9<td>13
|
|---|
| 75 | <tr><td><tt>DZ (Dunning)</tt><td>H, Li, B-Ne, Al-Cl<td>2<td>10<td>18
|
|---|
| 76 | <tr><td><tt>DZP (Dunning)</tt><td>H, Li, B-Ne, Al-Cl<td>5<td>16<td>24
|
|---|
| 77 | <tr><td><tt>DZP + Diffuse (Dunning)</tt><td>H, B-Ne<td>6<td>19<td>
|
|---|
| 78 | <tr><td><tt>3-21G</tt><td>H-Kr<td>2<td>9<td>13
|
|---|
| 79 | <tr><td><tt>3-21G*</tt><td>H-Ar<td>2<td>9<td>19
|
|---|
| 80 | <tr><td><tt>3-21++G</tt><td>H-Ar<td>3<td>13<td>17
|
|---|
| 81 | <tr><td><tt>3-21++G*</tt><td>H-Ar<td>3<td>13<td>23
|
|---|
| 82 | <tr><td><tt>4-31G</tt><td>H-Ne, P-Cl<td>2<td>9<td>13
|
|---|
| 83 | <tr><td><tt>6-31G</tt><td>H-Zn<td>2<td>9<td>13
|
|---|
| 84 | <tr><td><tt>6-31G*</tt><td>H-Zn<td>2<td>15<td>19
|
|---|
| 85 | <tr><td><tt>6-31G**</tt><td>H-Zn<td>5<td>15<td>19
|
|---|
| 86 | <tr><td><tt>6-31+G*</tt><td>H-Ar<td>2<td>19<td>23
|
|---|
| 87 | <tr><td><tt>6-31++G</tt><td>H-Ca<td>3<td>13<td>17
|
|---|
| 88 | <tr><td><tt>6-31++G*</tt><td>H-Ar<td>3<td>19<td>23
|
|---|
| 89 | <tr><td><tt>6-31++G**</tt><td>H-Ar<td>6<td>19<td>23
|
|---|
| 90 | <tr><td><tt>6-311G</tt><td>H-Ca, Ga-Kr<td>3<td>13<td>21
|
|---|
| 91 | <tr><td><tt>6-311G*</tt><td>H-Ca, Ga-Kr<td>3<td>18<td>26
|
|---|
| 92 | <tr><td><tt>6-311G**</tt><td>H-Ca, Ga-Kr<td>6<td>18<td>26
|
|---|
| 93 | <tr><td><tt>6-311G(2df,2pd)</tt><td>H-Ne, K, Ca<td>14<td>30<td>
|
|---|
| 94 | <tr><td><tt>6-311++G**</tt><td>H-Ne<td>7<td>22<td>
|
|---|
| 95 | <tr><td><tt>6-311++G(2d,2p)</tt><td>H-Ca<td>10<td>27<td>35
|
|---|
| 96 | <tr><td><tt>6-311++G(3df,3pd)</tt><td>H-Ar<td>18<td>39<td>47
|
|---|
| 97 | <tr><td><tt>cc-pVDZ</tt><td>H-Ar, Ca, Ga-Kr<td>5<td>14<td>18
|
|---|
| 98 | <tr><td><tt>cc-pVTZ</tt><td>H-Ar, Ca, Ga-Kr<td>14<td>30<td>34
|
|---|
| 99 | <tr><td><tt>cc-pVQZ</tt><td>H-Ar, Ca, Ga-Kr<td>30<td>55<td>59
|
|---|
| 100 | <tr><td><tt>cc-pV5Z</tt><td>H-Ar, Ca, Ga-Kr<td>55<td>91<td>95
|
|---|
| 101 | <tr><td><tt>cc-pV6Z</tt><td>H, He, B-Ne, Al-Ar<td>91<td>140<td>144
|
|---|
| 102 | <tr><td><tt>aug-cc-pVDZ</tt><td>H, He, B-Ne, Al-Ar, Ga-Kr<td>9<td>23<td>27
|
|---|
| 103 | <tr><td><tt>aug-cc-pVTZ</tt><td>H, He, B-Ne, Al-Ar, Ga-Kr<td>23<td>46<td>50
|
|---|
| 104 | <tr><td><tt>aug-cc-pVQZ</tt><td>H, He, B-Ne, Al-Ar, Ga-Kr<td>46<td>80<td>84
|
|---|
| 105 | <tr><td><tt>aug-cc-pV5Z</tt><td>H, He, B-Ne, Al-Ar, Ga-Kr<td>80<td>127<td>131
|
|---|
| 106 | <tr><td><tt>aug-cc-pV6Z</tt><td>H, He, B-Ne, Al-Ar<td>127<td>189<td>193
|
|---|
| 107 | <tr><td><tt>cc-pCVDZ</tt><td>Li, B-Ar<td><td>18<td>27
|
|---|
| 108 | <tr><td><tt>cc-pCVTZ</tt><td>Li, B-Ar<td><td>43<td>59
|
|---|
| 109 | <tr><td><tt>cc-pCVQZ</tt><td>Li, B-Ar<td><td>84<td>109
|
|---|
| 110 | <tr><td><tt>cc-pCV5Z</tt><td>B-Ne<td><td>145<td>
|
|---|
| 111 | <tr><td><tt>aug-cc-pCVDZ</tt><td>B-F, Al-Ar<td><td>27<td>36
|
|---|
| 112 | <tr><td><tt>aug-cc-pCVTZ</tt><td>B-Ne, Al-Ar<td><td>59<td>75
|
|---|
| 113 | <tr><td><tt>aug-cc-pCVQZ</tt><td>B-Ne, Al-Ar<td><td>109<td>134
|
|---|
| 114 | <tr><td><tt>aug-cc-pCV5Z</tt><td>B-F<td><td>181<td>
|
|---|
| 115 | <tr><td><tt>NASA Ames ANO</tt><td>H, B-Ne, Al, P, Ti, Fe, Ni<td>30<td>55<td>59
|
|---|
| 116 | <tr><td><tt>pc-0</tt><td>H, C-F, Si-Cl<td>2<td>9<td>13
|
|---|
| 117 | <tr><td><tt>pc-1</tt><td>H, C-F, Si-Cl<td>5<td>14<td>18
|
|---|
| 118 | <tr><td><tt>pc-2</tt><td>H, C-F, Si-Cl<td>14<td>30<td>34
|
|---|
| 119 | <tr><td><tt>pc-3</tt><td>H, C-F, Si-Cl<td>34<td>64<td>64
|
|---|
| 120 | <tr><td><tt>pc-4</tt><td>H, C-F, Si-Cl<td>63<td>109<td>105
|
|---|
| 121 | <tr><td><tt>pc-0-aug</tt><td>H, C-F, Si-Cl<td>3<td>13<td>17
|
|---|
| 122 | <tr><td><tt>pc-1-aug</tt><td>H, C-F, Si-Cl<td>9<td>23<td>27
|
|---|
| 123 | <tr><td><tt>pc-2-aug</tt><td>H, C-F, Si-Cl<td>23<td>46<td>50
|
|---|
| 124 | <tr><td><tt>pc-3-aug</tt><td>H, C-F, Si-Cl<td>50<td>89<td>89
|
|---|
| 125 | <tr><td><tt>pc-4-aug</tt><td>H, C-F, Si-Cl<td>88<td>145<td>141
|
|---|
| 126 | </table>
|
|---|
| 127 |
|
|---|
| 128 | All basis sets except for the pc-<i>n</i> and pc-<i>n</i>-aug basis sets
|
|---|
| 129 | were obtained from the Extensible Computational Chemistry
|
|---|
| 130 | Environment Basis Set Database, Version 12/03/03, as developed and
|
|---|
| 131 | distributed by the Molecular Science Computing Facility, Environmental and
|
|---|
| 132 | Molecular Sciences Laboratory which is part of the Pacific Northwest
|
|---|
| 133 | Laboratory, P.O. Box 999, Richland, Washington 99352, USA, and funded by
|
|---|
| 134 | the U.S. Department of Energy. The Pacific Northwest Laboratory is a
|
|---|
| 135 | multi-program laboratory operated by Battelle Memorial Institute for the
|
|---|
| 136 | U.S. Department of Energy under contract DE-AC06-76RLO 1830. Contact David
|
|---|
| 137 | Feller or Karen Schuchardt for further information.
|
|---|
| 138 |
|
|---|
| 139 | The pc-<i>n</i> and pc-<i>n</i>-aug basis sets are the polarization
|
|---|
| 140 | consistent basis sets of Frank Jensen. See J. Chem. Phys. 115 (2001) 9113;
|
|---|
| 141 | J. Chem. Phys. 116 (2002) 7372; J. Chem. Phys. 117 (2002) 9234; and
|
|---|
| 142 | J. Chem. Phys. 121 (2004) 3463.
|
|---|
| 143 |
|
|---|
| 144 | */
|
|---|
| 145 | class GaussianBasisSet: public SavableState
|
|---|
| 146 | {
|
|---|
| 147 | private:
|
|---|
| 148 | // nonnull if keyword "name" was provided
|
|---|
| 149 | char* name_;
|
|---|
| 150 | // same as name_ if name_!=0, else something else
|
|---|
| 151 | char* label_;
|
|---|
| 152 | GaussianShell** shell_;
|
|---|
| 153 | std::vector<int> shell_to_function_;
|
|---|
| 154 | std::vector<int> function_to_shell_;
|
|---|
| 155 |
|
|---|
| 156 | Ref<Molecule> molecule_;
|
|---|
| 157 |
|
|---|
| 158 | Ref<SCMatrixKit> matrixkit_;
|
|---|
| 159 | Ref<SCMatrixKit> so_matrixkit_;
|
|---|
| 160 | RefSCDimension basisdim_;
|
|---|
| 161 |
|
|---|
| 162 | int ncenter_;
|
|---|
| 163 |
|
|---|
| 164 | std::vector<int> shell_to_center_;
|
|---|
| 165 | std::vector<int> shell_to_primitive_;
|
|---|
| 166 | std::vector<int> center_to_shell_;
|
|---|
| 167 | std::vector<int> center_to_nshell_;
|
|---|
| 168 | std::vector<int> center_to_nbasis_;
|
|---|
| 169 |
|
|---|
| 170 | int nshell_;
|
|---|
| 171 | int nbasis_;
|
|---|
| 172 | int nprim_;
|
|---|
| 173 | bool has_pure_;
|
|---|
| 174 |
|
|---|
| 175 | GaussianBasisSet(const char* name, const char* label, const Ref<Molecule>& molecule,
|
|---|
| 176 | const Ref<SCMatrixKit>& matrixkit,
|
|---|
| 177 | const RefSCDimension& basisdim,
|
|---|
| 178 | const int ncenter, const int nshell,
|
|---|
| 179 | GaussianShell** shell,
|
|---|
| 180 | const std::vector<int>& center_to_nshell);
|
|---|
| 181 |
|
|---|
| 182 | // Counts shells in this basis for this chemical element
|
|---|
| 183 | int count_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
|
|---|
| 184 | int havepure, int pure, bool missing_ok);
|
|---|
| 185 | // Constructs this basis
|
|---|
| 186 | void get_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
|
|---|
| 187 | int havepure, int pure, bool missing_ok);
|
|---|
| 188 | // Counts shells in an even-tempered primitive basis
|
|---|
| 189 | int count_even_temp_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
|
|---|
| 190 | int havepure, int pure);
|
|---|
| 191 | // Constructs an even-tempered primitive basis
|
|---|
| 192 | void get_even_temp_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
|
|---|
| 193 | int havepure, int pure);
|
|---|
| 194 | // Constructs basis set specified as an array of shells
|
|---|
| 195 | void recursively_get_shell(int&,Ref<KeyVal>&,
|
|---|
| 196 | const char*,const char*,BasisFileSet&,
|
|---|
| 197 | int,int,int,bool missing_ok);
|
|---|
| 198 |
|
|---|
| 199 | void init(Ref<Molecule>&,Ref<KeyVal>&,
|
|---|
| 200 | BasisFileSet&,
|
|---|
| 201 | int have_userkeyval,
|
|---|
| 202 | int pure);
|
|---|
| 203 | void init2(int skip_ghosts=0,bool include_q=0);
|
|---|
| 204 |
|
|---|
| 205 | protected:
|
|---|
| 206 | GaussianBasisSet(const GaussianBasisSet&);
|
|---|
| 207 | virtual void set_matrixkit(const Ref<SCMatrixKit>&);
|
|---|
| 208 |
|
|---|
| 209 | public:
|
|---|
| 210 | /** This holds scratch data needed to compute basis function values. */
|
|---|
| 211 | class ValueData {
|
|---|
| 212 | protected:
|
|---|
| 213 | CartesianIter **civec_;
|
|---|
| 214 | SphericalTransformIter **sivec_;
|
|---|
| 215 | int maxam_;
|
|---|
| 216 | public:
|
|---|
| 217 | ValueData(const Ref<GaussianBasisSet> &, const Ref<Integral> &);
|
|---|
| 218 | ~ValueData();
|
|---|
| 219 | CartesianIter **civec() { return civec_; }
|
|---|
| 220 | SphericalTransformIter **sivec() { return sivec_; }
|
|---|
| 221 | };
|
|---|
| 222 |
|
|---|
| 223 | /// This can be given to a CTOR to construct a unit basis function.
|
|---|
| 224 | enum UnitType {Unit};
|
|---|
| 225 |
|
|---|
| 226 | /** The KeyVal constructor.
|
|---|
| 227 |
|
|---|
| 228 | <dl>
|
|---|
| 229 |
|
|---|
| 230 | <dt><tt>molecule</tt><dd> The gives a Molecule object. The is no
|
|---|
| 231 | default.
|
|---|
| 232 |
|
|---|
| 233 | <dt><tt>puream</tt><dd> If this boolean parameter is true then 5D,
|
|---|
| 234 | 7F, etc. will be used. Otherwise all cartesian functions will be
|
|---|
| 235 | used. The default depends on the particular basis set.
|
|---|
| 236 |
|
|---|
| 237 | <dt><tt>name</tt><dd> This is a string giving the name of the basis
|
|---|
| 238 | set. The above table of basis sets gives some of the recognized
|
|---|
| 239 | basis set names. It may be necessary to put the name in double
|
|---|
| 240 | quotes. There is no default.
|
|---|
| 241 |
|
|---|
| 242 | <dt><tt>basis</tt><dd> This is a vector of basis set names that can
|
|---|
| 243 | give a different basis set to each atom in the molecule. If the
|
|---|
| 244 | element vector is given, then it gives different basis sets to
|
|---|
| 245 | different elements. The default is to give every atom the basis
|
|---|
| 246 | set specified in name.
|
|---|
| 247 |
|
|---|
| 248 | <dt><tt>element</tt><dd> This is a vector of elements. If it is
|
|---|
| 249 | given then it must have the same number of entries as the basis
|
|---|
| 250 | vector.
|
|---|
| 251 |
|
|---|
| 252 | <dt><tt>basisdir</tt><dd> A string giving a directory where basis
|
|---|
| 253 | set data files are to be sought. See the text below for a complete
|
|---|
| 254 | description of what directories are consulted.
|
|---|
| 255 |
|
|---|
| 256 | <dt><tt>basisfiles</tt><dd> Each keyword in this vector of files is
|
|---|
| 257 | appended to the directory specified with basisdir and basis set
|
|---|
| 258 | data is read from them.
|
|---|
| 259 |
|
|---|
| 260 | <dt><tt>matrixkit</tt><dd> Specifies a SCMatrixKit object. It is
|
|---|
| 261 | usually not necessary to give this keyword, as the default action
|
|---|
| 262 | should get the correct SCMatrixKit.
|
|---|
| 263 |
|
|---|
| 264 | </dl>
|
|---|
| 265 |
|
|---|
| 266 | Several files in various directories are checked for basis set
|
|---|
| 267 | data. First, basis sets can be given by the user in the basis
|
|---|
| 268 | section at the top level of the main input file. Next, if a path
|
|---|
| 269 | is given with the basisdir keyword, then all of the files given
|
|---|
| 270 | with the basisfiles keyword are read in after appending their names
|
|---|
| 271 | to the value of basisdir. Basis sets can be given in these files
|
|---|
| 272 | in the basis section at the top level as well. If the named basis
|
|---|
| 273 | set still cannot be found, then GaussianBasisSet will try convert
|
|---|
| 274 | the basis set name to a file name and check first in the directory
|
|---|
| 275 | given by basisdir. Next it checks for the environment variable
|
|---|
| 276 | SCLIBDIR. If it is set it will look for the basis file in
|
|---|
| 277 | $SCLIBDIR/basis. Otherwise it will look in the source code
|
|---|
| 278 | distribution in the directory SC/lib/basis. If the executable has
|
|---|
| 279 | changed machines or the source code has be moved, then it may be
|
|---|
| 280 | necessary to copy the library files to your machine and set the
|
|---|
| 281 | SCLIBDIR environmental variable.
|
|---|
| 282 |
|
|---|
| 283 | The basis set itself is also given in the ParsedKeyVal format. There are two
|
|---|
| 284 | recognized formats for basis sets:
|
|---|
| 285 | <dl>
|
|---|
| 286 |
|
|---|
| 287 | <dt>array of shells<dd> One must specify the keyword :basis: followed by the
|
|---|
| 288 | lowercase atomic name followed by : followed by the basis set name
|
|---|
| 289 | (which may need to be placed inside double quotes). The value for the keyword
|
|---|
| 290 | is an array of shells. Each shell
|
|---|
| 291 | reads the following keywords:
|
|---|
| 292 |
|
|---|
| 293 | <dl>
|
|---|
| 294 |
|
|---|
| 295 | <dt><tt>type</tt><dd> This is a vector that describes each
|
|---|
| 296 | component of this shell. For each element the following two
|
|---|
| 297 | keywords are read:
|
|---|
| 298 |
|
|---|
| 299 | <dl>
|
|---|
| 300 |
|
|---|
| 301 | <dt><tt>am</tt><dd> The angular momentum of the component. This
|
|---|
| 302 | can be given as the letter designation, s, p, d, etc. There is
|
|---|
| 303 | no default.
|
|---|
| 304 |
|
|---|
| 305 | <dt><tt>puream</tt><dd> If this boolean parameter is true then
|
|---|
| 306 | 5D, 7F, etc. shells are used. The default is false. This
|
|---|
| 307 | parameter can be overridden in the GaussianBasisSet
|
|---|
| 308 | specification.
|
|---|
| 309 |
|
|---|
| 310 | </dl>
|
|---|
| 311 |
|
|---|
| 312 | <dt><tt>exp</tt><dd> This is a vector giving the exponents of the
|
|---|
| 313 | primitive Gaussian functions.
|
|---|
| 314 |
|
|---|
| 315 | <dt><tt>coef</tt><dd> This is a matrix giving the coeffients of the
|
|---|
| 316 | primitive Gaussian functions. The first index gives the component
|
|---|
| 317 | number of the shell and the second gives the primitive number.
|
|---|
| 318 |
|
|---|
| 319 | </dl>
|
|---|
| 320 |
|
|---|
| 321 | <dt><dd>An example might be easier to understand. This is a basis set
|
|---|
| 322 | specificition for STO-2G carbon:
|
|---|
| 323 |
|
|---|
| 324 | <pre>
|
|---|
| 325 | basis: (
|
|---|
| 326 | carbon: "STO-2G": [
|
|---|
| 327 | (type: [(am = s)]
|
|---|
| 328 | { exp coef:0 } = {
|
|---|
| 329 | 27.38503303 0.43012850
|
|---|
| 330 | 4.87452205 0.67891353
|
|---|
| 331 | })
|
|---|
| 332 | (type: [(am = p) (am = s)]
|
|---|
| 333 | { exp coef:1 coef:0 } = {
|
|---|
| 334 | 1.13674819 0.04947177 0.51154071
|
|---|
| 335 | 0.28830936 0.96378241 0.61281990
|
|---|
| 336 | })
|
|---|
| 337 | ]
|
|---|
| 338 | )
|
|---|
| 339 | </pre>
|
|---|
| 340 |
|
|---|
| 341 | <dt>basis set of even-tempered primitive Gaussians<dd>
|
|---|
| 342 | Such basis set format is given as a group of keywords. The name of the group is :basis: followed by the
|
|---|
| 343 | lowercase atomic name followed by : followed by the basis set name
|
|---|
| 344 | (which may need to be placed inside double quotes).
|
|---|
| 345 | The group of keywords must contain vectors <tt>am</tt> and <tt>nprim</tt>,
|
|---|
| 346 | which specify the angular momentum and the number of shells in each
|
|---|
| 347 | block of even-tempered primitives. In addition, one must provide any
|
|---|
| 348 | two of the following vectors:
|
|---|
| 349 |
|
|---|
| 350 | <dl>
|
|---|
| 351 | <dt><tt>first_exp</tt><dd> The exponent of the "tightest" primitive Gaussian in the block.
|
|---|
| 352 |
|
|---|
| 353 | <dt><tt>last_exp</tt><dd> The exponent of the most "diffuse" primitive Gaussian in the block.
|
|---|
| 354 |
|
|---|
| 355 | <dt><tt>exp_ratio</tt><dd> The ratio of exponents of consecutive primitive Gaussians
|
|---|
| 356 | in the block.
|
|---|
| 357 |
|
|---|
| 358 | </dl>
|
|---|
| 359 |
|
|---|
| 360 | <dt><dd>Note that the dimensions of each vector must be the same.
|
|---|
| 361 |
|
|---|
| 362 | Here's an example of a basis set composed of 2 blocks of even-tempered s-functions
|
|---|
| 363 | and 1 block of even-tempered p-functions.
|
|---|
| 364 |
|
|---|
| 365 | <pre>
|
|---|
| 366 | basis: (
|
|---|
| 367 | neon: "20s5s13p":(
|
|---|
| 368 |
|
|---|
| 369 | am = [ 0 0 1 ]
|
|---|
| 370 | nprim = [ 20 5 13 ]
|
|---|
| 371 | first_exp = [ 1000.0 0.1 70.0 ]
|
|---|
| 372 | last_exp = [ 1.0 0.01 0.1 ]
|
|---|
| 373 |
|
|---|
| 374 | )
|
|---|
| 375 | )
|
|---|
| 376 | </pre>
|
|---|
| 377 |
|
|---|
| 378 | </dl>
|
|---|
| 379 |
|
|---|
| 380 | */
|
|---|
| 381 | GaussianBasisSet(const Ref<KeyVal>&);
|
|---|
| 382 | /** This can be given GaussianBasisSet::Unit to construct a basis
|
|---|
| 383 | set with a single basis function that is one everywhere. This
|
|---|
| 384 | can be used with integral evaluators to compute certain classes
|
|---|
| 385 | of integrals, with limitations. */
|
|---|
| 386 | GaussianBasisSet(UnitType);
|
|---|
| 387 | GaussianBasisSet(StateIn&);
|
|---|
| 388 | virtual ~GaussianBasisSet();
|
|---|
| 389 |
|
|---|
| 390 | /** Returns a GaussianBasisSet object that consists of the basis
|
|---|
| 391 | functions for each atom in this followed by the basis functions in
|
|---|
| 392 | B for the corresponding atom. The Molecule object for the two
|
|---|
| 393 | basis sets must be identical. */
|
|---|
| 394 | Ref<GaussianBasisSet> operator+(const Ref<GaussianBasisSet>& B);
|
|---|
| 395 |
|
|---|
| 396 | void save_data_state(StateOut&);
|
|---|
| 397 |
|
|---|
| 398 | /// Return the name of the basis set (is nonnull only if keyword "name" was provided)
|
|---|
| 399 | const char* name() const { return name_; }
|
|---|
| 400 | /** Return the label of the basis set. label() return the same string as name() if
|
|---|
| 401 | keyword "name" was provided, otherwise it is a unique descriptive string which
|
|---|
| 402 | can be arbitrarily long. */
|
|---|
| 403 | const char* label() const { if (name()) { return name(); } else { return label_; } }
|
|---|
| 404 |
|
|---|
| 405 | /// Return the Molecule object.
|
|---|
| 406 | Ref<Molecule> molecule() const { return molecule_; }
|
|---|
| 407 | /// Returns the SCMatrixKit that is to be used for AO bases.
|
|---|
| 408 | Ref<SCMatrixKit> matrixkit() { return matrixkit_; }
|
|---|
| 409 | /// Returns the SCMatrixKit that is to be used for SO bases.
|
|---|
| 410 | Ref<SCMatrixKit> so_matrixkit() { return so_matrixkit_; }
|
|---|
| 411 | /// Returns the SCDimension object for the dimension.
|
|---|
| 412 | RefSCDimension basisdim() { return basisdim_; }
|
|---|
| 413 |
|
|---|
| 414 | /// Return the number of centers.
|
|---|
| 415 | int ncenter() const;
|
|---|
| 416 | /// Return the number of shells.
|
|---|
| 417 | int nshell() const { return nshell_; }
|
|---|
| 418 | /// Return the number of shells on the given center.
|
|---|
| 419 | int nshell_on_center(int icenter) const;
|
|---|
| 420 | /** Return an overall shell number, given a center and the shell number
|
|---|
| 421 | on that center. */
|
|---|
| 422 | int shell_on_center(int icenter, int shell) const;
|
|---|
| 423 | /// Return the center on which the given shell is located.
|
|---|
| 424 | int shell_to_center(int ishell) const { return shell_to_center_[ishell]; }
|
|---|
| 425 | /// Return the overall index of the first primitive from the given shell
|
|---|
| 426 | int shell_to_primitive(int ishell) const {return shell_to_primitive_[ishell]; }
|
|---|
| 427 | /// Return the number of basis functions.
|
|---|
| 428 | int nbasis() const { return nbasis_; }
|
|---|
| 429 | /// Return the number of basis functions on the given center.
|
|---|
| 430 | int nbasis_on_center(int icenter) const;
|
|---|
| 431 | /// Return the number of primitive Gaussians.
|
|---|
| 432 | int nprimitive() const { return nprim_; }
|
|---|
| 433 | /// Return true if basis contains solid harmonics Gaussians
|
|---|
| 434 | int has_pure() const { return has_pure_; }
|
|---|
| 435 |
|
|---|
| 436 | /// Return the maximum number of functions that any shell has.
|
|---|
| 437 | int max_nfunction_in_shell() const;
|
|---|
| 438 | /** Return the maximum number of Cartesian functions that any shell has.
|
|---|
| 439 | The optional argument is an angular momentum increment. */
|
|---|
| 440 | int max_ncartesian_in_shell(int aminc=0) const;
|
|---|
| 441 | /// Return the maximum number of primitive Gaussian that any shell has.
|
|---|
| 442 | int max_nprimitive_in_shell() const;
|
|---|
| 443 | /// Return the highest angular momentum in any shell.
|
|---|
| 444 | int max_angular_momentum() const;
|
|---|
| 445 | /// Return the maximum number of Gaussians in a contraction in any shell.
|
|---|
| 446 | int max_ncontraction() const;
|
|---|
| 447 | /** Return the maximum angular momentum found in the given contraction
|
|---|
| 448 | number for any shell. */
|
|---|
| 449 | int max_am_for_contraction(int con) const;
|
|---|
| 450 | /// Return the maximum number of Cartesian functions in any shell.
|
|---|
| 451 | int max_cartesian() const;
|
|---|
| 452 |
|
|---|
| 453 | /// Return the number of the first function in the given shell.
|
|---|
| 454 | int shell_to_function(int i) const { return shell_to_function_[i]; }
|
|---|
| 455 | /// Return the shell to which the given function belongs.
|
|---|
| 456 | int function_to_shell(int i) const;
|
|---|
| 457 |
|
|---|
| 458 | /// Return a reference to GaussianShell number i.
|
|---|
| 459 | const GaussianShell& operator()(int i) const { return *shell_[i]; }
|
|---|
| 460 | /// Return a reference to GaussianShell number i.
|
|---|
| 461 | GaussianShell& operator()(int i) { return *shell_[i]; }
|
|---|
| 462 | /// Return a reference to GaussianShell number i.
|
|---|
| 463 | const GaussianShell& operator[](int i) const { return *shell_[i]; }
|
|---|
| 464 | /// Return a reference to GaussianShell number i.
|
|---|
| 465 | GaussianShell& operator[](int i) { return *shell_[i]; }
|
|---|
| 466 | /// Return a reference to GaussianShell number i.
|
|---|
| 467 | const GaussianShell& shell(int i) const { return *shell_[i]; }
|
|---|
| 468 | /// Return a reference to GaussianShell number i.
|
|---|
| 469 | GaussianShell& shell(int i) { return *shell_[i]; }
|
|---|
| 470 |
|
|---|
| 471 | /// Return a reference to GaussianShell number ishell on center icenter.
|
|---|
| 472 | const GaussianShell& operator()(int icenter,int ishell) const;
|
|---|
| 473 | /// Return a reference to GaussianShell number ishell on center icenter.
|
|---|
| 474 | GaussianShell& operator()(int icenter,int ishell);
|
|---|
| 475 | /// Return a reference to GaussianShell number j on center i.
|
|---|
| 476 | const GaussianShell& shell(int i,int j) const { return operator()(i,j); }
|
|---|
| 477 | /// Return a reference to GaussianShell number j on center i.
|
|---|
| 478 | GaussianShell& shell(int i,int j) { return operator()(i,j); }
|
|---|
| 479 |
|
|---|
| 480 | /** The location of center icenter. The xyz argument is 0 for x, 1 for
|
|---|
| 481 | y, and 2 for z. */
|
|---|
| 482 | double r(int icenter,int xyz) const;
|
|---|
| 483 |
|
|---|
| 484 | /** Compute the values for this basis set at position r. The
|
|---|
| 485 | basis_values argument must be vector of length nbasis. */
|
|---|
| 486 | int values(const SCVector3& r, ValueData *, double* basis_values) const;
|
|---|
| 487 | /** Like values(...), but computes gradients of the basis function
|
|---|
| 488 | values, too. The g_values argument must be vector of length
|
|---|
| 489 | 3*nbasis. The data will be written in the order bf1_x, bf1_y,
|
|---|
| 490 | bf1_z, ... */
|
|---|
| 491 | int grad_values(const SCVector3& r, ValueData *,
|
|---|
| 492 | double*g_values,double* basis_values=0) const;
|
|---|
| 493 | /** Like values(...), but computes first and second derivatives of the
|
|---|
| 494 | basis function values, too. h_values must be vector of length
|
|---|
| 495 | 6*nbasis. The data will be written in the order bf1_xx, bf1_yx,
|
|---|
| 496 | bf1_yy, bf1_zx, bf1_zy, bf1_zz, ... */
|
|---|
| 497 | int hessian_values(const SCVector3& r, ValueData *, double *h_values,
|
|---|
| 498 | double*g_values=0,double* basis_values=0) const;
|
|---|
| 499 | /** Compute the values for the given shell functions at position r.
|
|---|
| 500 | See the other values(...) members for more information. */
|
|---|
| 501 | int shell_values(const SCVector3& r, int sh,
|
|---|
| 502 | ValueData *, double* basis_values) const;
|
|---|
| 503 | /** Like values(...), but computes gradients of the shell function
|
|---|
| 504 | values, too. See the other grad_values(...)
|
|---|
| 505 | members for more information. */
|
|---|
| 506 | int grad_shell_values(const SCVector3& r, int sh,
|
|---|
| 507 | ValueData *,
|
|---|
| 508 | double*g_values, double* basis_values=0) const;
|
|---|
| 509 | /** Like values(...), but computes first and second derivatives of the
|
|---|
| 510 | shell function values, too. See the other hessian_values(...)
|
|---|
| 511 | members for more information. */
|
|---|
| 512 | int hessian_shell_values(const SCVector3& r, int sh,
|
|---|
| 513 | ValueData *, double *h_values,
|
|---|
| 514 | double*g_values=0,double* basis_values=0) const;
|
|---|
| 515 |
|
|---|
| 516 | /// Returns true if this and the argument are equivalent.
|
|---|
| 517 | int equiv(const Ref<GaussianBasisSet> &b);
|
|---|
| 518 |
|
|---|
| 519 | /// Print a brief description of the basis set.
|
|---|
| 520 | void print_brief(std::ostream& =ExEnv::out0()) const;
|
|---|
| 521 | /// Print a detailed description of the basis set.
|
|---|
| 522 | void print(std::ostream& =ExEnv::out0()) const;
|
|---|
| 523 | };
|
|---|
| 524 |
|
|---|
| 525 | }
|
|---|
| 526 |
|
|---|
| 527 | #endif
|
|---|
| 528 |
|
|---|
| 529 | // Local Variables:
|
|---|
| 530 | // mode: c++
|
|---|
| 531 | // c-file-style: "CLJ"
|
|---|
| 532 | // End:
|
|---|