| [0b990d] | 1 | //
 | 
|---|
 | 2 | // obosrr.cc
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | // Copyright (C) 2001 Edward Valeev
 | 
|---|
 | 5 | //
 | 
|---|
 | 6 | // Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>
 | 
|---|
 | 7 | // Maintainer: EV
 | 
|---|
 | 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 | #ifdef __GNUG__
 | 
|---|
 | 29 | #pragma implementation
 | 
|---|
 | 30 | #endif
 | 
|---|
 | 31 | 
 | 
|---|
 | 32 | #include <chemistry/qc/cints/int1e.h>
 | 
|---|
 | 33 | #include <chemistry/qc/intv3/fjt.h>
 | 
|---|
 | 34 | 
 | 
|---|
 | 35 | using namespace std;
 | 
|---|
 | 36 | using namespace sc;
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | inline void fail()
 | 
|---|
 | 39 | {
 | 
|---|
 | 40 |   ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;
 | 
|---|
 | 41 |   abort();
 | 
|---|
 | 42 | }
 | 
|---|
 | 43 | 
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 | /* Recurrence relation are from the Obara-Saika paper - pp. 3971-3972 */
 | 
|---|
 | 46 | 
 | 
|---|
 | 47 | void Int1eCints::AI_OSrecurs_(double ***AI0, double PA[3], double PB[3],
 | 
|---|
 | 48 |                               double PC[3], double gamma, int iang, int jang)
 | 
|---|
 | 49 | {
 | 
|---|
 | 50 |   int a,b,m;
 | 
|---|
 | 51 |   int izm = 1;
 | 
|---|
 | 52 |   int iym = iang + 1;
 | 
|---|
 | 53 |   int ixm = iym * iym;
 | 
|---|
 | 54 |   int jzm = 1;
 | 
|---|
 | 55 |   int jym = jang + 1;
 | 
|---|
 | 56 |   int jxm = jym * jym;
 | 
|---|
 | 57 |   int ix,iy,iz,jx,jy,jz;
 | 
|---|
 | 58 |   int iind,jind;
 | 
|---|
 | 59 |   double pp = 1/(2*gamma);
 | 
|---|
 | 60 |   int mmax = iang+jang;
 | 
|---|
 | 61 |   double tmp = sqrt(gamma)*M_2_SQRTPI;
 | 
|---|
 | 62 |   double u = gamma*(PC[0]*PC[0] + PC[1]*PC[1] + PC[2]*PC[2]);
 | 
|---|
 | 63 |   double *F = Fm_Eval_->values(mmax,u);
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 |         /* Computing starting integrals for recursion */
 | 
|---|
 | 66 | 
 | 
|---|
 | 67 |   for(m=0;m<=mmax;m++)
 | 
|---|
 | 68 |     AI0[0][0][m] = tmp*F[m];
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 |         /* Upward recursion in j with i=0 */
 | 
|---|
 | 71 |   
 | 
|---|
 | 72 |   for(b=1;b<=jang;b++)
 | 
|---|
 | 73 |     for(jx=0;jx<=b;jx++)
 | 
|---|
 | 74 |     for(jy=0;jy<=b-jx;jy++) {
 | 
|---|
 | 75 |       jz = b-jx-jy;
 | 
|---|
 | 76 |       jind = jx*jxm+jy*jym+jz*jzm;
 | 
|---|
 | 77 |       if (jz > 0) {
 | 
|---|
 | 78 |         for(m=0;m<=mmax-b;m++)  /* Electrostatic potential integrals */
 | 
|---|
 | 79 |           AI0[0][jind][m] = PB[2]*AI0[0][jind-jzm][m] - 
 | 
|---|
 | 80 |                             PC[2]*AI0[0][jind-jzm][m+1];
 | 
|---|
 | 81 |         if (jz > 1) {
 | 
|---|
 | 82 |           for(m=0;m<=mmax-b;m++)
 | 
|---|
 | 83 |             AI0[0][jind][m] += pp*(jz-1)*(AI0[0][jind-2*jzm][m] -
 | 
|---|
 | 84 |                                           AI0[0][jind-2*jzm][m+1]);
 | 
|---|
 | 85 |         }
 | 
|---|
 | 86 |       }
 | 
|---|
 | 87 |       else 
 | 
|---|
 | 88 |       if (jy > 0) {
 | 
|---|
 | 89 |         for(m=0;m<=mmax-b;m++)
 | 
|---|
 | 90 |           AI0[0][jind][m] = PB[1]*AI0[0][jind-jym][m] -
 | 
|---|
 | 91 |                             PC[1]*AI0[0][jind-jym][m+1];
 | 
|---|
 | 92 |         if (jy > 1) {
 | 
|---|
 | 93 |           for(m=0;m<=mmax-b;m++)  
 | 
|---|
 | 94 |             AI0[0][jind][m] += pp*(jy-1)*(AI0[0][jind-2*jym][m] -
 | 
|---|
 | 95 |                                           AI0[0][jind-2*jym][m+1]);
 | 
|---|
 | 96 |         }
 | 
|---|
 | 97 |       }
 | 
|---|
 | 98 |       else
 | 
|---|
 | 99 |       if (jx > 0) {
 | 
|---|
 | 100 |         for(m=0;m<=mmax-b;m++)
 | 
|---|
 | 101 |           AI0[0][jind][m] = PB[0]*AI0[0][jind-jxm][m] -
 | 
|---|
 | 102 |                             PC[0]*AI0[0][jind-jxm][m+1];
 | 
|---|
 | 103 |         if (jx > 1) {
 | 
|---|
 | 104 |           for(m=0;m<=mmax-b;m++)  
 | 
|---|
 | 105 |             AI0[0][jind][m] += pp*(jx-1)*(AI0[0][jind-2*jxm][m] -
 | 
|---|
 | 106 |                                           AI0[0][jind-2*jxm][m+1]);
 | 
|---|
 | 107 |         }
 | 
|---|
 | 108 |       }
 | 
|---|
 | 109 |       else
 | 
|---|
 | 110 |         fail();
 | 
|---|
 | 111 |     }
 | 
|---|
 | 112 |  
 | 
|---|
 | 113 | 
 | 
|---|
 | 114 | 
 | 
|---|
 | 115 |   /* The following fragment cannot be vectorized easily, I guess :-) */
 | 
|---|
 | 116 |         /* Upward recursion in i with all possible j's */
 | 
|---|
 | 117 | 
 | 
|---|
 | 118 |   for(b=0;b<=jang;b++)
 | 
|---|
 | 119 |     for(jx=0;jx<=b;jx++)
 | 
|---|
 | 120 |     for(jy=0;jy<=b-jx;jy++) {
 | 
|---|
 | 121 |     jz = b-jx-jy;
 | 
|---|
 | 122 |     jind = jx*jxm + jy*jym + jz*jzm;
 | 
|---|
 | 123 |     for(a=1;a<=iang;a++)
 | 
|---|
 | 124 |       for(ix=0;ix<=a;ix++)
 | 
|---|
 | 125 |       for(iy=0;iy<=a-ix;iy++) {
 | 
|---|
 | 126 |         iz = a-ix-iy;
 | 
|---|
 | 127 |         iind = ix*ixm + iy*iym + iz*izm;
 | 
|---|
 | 128 |         if (iz > 0) {
 | 
|---|
 | 129 |           for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 130 |             AI0[iind][jind][m] = PA[2]*AI0[iind-izm][jind][m] - 
 | 
|---|
 | 131 |                                  PC[2]*AI0[iind-izm][jind][m+1];
 | 
|---|
 | 132 |           if (iz > 1) {
 | 
|---|
 | 133 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 134 |               AI0[iind][jind][m] += pp*(iz-1)*
 | 
|---|
 | 135 |                (AI0[iind-2*izm][jind][m] - AI0[iind-2*izm][jind][m+1]);
 | 
|---|
 | 136 |           }
 | 
|---|
 | 137 |           if (jz > 0) {
 | 
|---|
 | 138 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 139 |               AI0[iind][jind][m] += pp*jz*
 | 
|---|
 | 140 |                (AI0[iind-izm][jind-jzm][m] - AI0[iind-izm][jind-jzm][m+1]);
 | 
|---|
 | 141 |           }
 | 
|---|
 | 142 |         }
 | 
|---|
 | 143 |         else
 | 
|---|
 | 144 |         if (iy > 0) {
 | 
|---|
 | 145 |           for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 146 |             AI0[iind][jind][m] = PA[1]*AI0[iind-iym][jind][m] -
 | 
|---|
 | 147 |                                  PC[1]*AI0[iind-iym][jind][m+1];
 | 
|---|
 | 148 |           if (iy > 1) {
 | 
|---|
 | 149 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 150 |               AI0[iind][jind][m] += pp*(iy-1)*
 | 
|---|
 | 151 |               (AI0[iind-2*iym][jind][m] - AI0[iind-2*iym][jind][m+1]);
 | 
|---|
 | 152 |           }
 | 
|---|
 | 153 |           if (jy > 0) {
 | 
|---|
 | 154 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 155 |               AI0[iind][jind][m] += pp*jy*
 | 
|---|
 | 156 |                (AI0[iind-iym][jind-jym][m] - AI0[iind-iym][jind-jym][m+1]);
 | 
|---|
 | 157 |           }
 | 
|---|
 | 158 |         }
 | 
|---|
 | 159 |         else
 | 
|---|
 | 160 |         if (ix > 0) {
 | 
|---|
 | 161 |           for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 162 |             AI0[iind][jind][m] = PA[0]*AI0[iind-ixm][jind][m] -
 | 
|---|
 | 163 |                                  PC[0]*AI0[iind-ixm][jind][m+1];
 | 
|---|
 | 164 |           if (ix > 1) {
 | 
|---|
 | 165 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 166 |               AI0[iind][jind][m] += pp*(ix-1)*
 | 
|---|
 | 167 |                (AI0[iind-2*ixm][jind][m] - AI0[iind-2*ixm][jind][m+1]);
 | 
|---|
 | 168 |           }
 | 
|---|
 | 169 |           if (jx > 0) {
 | 
|---|
 | 170 |             for(m=0;m<=mmax-a-b;m++)
 | 
|---|
 | 171 |               AI0[iind][jind][m] += pp*jx*
 | 
|---|
 | 172 |                (AI0[iind-ixm][jind-jxm][m] - AI0[iind-ixm][jind-jxm][m+1]);  
 | 
|---|
 | 173 |           }
 | 
|---|
 | 174 |         }
 | 
|---|
 | 175 |         else
 | 
|---|
 | 176 |           fail();
 | 
|---|
 | 177 |       }
 | 
|---|
 | 178 |     }
 | 
|---|
 | 179 | 
 | 
|---|
 | 180 |   return;
 | 
|---|
 | 181 | }
 | 
|---|
 | 182 | 
 | 
|---|
 | 183 | 
 | 
|---|
 | 184 | void Int1eCints::OI_OSrecurs_(double **OIX, double **OIY, double **OIZ, double PA[3], double PB[3],
 | 
|---|
 | 185 |                               double gamma, int lmaxi, int lmaxj)
 | 
|---|
 | 186 | {
 | 
|---|
 | 187 |   int i,j,k;
 | 
|---|
 | 188 |   double pp = 1/(2*gamma);
 | 
|---|
 | 189 | 
 | 
|---|
 | 190 |   OIX[0][0] = OIY[0][0] = OIZ[0][0] = 1.0;
 | 
|---|
 | 191 | 
 | 
|---|
 | 192 |         /* Upward recursion in j for i=0 */
 | 
|---|
 | 193 | 
 | 
|---|
 | 194 |   OIX[0][1] = PB[0];
 | 
|---|
 | 195 |   OIY[0][1] = PB[1];
 | 
|---|
 | 196 |   OIZ[0][1] = PB[2];
 | 
|---|
 | 197 | 
 | 
|---|
 | 198 |   for(j=1;j<lmaxj;j++) {
 | 
|---|
 | 199 |     OIX[0][j+1] = PB[0]*OIX[0][j];
 | 
|---|
 | 200 |     OIY[0][j+1] = PB[1]*OIY[0][j];
 | 
|---|
 | 201 |     OIZ[0][j+1] = PB[2]*OIZ[0][j];
 | 
|---|
 | 202 |     OIX[0][j+1] += j*pp*OIX[0][j-1];
 | 
|---|
 | 203 |     OIY[0][j+1] += j*pp*OIY[0][j-1];
 | 
|---|
 | 204 |     OIZ[0][j+1] += j*pp*OIZ[0][j-1];
 | 
|---|
 | 205 |   }
 | 
|---|
 | 206 | 
 | 
|---|
 | 207 |         /* Upward recursion in i for all j's */
 | 
|---|
 | 208 | 
 | 
|---|
 | 209 |   OIX[1][0] = PA[0];
 | 
|---|
 | 210 |   OIY[1][0] = PA[1];
 | 
|---|
 | 211 |   OIZ[1][0] = PA[2];
 | 
|---|
 | 212 |   for(j=1;j<=lmaxj;j++) {
 | 
|---|
 | 213 |     OIX[1][j] = PA[0]*OIX[0][j];
 | 
|---|
 | 214 |     OIY[1][j] = PA[1]*OIY[0][j];
 | 
|---|
 | 215 |     OIZ[1][j] = PA[2]*OIZ[0][j];
 | 
|---|
 | 216 |     OIX[1][j] += j*pp*OIX[0][j-1];
 | 
|---|
 | 217 |     OIY[1][j] += j*pp*OIY[0][j-1];
 | 
|---|
 | 218 |     OIZ[1][j] += j*pp*OIZ[0][j-1];
 | 
|---|
 | 219 |   }
 | 
|---|
 | 220 |   for(i=1;i<lmaxi;i++) {
 | 
|---|
 | 221 |     OIX[i+1][0] = PA[0]*OIX[i][0];
 | 
|---|
 | 222 |     OIY[i+1][0] = PA[1]*OIY[i][0];
 | 
|---|
 | 223 |     OIZ[i+1][0] = PA[2]*OIZ[i][0];
 | 
|---|
 | 224 |     OIX[i+1][0] += i*pp*OIX[i-1][0];
 | 
|---|
 | 225 |     OIY[i+1][0] += i*pp*OIY[i-1][0];
 | 
|---|
 | 226 |     OIZ[i+1][0] += i*pp*OIZ[i-1][0];
 | 
|---|
 | 227 |     for(j=1;j<=lmaxj;j++) {
 | 
|---|
 | 228 |       OIX[i+1][j] = PA[0]*OIX[i][j];
 | 
|---|
 | 229 |       OIY[i+1][j] = PA[1]*OIY[i][j];
 | 
|---|
 | 230 |       OIZ[i+1][j] = PA[2]*OIZ[i][j];
 | 
|---|
 | 231 |       OIX[i+1][j] += i*pp*OIX[i-1][j];
 | 
|---|
 | 232 |       OIY[i+1][j] += i*pp*OIY[i-1][j];
 | 
|---|
 | 233 |       OIZ[i+1][j] += i*pp*OIZ[i-1][j];
 | 
|---|
 | 234 |       OIX[i+1][j] += j*pp*OIX[i][j-1];
 | 
|---|
 | 235 |       OIY[i+1][j] += j*pp*OIY[i][j-1];
 | 
|---|
 | 236 |       OIZ[i+1][j] += j*pp*OIZ[i][j-1];
 | 
|---|
 | 237 |     }
 | 
|---|
 | 238 |   }
 | 
|---|
 | 239 | 
 | 
|---|
 | 240 |   return;
 | 
|---|
 | 241 | }
 | 
|---|