| 1 | //
 | 
|---|
| 2 | // comp2e.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 <stdarg.h>
 | 
|---|
| 29 | 
 | 
|---|
| 30 | #include <util/misc/formio.h>
 | 
|---|
| 31 | #include <chemistry/qc/intv3/macros.h>
 | 
|---|
| 32 | #include <chemistry/qc/intv3/flags.h>
 | 
|---|
| 33 | #include <chemistry/qc/intv3/types.h>
 | 
|---|
| 34 | #include <chemistry/qc/intv3/int2e.h>
 | 
|---|
| 35 | #include <chemistry/qc/intv3/utils.h>
 | 
|---|
| 36 | #include <chemistry/qc/intv3/tformv3.h>
 | 
|---|
| 37 | 
 | 
|---|
| 38 | using namespace std;
 | 
|---|
| 39 | using namespace sc;
 | 
|---|
| 40 | 
 | 
|---|
| 41 | #undef DER_TIMING
 | 
|---|
| 42 | #undef EREP_TIMING
 | 
|---|
| 43 | 
 | 
|---|
| 44 | #if defined(DER_TIMING)||defined(EREP_TIMING)
 | 
|---|
| 45 | #  include <util/misc/timer.h>
 | 
|---|
| 46 | #endif
 | 
|---|
| 47 | 
 | 
|---|
| 48 | static inline void
 | 
|---|
| 49 | swtch(GaussianBasisSet* &i,GaussianBasisSet* &j)
 | 
|---|
| 50 | {
 | 
|---|
| 51 |   GaussianBasisSet *tmp;
 | 
|---|
| 52 |   tmp = i;
 | 
|---|
| 53 |   i = j;
 | 
|---|
| 54 |   j = tmp;
 | 
|---|
| 55 | }
 | 
|---|
| 56 | 
 | 
|---|
| 57 | static inline void
 | 
|---|
| 58 | sswtch(GaussianShell**i,GaussianShell**j)
 | 
|---|
| 59 | {
 | 
|---|
| 60 |   GaussianShell*tmp;
 | 
|---|
| 61 |   tmp = *i;
 | 
|---|
| 62 |   *i = *j;
 | 
|---|
| 63 |   *j = tmp;
 | 
|---|
| 64 | }
 | 
|---|
| 65 | 
 | 
|---|
| 66 | static inline void
 | 
|---|
| 67 | iswtch(int *i,int *j)
 | 
|---|
| 68 | {
 | 
|---|
| 69 |   int tmp;
 | 
|---|
| 70 |   tmp = *i;
 | 
|---|
| 71 |   *i = *j;
 | 
|---|
| 72 |   *j = tmp;
 | 
|---|
| 73 | }
 | 
|---|
| 74 | 
 | 
|---|
| 75 | static void
 | 
|---|
| 76 | fail()
 | 
|---|
| 77 | {
 | 
|---|
| 78 |   ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;
 | 
|---|
| 79 |   abort();
 | 
|---|
| 80 | }
 | 
|---|
| 81 | 
 | 
|---|
| 82 | /* This computes the 2erep integrals for a shell quartet
 | 
|---|
| 83 |  * specified by psh1, psh2, psh3, psh4.
 | 
|---|
| 84 |  * The routine int_initialize_2erep must be called before
 | 
|---|
| 85 |  * any integrals can be computed.
 | 
|---|
| 86 |  * This routine may decide to change the shell ordering.
 | 
|---|
| 87 |  * The new ordering is placed in *psh1,4 on exit.
 | 
|---|
| 88 |  * for the derivatives.
 | 
|---|
| 89 |  */
 | 
|---|
| 90 | void
 | 
|---|
| 91 | Int2eV3::erep(int &psh1, int &psh2, int &psh3, int &psh4)
 | 
|---|
| 92 | {
 | 
|---|
| 93 |   compute_erep(0,&psh1,&psh2,&psh3,&psh4,0,0,0,0);
 | 
|---|
| 94 |   }
 | 
|---|
| 95 | 
 | 
|---|
| 96 | /* This is an alternate interface to int_erep.  It takes
 | 
|---|
| 97 |  * as arguments the flags, an integer vector of shell numbers
 | 
|---|
| 98 |  * and an integer vector which will be filled in with size
 | 
|---|
| 99 |  * information, if it is non-NULL. */
 | 
|---|
| 100 | void
 | 
|---|
| 101 | Int2eV3::erep(int *shells, int  *sizes)
 | 
|---|
| 102 | {
 | 
|---|
| 103 |   erep(shells[0],shells[1],shells[2],shells[3]);
 | 
|---|
| 104 |   if (sizes) {
 | 
|---|
| 105 |     sizes[0] = bs1_->shell(shells[0]).nfunction();
 | 
|---|
| 106 |     sizes[1] = bs2_->shell(shells[1]).nfunction();
 | 
|---|
| 107 |     sizes[2] = bs3_->shell(shells[2]).nfunction();
 | 
|---|
| 108 |     sizes[3] = bs4_->shell(shells[3]).nfunction();
 | 
|---|
| 109 |     }
 | 
|---|
| 110 |   }
 | 
|---|
| 111 | 
 | 
|---|
| 112 | /* If we need a computation with adjusted angular momentum, then
 | 
|---|
| 113 |  * this lower level routine can be called instead of int_erep.
 | 
|---|
| 114 |  * The dam{1,2,3,4} arguments given the amount by which the
 | 
|---|
| 115 |  * angular momentum is to adjusted.  This differs from libint version
 | 
|---|
| 116 |  * 1 in that it used total angular momentum here.
 | 
|---|
| 117 |  */
 | 
|---|
| 118 | void
 | 
|---|
| 119 | Int2eV3::compute_erep(int flags, int *psh1, int *psh2, int *psh3, int *psh4,
 | 
|---|
| 120 |                       int dam1, int dam2, int dam3, int dam4)
 | 
|---|
| 121 | {
 | 
|---|
| 122 | #ifdef EREP_TIMING
 | 
|---|
| 123 |   char section[30];
 | 
|---|
| 124 | #endif
 | 
|---|
| 125 |   GaussianBasisSet *pbs1=bs1_.pointer();
 | 
|---|
| 126 |   GaussianBasisSet *pbs2=bs2_.pointer();
 | 
|---|
| 127 |   GaussianBasisSet *pbs3=bs3_.pointer();
 | 
|---|
| 128 |   GaussianBasisSet *pbs4=bs4_.pointer();
 | 
|---|
| 129 |   int size;
 | 
|---|
| 130 |   int ii;
 | 
|---|
| 131 |   int size1, size2, size3, size4;
 | 
|---|
| 132 |   int tam1,tam2,tam3,tam4;
 | 
|---|
| 133 |   int i,j,k,l;
 | 
|---|
| 134 |   int ogc1,ogc2,ogc3,ogc4;
 | 
|---|
| 135 |   int sh1,sh2,sh3,sh4;
 | 
|---|
| 136 |   int am1,am2,am3,am4,am12, am34;
 | 
|---|
| 137 |   int minam1,minam2,minam3,minam4;
 | 
|---|
| 138 |   int redundant_index;
 | 
|---|
| 139 |   int e12,e13e24,e34;
 | 
|---|
| 140 |   int p12,p34,p13p24;
 | 
|---|
| 141 |   int eAB;
 | 
|---|
| 142 | 
 | 
|---|
| 143 |   /* Compute the offset shell numbers. */
 | 
|---|
| 144 |   osh1 = *psh1 + bs1_shell_offset_;
 | 
|---|
| 145 |   osh2 = *psh2 + bs2_shell_offset_;
 | 
|---|
| 146 |   osh3 = *psh3 + bs3_shell_offset_;
 | 
|---|
| 147 |   osh4 = *psh4 + bs4_shell_offset_;
 | 
|---|
| 148 | 
 | 
|---|
| 149 |   sh1 = *psh1;
 | 
|---|
| 150 |   sh2 = *psh2;
 | 
|---|
| 151 |   sh3 = *psh3;
 | 
|---|
| 152 |   sh4 = *psh4;
 | 
|---|
| 153 | 
 | 
|---|
| 154 |   /* Test the arguments to make sure that they are sensible. */
 | 
|---|
| 155 |   if (   sh1 < 0 || sh1 >= bs1_->nbasis()
 | 
|---|
| 156 |       ||( !int_unit2 && (sh2 < 0 || sh2 >= bs2_->nbasis()))
 | 
|---|
| 157 |       || sh3 < 0 || sh3 >= bs3_->nbasis()
 | 
|---|
| 158 |       ||( !int_unit4 && (sh4 < 0 || sh4 >= bs4_->nbasis()))) {
 | 
|---|
| 159 |     ExEnv::errn() << scprintf("compute_erep has been incorrectly used\n");
 | 
|---|
| 160 |     ExEnv::errn() << scprintf("shells (bounds): %d (%d), %d (%d), %d (%d), %d (%d)\n",
 | 
|---|
| 161 |             sh1,bs1_->nbasis()-1,
 | 
|---|
| 162 |             sh2,(bs2_.null()?0:bs2_->nbasis())-1,
 | 
|---|
| 163 |             sh3,bs3_->nbasis()-1,
 | 
|---|
| 164 |             sh4,(bs4_.null()?0:bs4_->nbasis())-1);
 | 
|---|
| 165 |     fail();
 | 
|---|
| 166 |     }
 | 
|---|
| 167 | 
 | 
|---|
| 168 |   /* Set up pointers to the current shells. */
 | 
|---|
| 169 |   int_shell1 = &bs1_->shell(sh1);
 | 
|---|
| 170 |   if (!int_unit2) int_shell2 = &bs2_->shell(sh2);
 | 
|---|
| 171 |   else int_shell2 = int_unit_shell;
 | 
|---|
| 172 |   int_shell3 = &bs3_->shell(sh3);
 | 
|---|
| 173 |   if (!int_unit4) int_shell4 = &bs4_->shell(sh4);
 | 
|---|
| 174 |   else int_shell4 = int_unit_shell;
 | 
|---|
| 175 | 
 | 
|---|
| 176 | 
 | 
|---|
| 177 |   /* Compute the maximum angular momentum on each centers to
 | 
|---|
| 178 |    * determine the most efficient way to invoke the building and shifting
 | 
|---|
| 179 |    * routines.  The minimum angular momentum will be computed at the
 | 
|---|
| 180 |    * same time. */
 | 
|---|
| 181 |   minam1 = int_shell1->min_am();
 | 
|---|
| 182 |   minam2 = int_shell2->min_am();
 | 
|---|
| 183 |   minam3 = int_shell3->min_am();
 | 
|---|
| 184 |   minam4 = int_shell4->min_am();
 | 
|---|
| 185 |   am1 = int_shell1->max_am();
 | 
|---|
| 186 |   am2 = int_shell2->max_am();
 | 
|---|
| 187 |   am3 = int_shell3->max_am();
 | 
|---|
| 188 |   am4 = int_shell4->max_am();
 | 
|---|
| 189 | 
 | 
|---|
| 190 |   am1 += dam1; minam1 += dam1;
 | 
|---|
| 191 |   am2 += dam2; minam2 += dam2;
 | 
|---|
| 192 |   am3 += dam3; minam3 += dam3;
 | 
|---|
| 193 |   am4 += dam4; minam4 += dam4;
 | 
|---|
| 194 |   am12 = am1 + am2;
 | 
|---|
| 195 |   am34 = am3 + am4;
 | 
|---|
| 196 | 
 | 
|---|
| 197 |   /* if no angular momentum remains on one of the centers return */
 | 
|---|
| 198 |   if (am1 < 0 || am2 < 0 || am3 < 0 || am4 < 0) {
 | 
|---|
| 199 |     return;
 | 
|---|
| 200 |     }
 | 
|---|
| 201 | 
 | 
|---|
| 202 | #ifdef EREP_TIMING
 | 
|---|
| 203 |   sprintf(section,"erep am=%02d",am12+am34);
 | 
|---|
| 204 |   tim_enter(section);
 | 
|---|
| 205 |   tim_enter("setup");
 | 
|---|
| 206 | #endif
 | 
|---|
| 207 | 
 | 
|---|
| 208 |   /* Convert the integral to the most efficient form. */
 | 
|---|
| 209 |   p12 = 0;
 | 
|---|
| 210 |   p34 = 0;
 | 
|---|
| 211 |   p13p24 = 0;
 | 
|---|
| 212 | 
 | 
|---|
| 213 |   if (am2 > am1) {
 | 
|---|
| 214 |     p12 = 1;
 | 
|---|
| 215 |     iswtch(&am1,&am2);iswtch(&sh1,&sh2);iswtch(psh1,psh2);iswtch(&osh1,&osh2);
 | 
|---|
| 216 |     iswtch(&dam1,&dam2);
 | 
|---|
| 217 |     iswtch(&minam1,&minam2);
 | 
|---|
| 218 |     sswtch(&int_shell1,&int_shell2);
 | 
|---|
| 219 |     swtch(pbs1,pbs2);
 | 
|---|
| 220 |     }
 | 
|---|
| 221 |   if (am4 > am3) {
 | 
|---|
| 222 |     p34 = 1;
 | 
|---|
| 223 |     iswtch(&am3,&am4);iswtch(&sh3,&sh4);iswtch(psh3,psh4);iswtch(&osh3,&osh4);
 | 
|---|
| 224 |     iswtch(&dam3,&dam4);
 | 
|---|
| 225 |     iswtch(&minam3,&minam4);
 | 
|---|
| 226 |     sswtch(&int_shell3,&int_shell4);
 | 
|---|
| 227 |     swtch(pbs3,pbs4);
 | 
|---|
| 228 |     }
 | 
|---|
| 229 |   if ((osh1 == osh4) && (osh2 == osh3) && (osh1 != osh2)) {
 | 
|---|
| 230 |     /* Don't make the permutation unless we won't override what was
 | 
|---|
| 231 |      * decided above about p34. */
 | 
|---|
| 232 |     if (am4 == am3) {
 | 
|---|
| 233 |       p34 = 1;
 | 
|---|
| 234 |       iswtch(&am3,&am4);iswtch(&sh3,&sh4);iswtch(psh3,psh4);iswtch(&osh3,&osh4);
 | 
|---|
| 235 |       iswtch(&dam3,&dam4);
 | 
|---|
| 236 |       iswtch(&minam3,&minam4);
 | 
|---|
| 237 |       sswtch(&int_shell3,&int_shell4);
 | 
|---|
| 238 |       swtch(pbs3,pbs4);
 | 
|---|
| 239 |       }
 | 
|---|
| 240 |     }
 | 
|---|
| 241 |   if ((am34 > am12)||((am34 == am12)&&(minam1 > minam3))) {
 | 
|---|
| 242 |     p13p24 = 1;
 | 
|---|
| 243 |     iswtch(&am1,&am3);iswtch(&sh1,&sh3);iswtch(psh1,psh3);iswtch(&osh1,&osh3);
 | 
|---|
| 244 |     iswtch(&am2,&am4);iswtch(&sh2,&sh4);iswtch(psh2,psh4);iswtch(&osh2,&osh4);
 | 
|---|
| 245 |     iswtch(&int_unit2,&int_unit4);
 | 
|---|
| 246 |     iswtch(&am12,&am34);
 | 
|---|
| 247 |     iswtch(&dam1,&dam3);
 | 
|---|
| 248 |     iswtch(&minam1,&minam3);
 | 
|---|
| 249 |     sswtch(&int_shell1,&int_shell3);
 | 
|---|
| 250 |     swtch(pbs1,pbs3);
 | 
|---|
| 251 |     iswtch(&dam2,&dam4);
 | 
|---|
| 252 |     iswtch(&minam2,&minam4);
 | 
|---|
| 253 |     sswtch(&int_shell2,&int_shell4);
 | 
|---|
| 254 |     swtch(pbs2,pbs4);
 | 
|---|
| 255 |     }
 | 
|---|
| 256 |   /* This tries to make centers A and B equivalent, if possible. */
 | 
|---|
| 257 |   else if (  (am3 == am1)
 | 
|---|
| 258 |            &&(am4 == am2)
 | 
|---|
| 259 |            && !int_unit2
 | 
|---|
| 260 |            && !int_unit4
 | 
|---|
| 261 |            &&(minam1 == minam3)
 | 
|---|
| 262 |            &&(!(  (bs1_ == bs2_)
 | 
|---|
| 263 |                 &&(bs1_->shell_to_center(sh1)==bs2_->shell_to_center(sh2))))
 | 
|---|
| 264 |            &&(   (bs3_ == bs4_)
 | 
|---|
| 265 |                &&(bs3_->shell_to_center(sh3)==bs4_->shell_to_center(sh4)))) {
 | 
|---|
| 266 |     p13p24 = 1;
 | 
|---|
| 267 |     iswtch(&am1,&am3);iswtch(&sh1,&sh3);iswtch(psh1,psh3);iswtch(&osh1,&osh3);
 | 
|---|
| 268 |     iswtch(&am2,&am4);iswtch(&sh2,&sh4);iswtch(psh2,psh4);iswtch(&osh2,&osh4);
 | 
|---|
| 269 |     iswtch(&am12,&am34);
 | 
|---|
| 270 |     iswtch(&dam1,&dam3);
 | 
|---|
| 271 |     iswtch(&minam1,&minam3);
 | 
|---|
| 272 |     sswtch(&int_shell1,&int_shell3);
 | 
|---|
| 273 |     swtch(pbs1,pbs3);
 | 
|---|
| 274 |     iswtch(&dam2,&dam4);
 | 
|---|
| 275 |     iswtch(&minam2,&minam4);
 | 
|---|
| 276 |     sswtch(&int_shell2,&int_shell4);
 | 
|---|
| 277 |     swtch(pbs2,pbs4);
 | 
|---|
| 278 |     }
 | 
|---|
| 279 | 
 | 
|---|
| 280 |   if ((pbs1 == pbs2)
 | 
|---|
| 281 |       &&(pbs1->shell_to_center(sh1)==pbs2->shell_to_center(sh2))) {
 | 
|---|
| 282 |     eAB = 1;
 | 
|---|
| 283 |     }
 | 
|---|
| 284 |   else {
 | 
|---|
| 285 |     eAB = 0;
 | 
|---|
| 286 |     }
 | 
|---|
| 287 | 
 | 
|---|
| 288 |   /* If the centers were permuted, then the int_expweighted variable may
 | 
|---|
| 289 |    * need to be changed. */
 | 
|---|
| 290 |   if (p12) {
 | 
|---|
| 291 |     iswtch(&int_expweight1,&int_expweight2);
 | 
|---|
| 292 |     }
 | 
|---|
| 293 |   if (p34) {
 | 
|---|
| 294 |     iswtch(&int_expweight3,&int_expweight4);
 | 
|---|
| 295 |     }
 | 
|---|
| 296 |   if (p13p24) {
 | 
|---|
| 297 |     iswtch(&int_expweight1,&int_expweight3);
 | 
|---|
| 298 |     iswtch(&int_expweight2,&int_expweight4);
 | 
|---|
| 299 |     }
 | 
|---|
| 300 | 
 | 
|---|
| 301 |   pbs1_ = pbs1;
 | 
|---|
| 302 |   pbs2_ = pbs2;
 | 
|---|
| 303 |   pbs3_ = pbs3;
 | 
|---|
| 304 |   pbs4_ = pbs4;
 | 
|---|
| 305 | 
 | 
|---|
| 306 |   int nc1 = int_shell1->ncontraction();
 | 
|---|
| 307 |   int nc2 = int_shell2->ncontraction();
 | 
|---|
| 308 |   int nc3 = int_shell3->ncontraction();
 | 
|---|
| 309 |   int nc4 = int_shell4->ncontraction();
 | 
|---|
| 310 | 
 | 
|---|
| 311 |   /* Compute the shell sizes. */
 | 
|---|
| 312 |   for (ii=size1=0; ii<nc1; ii++)
 | 
|---|
| 313 |     size1 += INT_NCART(int_shell1->am(ii)+dam1);
 | 
|---|
| 314 |   for (ii=size2=0; ii<nc2; ii++)
 | 
|---|
| 315 |     size2 += INT_NCART(int_shell2->am(ii)+dam2);
 | 
|---|
| 316 |   for (ii=size3=0; ii<nc3; ii++)
 | 
|---|
| 317 |     size3 += INT_NCART(int_shell3->am(ii)+dam3);
 | 
|---|
| 318 |   for (ii=size4=0; ii<nc4; ii++)
 | 
|---|
| 319 |     size4 += INT_NCART(int_shell4->am(ii)+dam4);
 | 
|---|
| 320 |   size = size1*size2*size3*size4;
 | 
|---|
| 321 | 
 | 
|---|
| 322 |   if (int_integral_storage) {
 | 
|---|
| 323 | #ifdef EREP_TIMING
 | 
|---|
| 324 |       tim_change("check storage");
 | 
|---|
| 325 | #endif
 | 
|---|
| 326 |     if (dam1 || dam2 || dam3 || dam4) {
 | 
|---|
| 327 |       ExEnv::errn() << scprintf("cannot use integral storage and dam\n");
 | 
|---|
| 328 |       fail();
 | 
|---|
| 329 |       }
 | 
|---|
| 330 |     if (    !int_unit2
 | 
|---|
| 331 |          && !int_unit4
 | 
|---|
| 332 |          && int_have_stored_integral(sh1,sh2,sh3,sh4,p12,p34,p13p24)) {
 | 
|---|
| 333 |       goto post_computation;
 | 
|---|
| 334 |       }
 | 
|---|
| 335 |     }
 | 
|---|
| 336 | 
 | 
|---|
| 337 |   /* Buildam up on center 1 and 3. */
 | 
|---|
| 338 | #ifdef EREP_TIMING
 | 
|---|
| 339 |   tim_change("build");
 | 
|---|
| 340 | #endif
 | 
|---|
| 341 |   int_buildgcam(minam1,minam2,minam3,minam4,
 | 
|---|
| 342 |                 am1,am2,am3,am4,
 | 
|---|
| 343 |                 dam1,dam2,dam3,dam4,
 | 
|---|
| 344 |                 sh1,sh2,sh3,sh4,
 | 
|---|
| 345 |                 eAB);
 | 
|---|
| 346 | #ifdef EREP_TIMING
 | 
|---|
| 347 |   tim_change("cleanup");
 | 
|---|
| 348 | #endif
 | 
|---|
| 349 | 
 | 
|---|
| 350 |   /* Begin loop over generalized contractions. */
 | 
|---|
| 351 |   ogc1 = 0;
 | 
|---|
| 352 |   for (i=0; i<nc1; i++) {
 | 
|---|
| 353 |     tam1 = int_shell1->am(i) + dam1;
 | 
|---|
| 354 |     if (tam1 < 0) continue;
 | 
|---|
| 355 |     int tsize1 = INT_NCART_NN(tam1);
 | 
|---|
| 356 |     ogc2 = 0;
 | 
|---|
| 357 |     for (j=0; j<nc2; j++) {
 | 
|---|
| 358 |       tam2 = int_shell2->am(j) + dam2;
 | 
|---|
| 359 |       if (tam2 < 0) continue;
 | 
|---|
| 360 |       int tsize2 = INT_NCART_NN(tam2);
 | 
|---|
| 361 |       ogc3 = 0;
 | 
|---|
| 362 |       for (k=0; k<nc3; k++) {
 | 
|---|
| 363 |         tam3 = int_shell3->am(k) + dam3;
 | 
|---|
| 364 |         if (tam3 < 0) continue;
 | 
|---|
| 365 |         int tsize3 = INT_NCART_NN(tam3);
 | 
|---|
| 366 |         ogc4 = 0;
 | 
|---|
| 367 |         for (l=0; l<nc4; l++) {
 | 
|---|
| 368 |           tam4 = int_shell4->am(l) + dam4;
 | 
|---|
| 369 |           if (tam4 < 0) continue;
 | 
|---|
| 370 |           int tsize4 = INT_NCART_NN(tam4);
 | 
|---|
| 371 | 
 | 
|---|
| 372 | #ifdef EREP_TIMING
 | 
|---|
| 373 |   tim_change("shift");
 | 
|---|
| 374 | #endif
 | 
|---|
| 375 |   /* Shift angular momentum from 1 to 2 and from 3 to 4. */
 | 
|---|
| 376 |   double *shiftbuffer = int_shiftgcam(i,j,k,l,tam1,tam2,tam3,tam4, eAB);
 | 
|---|
| 377 | #ifdef EREP_TIMING
 | 
|---|
| 378 |   tim_change("cleanup");
 | 
|---|
| 379 | #endif
 | 
|---|
| 380 | 
 | 
|---|
| 381 |   /* Place the integrals in the integral buffer. */
 | 
|---|
| 382 |   /* If permute_ is not set, then repack the integrals while copying. */
 | 
|---|
| 383 |   if ((!permute_)&&(p12||p34||p13p24)) {
 | 
|---|
| 384 |     int pam1,pam2,pam3,pam4;
 | 
|---|
| 385 |     int psize234,psize34;
 | 
|---|
| 386 |     int pogc1,pogc2,pogc3,pogc4;
 | 
|---|
| 387 |     int psize1,psize2,psize3,psize4;
 | 
|---|
| 388 |     pam1 = tam1;
 | 
|---|
| 389 |     pam2 = tam2;
 | 
|---|
| 390 |     pam3 = tam3;
 | 
|---|
| 391 |     pam4 = tam4;
 | 
|---|
| 392 |     pogc1 = ogc1;
 | 
|---|
| 393 |     pogc2 = ogc2;
 | 
|---|
| 394 |     pogc3 = ogc3;
 | 
|---|
| 395 |     pogc4 = ogc4;
 | 
|---|
| 396 |     psize1 = size1;
 | 
|---|
| 397 |     psize2 = size2;
 | 
|---|
| 398 |     psize3 = size3;
 | 
|---|
| 399 |     psize4 = size4;
 | 
|---|
| 400 |     if (p13p24) {
 | 
|---|
| 401 |       iswtch(&pam1,&pam3);
 | 
|---|
| 402 |       iswtch(&pam2,&pam4);
 | 
|---|
| 403 |       iswtch(&pogc1,&pogc3);
 | 
|---|
| 404 |       iswtch(&pogc2,&pogc4);
 | 
|---|
| 405 |       iswtch(&psize1,&psize3);
 | 
|---|
| 406 |       iswtch(&psize2,&psize4);
 | 
|---|
| 407 |       }
 | 
|---|
| 408 |     if (p34) {
 | 
|---|
| 409 |       iswtch(&pam3,&pam4);
 | 
|---|
| 410 |       iswtch(&pogc3,&pogc4);
 | 
|---|
| 411 |       iswtch(&psize3,&psize4);
 | 
|---|
| 412 |       }
 | 
|---|
| 413 |     if (p12) {
 | 
|---|
| 414 |       iswtch(&pam1,&pam2);
 | 
|---|
| 415 |       iswtch(&pogc1,&pogc2);
 | 
|---|
| 416 |       iswtch(&psize1,&psize2);
 | 
|---|
| 417 |       }
 | 
|---|
| 418 |     psize34 = psize4 * psize3;
 | 
|---|
| 419 |     psize234 = psize34 * psize2;
 | 
|---|
| 420 |     redundant_index = 0;
 | 
|---|
| 421 |     int newindexoffset = pogc1*psize234 + pogc2*psize34 + pogc3*psize4 + pogc4;
 | 
|---|
| 422 |     if (p13p24||p34) {
 | 
|---|
| 423 |       int stride1=psize234;
 | 
|---|
| 424 |       int stride2=psize34;
 | 
|---|
| 425 |       int stride3=psize4;
 | 
|---|
| 426 |       int stride4=1;
 | 
|---|
| 427 |       int tmp;
 | 
|---|
| 428 |       if (p12) {
 | 
|---|
| 429 |         tmp=stride1; stride1=stride2; stride2=tmp;
 | 
|---|
| 430 |         }
 | 
|---|
| 431 |       if (p34) {
 | 
|---|
| 432 |         tmp=stride3; stride3=stride4; stride4=tmp;
 | 
|---|
| 433 |         }
 | 
|---|
| 434 |       if (p13p24) {
 | 
|---|
| 435 |         tmp=stride1; stride1=stride3; stride3=tmp;
 | 
|---|
| 436 |         tmp=stride2; stride2=stride4; stride4=tmp;
 | 
|---|
| 437 |         }
 | 
|---|
| 438 |       int newindex1 = newindexoffset;
 | 
|---|
| 439 |       for (int ci1=0; ci1<tsize1; ci1++) {
 | 
|---|
| 440 |         int newindex12 = newindex1;
 | 
|---|
| 441 |         for (int ci2=0; ci2<tsize2; ci2++) {
 | 
|---|
| 442 |           int newindex123 = newindex12;
 | 
|---|
| 443 |           for (int ci3=0; ci3<tsize3; ci3++) {
 | 
|---|
| 444 |             double *tmp_shiftbuffer = &shiftbuffer[redundant_index];
 | 
|---|
| 445 |             int newindex1234 = newindex123;
 | 
|---|
| 446 |             for (int ci4=0; ci4<tsize4; ci4++) {
 | 
|---|
| 447 |               int_buffer[newindex1234] = tmp_shiftbuffer[ci4];
 | 
|---|
| 448 |               newindex1234 += stride4;
 | 
|---|
| 449 |               }
 | 
|---|
| 450 |             redundant_index+=tsize4;
 | 
|---|
| 451 |             newindex123 += stride3;
 | 
|---|
| 452 |             }
 | 
|---|
| 453 |           newindex12 += stride2;
 | 
|---|
| 454 |           }
 | 
|---|
| 455 |         newindex1 += stride1;
 | 
|---|
| 456 |         }
 | 
|---|
| 457 |       }
 | 
|---|
| 458 |     else if (nc3 == 1 && nc4 == 1) {
 | 
|---|
| 459 |       // this is the p12 only case w/o gen contractions on 3 & 4
 | 
|---|
| 460 |       // this special case collapses the 3rd and 4th indices together
 | 
|---|
| 461 |       for (int ci1=0; ci1<tsize1; ci1++) {
 | 
|---|
| 462 |         for (int ci2=0; ci2<tsize2; ci2++) {
 | 
|---|
| 463 |           int pci1=ci1;
 | 
|---|
| 464 |           int pci2=ci2;
 | 
|---|
| 465 |           if (p12) {
 | 
|---|
| 466 |             int tmp=pci1; pci1=pci2; pci2=tmp;
 | 
|---|
| 467 |             }
 | 
|---|
| 468 |           int newindex123 = newindexoffset + pci1*psize234 + pci2*psize34;
 | 
|---|
| 469 |           double *tmp_int_buffer = &int_buffer[newindex123];
 | 
|---|
| 470 |           double *tmp_shiftbuffer = &shiftbuffer[redundant_index];
 | 
|---|
| 471 |           for (int ci34=0; ci34<psize34; ci34++)
 | 
|---|
| 472 |             tmp_int_buffer[ci34] = tmp_shiftbuffer[ci34];
 | 
|---|
| 473 |           redundant_index += psize34;
 | 
|---|
| 474 |           }
 | 
|---|
| 475 |         }
 | 
|---|
| 476 |       }
 | 
|---|
| 477 |     else {
 | 
|---|
| 478 |       // this is the p12 only case w/gen. contr. on 3 & 4
 | 
|---|
| 479 |       for (int ci1=0; ci1<tsize1; ci1++) {
 | 
|---|
| 480 |         for (int ci2=0; ci2<tsize2; ci2++) {
 | 
|---|
| 481 |           int pci1=ci1;
 | 
|---|
| 482 |           int pci2=ci2;
 | 
|---|
| 483 |           if (p12) {
 | 
|---|
| 484 |             int tmp=pci1; pci1=pci2; pci2=tmp;
 | 
|---|
| 485 |             }
 | 
|---|
| 486 |           int newindex123 = newindexoffset + pci1*psize234 + pci2*psize34;
 | 
|---|
| 487 |           for (int ci3=0; ci3<tsize3; ci3++) {
 | 
|---|
| 488 |             double *tmp_int_buffer = &int_buffer[newindex123];
 | 
|---|
| 489 |             double *tmp_shiftbuffer = &shiftbuffer[redundant_index];
 | 
|---|
| 490 |             for (int ci4=0; ci4<tsize4; ci4++) {
 | 
|---|
| 491 |               tmp_int_buffer[ci4] = tmp_shiftbuffer[ci4];
 | 
|---|
| 492 |               }
 | 
|---|
| 493 |             redundant_index += tsize4;
 | 
|---|
| 494 |             newindex123 += psize4;
 | 
|---|
| 495 |             }
 | 
|---|
| 496 |           }
 | 
|---|
| 497 |         }
 | 
|---|
| 498 |       }
 | 
|---|
| 499 |     }
 | 
|---|
| 500 |   else if (nc3 == 1 && nc4 == 1) {
 | 
|---|
| 501 |     // this special case collapses the 3rd and 4th indices together
 | 
|---|
| 502 |     int size34 =  size3 * size4;
 | 
|---|
| 503 |     int size234 = size2 * size34;
 | 
|---|
| 504 |     double* redund_ints = shiftbuffer;
 | 
|---|
| 505 |     redundant_index = 0;
 | 
|---|
| 506 |     int newindex1 = ogc1*size234 + ogc2*size34 + ogc3*size4 + ogc4;
 | 
|---|
| 507 |     for (int ci1=0; ci1<tsize1; ci1++) {
 | 
|---|
| 508 |       int newindex12 = newindex1;
 | 
|---|
| 509 |       for (int ci2=0; ci2<tsize2; ci2++) {
 | 
|---|
| 510 |         double *tmp_int_buffer = &int_buffer[newindex12];
 | 
|---|
| 511 |         double *tmp_redund_ints = &redund_ints[redundant_index];
 | 
|---|
| 512 |         for (int ci34=0; ci34<size34; ci34++)
 | 
|---|
| 513 |           tmp_int_buffer[ci34] = tmp_redund_ints[ci34];
 | 
|---|
| 514 |         redundant_index += size34;
 | 
|---|
| 515 |         newindex12 += size34;
 | 
|---|
| 516 |         }
 | 
|---|
| 517 |       newindex1 += size234;
 | 
|---|
| 518 |       }
 | 
|---|
| 519 |     }
 | 
|---|
| 520 |   else {
 | 
|---|
| 521 |     int size34 =  size3 * size4;
 | 
|---|
| 522 |     int size234 = size2 * size34;
 | 
|---|
| 523 |     double* redund_ints = shiftbuffer;
 | 
|---|
| 524 |     redundant_index = 0;
 | 
|---|
| 525 |     int newindex1 = ogc1*size234 + ogc2*size34 + ogc3*size4 + ogc4;
 | 
|---|
| 526 |     for (int ci1=0; ci1<tsize1; ci1++) {
 | 
|---|
| 527 |       int newindex12 = newindex1;
 | 
|---|
| 528 |       for (int ci2=0; ci2<tsize2; ci2++) {
 | 
|---|
| 529 |         int newindex123 = newindex12;
 | 
|---|
| 530 |         for (int ci3=0; ci3<tsize3; ci3++) {
 | 
|---|
| 531 |           double *tmp_int_buffer = &int_buffer[newindex123];
 | 
|---|
| 532 |           double *tmp_redund_ints = &redund_ints[redundant_index];
 | 
|---|
| 533 |           for (int ci4=0; ci4<tsize4; ci4++) {
 | 
|---|
| 534 |             tmp_int_buffer[ci4] = tmp_redund_ints[ci4];
 | 
|---|
| 535 |             }
 | 
|---|
| 536 |           redundant_index += tsize4;
 | 
|---|
| 537 |           newindex123 += size4;
 | 
|---|
| 538 |           }
 | 
|---|
| 539 |         newindex12 += size34;
 | 
|---|
| 540 |         }
 | 
|---|
| 541 |       newindex1 += size234;
 | 
|---|
| 542 |       }
 | 
|---|
| 543 |     }
 | 
|---|
| 544 | 
 | 
|---|
| 545 |     /* End loop over generalized contractions. */
 | 
|---|
| 546 |           ogc4 += tsize4;
 | 
|---|
| 547 |           }
 | 
|---|
| 548 |         ogc3 += tsize3;
 | 
|---|
| 549 |         }
 | 
|---|
| 550 |       ogc2 += tsize2;
 | 
|---|
| 551 |       }
 | 
|---|
| 552 |     ogc1 += tsize1;
 | 
|---|
| 553 |     }
 | 
|---|
| 554 | 
 | 
|---|
| 555 |   if (   !int_unit2
 | 
|---|
| 556 |       && !int_unit4
 | 
|---|
| 557 |       && int_integral_storage) {
 | 
|---|
| 558 | #ifdef EREP_TIMING
 | 
|---|
| 559 |       tim_change("maybe store");
 | 
|---|
| 560 | #endif
 | 
|---|
| 561 |       int_store_integral(sh1,sh2,sh3,sh4,p12,p34,p13p24,size);
 | 
|---|
| 562 |     }
 | 
|---|
| 563 | 
 | 
|---|
| 564 |   /* We branch here if an integral was precomputed and the int_buffer
 | 
|---|
| 565 |    * has been already filled. */
 | 
|---|
| 566 |   post_computation:
 | 
|---|
| 567 | 
 | 
|---|
| 568 | #ifdef EREP_TIMING
 | 
|---|
| 569 |   tim_change("post");
 | 
|---|
| 570 | #endif
 | 
|---|
| 571 | 
 | 
|---|
| 572 |   /* Unpermute all of the permuted quantities. */
 | 
|---|
| 573 |   if ((!permute_)&&(p12||p34||p13p24)) {
 | 
|---|
| 574 |     if (p13p24) {
 | 
|---|
| 575 |       iswtch(&sh1,&sh3);iswtch(psh1,psh3);iswtch(&osh1,&osh3);
 | 
|---|
| 576 |       iswtch(&sh2,&sh4);iswtch(psh2,psh4);iswtch(&osh2,&osh4);
 | 
|---|
| 577 |       iswtch(&int_unit2,&int_unit4);
 | 
|---|
| 578 |       iswtch(&am1,&am3);
 | 
|---|
| 579 |       iswtch(&am2,&am4);
 | 
|---|
| 580 |       iswtch(&am12,&am34);
 | 
|---|
| 581 |       sswtch(&int_shell1,&int_shell3);
 | 
|---|
| 582 |       swtch(pbs1,pbs3);
 | 
|---|
| 583 |       sswtch(&int_shell2,&int_shell4);
 | 
|---|
| 584 |       swtch(pbs2,pbs4);
 | 
|---|
| 585 |       iswtch(&int_expweight1,&int_expweight3);
 | 
|---|
| 586 |       iswtch(&int_expweight2,&int_expweight4);
 | 
|---|
| 587 |       }
 | 
|---|
| 588 |     if (p34) {
 | 
|---|
| 589 |       iswtch(&sh3,&sh4);iswtch(psh3,psh4);iswtch(&osh3,&osh4);
 | 
|---|
| 590 |       iswtch(&am3,&am4);
 | 
|---|
| 591 |       sswtch(&int_shell3,&int_shell4);
 | 
|---|
| 592 |       swtch(pbs3,pbs4);
 | 
|---|
| 593 |       iswtch(&int_expweight3,&int_expweight4);
 | 
|---|
| 594 |       }
 | 
|---|
| 595 |     if (p12) {
 | 
|---|
| 596 |       iswtch(&sh1,&sh2);iswtch(psh1,psh2);iswtch(&osh1,&osh2);
 | 
|---|
| 597 |       iswtch(&am1,&am2);
 | 
|---|
| 598 |       sswtch(&int_shell1,&int_shell2);
 | 
|---|
| 599 |       swtch(pbs1,pbs2);
 | 
|---|
| 600 |       iswtch(&int_expweight1,&int_expweight2);
 | 
|---|
| 601 |       }
 | 
|---|
| 602 |     }
 | 
|---|
| 603 | 
 | 
|---|
| 604 |   pbs1_ = 0;
 | 
|---|
| 605 |   pbs2_ = 0;
 | 
|---|
| 606 |   pbs3_ = 0;
 | 
|---|
| 607 |   pbs4_ = 0;
 | 
|---|
| 608 | 
 | 
|---|
| 609 |   /* Transform to pure am (if requested in the centers structure). */
 | 
|---|
| 610 |   if (!(flags&INT_NOPURE)) {
 | 
|---|
| 611 |       transform_2e(integral_, int_buffer, int_buffer,
 | 
|---|
| 612 |                    &bs1_->shell(sh1),
 | 
|---|
| 613 |                    int_unit2?int_unit_shell:&bs2_->shell(sh2),
 | 
|---|
| 614 |                    &bs3_->shell(sh3),
 | 
|---|
| 615 |                    int_unit4?int_unit_shell:&bs4_->shell(sh4));
 | 
|---|
| 616 |     }
 | 
|---|
| 617 | 
 | 
|---|
| 618 |   /* Remove the redundant integrals, unless redundant_ is set. */
 | 
|---|
| 619 |   if (!redundant_) {
 | 
|---|
| 620 |     int redundant_offset = 0;
 | 
|---|
| 621 |     int nonredundant_offset = 0;
 | 
|---|
| 622 |     if ((osh1 == osh4)&&(osh2 == osh3)&&(osh1 != osh2)) {
 | 
|---|
| 623 |       ExEnv::errn() << scprintf("nonredundant integrals cannot be generated\n");
 | 
|---|
| 624 |       fail();
 | 
|---|
| 625 |       }
 | 
|---|
| 626 |     e12 = (int_unit2?0:(osh1 == osh2));
 | 
|---|
| 627 |     e13e24 = ((osh1 == osh3)
 | 
|---|
| 628 |               && ((int_unit2 && int_unit4)
 | 
|---|
| 629 |                   || ((int_unit2||int_unit4)?0:(osh2 == osh4))));
 | 
|---|
| 630 |     e34 = (int_unit4?0:(osh3 == osh4));
 | 
|---|
| 631 |     if (e12||e34||e13e24) {
 | 
|---|
| 632 |       nonredundant_erep(int_buffer,e12,e34,e13e24,
 | 
|---|
| 633 |                         int_shell1->nfunction(),
 | 
|---|
| 634 |                         int_shell2->nfunction(),
 | 
|---|
| 635 |                         int_shell3->nfunction(),
 | 
|---|
| 636 |                         int_shell4->nfunction(),
 | 
|---|
| 637 |                         &redundant_offset,
 | 
|---|
| 638 |                         &nonredundant_offset);
 | 
|---|
| 639 |       }
 | 
|---|
| 640 |     }
 | 
|---|
| 641 |     
 | 
|---|
| 642 | #ifdef EREP_TIMING
 | 
|---|
| 643 |   tim_exit("post");
 | 
|---|
| 644 |   tim_exit(section);
 | 
|---|
| 645 | #endif
 | 
|---|
| 646 |   }
 | 
|---|
| 647 | 
 | 
|---|
| 648 | /* This computes the two electron derivatives for all unique
 | 
|---|
| 649 |  * centers in the passed shell quartet.  One center in
 | 
|---|
| 650 |  * the set of unique centers is not included.  This can
 | 
|---|
| 651 |  * be computed as minus the sum of the other derivatives.
 | 
|---|
| 652 |  * The list of centers for which integrals were computed can
 | 
|---|
| 653 |  * be determined from the contents of der_centers.
 | 
|---|
| 654 |  * The results are put into the global integral buffer in the
 | 
|---|
| 655 |  * format:
 | 
|---|
| 656 |  * +------------------+
 | 
|---|
| 657 |  * | dercenter1 +---+ |
 | 
|---|
| 658 |  * |            | x | |
 | 
|---|
| 659 |  * |            +---+ |
 | 
|---|
| 660 |  * |            | y | |
 | 
|---|
| 661 |  * |            +---+ |
 | 
|---|
| 662 |  * |            | z | |
 | 
|---|
| 663 |  * |            +---+ |
 | 
|---|
| 664 |  * +------------------+
 | 
|---|
| 665 |  * | dercenter2 +---+ |
 | 
|---|
| 666 |  * |            | x | |
 | 
|---|
| 667 |  * |            +---+ |
 | 
|---|
| 668 |  * |            | y | |
 | 
|---|
| 669 |  * |            +---+ |
 | 
|---|
| 670 |  * |            | z | |
 | 
|---|
| 671 |  * |            +---+ |
 | 
|---|
| 672 |  * +------------------+
 | 
|---|
| 673 |  * | dercenter3 +---+ |
 | 
|---|
| 674 |  * |            | x | |
 | 
|---|
| 675 |  * |            +---+ |
 | 
|---|
| 676 |  * |            | y | |
 | 
|---|
| 677 |  * |            +---+ |
 | 
|---|
| 678 |  * |            | z | |
 | 
|---|
| 679 |  * |            +---+ |
 | 
|---|
| 680 |  * +------------------+
 | 
|---|
| 681 |  */
 | 
|---|
| 682 | 
 | 
|---|
| 683 | void
 | 
|---|
| 684 | Int2eV3::erep_all1der(int &psh1, int &psh2, int &psh3, int &psh4,
 | 
|---|
| 685 |                       der_centersv3_t *der_centers)
 | 
|---|
| 686 | {
 | 
|---|
| 687 |   double *current_buffer;
 | 
|---|
| 688 |   int nints;
 | 
|---|
| 689 |   double *user_int_buffer;
 | 
|---|
| 690 |   int omit;
 | 
|---|
| 691 |   GaussianBasisSet *cs[4];
 | 
|---|
| 692 |   int sh[4];
 | 
|---|
| 693 |   int n_unique;
 | 
|---|
| 694 |   int i,j;
 | 
|---|
| 695 |   GaussianShell *shell1,*shell2,*shell3,*shell4;
 | 
|---|
| 696 |   GaussianBasisSet *ucs[4]; /* The centers struct for the unique centers. */
 | 
|---|
| 697 |   int unum[4];        /* The number of times that this unique center occurs. */
 | 
|---|
| 698 |   int uam[4];         /* The total angular momentum on each unique center. */
 | 
|---|
| 699 |   int am[4];
 | 
|---|
| 700 |   int osh[4];
 | 
|---|
| 701 |   int cen[4];
 | 
|---|
| 702 |   int ucen[4];
 | 
|---|
| 703 |   int ncart;
 | 
|---|
| 704 |   double *current_pure_buffer;
 | 
|---|
| 705 | 
 | 
|---|
| 706 |   cs[0] = bs1_.pointer();
 | 
|---|
| 707 |   cs[1] = bs2_.pointer();
 | 
|---|
| 708 |   cs[2] = bs3_.pointer();
 | 
|---|
| 709 |   cs[3] = bs4_.pointer();
 | 
|---|
| 710 | 
 | 
|---|
| 711 |   sh[0] = psh1;
 | 
|---|
| 712 |   sh[1] = psh2;
 | 
|---|
| 713 |   sh[2] = psh3;
 | 
|---|
| 714 |   sh[3] = psh4;
 | 
|---|
| 715 | 
 | 
|---|
| 716 |   /* Set up pointers to the current shells. */
 | 
|---|
| 717 |   shell1 = &bs1_->shell(psh1);
 | 
|---|
| 718 |   shell2 = &bs2_->shell(psh2);
 | 
|---|
| 719 |   shell3 = &bs3_->shell(psh3);
 | 
|---|
| 720 |   shell4 = &bs4_->shell(psh4);
 | 
|---|
| 721 | 
 | 
|---|
| 722 |   /* Number of cartesian and pure integrals. */
 | 
|---|
| 723 |   ncart = shell1->ncartesian()*shell2->ncartesian()
 | 
|---|
| 724 |          *shell3->ncartesian()*shell4->ncartesian();
 | 
|---|
| 725 |   nints = shell1->nfunction()*shell2->nfunction()
 | 
|---|
| 726 |          *shell3->nfunction()*shell4->nfunction();
 | 
|---|
| 727 | 
 | 
|---|
| 728 |   am[0] = shell1->max_am();
 | 
|---|
| 729 |   am[1] = shell2->max_am();
 | 
|---|
| 730 |   am[2] = shell3->max_am();
 | 
|---|
| 731 |   am[3] = shell4->max_am();
 | 
|---|
| 732 | 
 | 
|---|
| 733 |   /* Compute the offset shell numbers. */
 | 
|---|
| 734 |   osh[0] = psh1 + bs1_shell_offset_;
 | 
|---|
| 735 |   osh[1] = psh2 + bs2_shell_offset_;
 | 
|---|
| 736 |   osh[2] = psh3 + bs3_shell_offset_;
 | 
|---|
| 737 |   osh[3] = psh4 + bs4_shell_offset_;
 | 
|---|
| 738 | 
 | 
|---|
| 739 |   for (i=0; i<4; i++) cen[i] = cs[i]->shell_to_center(sh[i]);
 | 
|---|
| 740 | 
 | 
|---|
| 741 |   /* This macro returns true if two shell centers are the same. */
 | 
|---|
| 742 | #define SC(cs1,shc1,cs2,shc2) (((cs1)==(cs2))&&((shc1)==(shc2)))
 | 
|---|
| 743 | 
 | 
|---|
| 744 |   /* Build the list of unique centers structures and shells. */
 | 
|---|
| 745 |   n_unique = 0;
 | 
|---|
| 746 |   for (i=0; i<4; i++) {
 | 
|---|
| 747 |     int unique = 1;
 | 
|---|
| 748 |     for (j=0; j<n_unique; j++) {
 | 
|---|
| 749 |       if (SC(ucs[j],ucen[j],cs[i],cen[i])) {
 | 
|---|
| 750 |         unique = 0;
 | 
|---|
| 751 |         uam[j] += am[i];
 | 
|---|
| 752 |         unum[j]++;
 | 
|---|
| 753 |         break;
 | 
|---|
| 754 |         }
 | 
|---|
| 755 |       }
 | 
|---|
| 756 |     if (unique) {
 | 
|---|
| 757 |       ucs[n_unique] = cs[i];
 | 
|---|
| 758 |       ucen[n_unique] = cen[i];
 | 
|---|
| 759 |       uam[n_unique] = am[i];
 | 
|---|
| 760 |       unum[n_unique] = 1;
 | 
|---|
| 761 |       n_unique++;
 | 
|---|
| 762 |       }
 | 
|---|
| 763 |     }
 | 
|---|
| 764 | 
 | 
|---|
| 765 |   /* Choose which unique center is to be omitted from the calculation. */
 | 
|---|
| 766 |   if (n_unique == 1) {
 | 
|---|
| 767 |     omit = 0;
 | 
|---|
| 768 |     }
 | 
|---|
| 769 |   else if (n_unique == 2) {
 | 
|---|
| 770 |     if (unum[0]==3) omit = 0;
 | 
|---|
| 771 |     else if (unum[1]==3) omit = 1;
 | 
|---|
| 772 |     else if (uam[1]>uam[0]) omit = 1;
 | 
|---|
| 773 |     else omit = 0;
 | 
|---|
| 774 |     }
 | 
|---|
| 775 |   else if (n_unique == 3) {
 | 
|---|
| 776 |     if (unum[0]==2) omit = 0;
 | 
|---|
| 777 |     else if (unum[1]==2) omit = 1;
 | 
|---|
| 778 |     else omit = 2;
 | 
|---|
| 779 |     }
 | 
|---|
| 780 |   else {
 | 
|---|
| 781 |     int max = 0;
 | 
|---|
| 782 |     omit = 0;
 | 
|---|
| 783 |     for (i=0; i<4; i++) {
 | 
|---|
| 784 |       if (uam[i]>max) {
 | 
|---|
| 785 |         max = uam[i];
 | 
|---|
| 786 |         omit = i;
 | 
|---|
| 787 |         }
 | 
|---|
| 788 |       }
 | 
|---|
| 789 |     }
 | 
|---|
| 790 | 
 | 
|---|
| 791 |   /* Save the location of the int_buffer. */
 | 
|---|
| 792 |   user_int_buffer = int_buffer;
 | 
|---|
| 793 |   int_buffer = int_derint_buffer;
 | 
|---|
| 794 | 
 | 
|---|
| 795 |   /* Zero out the result integrals. */
 | 
|---|
| 796 |   for (i=0; i<3*(n_unique-1)*ncart; i++) user_int_buffer[i] = 0.0;
 | 
|---|
| 797 | 
 | 
|---|
| 798 |   /* Loop thru the unique centers, computing the integrals and
 | 
|---|
| 799 |    * skip the derivative on the unique center specified by omit. */
 | 
|---|
| 800 |   der_centers->n = 0;
 | 
|---|
| 801 |   current_buffer = user_int_buffer;
 | 
|---|
| 802 |   for (i=0; i<n_unique; i++) {
 | 
|---|
| 803 |     if (i==omit) continue;
 | 
|---|
| 804 | 
 | 
|---|
| 805 |     der_centers->cs[der_centers->n] = ucs[i];
 | 
|---|
| 806 |     der_centers->num[der_centers->n] = ucen[i];
 | 
|---|
| 807 |     der_centers->n++;
 | 
|---|
| 808 | 
 | 
|---|
| 809 |     for (j=0; j<4; j++) {
 | 
|---|
| 810 |       if (SC(ucs[i],ucen[i],cs[j],cen[j])) {
 | 
|---|
| 811 |         int old_perm = permute();
 | 
|---|
| 812 |         set_permute(0);
 | 
|---|
| 813 |         compute_erep_1der(0,current_buffer,
 | 
|---|
| 814 |                           &psh1,&psh2,&psh3,&psh4,j);
 | 
|---|
| 815 |         set_permute(old_perm);
 | 
|---|
| 816 |         }
 | 
|---|
| 817 |       }
 | 
|---|
| 818 | 
 | 
|---|
| 819 |     current_buffer = ¤t_buffer[3*ncart];
 | 
|---|
| 820 |     }
 | 
|---|
| 821 | 
 | 
|---|
| 822 |   /* Put the information about the omitted center into der_centers. */
 | 
|---|
| 823 |   der_centers->ocs = ucs[omit];
 | 
|---|
| 824 |   der_centers->onum = ucen[omit];
 | 
|---|
| 825 | 
 | 
|---|
| 826 |   /* Transform to pure am. */
 | 
|---|
| 827 |   current_buffer = user_int_buffer;
 | 
|---|
| 828 |   current_pure_buffer = user_int_buffer;
 | 
|---|
| 829 |   for (i=0; i<3*der_centers->n; i++) {
 | 
|---|
| 830 |       transform_2e(integral_, current_buffer, current_pure_buffer,
 | 
|---|
| 831 |                    shell1, shell2, shell3, shell4);
 | 
|---|
| 832 |       current_buffer = ¤t_buffer[ncart];
 | 
|---|
| 833 |       current_pure_buffer = ¤t_pure_buffer[nints];
 | 
|---|
| 834 |     }
 | 
|---|
| 835 | 
 | 
|---|
| 836 |   /* Eliminate redundant integrals, unless flags specifies otherwise. */
 | 
|---|
| 837 |   current_buffer = user_int_buffer;
 | 
|---|
| 838 |   if (!redundant_) {
 | 
|---|
| 839 |     int redundant_offset = 0;
 | 
|---|
| 840 |     int nonredundant_offset = 0;
 | 
|---|
| 841 |     int e12,e13e24,e34;
 | 
|---|
| 842 |     int i;
 | 
|---|
| 843 | 
 | 
|---|
| 844 |     if ((osh[0] == osh[3])&&(osh[1] == osh[2])&&(osh[0] != osh[1])) {
 | 
|---|
| 845 |       ExEnv::errn() << scprintf("nonredundant integrals cannot be generated (1der)\n");
 | 
|---|
| 846 |       fail();
 | 
|---|
| 847 |       }
 | 
|---|
| 848 | 
 | 
|---|
| 849 |     /* Shell equivalence information. */
 | 
|---|
| 850 |     e12 = (osh[0] == osh[1]);
 | 
|---|
| 851 |     e13e24 = ((osh[0] == osh[2]) && (osh[1] == osh[3]));
 | 
|---|
| 852 |     e34 = (osh[2] == osh[3]);
 | 
|---|
| 853 |     if (e12||e13e24||e34) {
 | 
|---|
| 854 |       /* Repack x, y, and z integrals. */
 | 
|---|
| 855 |       for (i=0; i<3*der_centers->n; i++) {
 | 
|---|
| 856 |         nonredundant_erep(current_buffer,e12,e34,e13e24,
 | 
|---|
| 857 |                           shell1->nfunction(),
 | 
|---|
| 858 |                           shell2->nfunction(),
 | 
|---|
| 859 |                           shell3->nfunction(),
 | 
|---|
| 860 |                           shell4->nfunction(),
 | 
|---|
| 861 |                           &redundant_offset,
 | 
|---|
| 862 |                           &nonredundant_offset);
 | 
|---|
| 863 |         }
 | 
|---|
| 864 |       }
 | 
|---|
| 865 |     }
 | 
|---|
| 866 | 
 | 
|---|
| 867 |   /* Return the integral buffers to their normal state. */
 | 
|---|
| 868 |   int_derint_buffer = int_buffer;
 | 
|---|
| 869 |   int_buffer = user_int_buffer;
 | 
|---|
| 870 |   }
 | 
|---|
| 871 | 
 | 
|---|
| 872 | /* This will call compute_erep
 | 
|---|
| 873 |  * to compute the derivatives in terms of order == 0 integrals.
 | 
|---|
| 874 |  * flags are the flags to the int_comp_erep routine
 | 
|---|
| 875 |  * psh1-4 are pointers to the shell numbers
 | 
|---|
| 876 |  * dercenter is 0, 1, 2, or 3 -- the center within the integral
 | 
|---|
| 877 |  *           which we are taking the derivative with respect to.
 | 
|---|
| 878 |  * The results are accumulated in buffer, which cannot be the same
 | 
|---|
| 879 |  * as the current int_buffer.
 | 
|---|
| 880 |  */
 | 
|---|
| 881 | void
 | 
|---|
| 882 | Int2eV3::compute_erep_1der(int flags, double *buffer,
 | 
|---|
| 883 |                            int *psh1, int *psh2, int *psh3, int *psh4,
 | 
|---|
| 884 |                            int dercenter)
 | 
|---|
| 885 | {
 | 
|---|
| 886 |   int ii;
 | 
|---|
| 887 |   int index;
 | 
|---|
| 888 |   int size1,size2,size3,size4,size1234;
 | 
|---|
| 889 |   int sizem234,sizem34,sizem2,sizem3,sizem4;
 | 
|---|
| 890 |   int sizep234,sizep34,sizep2,sizep3,sizep4;
 | 
|---|
| 891 |   GaussianShell *shell1,*shell2,*shell3,*shell4;
 | 
|---|
| 892 | 
 | 
|---|
| 893 | #ifdef DER_TIMING
 | 
|---|
| 894 |   tim_enter("erep_1der");
 | 
|---|
| 895 | #endif
 | 
|---|
| 896 | 
 | 
|---|
| 897 |   /* Set up pointers to the current shells. */
 | 
|---|
| 898 |   shell1 = &bs1_->shell(*psh1);
 | 
|---|
| 899 |   shell2 = &bs2_->shell(*psh2);
 | 
|---|
| 900 |   shell3 = &bs3_->shell(*psh3);
 | 
|---|
| 901 |   shell4 = &bs4_->shell(*psh4);
 | 
|---|
| 902 | 
 | 
|---|
| 903 |   if ((dercenter<0) || (dercenter > 3)) {
 | 
|---|
| 904 |     ExEnv::errn() << scprintf("illegal derivative center -- must be 0, 1, 2, or 3\n");
 | 
|---|
| 905 |     fail();
 | 
|---|
| 906 |     }
 | 
|---|
| 907 | 
 | 
|---|
| 908 |   /* Offsets for the intermediates with original angular momentum. */
 | 
|---|
| 909 |   for (ii=size1=0; ii<shell1->ncontraction(); ii++)
 | 
|---|
| 910 |     size1 += INT_NCART(shell1->am(ii));
 | 
|---|
| 911 |   for (ii=size2=0; ii<shell2->ncontraction(); ii++)
 | 
|---|
| 912 |     size2 += INT_NCART(shell2->am(ii));
 | 
|---|
| 913 |   for (ii=size3=0; ii<shell3->ncontraction(); ii++)
 | 
|---|
| 914 |     size3 += INT_NCART(shell3->am(ii));
 | 
|---|
| 915 |   for (ii=size4=0; ii<shell4->ncontraction(); ii++)
 | 
|---|
| 916 |     size4 += INT_NCART(shell4->am(ii));
 | 
|---|
| 917 | 
 | 
|---|
| 918 |   size1234 = size1*size2*size3*size4;
 | 
|---|
| 919 | 
 | 
|---|
| 920 | #define DCTEST(n) ((dercenter==n)?1:0)
 | 
|---|
| 921 |   /* Offsets for the intermediates with angular momentum decremented. */
 | 
|---|
| 922 |   for (ii=sizem2=0; ii<shell2->ncontraction(); ii++) 
 | 
|---|
| 923 |     sizem2 += INT_NCART(shell2->am(ii)-DCTEST(1));
 | 
|---|
| 924 |   for (ii=sizem3=0; ii<shell3->ncontraction(); ii++) 
 | 
|---|
| 925 |     sizem3 += INT_NCART(shell3->am(ii)-DCTEST(2));
 | 
|---|
| 926 |   for (ii=sizem4=0; ii<shell4->ncontraction(); ii++) 
 | 
|---|
| 927 |     sizem4 += INT_NCART(shell4->am(ii)-DCTEST(3));
 | 
|---|
| 928 |   sizem34 = sizem4 * sizem3;
 | 
|---|
| 929 |   sizem234 = sizem34 * sizem2;
 | 
|---|
| 930 | 
 | 
|---|
| 931 |   /* Offsets for the intermediates with angular momentum incremented. */
 | 
|---|
| 932 |   for (ii=sizep2=0; ii<shell2->ncontraction(); ii++) 
 | 
|---|
| 933 |     sizep2 += INT_NCART(shell2->am(ii)+DCTEST(1));
 | 
|---|
| 934 |   for (ii=sizep3=0; ii<shell3->ncontraction(); ii++) 
 | 
|---|
| 935 |     sizep3 += INT_NCART(shell3->am(ii)+DCTEST(2));
 | 
|---|
| 936 |   for (ii=sizep4=0; ii<shell4->ncontraction(); ii++) 
 | 
|---|
| 937 |     sizep4 += INT_NCART(shell4->am(ii)+DCTEST(3));
 | 
|---|
| 938 |   sizep34 = sizep4 * sizep3;
 | 
|---|
| 939 |   sizep234 = sizep34 * sizep2;
 | 
|---|
| 940 | 
 | 
|---|
| 941 | #ifdef DER_TIMING
 | 
|---|
| 942 |   tim_enter("- erep");
 | 
|---|
| 943 | #endif
 | 
|---|
| 944 | 
 | 
|---|
| 945 |   int old_perm = permute();
 | 
|---|
| 946 |   set_permute(0);
 | 
|---|
| 947 |   int old_red = redundant();
 | 
|---|
| 948 |   set_redundant(1);
 | 
|---|
| 949 |   compute_erep(flags|INT_NOPURE,
 | 
|---|
| 950 |                psh1,psh2,psh3,psh4,
 | 
|---|
| 951 |                    -DCTEST(0),
 | 
|---|
| 952 |                    -DCTEST(1),
 | 
|---|
| 953 |                    -DCTEST(2),
 | 
|---|
| 954 |                    -DCTEST(3));
 | 
|---|
| 955 |   set_permute(old_perm);
 | 
|---|
| 956 |   set_redundant(old_red);
 | 
|---|
| 957 | 
 | 
|---|
| 958 |   /* Trouble if cpp is nonANSI. */
 | 
|---|
| 959 | #define DERLOOP(index,indexp1) \
 | 
|---|
| 960 |    oc##indexp1 = 0;\
 | 
|---|
| 961 |    for ( c##indexp1 =0; c##indexp1 <shell##indexp1->ncontraction(); c##indexp1 ++) {\
 | 
|---|
| 962 |      am[index] = shell##indexp1->am(c##indexp1);\
 | 
|---|
| 963 |      FOR_CART(i[index],j[index],k[index],am[index])
 | 
|---|
| 964 | 
 | 
|---|
| 965 | #define END_DERLOOP(index,indexp1,sign) \
 | 
|---|
| 966 |        END_FOR_CART\
 | 
|---|
| 967 |      oc##indexp1 += INT_NCART(am[index] sign DCTEST(index));\
 | 
|---|
| 968 |      }
 | 
|---|
| 969 | 
 | 
|---|
| 970 | #define ALLDERLOOPS\
 | 
|---|
| 971 |     DERLOOP(0,1)\
 | 
|---|
| 972 |       DERLOOP(1,2)\
 | 
|---|
| 973 |         DERLOOP(2,3)\
 | 
|---|
| 974 |           DERLOOP(3,4)
 | 
|---|
| 975 | 
 | 
|---|
| 976 | #define END_ALLDERLOOPS(sign)\
 | 
|---|
| 977 |             END_DERLOOP(3,4,sign)\
 | 
|---|
| 978 |           END_DERLOOP(2,3,sign)\
 | 
|---|
| 979 |         END_DERLOOP(1,2,sign)\
 | 
|---|
| 980 |       END_DERLOOP(0,1,sign)
 | 
|---|
| 981 | 
 | 
|---|
| 982 |   /* Place the contributions into the user integral buffer. */
 | 
|---|
| 983 |   index = 0;
 | 
|---|
| 984 | 
 | 
|---|
| 985 |   if (dercenter==0) {
 | 
|---|
| 986 |     int ogc1,ogc1m,gc1,i1,k1,f234,size234;
 | 
|---|
| 987 |     size234=size2*size3*size4;
 | 
|---|
| 988 | 
 | 
|---|
| 989 | #ifdef DER_TIMING
 | 
|---|
| 990 |   tim_change("- 0");
 | 
|---|
| 991 | #endif
 | 
|---|
| 992 |     /* The center 0 d/dx integrals */
 | 
|---|
| 993 |     ogc1 = 0;
 | 
|---|
| 994 |     ogc1m = 0;
 | 
|---|
| 995 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 996 |       int am1 = shell1->am(gc1);
 | 
|---|
| 997 |       // only integrals with x^n n>0 on center 0 contribute
 | 
|---|
| 998 |       // so skip over n==0
 | 
|---|
| 999 |       index += (am1+1)*size234;
 | 
|---|
| 1000 |       int c1 = am1+1;
 | 
|---|
| 1001 |       for (i1=1; i1<=am1; i1++) {
 | 
|---|
| 1002 |         double factor = -i1;
 | 
|---|
| 1003 |         for (k1=0; k1<=am1-i1; k1++) {
 | 
|---|
| 1004 |           int c1xm1 = c1-am1-1;//=INT_CARTINDEX(am1-1,i1-1,j1)
 | 
|---|
| 1005 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1006 |           double *tmp_int_buffer=&int_buffer[(ogc1m+c1xm1)*size234];
 | 
|---|
| 1007 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1008 |             tmp_buffer[f234] += factor * tmp_int_buffer[f234];
 | 
|---|
| 1009 |             }
 | 
|---|
| 1010 |           index+=size234;
 | 
|---|
| 1011 |           c1++;
 | 
|---|
| 1012 |           }
 | 
|---|
| 1013 |         }
 | 
|---|
| 1014 |       ogc1 += c1;
 | 
|---|
| 1015 |       ogc1m += INT_NCART(am1-1);
 | 
|---|
| 1016 |       }
 | 
|---|
| 1017 | 
 | 
|---|
| 1018 |     /* The center 0 d/dy integrals */
 | 
|---|
| 1019 |     ogc1 = 0;
 | 
|---|
| 1020 |     ogc1m = 0;
 | 
|---|
| 1021 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 1022 |       int am1 = shell1->am(gc1);
 | 
|---|
| 1023 |       // only integrals with y^n n>0 on center 0 contribute
 | 
|---|
| 1024 |       // so skip over n==0 (by making i1+k1<am1)
 | 
|---|
| 1025 |       int c1 = 0;
 | 
|---|
| 1026 |       for (i1=0; i1<=am1; i1++) {
 | 
|---|
| 1027 |         for (k1=0; k1<=am1-i1-1; k1++) {
 | 
|---|
| 1028 |           double factor = -(am1-i1-k1);
 | 
|---|
| 1029 |           int c1ym1 = c1-i1;//=INT_CARTINDEX(am1-1,i1,j1-1)
 | 
|---|
| 1030 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1031 |           double *tmp_int_buffer=&int_buffer[(ogc1m+c1ym1)*size234];
 | 
|---|
| 1032 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1033 |             tmp_buffer[f234] += factor * tmp_int_buffer[f234];
 | 
|---|
| 1034 |             }
 | 
|---|
| 1035 |           index+=size234;
 | 
|---|
| 1036 |           c1++;
 | 
|---|
| 1037 |           }
 | 
|---|
| 1038 |         // account for the y^n n==0 case by an extra increment
 | 
|---|
| 1039 |         c1++;
 | 
|---|
| 1040 |         index+=size234;
 | 
|---|
| 1041 |         }
 | 
|---|
| 1042 |       ogc1 += c1;
 | 
|---|
| 1043 |       ogc1m += INT_NCART(am1-1);
 | 
|---|
| 1044 |       }
 | 
|---|
| 1045 | 
 | 
|---|
| 1046 |     /* The center 0 d/dz integrals */
 | 
|---|
| 1047 |     ogc1 = 0;
 | 
|---|
| 1048 |     ogc1m = 0;
 | 
|---|
| 1049 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 1050 |       int am1 = shell1->am(gc1);
 | 
|---|
| 1051 |       int c1 = 0;
 | 
|---|
| 1052 |       for (i1=0; i1<=am1; i1++) {
 | 
|---|
| 1053 |         // only integrals with z^n n>0 on center 0 contribute
 | 
|---|
| 1054 |         // so skip over n==0
 | 
|---|
| 1055 |         c1++;
 | 
|---|
| 1056 |         index+=size234;
 | 
|---|
| 1057 |         for (k1=1; k1<=am1-i1; k1++) {
 | 
|---|
| 1058 |           double factor = -k1;
 | 
|---|
| 1059 |           int c1zm1 = c1-i1-1;//=INT_CARTINDEX(am1-1,i1,j1)
 | 
|---|
| 1060 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1061 |           double *tmp_int_buffer=&int_buffer[(ogc1m+c1zm1)*size234];
 | 
|---|
| 1062 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1063 |             tmp_buffer[f234] += factor * tmp_int_buffer[f234];
 | 
|---|
| 1064 |             }
 | 
|---|
| 1065 |           index+=size234;
 | 
|---|
| 1066 |           c1++;
 | 
|---|
| 1067 |           }
 | 
|---|
| 1068 |         }
 | 
|---|
| 1069 |       ogc1 += c1;
 | 
|---|
| 1070 |       ogc1m += INT_NCART(am1-1);
 | 
|---|
| 1071 |       }
 | 
|---|
| 1072 |     }
 | 
|---|
| 1073 |   else if (dercenter == 1) {
 | 
|---|
| 1074 |     int ogc2,ogc2m,gc2,i2,k2,f1,f34,size34,size234;
 | 
|---|
| 1075 |     size34 = size3*size4;
 | 
|---|
| 1076 |     size234 = size2*size3*size4;
 | 
|---|
| 1077 | 
 | 
|---|
| 1078 | #ifdef DER_TIMING
 | 
|---|
| 1079 |   tim_change("- 1");
 | 
|---|
| 1080 | #endif
 | 
|---|
| 1081 |     /* The center 1 d/dx integrals */
 | 
|---|
| 1082 |     ogc2 = 0;
 | 
|---|
| 1083 |     ogc2m = 0;
 | 
|---|
| 1084 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1085 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1086 |       // only integrals with x^n n>0 on center 1 contribute
 | 
|---|
| 1087 |       // so skip over n==0
 | 
|---|
| 1088 |       int c2 = am2+1;
 | 
|---|
| 1089 |       for (i2=1; i2<=am2; i2++) {
 | 
|---|
| 1090 |         double factor = -i2;
 | 
|---|
| 1091 |         for (k2=0; k2<=am2-i2; k2++) {
 | 
|---|
| 1092 |           int c2xm1 = c2-am2-1;//=INT_CARTINDEX(am2-1,i2-1,j2)
 | 
|---|
| 1093 |           int buffer_index = (ogc2+c2)*size34;
 | 
|---|
| 1094 |           int int_buffer_index = (ogc2m+c2xm1)*size34;
 | 
|---|
| 1095 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1096 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1097 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1098 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1099 |                 tmp_buffer[f34] += factor * tmp_int_buffer[f34];
 | 
|---|
| 1100 |               }
 | 
|---|
| 1101 |             buffer_index += size234;
 | 
|---|
| 1102 |             int_buffer_index += sizem234;
 | 
|---|
| 1103 |             }
 | 
|---|
| 1104 |           c2++;
 | 
|---|
| 1105 |           }
 | 
|---|
| 1106 |         }
 | 
|---|
| 1107 |       ogc2 += c2;
 | 
|---|
| 1108 |       ogc2m += INT_NCART(am2-1);
 | 
|---|
| 1109 |       }
 | 
|---|
| 1110 |     index += size1234;
 | 
|---|
| 1111 | 
 | 
|---|
| 1112 |      /* The center 1 d/dy integrals */
 | 
|---|
| 1113 |     ogc2 = 0;
 | 
|---|
| 1114 |     ogc2m = 0;
 | 
|---|
| 1115 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1116 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1117 |       // only integrals with y^n n>0 on center 1 contribute
 | 
|---|
| 1118 |       // so skip over n==0
 | 
|---|
| 1119 |       int c2 = 0;
 | 
|---|
| 1120 |       for (i2=0; i2<=am2; i2++) {
 | 
|---|
| 1121 |         for (k2=0; k2<=am2-i2-1; k2++) {
 | 
|---|
| 1122 |           double factor = -(am2-k2-i2);
 | 
|---|
| 1123 |           int c2ym1 = c2-i2;//=INT_CARTINDEX(am2-1,i2,j2-1)
 | 
|---|
| 1124 |           int buffer_index = size1234 + (ogc2+c2)*size34;
 | 
|---|
| 1125 |           int int_buffer_index = (ogc2m+c2ym1)*size34;
 | 
|---|
| 1126 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1127 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1128 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1129 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1130 |                 tmp_buffer[f34] += factor * tmp_int_buffer[f34];
 | 
|---|
| 1131 |               }
 | 
|---|
| 1132 |             buffer_index += size234;
 | 
|---|
| 1133 |             int_buffer_index += sizem234;
 | 
|---|
| 1134 |             }
 | 
|---|
| 1135 |           c2++;
 | 
|---|
| 1136 |           }
 | 
|---|
| 1137 |         // account for the y^n n==0 case by an extra increment
 | 
|---|
| 1138 |         c2++;
 | 
|---|
| 1139 |         }
 | 
|---|
| 1140 |       ogc2 += c2;
 | 
|---|
| 1141 |       ogc2m += INT_NCART(am2-1);
 | 
|---|
| 1142 |       }
 | 
|---|
| 1143 |     index += size1234;
 | 
|---|
| 1144 | 
 | 
|---|
| 1145 |      /* The center 1 d/dz integrals */
 | 
|---|
| 1146 |     ogc2 = 0;
 | 
|---|
| 1147 |     ogc2m = 0;
 | 
|---|
| 1148 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1149 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1150 |       // only integrals with z^n n>0 on center 1 contribute
 | 
|---|
| 1151 |       // so skip over n==0
 | 
|---|
| 1152 |       int c2 = 0;
 | 
|---|
| 1153 |       for (i2=0; i2<=am2; i2++) {
 | 
|---|
| 1154 |         // account for the z^n n==0 case by an extra increment
 | 
|---|
| 1155 |         c2++;
 | 
|---|
| 1156 |         for (k2=1; k2<=am2-i2; k2++) {
 | 
|---|
| 1157 |           double factor = -k2;
 | 
|---|
| 1158 |           int c2zm1 = c2-i2-1;//=INT_CARTINDEX(am2-1,i2,j2-1)
 | 
|---|
| 1159 |           int buffer_index = size1234+size1234+(ogc2+c2)*size34;
 | 
|---|
| 1160 |           int int_buffer_index = (ogc2m+c2zm1)*size34;
 | 
|---|
| 1161 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1162 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1163 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1164 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1165 |                 tmp_buffer[f34] += factor * tmp_int_buffer[f34];
 | 
|---|
| 1166 |               }
 | 
|---|
| 1167 |             buffer_index += size234;
 | 
|---|
| 1168 |             int_buffer_index += sizem234;
 | 
|---|
| 1169 |             }
 | 
|---|
| 1170 |           c2++;
 | 
|---|
| 1171 |           }
 | 
|---|
| 1172 |         }
 | 
|---|
| 1173 |       ogc2 += c2;
 | 
|---|
| 1174 |       ogc2m += INT_NCART(am2-1);
 | 
|---|
| 1175 |       }
 | 
|---|
| 1176 |     index += size1234;
 | 
|---|
| 1177 |     }
 | 
|---|
| 1178 |   else if (dercenter == 2) {
 | 
|---|
| 1179 |     int ogc3,ogc3m,gc3,i3,k3,f12,f4,size12,size34;
 | 
|---|
| 1180 |     size12 = size1*size2;
 | 
|---|
| 1181 |     size34 = size3*size4;
 | 
|---|
| 1182 | 
 | 
|---|
| 1183 | #ifdef DER_TIMING
 | 
|---|
| 1184 |   tim_change("- 2");
 | 
|---|
| 1185 | #endif
 | 
|---|
| 1186 |     /* The center 2 d/dx integrals */
 | 
|---|
| 1187 |     ogc3 = 0;
 | 
|---|
| 1188 |     ogc3m = 0;
 | 
|---|
| 1189 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1190 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1191 |       // only integrals with x^n n>0 on center 2 contribute
 | 
|---|
| 1192 |       // so skip over n==0
 | 
|---|
| 1193 |       int c3 = am3+1;
 | 
|---|
| 1194 |       for (i3=1; i3<=am3; i3++) {
 | 
|---|
| 1195 |         double factor = -i3;
 | 
|---|
| 1196 |         for (k3=0; k3<=am3-i3; k3++) {
 | 
|---|
| 1197 |           int c3xm1 = c3-am3-1;//=INT_CARTINDEX(am3-1,i3-1,j3)
 | 
|---|
| 1198 |           int buffer_index = (ogc3+c3)*size4;
 | 
|---|
| 1199 |           int int_buffer_index = (ogc3m+c3xm1)*size4;
 | 
|---|
| 1200 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1201 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1202 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1203 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1204 |                 tmp_buffer[f4] += factor * tmp_int_buffer[f4];
 | 
|---|
| 1205 |               }
 | 
|---|
| 1206 |             buffer_index += size34;
 | 
|---|
| 1207 |             int_buffer_index += sizem34;
 | 
|---|
| 1208 |             }
 | 
|---|
| 1209 |           c3++;
 | 
|---|
| 1210 |           }
 | 
|---|
| 1211 |         }
 | 
|---|
| 1212 |       ogc3 += c3;
 | 
|---|
| 1213 |       ogc3m += INT_NCART(am3-1);
 | 
|---|
| 1214 |       }
 | 
|---|
| 1215 |     index += size1234;
 | 
|---|
| 1216 | 
 | 
|---|
| 1217 |      /* The center 2 d/dy integrals */
 | 
|---|
| 1218 |     ogc3 = 0;
 | 
|---|
| 1219 |     ogc3m = 0;
 | 
|---|
| 1220 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1221 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1222 |       // only integrals with y^n n>0 on center 2 contribute
 | 
|---|
| 1223 |       // so skip over n==0
 | 
|---|
| 1224 |       int c3 = 0;
 | 
|---|
| 1225 |       for (i3=0; i3<=am3; i3++) {
 | 
|---|
| 1226 |         for (k3=0; k3<=am3-i3-1; k3++) {
 | 
|---|
| 1227 |           double factor = -(am3-k3-i3);
 | 
|---|
| 1228 |           int c3ym1 = c3-i3;//=INT_CARTINDEX(am3-1,i3,j3-1)
 | 
|---|
| 1229 |           int buffer_index = size1234 + (ogc3+c3)*size4;
 | 
|---|
| 1230 |           int int_buffer_index = (ogc3m+c3ym1)*size4;
 | 
|---|
| 1231 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1232 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1233 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1234 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1235 |                 tmp_buffer[f4] += factor * tmp_int_buffer[f4];
 | 
|---|
| 1236 |               }
 | 
|---|
| 1237 |             buffer_index += size34;
 | 
|---|
| 1238 |             int_buffer_index += sizem34;
 | 
|---|
| 1239 |             }
 | 
|---|
| 1240 |           c3++;
 | 
|---|
| 1241 |           }
 | 
|---|
| 1242 |         // account for the y^n n==0 case by an extra increment
 | 
|---|
| 1243 |         c3++;
 | 
|---|
| 1244 |         }
 | 
|---|
| 1245 |       ogc3 += c3;
 | 
|---|
| 1246 |       ogc3m += INT_NCART(am3-1);
 | 
|---|
| 1247 |       }
 | 
|---|
| 1248 |     index += size1234;
 | 
|---|
| 1249 | 
 | 
|---|
| 1250 |      /* The center 2 d/dz integrals */
 | 
|---|
| 1251 |     ogc3 = 0;
 | 
|---|
| 1252 |     ogc3m = 0;
 | 
|---|
| 1253 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1254 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1255 |       // only integrals with z^n n>0 on center 2 contribute
 | 
|---|
| 1256 |       // so skip over n==0
 | 
|---|
| 1257 |       int c3 = 0;
 | 
|---|
| 1258 |       for (i3=0; i3<=am3; i3++) {
 | 
|---|
| 1259 |         // account for the z^n n==0 case by an extra increment
 | 
|---|
| 1260 |         c3++;
 | 
|---|
| 1261 |         for (k3=1; k3<=am3-i3; k3++) {
 | 
|---|
| 1262 |           double factor = -k3;
 | 
|---|
| 1263 |           int c3zm1 = c3-i3-1;//=INT_CARTINDEX(am3-1,i3,j3)
 | 
|---|
| 1264 |           int buffer_index = size1234+size1234+(ogc3+c3)*size4;
 | 
|---|
| 1265 |           int int_buffer_index = (ogc3m+c3zm1)*size4;
 | 
|---|
| 1266 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1267 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1268 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1269 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1270 |                 tmp_buffer[f4] += factor * tmp_int_buffer[f4];
 | 
|---|
| 1271 |               }
 | 
|---|
| 1272 |             buffer_index += size34;
 | 
|---|
| 1273 |             int_buffer_index += sizem34;
 | 
|---|
| 1274 |             }
 | 
|---|
| 1275 |           c3++;
 | 
|---|
| 1276 |           }
 | 
|---|
| 1277 |         }
 | 
|---|
| 1278 |       ogc3 += c3;
 | 
|---|
| 1279 |       ogc3m += INT_NCART(am3-1);
 | 
|---|
| 1280 |       }
 | 
|---|
| 1281 |     index += size1234;
 | 
|---|
| 1282 |     }
 | 
|---|
| 1283 |   else if (dercenter == 3) {
 | 
|---|
| 1284 |     int ogc4,ogc4m,gc4,i4,k4,f123,size123;
 | 
|---|
| 1285 |     size123 = size1*size2*size3;
 | 
|---|
| 1286 | 
 | 
|---|
| 1287 | #ifdef DER_TIMING
 | 
|---|
| 1288 |   tim_change("- 3");
 | 
|---|
| 1289 | #endif
 | 
|---|
| 1290 |     /* The center 3 d/dx integrals */
 | 
|---|
| 1291 |     ogc4 = 0;
 | 
|---|
| 1292 |     ogc4m = 0;
 | 
|---|
| 1293 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1294 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1295 |       // only integrals with x^n n>0 on center 3 contribute
 | 
|---|
| 1296 |       // so skip over n==0
 | 
|---|
| 1297 |       int c4 = am4+1;
 | 
|---|
| 1298 |       for (i4=1; i4<=am4; i4++) {
 | 
|---|
| 1299 |         double factor = -i4;
 | 
|---|
| 1300 |         for (k4=0; k4<=am4-i4; k4++) {
 | 
|---|
| 1301 |           int c4xm1 = c4-am4-1;//=INT_CARTINDEX(am4-1,i4-1,j4)
 | 
|---|
| 1302 |           int buffer_index = ogc4+c4;
 | 
|---|
| 1303 |           int int_buffer_index = ogc4m+c4xm1;
 | 
|---|
| 1304 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1305 |             buffer[buffer_index] += factor * int_buffer[int_buffer_index];
 | 
|---|
| 1306 |             buffer_index += size4;
 | 
|---|
| 1307 |             int_buffer_index += sizem4;
 | 
|---|
| 1308 |             }
 | 
|---|
| 1309 |           c4++;
 | 
|---|
| 1310 |           }
 | 
|---|
| 1311 |         }
 | 
|---|
| 1312 |       ogc4 += c4;
 | 
|---|
| 1313 |       ogc4m += INT_NCART(am4-1);
 | 
|---|
| 1314 |       }
 | 
|---|
| 1315 |     index += size1234;
 | 
|---|
| 1316 | 
 | 
|---|
| 1317 |      /* The center 3 d/dy integrals */
 | 
|---|
| 1318 |     ogc4 = 0;
 | 
|---|
| 1319 |     ogc4m = 0;
 | 
|---|
| 1320 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1321 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1322 |       // only integrals with y^n n>0 on center 3 contribute
 | 
|---|
| 1323 |       // so skip over n==0
 | 
|---|
| 1324 |       int c4 = 0;
 | 
|---|
| 1325 |       for (i4=0; i4<=am4; i4++) {
 | 
|---|
| 1326 |         for (k4=0; k4<=am4-i4-1; k4++) {
 | 
|---|
| 1327 |           double factor = -(am4-k4-i4);
 | 
|---|
| 1328 |           int c4ym1 = c4-i4;//=INT_CARTINDEX(am4-1,i4,j4-1)
 | 
|---|
| 1329 |           int buffer_index = size1234 + ogc4+c4;
 | 
|---|
| 1330 |           int int_buffer_index = ogc4m+c4ym1;
 | 
|---|
| 1331 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1332 |             buffer[buffer_index] += factor * int_buffer[int_buffer_index];
 | 
|---|
| 1333 |             buffer_index += size4;
 | 
|---|
| 1334 |             int_buffer_index += sizem4;
 | 
|---|
| 1335 |             }
 | 
|---|
| 1336 |           c4++;
 | 
|---|
| 1337 |           }
 | 
|---|
| 1338 |         // account for the y^n n==0 case by an extra increment
 | 
|---|
| 1339 |         c4++;
 | 
|---|
| 1340 |         }
 | 
|---|
| 1341 |       ogc4 += c4;
 | 
|---|
| 1342 |       ogc4m += INT_NCART(am4-1);
 | 
|---|
| 1343 |       }
 | 
|---|
| 1344 |     index += size1234;
 | 
|---|
| 1345 | 
 | 
|---|
| 1346 |     /* The center 3 d/dz integrals */
 | 
|---|
| 1347 |     ogc4 = 0;
 | 
|---|
| 1348 |     ogc4m = 0;
 | 
|---|
| 1349 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1350 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1351 |       // only integrals with z^n n>0 on center 3 contribute
 | 
|---|
| 1352 |       // so skip over n==0
 | 
|---|
| 1353 |       int c4 = 0;
 | 
|---|
| 1354 |       for (i4=0; i4<=am4; i4++) {
 | 
|---|
| 1355 |         // account for the z^n n==0 case by an extra increment
 | 
|---|
| 1356 |         c4++;
 | 
|---|
| 1357 |         for (k4=1; k4<=am4-i4; k4++) {
 | 
|---|
| 1358 |           double factor = -k4;
 | 
|---|
| 1359 |           int c4zm1 = c4-i4-1;//=INT_CARTINDEX(am4-1,i4,j4-1)
 | 
|---|
| 1360 |           int buffer_index = size1234+size1234+ogc4+c4;
 | 
|---|
| 1361 |           int int_buffer_index = ogc4m+c4zm1;
 | 
|---|
| 1362 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1363 |             buffer[buffer_index] += factor * int_buffer[int_buffer_index];
 | 
|---|
| 1364 |             buffer_index += size4;
 | 
|---|
| 1365 |             int_buffer_index += sizem4;
 | 
|---|
| 1366 |             }
 | 
|---|
| 1367 |           c4++;
 | 
|---|
| 1368 |           }
 | 
|---|
| 1369 |         }
 | 
|---|
| 1370 |       ogc4 += c4;
 | 
|---|
| 1371 |       ogc4m += INT_NCART(am4-1);
 | 
|---|
| 1372 |       }
 | 
|---|
| 1373 |     index += size1234;
 | 
|---|
| 1374 |     }
 | 
|---|
| 1375 | 
 | 
|---|
| 1376 | #ifdef DER_TIMING
 | 
|---|
| 1377 |   tim_change("+ erep");
 | 
|---|
| 1378 | #endif
 | 
|---|
| 1379 | 
 | 
|---|
| 1380 |   /* Compute the next contribution to the integrals. */
 | 
|---|
| 1381 |   /* Tell the build routine that we need an exponent weighted contraction
 | 
|---|
| 1382 |    * with the exponents taken from the dercenter and adjust the
 | 
|---|
| 1383 |    * angular momentum of dercenter to the needed value. */
 | 
|---|
| 1384 |   if (dercenter==0) int_expweight1 = 1;
 | 
|---|
| 1385 |   else if (dercenter==1) int_expweight2 = 1;
 | 
|---|
| 1386 |   else if (dercenter==2) int_expweight3 = 1;
 | 
|---|
| 1387 |   else if (dercenter==3) int_expweight4 = 1;
 | 
|---|
| 1388 |   old_perm = permute();
 | 
|---|
| 1389 |   set_permute(0);
 | 
|---|
| 1390 |   old_red = redundant();
 | 
|---|
| 1391 |   set_redundant(1);
 | 
|---|
| 1392 |   compute_erep(flags|INT_NOPURE,
 | 
|---|
| 1393 |                psh1,psh2,psh3,psh4,
 | 
|---|
| 1394 |                      DCTEST(0),
 | 
|---|
| 1395 |                      DCTEST(1),
 | 
|---|
| 1396 |                      DCTEST(2),
 | 
|---|
| 1397 |                      DCTEST(3));
 | 
|---|
| 1398 |   set_permute(old_perm);
 | 
|---|
| 1399 |   set_redundant(old_red);
 | 
|---|
| 1400 |   if (dercenter==0) int_expweight1 = 0;
 | 
|---|
| 1401 |   else if (dercenter==1) int_expweight2 = 0;
 | 
|---|
| 1402 |   else if (dercenter==2) int_expweight3 = 0;
 | 
|---|
| 1403 |   else if (dercenter==3) int_expweight4 = 0;
 | 
|---|
| 1404 | 
 | 
|---|
| 1405 |   /* Place the contributions into the user integral buffer. */
 | 
|---|
| 1406 |   index = 0;
 | 
|---|
| 1407 |   if (dercenter==0) {
 | 
|---|
| 1408 |     int ogc1,ogc1p,gc1,i1,k1,f234,size234;
 | 
|---|
| 1409 |     size234=size2*size3*size4;
 | 
|---|
| 1410 | 
 | 
|---|
| 1411 | #ifdef DER_TIMING
 | 
|---|
| 1412 |   tim_change("+ 0");
 | 
|---|
| 1413 | #endif
 | 
|---|
| 1414 |     /* The center 0 d/dx integrals */
 | 
|---|
| 1415 |     ogc1 = 0;
 | 
|---|
| 1416 |     ogc1p = 0;
 | 
|---|
| 1417 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 1418 |       int am1 = shell1->am(gc1);
 | 
|---|
| 1419 |       int c1 = 0;
 | 
|---|
| 1420 |       for (i1=0; i1<=am1; i1++) {
 | 
|---|
| 1421 |         for (k1=0; k1<=am1-i1; k1++) {
 | 
|---|
| 1422 |           int c1xp1 = c1+am1+2;//=INT_CARTINDEX(am1+1,i1+1,j1)
 | 
|---|
| 1423 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1424 |           double *tmp_int_buffer=&int_buffer[(ogc1p+c1xp1)*size234];
 | 
|---|
| 1425 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1426 |             tmp_buffer[f234] += tmp_int_buffer[f234];
 | 
|---|
| 1427 |             }
 | 
|---|
| 1428 |           index+=size234;
 | 
|---|
| 1429 |           c1++;
 | 
|---|
| 1430 |           }
 | 
|---|
| 1431 |         }
 | 
|---|
| 1432 |       ogc1 += c1;
 | 
|---|
| 1433 |       ogc1p += INT_NCART(am1+1);
 | 
|---|
| 1434 |       }
 | 
|---|
| 1435 | 
 | 
|---|
| 1436 |     /* The center 0 d/dy integrals */
 | 
|---|
| 1437 |     ogc1 = 0;
 | 
|---|
| 1438 |     ogc1p = 0;
 | 
|---|
| 1439 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 1440 |       int am1 = shell1->am(gc1);
 | 
|---|
| 1441 |       int c1 = 0;
 | 
|---|
| 1442 |       for (i1=0; i1<=am1; i1++) {
 | 
|---|
| 1443 |         for (k1=0; k1<=am1-i1; k1++) {
 | 
|---|
| 1444 |           int c1yp1 = c1+i1;//=INT_CARTINDEX(am1+1,i1,j1+1)
 | 
|---|
| 1445 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1446 |           double *tmp_int_buffer=&int_buffer[(ogc1p+c1yp1)*size234];
 | 
|---|
| 1447 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1448 |             tmp_buffer[f234] += tmp_int_buffer[f234];
 | 
|---|
| 1449 |             }
 | 
|---|
| 1450 |           index+=size234;
 | 
|---|
| 1451 |           c1++;
 | 
|---|
| 1452 |           }
 | 
|---|
| 1453 |         }
 | 
|---|
| 1454 |       ogc1 += c1;
 | 
|---|
| 1455 |       ogc1p += INT_NCART(am1+1);
 | 
|---|
| 1456 |       }
 | 
|---|
| 1457 | 
 | 
|---|
| 1458 |     /* The center 0 d/dz integrals */
 | 
|---|
| 1459 |     ogc1 = 0;
 | 
|---|
| 1460 |     ogc1p = 0;
 | 
|---|
| 1461 |     for (gc1=0; gc1<shell1->ncontraction(); gc1++) {
 | 
|---|
| 1462 |       int am1 = shell1->am(gc1);
 | 
|---|
| 1463 |       int c1 = 0;
 | 
|---|
| 1464 |       for (i1=0; i1<=am1; i1++) {
 | 
|---|
| 1465 |         for (k1=0; k1<=am1-i1; k1++) {
 | 
|---|
| 1466 |           int c1zp1 = c1+i1+1;//=INT_CARTINDEX(am1+1,i1,j1)
 | 
|---|
| 1467 |           double *tmp_buffer=&buffer[index];
 | 
|---|
| 1468 |           double *tmp_int_buffer=&int_buffer[(ogc1p+c1zp1)*size234];
 | 
|---|
| 1469 |           for (f234=0; f234<size234; f234++) {
 | 
|---|
| 1470 |             tmp_buffer[f234] += tmp_int_buffer[f234];
 | 
|---|
| 1471 |             }
 | 
|---|
| 1472 |           index+=size234;
 | 
|---|
| 1473 |           c1++;
 | 
|---|
| 1474 |           }
 | 
|---|
| 1475 |         }
 | 
|---|
| 1476 |       ogc1 += c1;
 | 
|---|
| 1477 |       ogc1p += INT_NCART(am1+1);
 | 
|---|
| 1478 |       }
 | 
|---|
| 1479 |     }
 | 
|---|
| 1480 |   else if (dercenter == 1) {
 | 
|---|
| 1481 |     int ogc2,ogc2p,gc2,i2,k2,f1,f34,size34,size234;
 | 
|---|
| 1482 |     size34 = size3*size4;
 | 
|---|
| 1483 |     size234 = size2*size3*size4;
 | 
|---|
| 1484 | 
 | 
|---|
| 1485 | #ifdef DER_TIMING
 | 
|---|
| 1486 |   tim_change("+ 1");
 | 
|---|
| 1487 | #endif
 | 
|---|
| 1488 |     /* The center 1 d/dx integrals */
 | 
|---|
| 1489 |     ogc2 = 0;
 | 
|---|
| 1490 |     ogc2p = 0;
 | 
|---|
| 1491 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1492 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1493 |       int c2=0;
 | 
|---|
| 1494 |       for (i2=0; i2<=am2; i2++) {
 | 
|---|
| 1495 |         for (k2=0; k2<=am2-i2; k2++) {
 | 
|---|
| 1496 |           int c2xp1 = c2+am2+2;//=INT_CARTINDEX(am2+1,i2+1,j2)
 | 
|---|
| 1497 |           int buffer_index = (ogc2+c2)*size34;
 | 
|---|
| 1498 |           int int_buffer_index = (ogc2p+c2xp1)*size34;
 | 
|---|
| 1499 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1500 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1501 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1502 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1503 |                 tmp_buffer[f34] += tmp_int_buffer[f34];
 | 
|---|
| 1504 |               }
 | 
|---|
| 1505 |             buffer_index += size234;
 | 
|---|
| 1506 |             int_buffer_index += sizep234;
 | 
|---|
| 1507 |             }
 | 
|---|
| 1508 |           c2++;
 | 
|---|
| 1509 |           }
 | 
|---|
| 1510 |         }
 | 
|---|
| 1511 |       ogc2 += c2;
 | 
|---|
| 1512 |       ogc2p += INT_NCART(am2+1);
 | 
|---|
| 1513 |       }
 | 
|---|
| 1514 |     index += size1234;
 | 
|---|
| 1515 | 
 | 
|---|
| 1516 |      /* The center 1 d/dy integrals */
 | 
|---|
| 1517 |     ogc2 = 0;
 | 
|---|
| 1518 |     ogc2p = 0;
 | 
|---|
| 1519 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1520 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1521 |       int c2 = 0;
 | 
|---|
| 1522 |       for (i2=0; i2<=am2; i2++) {
 | 
|---|
| 1523 |         for (k2=0; k2<=am2-i2; k2++) {
 | 
|---|
| 1524 |           int c2yp1 = c2+i2;//=INT_CARTINDEX(am2+1,i2,j2+1)
 | 
|---|
| 1525 |           int buffer_index = size1234 + (ogc2+c2)*size34;
 | 
|---|
| 1526 |           int int_buffer_index = (ogc2p+c2yp1)*size34;
 | 
|---|
| 1527 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1528 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1529 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1530 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1531 |                 tmp_buffer[f34] += tmp_int_buffer[f34];
 | 
|---|
| 1532 |               }
 | 
|---|
| 1533 |             buffer_index += size234;
 | 
|---|
| 1534 |             int_buffer_index += sizep234;
 | 
|---|
| 1535 |             }
 | 
|---|
| 1536 |           c2++;
 | 
|---|
| 1537 |           }
 | 
|---|
| 1538 |         }
 | 
|---|
| 1539 |       ogc2 += c2;
 | 
|---|
| 1540 |       ogc2p += INT_NCART(am2+1);
 | 
|---|
| 1541 |       }
 | 
|---|
| 1542 |     index += size1234;
 | 
|---|
| 1543 | 
 | 
|---|
| 1544 |     /* The center 1 d/dz integrals */
 | 
|---|
| 1545 |     ogc2 = 0;
 | 
|---|
| 1546 |     ogc2p = 0;
 | 
|---|
| 1547 |     for (gc2=0; gc2<shell2->ncontraction(); gc2++) {
 | 
|---|
| 1548 |       int am2 = shell2->am(gc2);
 | 
|---|
| 1549 |       int c2 = 0;
 | 
|---|
| 1550 |       for (i2=0; i2<=am2; i2++) {
 | 
|---|
| 1551 |         for (k2=0; k2<=am2-i2; k2++) {
 | 
|---|
| 1552 |           int c2zp1 = c2+i2+1;//=INT_CARTINDEX(am2+1,i2,j2+1)
 | 
|---|
| 1553 |           int buffer_index = size1234+size1234+(ogc2+c2)*size34;
 | 
|---|
| 1554 |           int int_buffer_index = (ogc2p+c2zp1)*size34;
 | 
|---|
| 1555 |           for (f1=0; f1<size1; f1++) {
 | 
|---|
| 1556 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1557 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1558 |             for (f34=0; f34<size34; f34++) {
 | 
|---|
| 1559 |                 tmp_buffer[f34] += tmp_int_buffer[f34];
 | 
|---|
| 1560 |               }
 | 
|---|
| 1561 |             buffer_index += size234;
 | 
|---|
| 1562 |             int_buffer_index += sizep234;
 | 
|---|
| 1563 |             }
 | 
|---|
| 1564 |           c2++;
 | 
|---|
| 1565 |           }
 | 
|---|
| 1566 |         }
 | 
|---|
| 1567 |       ogc2 += c2;
 | 
|---|
| 1568 |       ogc2p += INT_NCART(am2+1);
 | 
|---|
| 1569 |       }
 | 
|---|
| 1570 |     index += size1234;
 | 
|---|
| 1571 |     }
 | 
|---|
| 1572 |   else if (dercenter == 2) {
 | 
|---|
| 1573 |     int ogc3,ogc3p,gc3,i3,k3,f12,f4,size12,size34;
 | 
|---|
| 1574 |     size12 = size1*size2;
 | 
|---|
| 1575 |     size34 = size3*size4;
 | 
|---|
| 1576 | 
 | 
|---|
| 1577 | #ifdef DER_TIMING
 | 
|---|
| 1578 |   tim_change("+ 2");
 | 
|---|
| 1579 | #endif
 | 
|---|
| 1580 |     /* The center 2 d/dx integrals */
 | 
|---|
| 1581 |     ogc3 = 0;
 | 
|---|
| 1582 |     ogc3p = 0;
 | 
|---|
| 1583 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1584 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1585 |       int c3 = 0;
 | 
|---|
| 1586 |       for (i3=0; i3<=am3; i3++) {
 | 
|---|
| 1587 |         for (k3=0; k3<=am3-i3; k3++) {
 | 
|---|
| 1588 |           int c3xp1 = c3+am3+2;//=INT_CARTINDEX(am3+1,i3+1,j3)
 | 
|---|
| 1589 |           int buffer_index = (ogc3+c3)*size4;
 | 
|---|
| 1590 |           int int_buffer_index = (ogc3p+c3xp1)*size4;
 | 
|---|
| 1591 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1592 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1593 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1594 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1595 |                 tmp_buffer[f4] += tmp_int_buffer[f4];
 | 
|---|
| 1596 |               }
 | 
|---|
| 1597 |             buffer_index += size34;
 | 
|---|
| 1598 |             int_buffer_index += sizep34;
 | 
|---|
| 1599 |             }
 | 
|---|
| 1600 |           c3++;
 | 
|---|
| 1601 |           }
 | 
|---|
| 1602 |         }
 | 
|---|
| 1603 |       ogc3 += c3;
 | 
|---|
| 1604 |       ogc3p += INT_NCART(am3+1);
 | 
|---|
| 1605 |       }
 | 
|---|
| 1606 |     index += size1234;
 | 
|---|
| 1607 | 
 | 
|---|
| 1608 |      /* The center 2 d/dy integrals */
 | 
|---|
| 1609 |     ogc3 = 0;
 | 
|---|
| 1610 |     ogc3p = 0;
 | 
|---|
| 1611 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1612 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1613 |       int c3 = 0;
 | 
|---|
| 1614 |       for (i3=0; i3<=am3; i3++) {
 | 
|---|
| 1615 |         for (k3=0; k3<=am3-i3; k3++) {
 | 
|---|
| 1616 |           int c3yp1 = c3+i3;//=INT_CARTINDEX(am3+1,i3,j3+1)
 | 
|---|
| 1617 |           int buffer_index = size1234 + (ogc3+c3)*size4;
 | 
|---|
| 1618 |           int int_buffer_index = (ogc3p+c3yp1)*size4;
 | 
|---|
| 1619 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1620 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1621 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1622 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1623 |                 tmp_buffer[f4] += tmp_int_buffer[f4];
 | 
|---|
| 1624 |               }
 | 
|---|
| 1625 |             buffer_index += size34;
 | 
|---|
| 1626 |             int_buffer_index += sizep34;
 | 
|---|
| 1627 |             }
 | 
|---|
| 1628 |           c3++;
 | 
|---|
| 1629 |           }
 | 
|---|
| 1630 |         }
 | 
|---|
| 1631 |       ogc3 += c3;
 | 
|---|
| 1632 |       ogc3p += INT_NCART(am3+1);
 | 
|---|
| 1633 |       }
 | 
|---|
| 1634 |     index += size1234;
 | 
|---|
| 1635 | 
 | 
|---|
| 1636 |      /* The center 2 d/dz integrals */
 | 
|---|
| 1637 |     ogc3 = 0;
 | 
|---|
| 1638 |     ogc3p = 0;
 | 
|---|
| 1639 |     for (gc3=0; gc3<shell3->ncontraction(); gc3++) {
 | 
|---|
| 1640 |       int am3 = shell3->am(gc3);
 | 
|---|
| 1641 |       int c3 = 0;
 | 
|---|
| 1642 |       for (i3=0; i3<=am3; i3++) {
 | 
|---|
| 1643 |         for (k3=0; k3<=am3-i3; k3++) {
 | 
|---|
| 1644 |           int c3zp1 = c3+i3+1;//=INT_CARTINDEX(am3+1,i3,j3)
 | 
|---|
| 1645 |           int buffer_index = size1234+size1234+(ogc3+c3)*size4;
 | 
|---|
| 1646 |           int int_buffer_index = (ogc3p+c3zp1)*size4;
 | 
|---|
| 1647 |           for (f12=0; f12<size12; f12++) {
 | 
|---|
| 1648 |             double *tmp_buffer=&buffer[buffer_index];
 | 
|---|
| 1649 |             double *tmp_int_buffer=&int_buffer[int_buffer_index];
 | 
|---|
| 1650 |             for (f4=0; f4<size4; f4++) {
 | 
|---|
| 1651 |                 tmp_buffer[f4] += tmp_int_buffer[f4];
 | 
|---|
| 1652 |               }
 | 
|---|
| 1653 |             buffer_index += size34;
 | 
|---|
| 1654 |             int_buffer_index += sizep34;
 | 
|---|
| 1655 |             }
 | 
|---|
| 1656 |           c3++;
 | 
|---|
| 1657 |           }
 | 
|---|
| 1658 |         }
 | 
|---|
| 1659 |       ogc3 += c3;
 | 
|---|
| 1660 |       ogc3p += INT_NCART(am3+1);
 | 
|---|
| 1661 |       }
 | 
|---|
| 1662 |     index += size1234;
 | 
|---|
| 1663 |     }
 | 
|---|
| 1664 |   else if (dercenter == 3) {
 | 
|---|
| 1665 |     int ogc4,ogc4p,gc4,i4,k4,f123,size123;
 | 
|---|
| 1666 |     size123 = size1*size2*size3;
 | 
|---|
| 1667 | 
 | 
|---|
| 1668 | #ifdef DER_TIMING
 | 
|---|
| 1669 |   tim_change("+ 3");
 | 
|---|
| 1670 | #endif
 | 
|---|
| 1671 |     /* The center 3 d/dx integrals */
 | 
|---|
| 1672 |     ogc4 = 0;
 | 
|---|
| 1673 |     ogc4p = 0;
 | 
|---|
| 1674 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1675 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1676 |       int c4 = 0;
 | 
|---|
| 1677 |       for (i4=0; i4<=am4; i4++) {
 | 
|---|
| 1678 |         for (k4=0; k4<=am4-i4; k4++) {
 | 
|---|
| 1679 |           int c4xp1 = c4+am4+2;//=INT_CARTINDEX(am4+1,i4+1,j4)
 | 
|---|
| 1680 |           int buffer_index = ogc4+c4;
 | 
|---|
| 1681 |           int int_buffer_index = ogc4p+c4xp1;
 | 
|---|
| 1682 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1683 |             buffer[buffer_index] += int_buffer[int_buffer_index];
 | 
|---|
| 1684 |             buffer_index += size4;
 | 
|---|
| 1685 |             int_buffer_index += sizep4;
 | 
|---|
| 1686 |             }
 | 
|---|
| 1687 |           c4++;
 | 
|---|
| 1688 |           }
 | 
|---|
| 1689 |         }
 | 
|---|
| 1690 |       ogc4 += c4;
 | 
|---|
| 1691 |       ogc4p += INT_NCART(am4+1);
 | 
|---|
| 1692 |       }
 | 
|---|
| 1693 |     index += size1234;
 | 
|---|
| 1694 | 
 | 
|---|
| 1695 |      /* The center 3 d/dy integrals */
 | 
|---|
| 1696 |     ogc4 = 0;
 | 
|---|
| 1697 |     ogc4p = 0;
 | 
|---|
| 1698 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1699 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1700 |       int c4 = 0;
 | 
|---|
| 1701 |       for (i4=0; i4<=am4; i4++) {
 | 
|---|
| 1702 |         for (k4=0; k4<=am4-i4; k4++) {
 | 
|---|
| 1703 |           int c4yp1 = c4+i4;//=INT_CARTINDEX(am4+1,i4,j4+1)
 | 
|---|
| 1704 |           int buffer_index = size1234 + ogc4+c4;
 | 
|---|
| 1705 |           int int_buffer_index = ogc4p+c4yp1;
 | 
|---|
| 1706 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1707 |             buffer[buffer_index] += int_buffer[int_buffer_index];
 | 
|---|
| 1708 |             buffer_index += size4;
 | 
|---|
| 1709 |             int_buffer_index += sizep4;
 | 
|---|
| 1710 |             }
 | 
|---|
| 1711 |           c4++;
 | 
|---|
| 1712 |           }
 | 
|---|
| 1713 |         }
 | 
|---|
| 1714 |       ogc4 += c4;
 | 
|---|
| 1715 |       ogc4p += INT_NCART(am4+1);
 | 
|---|
| 1716 |       }
 | 
|---|
| 1717 |     index += size1234;
 | 
|---|
| 1718 | 
 | 
|---|
| 1719 |     /* The center 3 d/dz integrals */
 | 
|---|
| 1720 |     ogc4 = 0;
 | 
|---|
| 1721 |     ogc4p = 0;
 | 
|---|
| 1722 |     for (gc4=0; gc4<shell4->ncontraction(); gc4++) {
 | 
|---|
| 1723 |       int am4 = shell4->am(gc4);
 | 
|---|
| 1724 |       int c4 = 0;
 | 
|---|
| 1725 |       for (i4=0; i4<=am4; i4++) {
 | 
|---|
| 1726 |         for (k4=0; k4<=am4-i4; k4++) {
 | 
|---|
| 1727 |           int c4zp1 = c4+i4+1;//=INT_CARTINDEX(am4+1,i4,j4)
 | 
|---|
| 1728 |           int buffer_index = size1234+size1234+ogc4+c4;
 | 
|---|
| 1729 |           int int_buffer_index = ogc4p+c4zp1;
 | 
|---|
| 1730 |           for (f123=0; f123<size123; f123++) {
 | 
|---|
| 1731 |             buffer[buffer_index] += int_buffer[int_buffer_index];
 | 
|---|
| 1732 |             buffer_index += size4;
 | 
|---|
| 1733 |             int_buffer_index += sizep4;
 | 
|---|
| 1734 |             }
 | 
|---|
| 1735 |           c4++;
 | 
|---|
| 1736 |           }
 | 
|---|
| 1737 |         }
 | 
|---|
| 1738 |       ogc4 += c4;
 | 
|---|
| 1739 |       ogc4p += INT_NCART(am4+1);
 | 
|---|
| 1740 |       }
 | 
|---|
| 1741 |     index += size1234;
 | 
|---|
| 1742 |     }
 | 
|---|
| 1743 | #ifdef DER_TIMING
 | 
|---|
| 1744 |   tim_exit(0);
 | 
|---|
| 1745 |   tim_exit(0);
 | 
|---|
| 1746 | #endif
 | 
|---|
| 1747 |   }
 | 
|---|
| 1748 | 
 | 
|---|
| 1749 | void
 | 
|---|
| 1750 | Int2eV3::nonredundant_erep(double *buffer, int e12, int e34, int e13e24,
 | 
|---|
| 1751 |                            int n1, int n2, int n3, int n4,
 | 
|---|
| 1752 |                            int *red_off, int *nonred_off)
 | 
|---|
| 1753 | {
 | 
|---|
| 1754 |   int nonredundant_index;
 | 
|---|
| 1755 |   int i,j,k,l;
 | 
|---|
| 1756 | 
 | 
|---|
| 1757 |   double *redundant_ptr = &buffer[*red_off];
 | 
|---|
| 1758 |   double *nonredundant_ptr = &buffer[*nonred_off];
 | 
|---|
| 1759 | 
 | 
|---|
| 1760 |   nonredundant_index = 0;
 | 
|---|
| 1761 |   int n34 = n3*n4;
 | 
|---|
| 1762 |   for (i=0; i<n1; i++) {
 | 
|---|
| 1763 |     int jmax = INT_MAX2(e12,i,n2);
 | 
|---|
| 1764 |     for (j=0; j<=jmax; j++) {
 | 
|---|
| 1765 |       int kmax = INT_MAX3(e13e24,i,n3);
 | 
|---|
| 1766 |       for (k=0; k<=kmax; k++) {
 | 
|---|
| 1767 |         int lmax = INT_MAX4(e13e24,e34,i,j,k,n4);
 | 
|---|
| 1768 |         for (l=0; l<=lmax; l++) {
 | 
|---|
| 1769 |           nonredundant_ptr[l] = redundant_ptr[l];
 | 
|---|
| 1770 |           }
 | 
|---|
| 1771 |         redundant_ptr += n4;
 | 
|---|
| 1772 |         nonredundant_index += lmax+1;
 | 
|---|
| 1773 |         nonredundant_ptr += lmax+1;
 | 
|---|
| 1774 |         }
 | 
|---|
| 1775 |       redundant_ptr += (n3-(kmax+1))*n4;
 | 
|---|
| 1776 |       }
 | 
|---|
| 1777 |     redundant_ptr += (n2-(jmax+1))*n34;
 | 
|---|
| 1778 |     }
 | 
|---|
| 1779 |   *red_off += n1*n2*n34;
 | 
|---|
| 1780 |   *nonred_off += nonredundant_index;
 | 
|---|
| 1781 |   }
 | 
|---|
| 1782 | 
 | 
|---|
| 1783 | /* This is an alternate interface to int_erep_all1der.  It takes
 | 
|---|
| 1784 |  * as arguments the flags, an integer vector of shell numbers
 | 
|---|
| 1785 |  * and an integer vector which will be filled in with size
 | 
|---|
| 1786 |  * information, if it is non-NULL, and the dercenters pointer. */
 | 
|---|
| 1787 | void
 | 
|---|
| 1788 | Int2eV3::erep_all1der(int *shells, int  *sizes,
 | 
|---|
| 1789 |                       der_centersv3_t *dercenters)
 | 
|---|
| 1790 | {
 | 
|---|
| 1791 |   erep_all1der(shells[0],shells[1],shells[2],shells[3],
 | 
|---|
| 1792 |                dercenters);
 | 
|---|
| 1793 |   if (sizes) {
 | 
|---|
| 1794 |     sizes[0] = bs1_->shell(shells[0]).nfunction();
 | 
|---|
| 1795 |     sizes[1] = bs2_->shell(shells[1]).nfunction();
 | 
|---|
| 1796 |     sizes[2] = bs3_->shell(shells[2]).nfunction();
 | 
|---|
| 1797 |     sizes[3] = bs4_->shell(shells[3]).nfunction();
 | 
|---|
| 1798 |     }
 | 
|---|
| 1799 |   }
 | 
|---|
| 1800 | 
 | 
|---|
| 1801 | void
 | 
|---|
| 1802 | Int2eV3::int_erep_bound1der(int flags, int bsh1, int bsh2, int *size)
 | 
|---|
| 1803 | {
 | 
|---|
| 1804 |   double *current_buffer;
 | 
|---|
| 1805 |   int nints;
 | 
|---|
| 1806 |   double *user_int_buffer;
 | 
|---|
| 1807 |   int i;
 | 
|---|
| 1808 |   GaussianShell *shell1,*shell2,*shell3,*shell4;
 | 
|---|
| 1809 |   int osh[4];
 | 
|---|
| 1810 |   int sh1 = bsh1;
 | 
|---|
| 1811 |   int sh2 = bsh2;
 | 
|---|
| 1812 |   int sh3 = bsh1;
 | 
|---|
| 1813 |   int sh4 = bsh2;
 | 
|---|
| 1814 |   int *psh1 = &sh1;
 | 
|---|
| 1815 |   int *psh2 = &sh2;
 | 
|---|
| 1816 |   int *psh3 = &sh3;
 | 
|---|
| 1817 |   int *psh4 = &sh4;
 | 
|---|
| 1818 |   int ncart;
 | 
|---|
| 1819 |   double *current_pure_buffer;
 | 
|---|
| 1820 | 
 | 
|---|
| 1821 |   /* Set up pointers to the current shells. */
 | 
|---|
| 1822 |   shell1 = &bs1_->shell(*psh1);
 | 
|---|
| 1823 |   shell2 = &bs2_->shell(*psh2);
 | 
|---|
| 1824 |   shell3 = &bs3_->shell(*psh3);
 | 
|---|
| 1825 |   shell4 = &bs4_->shell(*psh4);
 | 
|---|
| 1826 | 
 | 
|---|
| 1827 |   /* Number of cartesian and pure integrals. */
 | 
|---|
| 1828 |   ncart = shell1->ncartesian()*shell2->ncartesian()
 | 
|---|
| 1829 |          *shell3->ncartesian()*shell4->ncartesian();
 | 
|---|
| 1830 |   nints = shell1->nfunction() * shell2->nfunction()
 | 
|---|
| 1831 |         * shell3->nfunction() * shell4->nfunction();
 | 
|---|
| 1832 | 
 | 
|---|
| 1833 |   /* Compute the offset shell numbers. */
 | 
|---|
| 1834 |   osh[0] = *psh1 + bs1_shell_offset_;
 | 
|---|
| 1835 |   osh[1] = *psh2 + bs2_shell_offset_;
 | 
|---|
| 1836 |   osh[2] = *psh3 + bs3_shell_offset_;
 | 
|---|
| 1837 |   osh[3] = *psh4 + bs4_shell_offset_;
 | 
|---|
| 1838 | 
 | 
|---|
| 1839 |   /* Save the location of the int_buffer. */
 | 
|---|
| 1840 |   user_int_buffer = int_buffer;
 | 
|---|
| 1841 |   int_buffer = int_derint_buffer;
 | 
|---|
| 1842 | 
 | 
|---|
| 1843 |   /* Zero out the result integrals. */
 | 
|---|
| 1844 |   for (i=0; i<3*ncart; i++) user_int_buffer[i] = 0.0;
 | 
|---|
| 1845 | 
 | 
|---|
| 1846 |   /* Set the size so it is available to the caller. */
 | 
|---|
| 1847 |   *size = nints * 3;
 | 
|---|
| 1848 | 
 | 
|---|
| 1849 |   current_buffer = user_int_buffer;
 | 
|---|
| 1850 |   int old_perm = permute();
 | 
|---|
| 1851 |   compute_erep_bound1der(flags|INT_NOPURE,current_buffer,
 | 
|---|
| 1852 |                           psh1,psh2,psh3,psh4);
 | 
|---|
| 1853 |   set_permute(old_perm);
 | 
|---|
| 1854 | 
 | 
|---|
| 1855 |   /* Transform to pure am. */
 | 
|---|
| 1856 |   current_buffer = user_int_buffer;
 | 
|---|
| 1857 |   current_pure_buffer = user_int_buffer;
 | 
|---|
| 1858 |   for (i=0; i<3; i++) {
 | 
|---|
| 1859 |       transform_2e(integral_, current_buffer, current_pure_buffer,
 | 
|---|
| 1860 |                    &bs1_->shell(sh1),
 | 
|---|
| 1861 |                    &bs2_->shell(sh2),
 | 
|---|
| 1862 |                    &bs3_->shell(sh3),
 | 
|---|
| 1863 |                    &bs4_->shell(sh4));
 | 
|---|
| 1864 |       current_buffer = ¤t_buffer[ncart];
 | 
|---|
| 1865 |       current_pure_buffer = ¤t_pure_buffer[nints];
 | 
|---|
| 1866 |     }
 | 
|---|
| 1867 | 
 | 
|---|
| 1868 |   /* Eliminate redundant integrals, unless flags specifies otherwise. */
 | 
|---|
| 1869 |   current_buffer = user_int_buffer;
 | 
|---|
| 1870 |   if (!redundant_) {
 | 
|---|
| 1871 |     int redundant_offset = 0;
 | 
|---|
| 1872 |     int nonredundant_offset = 0;
 | 
|---|
| 1873 |     int e12,e13e24,e34;
 | 
|---|
| 1874 |     int i;
 | 
|---|
| 1875 | 
 | 
|---|
| 1876 |     if ((osh[0] == osh[3])&&(osh[1] == osh[2])&&(osh[0] != osh[1])) {
 | 
|---|
| 1877 |       ExEnv::errn() << scprintf("nonredundant integrals cannot be generated (1der)\n");
 | 
|---|
| 1878 |       fail();
 | 
|---|
| 1879 |       }
 | 
|---|
| 1880 | 
 | 
|---|
| 1881 |     /* Shell equivalence information. */
 | 
|---|
| 1882 |     e12 = (osh[0] == osh[1]);
 | 
|---|
| 1883 |     e13e24 = ((osh[0] == osh[2]) && (osh[1] == osh[3]));
 | 
|---|
| 1884 |     e34 = (osh[2] == osh[3]);
 | 
|---|
| 1885 |     /* Repack x, y, and z integrals. */
 | 
|---|
| 1886 |     for (i=0; i<3; i++) {
 | 
|---|
| 1887 |       nonredundant_erep(current_buffer,e12,e34,e13e24,
 | 
|---|
| 1888 |                              shell1->nfunction(),
 | 
|---|
| 1889 |                              shell2->nfunction(),
 | 
|---|
| 1890 |                              shell3->nfunction(),
 | 
|---|
| 1891 |                              shell4->nfunction(),
 | 
|---|
| 1892 |                              &redundant_offset,
 | 
|---|
| 1893 |                              &nonredundant_offset);
 | 
|---|
| 1894 |       }
 | 
|---|
| 1895 |     }
 | 
|---|
| 1896 | 
 | 
|---|
| 1897 |   /* Return the integral buffers to their normal state. */
 | 
|---|
| 1898 |   int_derint_buffer = int_buffer;
 | 
|---|
| 1899 |   int_buffer = user_int_buffer;
 | 
|---|
| 1900 |   }
 | 
|---|
| 1901 | 
 | 
|---|
| 1902 | /* This routine computes a quantity needed to compute the
 | 
|---|
| 1903 |  * derivative integral bounds.
 | 
|---|
| 1904 |  * It fills int_buffer with (sh1+i sh2|sh1+i sh2).
 | 
|---|
| 1905 |  */
 | 
|---|
| 1906 | void
 | 
|---|
| 1907 | Int2eV3::compute_erep_bound1der(int flags, double *buffer,
 | 
|---|
| 1908 |                                 int *psh1, int *psh2, int *psh3, int *psh4)
 | 
|---|
| 1909 | {
 | 
|---|
| 1910 |   int oc1,oc2,oc3,oc4;
 | 
|---|
| 1911 |   int ii;
 | 
|---|
| 1912 |   int c1,c2,c3,c4;
 | 
|---|
| 1913 |   int i[4],j[4],k[4],am[4];
 | 
|---|
| 1914 |   int index;
 | 
|---|
| 1915 |   int sizem234,sizem34,sizem2,sizem3,sizem4;
 | 
|---|
| 1916 |   int sizep234,sizep34,sizep2,sizep3,sizep4;
 | 
|---|
| 1917 |   int sizepm234,sizepm34,sizepm2,sizepm3,sizepm4;
 | 
|---|
| 1918 |   GaussianShell *shell1,*shell2,*shell3,*shell4;
 | 
|---|
| 1919 | 
 | 
|---|
| 1920 |   /* Set up pointers to the current shells. */
 | 
|---|
| 1921 |   shell1 = &bs1_->shell(*psh1);
 | 
|---|
| 1922 |   shell2 = &bs2_->shell(*psh2);
 | 
|---|
| 1923 |   shell3 = &bs3_->shell(*psh3);
 | 
|---|
| 1924 |   shell4 = &bs4_->shell(*psh4);
 | 
|---|
| 1925 | 
 | 
|---|
| 1926 | #define DCT1(n) ((((n)==0)||((n)==2))?1:0)
 | 
|---|
| 1927 | #define DCT2(n) ((((n)==0)||((n)==2))?((((n)==0))?1:-1):0)
 | 
|---|
| 1928 |   /* Offsets for the intermediates with angular momentum decremented. */
 | 
|---|
| 1929 |   for (ii=sizem2=0; ii<shell2->ncontraction(); ii++) 
 | 
|---|
| 1930 |     sizem2 += INT_NCART(shell2->am(ii)-DCT1(1));
 | 
|---|
| 1931 |   for (ii=sizem3=0; ii<shell3->ncontraction(); ii++) 
 | 
|---|
| 1932 |     sizem3 += INT_NCART(shell3->am(ii)-DCT1(2));
 | 
|---|
| 1933 |   for (ii=sizem4=0; ii<shell4->ncontraction(); ii++) 
 | 
|---|
| 1934 |     sizem4 += INT_NCART(shell4->am(ii)-DCT1(3));
 | 
|---|
| 1935 |   sizem34 = sizem4 * sizem3;
 | 
|---|
| 1936 |   sizem234 = sizem34 * sizem2;
 | 
|---|
| 1937 | 
 | 
|---|
| 1938 |   /* Offsets for the intermediates with angular momentum incremented. */
 | 
|---|
| 1939 |   for (ii=sizep2=0; ii<shell2->ncontraction(); ii++) 
 | 
|---|
| 1940 |     sizep2 += INT_NCART(shell2->am(ii)+DCT1(1));
 | 
|---|
| 1941 |   for (ii=sizep3=0; ii<shell3->ncontraction(); ii++) 
 | 
|---|
| 1942 |     sizep3 += INT_NCART(shell3->am(ii)+DCT1(2));
 | 
|---|
| 1943 |   for (ii=sizep4=0; ii<shell4->ncontraction(); ii++) 
 | 
|---|
| 1944 |     sizep4 += INT_NCART(shell4->am(ii)+DCT1(3));
 | 
|---|
| 1945 |   sizep34 = sizep4 * sizep3;
 | 
|---|
| 1946 |   sizep234 = sizep34 * sizep2;
 | 
|---|
| 1947 | 
 | 
|---|
| 1948 |   /* Offsets for the intermediates with angular momentum incremented and
 | 
|---|
| 1949 |    * decremented. */
 | 
|---|
| 1950 |   for (ii=sizepm2=0; ii<shell2->ncontraction(); ii++) 
 | 
|---|
| 1951 |     sizepm2 += INT_NCART(shell2->am(ii)+DCT2(1));
 | 
|---|
| 1952 |   for (ii=sizepm3=0; ii<shell3->ncontraction(); ii++) 
 | 
|---|
| 1953 |     sizepm3 += INT_NCART(shell3->am(ii)+DCT2(2));
 | 
|---|
| 1954 |   for (ii=sizepm4=0; ii<shell4->ncontraction(); ii++) 
 | 
|---|
| 1955 |     sizepm4 += INT_NCART(shell4->am(ii)+DCT2(3));
 | 
|---|
| 1956 |   sizepm34 = sizepm4 * sizepm3;
 | 
|---|
| 1957 |   sizepm234 = sizepm34 * sizepm2;
 | 
|---|
| 1958 | 
 | 
|---|
| 1959 |   /* END_DERLOOP must be redefined here because it previously depended
 | 
|---|
| 1960 |    * on the DCTEST macro */
 | 
|---|
| 1961 | #undef END_DERLOOP
 | 
|---|
| 1962 | #define END_DERLOOP(index,indexp1,sign) \
 | 
|---|
| 1963 |        END_FOR_CART\
 | 
|---|
| 1964 |      oc##indexp1 += INT_NCART(am[index] sign DCT1(index));\
 | 
|---|
| 1965 |      }
 | 
|---|
| 1966 | 
 | 
|---|
| 1967 | #undef END_ALLDERLOOPS
 | 
|---|
| 1968 | #define END_ALLDERLOOPS(sign)\
 | 
|---|
| 1969 |             END_DERLOOP(3,4,sign)\
 | 
|---|
| 1970 |           END_DERLOOP(2,3,sign)\
 | 
|---|
| 1971 |         END_DERLOOP(1,2,sign)\
 | 
|---|
| 1972 |       END_DERLOOP(0,1,sign)
 | 
|---|
| 1973 | 
 | 
|---|
| 1974 |   int old_perm = permute();
 | 
|---|
| 1975 |   set_permute(0);
 | 
|---|
| 1976 |   int old_red = redundant();
 | 
|---|
| 1977 |   set_redundant(1);
 | 
|---|
| 1978 |   compute_erep(flags,psh1,psh2,psh3,psh4,
 | 
|---|
| 1979 |                    -DCT1(0),
 | 
|---|
| 1980 |                    -DCT1(1),
 | 
|---|
| 1981 |                    -DCT1(2),
 | 
|---|
| 1982 |                    -DCT1(3));
 | 
|---|
| 1983 |   set_permute(old_perm);
 | 
|---|
| 1984 |   set_redundant(old_red);
 | 
|---|
| 1985 | 
 | 
|---|
| 1986 |    /* Place the contributions into the user integral buffer. */
 | 
|---|
| 1987 |    index = 0;
 | 
|---|
| 1988 |    /* The d/dx integrals */
 | 
|---|
| 1989 |   ALLDERLOOPS
 | 
|---|
| 1990 |     if (i[0]>0 && i[2]>0) {
 | 
|---|
| 1991 |       buffer[index] += i[0] * i[2] * int_buffer[
 | 
|---|
| 1992 |         (oc1 + INT_CARTINDEX(am[0]-DCT1(0),i[0]-DCT1(0),j[0])) * sizem234
 | 
|---|
| 1993 |        +(oc2 + INT_CARTINDEX(am[1]-DCT1(1),i[1]-DCT1(1),j[1])) * sizem34
 | 
|---|
| 1994 |        +(oc3 + INT_CARTINDEX(am[2]-DCT1(2),i[2]-DCT1(2),j[2])) * sizem4
 | 
|---|
| 1995 |        +(oc4 + INT_CARTINDEX(am[3]-DCT1(3),i[3]-DCT1(3),j[3]))
 | 
|---|
| 1996 |        ];
 | 
|---|
| 1997 |       }
 | 
|---|
| 1998 |     index++;
 | 
|---|
| 1999 |     END_ALLDERLOOPS(-)
 | 
|---|
| 2000 | 
 | 
|---|
| 2001 |    /* The d/dy integrals */
 | 
|---|
| 2002 |   ALLDERLOOPS
 | 
|---|
| 2003 |     if (j[0]>0 && j[2]>0) {
 | 
|---|
| 2004 |     buffer[index] += j[0] * j[2] * int_buffer[
 | 
|---|
| 2005 |          (oc1 + INT_CARTINDEX(am[0]-DCT1(0),i[0],j[0]-DCT1(0))) * sizem234
 | 
|---|
| 2006 |         +(oc2 + INT_CARTINDEX(am[1]-DCT1(1),i[1],j[1]-DCT1(1))) * sizem34
 | 
|---|
| 2007 |         +(oc3 + INT_CARTINDEX(am[2]-DCT1(2),i[2],j[2]-DCT1(2))) * sizem4
 | 
|---|
| 2008 |         +(oc4 + INT_CARTINDEX(am[3]-DCT1(3),i[3],j[3]-DCT1(3)))
 | 
|---|
| 2009 |         ];
 | 
|---|
| 2010 |       }
 | 
|---|
| 2011 |     index++;
 | 
|---|
| 2012 |   END_ALLDERLOOPS(-)
 | 
|---|
| 2013 | 
 | 
|---|
| 2014 |    /* The d/dz integrals */
 | 
|---|
| 2015 |   ALLDERLOOPS
 | 
|---|
| 2016 |     if (k[0]>0 && k[2]>0) {
 | 
|---|
| 2017 |     buffer[index] += k[0] * k[2] * int_buffer[
 | 
|---|
| 2018 |          (oc1 + INT_CARTINDEX(am[0]-DCT1(0),i[0],j[0])) * sizem234
 | 
|---|
| 2019 |         +(oc2 + INT_CARTINDEX(am[1]-DCT1(1),i[1],j[1])) * sizem34
 | 
|---|
| 2020 |         +(oc3 + INT_CARTINDEX(am[2]-DCT1(2),i[2],j[2])) * sizem4
 | 
|---|
| 2021 |         +(oc4 + INT_CARTINDEX(am[3]-DCT1(3),i[3],j[3]))
 | 
|---|
| 2022 |         ];
 | 
|---|
| 2023 |       }
 | 
|---|
| 2024 |     index++;
 | 
|---|
| 2025 |   END_ALLDERLOOPS(-)
 | 
|---|
| 2026 | 
 | 
|---|
| 2027 |   /* Compute the next contribution to the integrals. */
 | 
|---|
| 2028 |   /* Tell the build routine that we need an exponent weighted contraction
 | 
|---|
| 2029 |    * with the exponents taken from the dercenter and adjust the
 | 
|---|
| 2030 |    * angular momentum of dercenter to the needed value. */
 | 
|---|
| 2031 |   int_expweight1 = 1;
 | 
|---|
| 2032 |   int_expweight3 = 1;
 | 
|---|
| 2033 |   old_perm = permute();
 | 
|---|
| 2034 |   set_permute(0);
 | 
|---|
| 2035 |   old_red = redundant();
 | 
|---|
| 2036 |   set_redundant(1);
 | 
|---|
| 2037 |   compute_erep(flags,psh1,psh2,psh3,psh4,
 | 
|---|
| 2038 |                      DCT1(0),
 | 
|---|
| 2039 |                      DCT1(1),
 | 
|---|
| 2040 |                      DCT1(2),
 | 
|---|
| 2041 |                      DCT1(3));
 | 
|---|
| 2042 |   set_permute(old_perm);
 | 
|---|
| 2043 |   set_redundant(old_red);
 | 
|---|
| 2044 |   int_expweight1 = 0;
 | 
|---|
| 2045 |   int_expweight3 = 0;
 | 
|---|
| 2046 | 
 | 
|---|
| 2047 |   /* Place the contributions into the user integral buffer. */
 | 
|---|
| 2048 |   index = 0;
 | 
|---|
| 2049 |   /* The d/dx integrals */
 | 
|---|
| 2050 |   ALLDERLOOPS
 | 
|---|
| 2051 |           buffer[index] += int_buffer[
 | 
|---|
| 2052 |              (oc1+INT_CARTINDEX(am[0]+DCT1(0),i[0]+DCT1(0),j[0]))*sizep234
 | 
|---|
| 2053 |             +(oc2+INT_CARTINDEX(am[1]+DCT1(1),i[1]+DCT1(1),j[1]))*sizep34
 | 
|---|
| 2054 |             +(oc3+INT_CARTINDEX(am[2]+DCT1(2),i[2]+DCT1(2),j[2]))*sizep4
 | 
|---|
| 2055 |             +(oc4+INT_CARTINDEX(am[3]+DCT1(3),i[3]+DCT1(3),j[3]))
 | 
|---|
| 2056 |             ];
 | 
|---|
| 2057 |     index++;
 | 
|---|
| 2058 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2059 | 
 | 
|---|
| 2060 |   /* The d/dy integrals */
 | 
|---|
| 2061 |   ALLDERLOOPS
 | 
|---|
| 2062 |           buffer[index] += int_buffer[
 | 
|---|
| 2063 |              (oc1+INT_CARTINDEX(am[0]+DCT1(0),i[0],j[0]+DCT1(0)))*sizep234
 | 
|---|
| 2064 |             +(oc2+INT_CARTINDEX(am[1]+DCT1(1),i[1],j[1]+DCT1(1)))*sizep34
 | 
|---|
| 2065 |             +(oc3+INT_CARTINDEX(am[2]+DCT1(2),i[2],j[2]+DCT1(2)))*sizep4
 | 
|---|
| 2066 |             +(oc4+INT_CARTINDEX(am[3]+DCT1(3),i[3],j[3]+DCT1(3)))
 | 
|---|
| 2067 |             ];
 | 
|---|
| 2068 |           index++;
 | 
|---|
| 2069 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2070 | 
 | 
|---|
| 2071 |   /* The d/dz integrals */
 | 
|---|
| 2072 |   ALLDERLOOPS
 | 
|---|
| 2073 |           buffer[index] += int_buffer[
 | 
|---|
| 2074 |                (oc1 + INT_CARTINDEX(am[0]+DCT1(0),i[0],j[0])) * sizep234
 | 
|---|
| 2075 |               +(oc2 + INT_CARTINDEX(am[1]+DCT1(1),i[1],j[1])) * sizep34
 | 
|---|
| 2076 |               +(oc3 + INT_CARTINDEX(am[2]+DCT1(2),i[2],j[2])) * sizep4
 | 
|---|
| 2077 |               +(oc4 + INT_CARTINDEX(am[3]+DCT1(3),i[3],j[3]))
 | 
|---|
| 2078 |               ];
 | 
|---|
| 2079 |           index++;
 | 
|---|
| 2080 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2081 | 
 | 
|---|
| 2082 |   /* END_DERLOOP must be redefined here because it previously depended
 | 
|---|
| 2083 |    * on the DCT1 macro */
 | 
|---|
| 2084 | #undef END_DERLOOP
 | 
|---|
| 2085 | #define END_DERLOOP(index,indexp1,sign) \
 | 
|---|
| 2086 |        END_FOR_CART\
 | 
|---|
| 2087 |      oc##indexp1 += INT_NCART(am[index] sign DCT2(index));\
 | 
|---|
| 2088 |      }
 | 
|---|
| 2089 | 
 | 
|---|
| 2090 | #undef END_ALLDERLOOPS
 | 
|---|
| 2091 | #define END_ALLDERLOOPS(sign)\
 | 
|---|
| 2092 |             END_DERLOOP(3,4,sign)\
 | 
|---|
| 2093 |           END_DERLOOP(2,3,sign)\
 | 
|---|
| 2094 |         END_DERLOOP(1,2,sign)\
 | 
|---|
| 2095 |       END_DERLOOP(0,1,sign)
 | 
|---|
| 2096 | 
 | 
|---|
| 2097 |   /* Compute the next contribution to the integrals. */
 | 
|---|
| 2098 |   /* Tell the build routine that we need an exponent weighted contraction
 | 
|---|
| 2099 |    * with the exponents taken from the dercenter and adjust the
 | 
|---|
| 2100 |    * angular momentum of dercenter to the needed value. */
 | 
|---|
| 2101 |   int_expweight1 = 1;
 | 
|---|
| 2102 |   old_perm = permute();
 | 
|---|
| 2103 |   set_permute(0);
 | 
|---|
| 2104 |   old_red = redundant();
 | 
|---|
| 2105 |   set_redundant(1);
 | 
|---|
| 2106 |   compute_erep(flags,psh1,psh2,psh3,psh4,
 | 
|---|
| 2107 |                      DCT2(0),
 | 
|---|
| 2108 |                      DCT2(1),
 | 
|---|
| 2109 |                      DCT2(2),
 | 
|---|
| 2110 |                      DCT2(3));
 | 
|---|
| 2111 |   set_permute(old_perm);
 | 
|---|
| 2112 |   set_redundant(old_red);
 | 
|---|
| 2113 |   int_expweight1 = 0;
 | 
|---|
| 2114 | 
 | 
|---|
| 2115 |   /* Place the contributions into the user integral buffer. */
 | 
|---|
| 2116 |   index = 0;
 | 
|---|
| 2117 |   /* The d/dx integrals */
 | 
|---|
| 2118 |   ALLDERLOOPS
 | 
|---|
| 2119 |     if (i[2] > 0)  {
 | 
|---|
| 2120 |           buffer[index] -= 2.0 * int_buffer[
 | 
|---|
| 2121 |              (oc1+INT_CARTINDEX(am[0]+DCT2(0),i[0]+DCT2(0),j[0]))*sizepm234
 | 
|---|
| 2122 |             +(oc2+INT_CARTINDEX(am[1]+DCT2(1),i[1]+DCT2(1),j[1]))*sizepm34
 | 
|---|
| 2123 |             +(oc3+INT_CARTINDEX(am[2]+DCT2(2),i[2]+DCT2(2),j[2]))*sizepm4
 | 
|---|
| 2124 |             +(oc4+INT_CARTINDEX(am[3]+DCT2(3),i[3]+DCT2(3),j[3]))
 | 
|---|
| 2125 |             ];
 | 
|---|
| 2126 |        }
 | 
|---|
| 2127 |     index++;
 | 
|---|
| 2128 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2129 | 
 | 
|---|
| 2130 |   /* The d/dy integrals */
 | 
|---|
| 2131 |   ALLDERLOOPS
 | 
|---|
| 2132 |     if (j[2] > 0)  {
 | 
|---|
| 2133 |           buffer[index] -= 2.0 * int_buffer[
 | 
|---|
| 2134 |              (oc1+INT_CARTINDEX(am[0]+DCT2(0),i[0],j[0]+DCT2(0)))*sizepm234
 | 
|---|
| 2135 |             +(oc2+INT_CARTINDEX(am[1]+DCT2(1),i[1],j[1]+DCT2(1)))*sizepm34
 | 
|---|
| 2136 |             +(oc3+INT_CARTINDEX(am[2]+DCT2(2),i[2],j[2]+DCT2(2)))*sizepm4
 | 
|---|
| 2137 |             +(oc4+INT_CARTINDEX(am[3]+DCT2(3),i[3],j[3]+DCT2(3)))
 | 
|---|
| 2138 |             ];
 | 
|---|
| 2139 |        }
 | 
|---|
| 2140 |     index++;
 | 
|---|
| 2141 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2142 | 
 | 
|---|
| 2143 |   /* The d/dz integrals */
 | 
|---|
| 2144 |   ALLDERLOOPS
 | 
|---|
| 2145 |     if (k[2] > 0)  {
 | 
|---|
| 2146 |           buffer[index] -= 2.0 * int_buffer[
 | 
|---|
| 2147 |                (oc1 + INT_CARTINDEX(am[0]+DCT2(0),i[0],j[0])) * sizepm234
 | 
|---|
| 2148 |               +(oc2 + INT_CARTINDEX(am[1]+DCT2(1),i[1],j[1])) * sizepm34
 | 
|---|
| 2149 |               +(oc3 + INT_CARTINDEX(am[2]+DCT2(2),i[2],j[2])) * sizepm4
 | 
|---|
| 2150 |               +(oc4 + INT_CARTINDEX(am[3]+DCT2(3),i[3],j[3]))
 | 
|---|
| 2151 |               ];
 | 
|---|
| 2152 |        }
 | 
|---|
| 2153 |     index++;
 | 
|---|
| 2154 |     END_ALLDERLOOPS(+)
 | 
|---|
| 2155 |   }
 | 
|---|
| 2156 | 
 | 
|---|
| 2157 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
| 2158 | 
 | 
|---|
| 2159 | // Local Variables:
 | 
|---|
| 2160 | // mode: c++
 | 
|---|
| 2161 | // c-file-style: "CLJ-CONDENSED"
 | 
|---|
| 2162 | // End:
 | 
|---|