BL2_AO.cc

Go to the documentation of this file.
00001 
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 #include <math.h>
00011 #include <libciomr/libciomr.h>
00012 #include <libpsio/psio.h>
00013 #include <libiwl/iwl.h>
00014 #include <libdpd/dpd.h>
00015 #include <libqt/qt.h>
00016 #include <psifiles.h>
00017 #include "MOInfo.h"
00018 #include "Params.h"
00019 #define EXTERN
00020 #include "globals.h"
00021 
00022 namespace psi { namespace cclambda {
00023 
00024 void halftrans(dpdbuf4 *Buf1, int dpdnum1, dpdbuf4 *Buf2, int dpdnum2, double ***C, int nirreps, 
00025                int **mo_row, int **so_row, int *mospi, int *sospi, int type, double alpha, double beta);
00026 
00027 void AO_contribute(int p, int q, int r, int s, double value, 
00028                    dpdbuf4 *tau1_AO, dpdbuf4 *tau2_AO, int anti);
00029 
00030 void BL2_AO(int L_irr)
00031 {
00032   int h, nirreps, i, Gc, Gd, Ga, Gb, ij;
00033   double ***C, **X;
00034   int *orbspi, *virtpi;
00035   int **T2_cd_row_start, **T2_pq_row_start, offset, cd, pq;
00036   dpdbuf4 tau, t2, tau1_AO, tau2_AO;
00037   psio_address next;
00038   struct iwlbuf InBuf;
00039   int idx, p, q, r, s, filenum;
00040   int lastbuf;
00041   double value, tolerance=1e-14;
00042   Value *valptr;
00043   Label *lblptr;
00044 
00045   nirreps = moinfo.nirreps;
00046   orbspi = moinfo.orbspi;
00047   virtpi = moinfo.virtpi;
00048   C = moinfo.C;
00049 
00050   T2_cd_row_start = init_int_matrix(nirreps,nirreps);
00051   for(h=0; h < nirreps; h++) {
00052     for(Gc=0,offset=0; Gc < nirreps; Gc++) {
00053       Gd = Gc ^ h;
00054       T2_cd_row_start[h][Gc] = offset;
00055       offset += virtpi[Gc] * virtpi[Gd];
00056     }
00057   }
00058 
00059   T2_pq_row_start = init_int_matrix(nirreps,nirreps);
00060   for(h=0; h < nirreps; h++) {
00061     for(Gc=0,offset=0; Gc < nirreps; Gc++) {
00062       Gd = Gc ^ h;
00063       T2_pq_row_start[h][Gc] = offset;
00064       offset += orbspi[Gc] * orbspi[Gd];
00065     }
00066   }
00067 
00068   /************************************* AA *****************************************/
00069 
00070   dpd_set_default(1);
00071   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIJPQ (1)");
00072   dpd_buf4_scm(&tau1_AO, 0.0);
00073 
00074   dpd_set_default(0);
00075   dpd_buf4_init(&tau, CC_LAMBDA, L_irr, 0, 5, 2, 7, 0, "LIJAB");
00076 
00077   halftrans(&tau, 0, &tau1_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00078             virtpi, orbspi, 0, 1.0, 0.0);
00079 
00080   dpd_buf4_close(&tau);
00081   dpd_buf4_close(&tau1_AO);
00082 
00083   dpd_set_default(1);
00084   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIJPQ (1)");
00085   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIJPQ (2)");
00086   dpd_buf4_scm(&tau2_AO, 0.0);
00087 
00088   for(h=0; h < nirreps; h++) {
00089     dpd_buf4_mat_irrep_init(&tau1_AO, h);
00090     dpd_buf4_mat_irrep_rd(&tau1_AO, h);
00091     dpd_buf4_mat_irrep_init(&tau2_AO, h);
00092   }
00093 
00094   iwl_buf_init(&InBuf, PSIF_SO_TEI, tolerance, 1, 1);
00095 
00096   lblptr = InBuf.labels;
00097   valptr = InBuf.values;
00098   lastbuf = InBuf.lastbuf;
00099 
00100   for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00101     p = abs((int) lblptr[idx++]);
00102     q = (int) lblptr[idx++];
00103     r = (int) lblptr[idx++];
00104     s = (int) lblptr[idx++];
00105 
00106     value = (double) valptr[InBuf.idx];
00107 
00108     /*    fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00109 
00110     AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 1);
00111 
00112   }
00113   while(!lastbuf) {
00114     iwl_buf_fetch(&InBuf);
00115     lastbuf = InBuf.lastbuf;
00116     for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00117       p = abs((int) lblptr[idx++]);
00118       q = (int) lblptr[idx++];
00119       r = (int) lblptr[idx++];
00120       s = (int) lblptr[idx++];
00121 
00122       value = (double) valptr[InBuf.idx];
00123 
00124       /*      fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00125 
00126       AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 1);
00127 
00128     }
00129   }
00130 
00131   iwl_buf_close(&InBuf, 1);
00132 
00133   for(h=0; h < nirreps; h++) {
00134     dpd_buf4_mat_irrep_wrt(&tau2_AO, h);
00135     dpd_buf4_mat_irrep_close(&tau2_AO, h);
00136     dpd_buf4_mat_irrep_close(&tau1_AO, h);
00137   }
00138   dpd_buf4_close(&tau1_AO);
00139   dpd_buf4_close(&tau2_AO);
00140 
00141 
00142   dpd_set_default(1);
00143   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIJPQ (2)");
00144 
00145   dpd_set_default(0);
00146   dpd_buf4_init(&t2, CC_LAMBDA, L_irr, 0, 5, 2, 7, 0, "New LIJAB");
00147 
00148   halftrans(&t2, 0, &tau2_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00149             virtpi, orbspi, 1, 0.5, 1.0);
00150 
00151   dpd_buf4_close(&t2);
00152   dpd_buf4_close(&tau2_AO);
00153 
00154   /************************************* BB *****************************************/
00155 
00156   dpd_set_default(1);
00157   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "Lijpq (1)");
00158   dpd_buf4_scm(&tau1_AO, 0.0);
00159 
00160   dpd_set_default(0);
00161   dpd_buf4_init(&tau, CC_LAMBDA, L_irr, 0, 5, 2, 7, 0, "Lijab");
00162 
00163   halftrans(&tau, 0, &tau1_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00164             virtpi, orbspi, 0, 1.0, 0.0);
00165 
00166   dpd_buf4_close(&tau);
00167   dpd_buf4_close(&tau1_AO);
00168 
00169   dpd_set_default(1);
00170   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "Lijpq (1)");
00171   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "Lijpq (2)");
00172   dpd_buf4_scm(&tau2_AO, 0.0);
00173 
00174   for(h=0; h < nirreps; h++) {
00175     dpd_buf4_mat_irrep_init(&tau1_AO, h);
00176     dpd_buf4_mat_irrep_rd(&tau1_AO, h);
00177     dpd_buf4_mat_irrep_init(&tau2_AO, h);
00178   }
00179 
00180   iwl_buf_init(&InBuf, PSIF_SO_TEI, tolerance, 1, 1);
00181 
00182   lblptr = InBuf.labels;
00183   valptr = InBuf.values;
00184   lastbuf = InBuf.lastbuf;
00185 
00186   for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00187     p = abs((int) lblptr[idx++]);
00188     q = (int) lblptr[idx++];
00189     r = (int) lblptr[idx++];
00190     s = (int) lblptr[idx++];
00191 
00192     value = (double) valptr[InBuf.idx];
00193 
00194     /*    fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00195 
00196     AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 1);
00197 
00198   }
00199   while(!lastbuf) {
00200     iwl_buf_fetch(&InBuf);
00201     lastbuf = InBuf.lastbuf;
00202     for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00203       p = abs((int) lblptr[idx++]);
00204       q = (int) lblptr[idx++];
00205       r = (int) lblptr[idx++];
00206       s = (int) lblptr[idx++];
00207 
00208       value = (double) valptr[InBuf.idx];
00209 
00210       /*      fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00211 
00212       AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 1);
00213 
00214     }
00215   }
00216 
00217   iwl_buf_close(&InBuf, 1);
00218 
00219   for(h=0; h < nirreps; h++) {
00220     dpd_buf4_mat_irrep_wrt(&tau2_AO, h);
00221     dpd_buf4_mat_irrep_close(&tau2_AO, h);
00222     dpd_buf4_mat_irrep_close(&tau1_AO, h);
00223   }
00224   dpd_buf4_close(&tau1_AO);
00225   dpd_buf4_close(&tau2_AO);
00226 
00227 
00228   dpd_set_default(1);
00229   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "Lijpq (2)");
00230 
00231   dpd_set_default(0);
00232   dpd_buf4_init(&t2, CC_LAMBDA, L_irr, 0, 5, 2, 7, 0, "New Lijab");
00233 
00234   halftrans(&t2, 0, &tau2_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00235             virtpi, orbspi, 1, 0.5, 1.0);
00236 
00237   dpd_buf4_close(&t2);
00238   dpd_buf4_close(&tau2_AO);
00239 
00240   /************************************* AB *****************************************/
00241 
00242   dpd_set_default(1);
00243   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIjPq (1)");
00244   dpd_buf4_scm(&tau1_AO, 0.0);
00245 
00246   dpd_set_default(0);
00247   dpd_buf4_init(&tau, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIjAb");
00248 
00249   halftrans(&tau, 0, &tau1_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00250             virtpi, orbspi, 0, 1.0, 0.0);
00251 
00252   dpd_buf4_close(&tau);
00253   dpd_buf4_close(&tau1_AO);
00254 
00255   dpd_set_default(1);
00256   dpd_buf4_init(&tau1_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIjPq (1)");
00257   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIjPq (2)");
00258   dpd_buf4_scm(&tau2_AO, 0.0);
00259 
00260   for(h=0; h < nirreps; h++) {
00261     dpd_buf4_mat_irrep_init(&tau1_AO, h);
00262     dpd_buf4_mat_irrep_rd(&tau1_AO, h);
00263     dpd_buf4_mat_irrep_init(&tau2_AO, h);
00264   }
00265 
00266   iwl_buf_init(&InBuf, PSIF_SO_TEI, tolerance, 1, 1);
00267 
00268   lblptr = InBuf.labels;
00269   valptr = InBuf.values;
00270   lastbuf = InBuf.lastbuf;
00271 
00272   for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00273     p = abs((int) lblptr[idx++]);
00274     q = (int) lblptr[idx++];
00275     r = (int) lblptr[idx++];
00276     s = (int) lblptr[idx++];
00277 
00278     value = (double) valptr[InBuf.idx];
00279 
00280     /*    fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00281 
00282     AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 0);
00283 
00284   }
00285   while(!lastbuf) {
00286     iwl_buf_fetch(&InBuf);
00287     lastbuf = InBuf.lastbuf;
00288     for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
00289       p = abs((int) lblptr[idx++]);
00290       q = (int) lblptr[idx++];
00291       r = (int) lblptr[idx++];
00292       s = (int) lblptr[idx++];
00293 
00294       value = (double) valptr[InBuf.idx];
00295 
00296       /*      fprintf(outfile, "<%d %d %d %d = %20.10lf\n", p, q, r, s, value); */
00297 
00298       AO_contribute(p, q, r, s, value, &tau1_AO, &tau2_AO, 0);
00299 
00300     }
00301   }
00302 
00303   iwl_buf_close(&InBuf, 1);
00304 
00305   for(h=0; h < nirreps; h++) {
00306     dpd_buf4_mat_irrep_wrt(&tau2_AO, h);
00307     dpd_buf4_mat_irrep_close(&tau2_AO, h);
00308     dpd_buf4_mat_irrep_close(&tau1_AO, h);
00309   }
00310   dpd_buf4_close(&tau1_AO);
00311   dpd_buf4_close(&tau2_AO);
00312 
00313 
00314   dpd_set_default(1);
00315   dpd_buf4_init(&tau2_AO, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "LIjPq (2)");
00316 
00317   dpd_set_default(0);
00318   dpd_buf4_init(&t2, CC_LAMBDA, L_irr, 0, 5, 0, 5, 0, "New LIjAb");
00319 
00320   halftrans(&t2, 0, &tau2_AO, 1, C, nirreps, T2_cd_row_start, T2_pq_row_start, 
00321             virtpi, orbspi, 1, 1.0, 1.0);
00322 
00323   dpd_buf4_close(&t2);
00324   dpd_buf4_close(&tau2_AO);
00325 
00326   free(T2_cd_row_start);
00327   free(T2_pq_row_start);
00328 
00329   /* Reset the default dpd back to 0 --- this stuff gets really ugly */
00330   dpd_set_default(0);
00331 }
00332 
00333 void AO_contribute(int p, int q, int r, int s, double value, dpdbuf4 
00334                    *tau1_AO, dpdbuf4 *tau2_AO, int anti)
00335 {
00336   int Gp, Gq, Gr, Gs, Gpr, Gps, Gqr, Gqs, Grp, Gsp, Grq, Gsq;
00337   int pr, ps, qr, qs, rp, rq, sp, sq, pq, rs;
00338   int row;
00339 
00340   Gp = tau1_AO->params->rsym[p]; 
00341   Gq = tau1_AO->params->rsym[q]; 
00342   Gr = tau1_AO->params->rsym[r]; 
00343   Gs = tau1_AO->params->rsym[s];
00344 
00345   pq = tau1_AO->params->colidx[p][q];  rs = tau1_AO->params->colidx[r][s];
00346 
00347   if(p!=q && r!=s) {
00348 
00349     /* (pq|rs) */
00350     Gpr = Gp ^ Gr;
00351     pr = tau1_AO->params->colidx[p][r];
00352     qs = tau1_AO->params->colidx[q][s];
00353     sq = tau1_AO->params->colidx[s][q];
00354 
00355     for(row=0; row < tau1_AO->params->rowtot[Gpr]; row++) {
00356       tau2_AO->matrix[Gpr][row][pr] += value * tau1_AO->matrix[Gpr][row][qs];
00357       if(anti) tau2_AO->matrix[Gpr][row][pr] -= value * tau1_AO->matrix[Gpr][row][sq];
00358     }
00359 
00360     /* (pq|sr) */
00361     Gps = Gp ^ Gs;
00362     ps = tau1_AO->params->colidx[p][s];
00363     qr = tau1_AO->params->colidx[q][r];
00364     rq = tau1_AO->params->colidx[r][q];
00365 
00366     for(row=0; row < tau1_AO->params->rowtot[Gps]; row++) {
00367       tau2_AO->matrix[Gps][row][ps] += value * tau1_AO->matrix[Gps][row][qr];
00368       if(anti) tau2_AO->matrix[Gps][row][ps] -= value * tau1_AO->matrix[Gps][row][rq];
00369     }
00370 
00371     /* (qp|rs) */
00372     Gqr = Gq ^ Gr;
00373     qr = tau1_AO->params->colidx[q][r];
00374     ps = tau1_AO->params->colidx[p][s];
00375     sp = tau1_AO->params->colidx[s][p];
00376 
00377     for(row=0; row < tau1_AO->params->rowtot[Gqr]; row++) {
00378       tau2_AO->matrix[Gqr][row][qr] += value * tau1_AO->matrix[Gqr][row][ps];
00379       if(anti) tau2_AO->matrix[Gqr][row][qr] -= value * tau1_AO->matrix[Gqr][row][sp];
00380     }
00381 
00382     /* (qp|sr) */
00383     Gqs = Gq ^ Gs;
00384     qs = tau1_AO->params->colidx[q][s];
00385     pr = tau1_AO->params->colidx[p][r];
00386     rp = tau1_AO->params->colidx[r][p];
00387 
00388     for(row=0; row < tau1_AO->params->rowtot[Gqs]; row++) {
00389       tau2_AO->matrix[Gqs][row][qs] += value * tau1_AO->matrix[Gqs][row][pr];
00390       if(anti) tau2_AO->matrix[Gqs][row][qs] -= value * tau1_AO->matrix[Gqs][row][rp];
00391     }
00392 
00393     if(pq != rs) {
00394       /* (rs|pq) */
00395       Grp = Gp ^ Gr;
00396       rp = tau1_AO->params->colidx[r][p];
00397       sq = tau1_AO->params->colidx[s][q];
00398       qs = tau1_AO->params->colidx[q][s];
00399 
00400       for(row=0; row < tau1_AO->params->rowtot[Grp]; row++) {
00401         tau2_AO->matrix[Grp][row][rp] += value * tau1_AO->matrix[Grp][row][sq];
00402         if(anti) tau2_AO->matrix[Grp][row][rp] -= value * tau1_AO->matrix[Grp][row][qs];
00403       }
00404 
00405       /* (sr|pq) */
00406       Gsp = Gp ^ Gs;
00407       sp = tau1_AO->params->colidx[s][p];
00408       qr = tau1_AO->params->colidx[q][r];
00409       rq = tau1_AO->params->colidx[r][q];
00410 
00411       for(row=0; row < tau1_AO->params->rowtot[Gsp]; row++) {
00412         tau2_AO->matrix[Gsp][row][sp] += value * tau1_AO->matrix[Gsp][row][rq];
00413         if(anti) tau2_AO->matrix[Gsp][row][sp] -= value * tau1_AO->matrix[Gsp][row][qr];
00414       }
00415 
00416       /* (rs|qp) */
00417       Grq = Gq ^ Gr;
00418       rq = tau1_AO->params->colidx[r][q];
00419       ps = tau1_AO->params->colidx[p][s];
00420       sp = tau1_AO->params->colidx[s][p];
00421 
00422       for(row=0; row < tau1_AO->params->rowtot[Grq]; row++) {
00423         tau2_AO->matrix[Grq][row][rq] += value * tau1_AO->matrix[Grq][row][sp];
00424         if(anti) tau2_AO->matrix[Grq][row][rq] -= value * tau1_AO->matrix[Grq][row][ps];
00425       }
00426 
00427       /* (sr|qp) */
00428       Gsq = Gq ^ Gs;
00429       sq = tau1_AO->params->colidx[s][q];
00430       pr = tau1_AO->params->colidx[p][r];
00431       rp = tau1_AO->params->colidx[r][p];
00432 
00433       for(row=0; row < tau1_AO->params->rowtot[Gsq]; row++) {
00434         tau2_AO->matrix[Gsq][row][sq] += value * tau1_AO->matrix[Gsq][row][rp];
00435         if(anti) tau2_AO->matrix[Gsq][row][sq] -= value * tau1_AO->matrix[Gsq][row][pr];
00436       }
00437     }
00438 
00439   }
00440   else if(p!=q && r==s) {
00441 
00442     /* (pq|rs) */
00443     Gpr = Gp ^ Gr;
00444     pr = tau1_AO->params->colidx[p][r];
00445     qs = tau1_AO->params->colidx[q][s];
00446     sq = tau1_AO->params->colidx[s][q];
00447 
00448     for(row=0; row < tau1_AO->params->rowtot[Gpr]; row++) {
00449       tau2_AO->matrix[Gpr][row][pr] += value * tau1_AO->matrix[Gpr][row][qs];
00450       if(anti) tau2_AO->matrix[Gpr][row][pr] -= value * tau1_AO->matrix[Gpr][row][sq];
00451     }
00452 
00453     /* (qp|rs) */
00454     Gqr = Gq ^ Gr;
00455     qr = tau1_AO->params->colidx[q][r];
00456     ps = tau1_AO->params->colidx[p][s];
00457     sp = tau1_AO->params->colidx[s][p];
00458 
00459     for(row=0; row < tau1_AO->params->rowtot[Gqr]; row++) {
00460       tau2_AO->matrix[Gqr][row][qr] += value * tau1_AO->matrix[Gqr][row][ps];
00461       if(anti) tau2_AO->matrix[Gqr][row][qr] -= value * tau1_AO->matrix[Gqr][row][sp];
00462     }
00463 
00464     if(pq != rs) {
00465 
00466       /* (rs|pq) */
00467       Grp = Gp ^ Gr;
00468       rp = tau1_AO->params->colidx[r][p];
00469       sq = tau1_AO->params->colidx[s][q];
00470       qs = tau1_AO->params->colidx[q][s];
00471 
00472       for(row=0; row < tau1_AO->params->rowtot[Grp]; row++) {
00473         tau2_AO->matrix[Grp][row][rp] += value * tau1_AO->matrix[Grp][row][sq];
00474         if(anti) tau2_AO->matrix[Grp][row][rp] -= value * tau1_AO->matrix[Grp][row][qs];
00475       }
00476 
00477       /* (rs|qp) */
00478       Grq = Gq ^ Gr;
00479       rq = tau1_AO->params->colidx[r][q];
00480       ps = tau1_AO->params->colidx[p][s];
00481       sp = tau1_AO->params->colidx[s][p];
00482 
00483       for(row=0; row < tau1_AO->params->rowtot[Grq]; row++) {
00484         tau2_AO->matrix[Grq][row][rq] += value * tau1_AO->matrix[Grq][row][sp];
00485         if(anti) tau2_AO->matrix[Grq][row][rq] -= value * tau1_AO->matrix[Grq][row][ps];
00486       }
00487     }
00488 
00489   }
00490 
00491   else if(p==q && r!=s) {
00492 
00493     /* (pq|rs) */
00494     Gpr = Gp ^ Gr;
00495     pr = tau1_AO->params->colidx[p][r];
00496     qs = tau1_AO->params->colidx[q][s];
00497     sq = tau1_AO->params->colidx[s][q];
00498 
00499     for(row=0; row < tau1_AO->params->rowtot[Gpr]; row++) {
00500       tau2_AO->matrix[Gpr][row][pr] += value * tau1_AO->matrix[Gpr][row][qs];
00501       if(anti) tau2_AO->matrix[Gpr][row][pr] -= value * tau1_AO->matrix[Gpr][row][sq];
00502     }
00503 
00504     /* (pq|sr) */
00505     Gps = Gp ^ Gs;
00506     ps = tau1_AO->params->colidx[p][s];
00507     qr = tau1_AO->params->colidx[q][r];
00508     rq = tau1_AO->params->colidx[r][q];
00509 
00510     for(row=0; row < tau1_AO->params->rowtot[Gps]; row++) {
00511       tau2_AO->matrix[Gps][row][ps] += value * tau1_AO->matrix[Gps][row][qr];
00512       if(anti) tau2_AO->matrix[Gps][row][ps] -= value * tau1_AO->matrix[Gps][row][rq];
00513     }
00514 
00515     if(pq != rs) {
00516 
00517       /* (rs|pq) */
00518       Grp = Gp ^ Gr;
00519       rp = tau1_AO->params->colidx[r][p];
00520       sq = tau1_AO->params->colidx[s][q];
00521       qs = tau1_AO->params->colidx[q][s];
00522 
00523       for(row=0; row < tau1_AO->params->rowtot[Grp]; row++) {
00524         tau2_AO->matrix[Grp][row][rp] += value * tau1_AO->matrix[Grp][row][sq];
00525         if(anti) tau2_AO->matrix[Grp][row][rp] -= value * tau1_AO->matrix[Grp][row][qs];
00526       }
00527 
00528       /* (sr|pq) */
00529       Gsp = Gp ^ Gs;
00530       sp = tau1_AO->params->colidx[s][p];
00531       qr = tau1_AO->params->colidx[q][r];
00532       rq = tau1_AO->params->colidx[r][q];
00533 
00534       for(row=0; row < tau1_AO->params->rowtot[Gsp]; row++) {
00535         tau2_AO->matrix[Gsp][row][sp] += value * tau1_AO->matrix[Gsp][row][rq];
00536         if(anti) tau2_AO->matrix[Gsp][row][sp] -= value * tau1_AO->matrix[Gsp][row][qr];
00537       }
00538     }
00539 
00540   }
00541 
00542   else if(p==q && r==s) {
00543 
00544     /* (pq|rs) */
00545     Gpr = Gp ^ Gr;
00546     pr = tau1_AO->params->colidx[p][r];
00547     qs = tau1_AO->params->colidx[q][s];
00548     sq = tau1_AO->params->colidx[s][q];
00549 
00550     for(row=0; row < tau1_AO->params->rowtot[Gpr]; row++) {
00551       tau2_AO->matrix[Gpr][row][pr] += value * tau1_AO->matrix[Gpr][row][qs];
00552       if(anti) tau2_AO->matrix[Gpr][row][pr] -= value * tau1_AO->matrix[Gpr][row][sq];
00553     }
00554 
00555     if(pq != rs) {
00556 
00557       /* (rs|pq) */
00558       Grp = Gp ^ Gr;
00559       rp = tau1_AO->params->colidx[r][p];
00560       sq = tau1_AO->params->colidx[s][q];
00561       qs = tau1_AO->params->colidx[q][s];
00562 
00563       for(row=0; row < tau1_AO->params->rowtot[Grp]; row++) {
00564         tau2_AO->matrix[Grp][row][rp] += value * tau1_AO->matrix[Grp][row][sq];
00565         if(anti) tau2_AO->matrix[Grp][row][rp] -= value * tau1_AO->matrix[Grp][row][qs];
00566       }
00567 
00568     }
00569 
00570   }
00571   return;
00572 }
00573 
00574 }} // namespace psi::cclambda

Generated on Wed Feb 13 16:35:39 2008 for PSI by  doxygen 1.5.4