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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }}