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();
civec()219         CartesianIter **civec() { return civec_; }
sivec()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)
name()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. */
label()403     const char* label() const { if (name()) { return name(); } else { return label_; } }
404 
405     /// Return the Molecule object.
molecule()406     Ref<Molecule> molecule() const { return molecule_; }
407     /// Returns the SCMatrixKit that is to be used for AO bases.
matrixkit()408     Ref<SCMatrixKit> matrixkit() { return matrixkit_; }
409     /// Returns the SCMatrixKit that is to be used for SO bases.
so_matrixkit()410     Ref<SCMatrixKit> so_matrixkit() { return so_matrixkit_; }
411     /// Returns the SCDimension object for the dimension.
basisdim()412     RefSCDimension basisdim() { return basisdim_; }
413 
414     /// Return the number of centers.
415     int ncenter() const;
416     /// Return the number of shells.
nshell()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.
shell_to_center(int ishell)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
shell_to_primitive(int ishell)426     int shell_to_primitive(int ishell) const {return shell_to_primitive_[ishell]; }
427     /// Return the number of basis functions.
nbasis()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.
nprimitive()432     int nprimitive() const { return nprim_; }
433     /// Return true if basis contains solid harmonics Gaussians
has_pure()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.
shell_to_function(int i)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.
operator()459     const GaussianShell& operator()(int i) const { return *shell_[i]; }
460     /// Return a reference to GaussianShell number i.
operator()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.
shell(int i)467     const GaussianShell& shell(int i) const { return *shell_[i]; }
468     /// Return a reference to GaussianShell number i.
shell(int 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.
shell(int i,int j)476     const GaussianShell& shell(int i,int j) const { return operator()(i,j); }
477     /// Return a reference to GaussianShell number j on center i.
shell(int i,int j)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:
533