1 //
2 // gaussbaval.cc
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 #include <stdlib.h>
29 #include <math.h>
30 
31 #include <util/misc/formio.h>
32 #include <util/keyval/keyval.h>
33 
34 #include <chemistry/qc/basis/gaussbas.h>
35 #include <chemistry/qc/basis/gaussshell.h>
36 
37 using namespace sc;
38 
39 int
values(const SCVector3 & r,ValueData * v,double * basis_values) const40 GaussianBasisSet::values(const SCVector3& r, ValueData *v,
41                          double* basis_values) const
42 {
43   return hessian_values(r, v, 0, 0, basis_values);
44 }
45 
46 int
grad_values(const SCVector3 & r,ValueData * v,double * g_values,double * basis_values) const47 GaussianBasisSet::grad_values(const SCVector3& r, ValueData *v,
48                               double* g_values,
49                               double* basis_values) const
50 {
51   return hessian_values(r, v, 0, g_values, basis_values);
52 }
53 
54 int
hessian_values(const SCVector3 & r,ValueData * v,double * h_values,double * g_values,double * basis_values) const55 GaussianBasisSet::hessian_values(const SCVector3& r, ValueData *v,
56                                  double* h_values,
57                                  double* g_values,
58                                  double* basis_values) const
59 {
60     SCVector3 r_diff;
61     int ishell = 0;
62     int ibasis = 0;
63     int nreturns;
64 
65     // for convenience
66     const GaussianBasisSet& gbs = *this;
67 
68     double *b_values_i = 0;
69     double *h_values_i = 0;
70     double *g_values_i = 0;
71 
72     // calculate the value of each basis
73     for (int icenter=0; icenter < ncenter_; icenter++)
74       {
75         int nshell = center_to_nshell_[icenter];
76 
77 	// Calculate r_diff
78 	r_diff.x()=r.x()-GaussianBasisSet::r(icenter,0);
79 	r_diff.y()=r.y()-GaussianBasisSet::r(icenter,1);
80 	r_diff.z()=r.z()-GaussianBasisSet::r(icenter,2);
81 
82 #ifdef EXTRA_PRINT
83         static int iflag=0;
84 	if (iflag)
85 	{
86 	    iflag--;
87 	    ExEnv::out0() << indent
88                  << scprintf("Center %d, (%lf,%lf,%lf)\n",
89                              icenter,r_center(center,0),
90                              r_center(center,1),r_center(center,2));
91 	}
92 #endif
93 	for (int ish=0; ish < nshell; ish++) {
94             if (basis_values) b_values_i = &basis_values[ibasis];
95             if (g_values)     g_values_i = &g_values[3*ibasis];
96             if (h_values)     h_values_i = &h_values[6*ibasis];
97             nreturns=gbs(ishell).hessian_values(v->civec(), v->sivec(), r_diff,
98                                                 h_values_i,
99                                                 g_values_i,
100                                                 b_values_i);
101             ibasis += nreturns;
102 	    ishell++;
103 	}
104     }
105 
106     return ibasis;
107 }
108 
109 int
shell_values(const SCVector3 & r,int sh,ValueData * d,double * basis_values) const110 GaussianBasisSet::shell_values(const SCVector3& r, int sh, ValueData *d,
111                                double* basis_values) const
112 {
113   return hessian_shell_values(r, sh, d, 0, 0, basis_values);
114 }
115 
116 int
grad_shell_values(const SCVector3 & r,int sh,ValueData * d,double * g_values,double * basis_values) const117 GaussianBasisSet::grad_shell_values(const SCVector3& r, int sh,
118                               ValueData *d,
119                               double* g_values,
120                               double* basis_values) const
121 {
122   return hessian_shell_values(r, sh, d, 0, g_values, basis_values);
123 }
124 
125 int
hessian_shell_values(const SCVector3 & r,int sh,ValueData * d,double * h_values,double * g_values,double * basis_values) const126 GaussianBasisSet::hessian_shell_values(const SCVector3& r, int sh,
127                                        ValueData *d,
128                                        double* h_values,
129                                        double* g_values,
130                                        double* basis_values) const
131 {
132     int icenter = shell_to_center(sh);
133 
134     SCVector3 r_diff;
135     for (int i=0; i<3; i++) r_diff[i] = r[i] - GaussianBasisSet::r(icenter,i);
136 
137     return operator()(sh).hessian_values(d->civec(), d->sivec(), r_diff,
138                                          h_values,
139                                          g_values,
140                                          basis_values);
141 }
142 
143 /////////////////////////////////////////////////////////////////////////////
144 
145 // Local Variables:
146 // mode: c++
147 // c-file-style: "CLJ"
148 // End:
149