3
\brief Enter brief description of file here
6
/*! \defgroup CCTRIPLES cctriples: Evaluate triple excitations */
10
#include <libdpd/dpd.h>
16
namespace psi { namespace cctriples {
22
int Gi, Gj, Gk, Ga, Gb, Gc, Ge, Gm;
23
int Gji, Gij, Gjk, Gik, Gbc, Gac, Gba;
24
int I, J, K, A, B, C, E, M;
25
int i, j, k, a, b, c, e, m;
26
int ij, ji, ik, jk, bc, ac, ba;
27
int im, jm, km, ma, mb, mc;
28
int ae, be, ce, ke, ie, je;
29
int *occpi, *virtpi, *occ_off, *vir_off;
30
double value_c, value_d, denom, ET_AAA;
31
double t_ijae, t_ijbe, t_ijce, t_jkae, t_jkbe, t_jkce, t_ikae, t_ikbe, t_ikce;
32
double F_kebc, F_keac, F_keba, F_iebc, F_ieac, F_ieba, F_jebc, F_jeac, F_jeba;
33
double t_imbc, t_imac, t_imba, t_jmbc, t_jmac, t_jmba, t_kmbc, t_kmac, t_kmba;
34
double E_jkma, E_jkmb, E_jkmc, E_ikma, E_ikmb, E_ikmc, E_jima, E_jimb, E_jimc;
35
double t_ia, t_ib, t_ic, t_ja, t_jb, t_jc, t_ka, t_kb, t_kc;
36
double D_jkbc, D_jkac, D_jkba, D_ikbc, D_ikac, D_ikba, D_jibc, D_jiac, D_jiba;
37
dpdbuf4 T2, Fints, Eints, Dints;
38
dpdfile2 fIJ, fAB, T1;
40
nirreps = moinfo.nirreps;
41
occpi = moinfo.occpi; virtpi = moinfo.virtpi;
42
occ_off = moinfo.occ_off;
43
vir_off = moinfo.vir_off;
45
dpd_file2_init(&fIJ, CC_OEI, 0, 0, 0, "fIJ");
46
dpd_file2_init(&fAB, CC_OEI, 0, 1, 1, "fAB");
47
dpd_file2_mat_init(&fIJ);
48
dpd_file2_mat_init(&fAB);
49
dpd_file2_mat_rd(&fIJ);
50
dpd_file2_mat_rd(&fAB);
52
dpd_file2_init(&T1, CC_OEI, 0, 0, 1, "tIA");
53
dpd_file2_mat_init(&T1);
54
dpd_file2_mat_rd(&T1);
56
dpd_buf4_init(&T2, CC_TAMPS, 0, 0, 5, 2, 7, 0, "tIJAB");
57
dpd_buf4_init(&Fints, CC_FINTS, 0, 10, 5, 10, 5, 1, "F <ia|bc>");
58
dpd_buf4_init(&Eints, CC_EINTS, 0, 0, 10, 2, 10, 0, "E <ij||ka> (i>j,ka)");
59
dpd_buf4_init(&Dints, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij||ab>");
60
for(h=0; h < nirreps; h++) {
61
dpd_buf4_mat_irrep_init(&T2, h);
62
dpd_buf4_mat_irrep_rd(&T2, h);
64
dpd_buf4_mat_irrep_init(&Fints, h);
65
dpd_buf4_mat_irrep_rd(&Fints, h);
67
dpd_buf4_mat_irrep_init(&Eints, h);
68
dpd_buf4_mat_irrep_rd(&Eints, h);
70
dpd_buf4_mat_irrep_init(&Dints, h);
71
dpd_buf4_mat_irrep_rd(&Dints, h);
77
for(Gi=0; Gi < nirreps; Gi++) {
78
for(Gj=0; Gj < nirreps; Gj++) {
80
for(Gk=0; Gk < nirreps; Gk++) {
84
for(Ga=0; Ga < nirreps; Ga++) {
85
for(Gb=0; Gb < nirreps; Gb++) {
86
Gc = Gi ^ Gj ^ Gk ^ Ga ^ Gb;
92
for(i=0; i < occpi[Gi]; i++) {
94
for(j=0; j < occpi[Gj]; j++) {
96
for(k=0; k < occpi[Gk]; k++) {
99
ij = T2.params->rowidx[I][J];
100
ji = T2.params->rowidx[J][I];
101
jk = T2.params->rowidx[J][K];
102
ik = T2.params->rowidx[I][K];
104
for(a=0; a < virtpi[Ga]; a++) {
106
for(b=0; b < virtpi[Gb]; b++) {
108
for(c=0; c < virtpi[Gc]; c++) {
111
bc = Fints.params->colidx[B][C];
112
ac = Fints.params->colidx[A][C];
113
ba = Fints.params->colidx[B][A];
117
/** <ov||vv> --> connected triples **/
119
/* -t_jkae * F_iebc */
121
for(e=0; e < virtpi[Ge]; e++) {
124
ae = T2.params->colidx[A][E];
125
ie = Fints.params->rowidx[I][E];
127
t_jkae = F_iebc = 0.0;
129
if(T2.params->rowtot[Gjk] && T2.params->coltot[Gjk])
130
t_jkae = T2.matrix[Gjk][jk][ae];
132
if(Fints.params->rowtot[Gbc] && Fints.params->coltot[Gbc])
133
F_iebc = Fints.matrix[Gbc][ie][bc];
135
value_c -= t_jkae * F_iebc;
138
/* +t_jkbe * F_ieac */
140
for(e=0; e < virtpi[Ge]; e++) {
143
be = T2.params->colidx[B][E];
144
ie = Fints.params->rowidx[I][E];
146
t_jkbe = F_ieac = 0.0;
148
if(T2.params->rowtot[Gjk] && T2.params->coltot[Gjk])
149
t_jkbe = T2.matrix[Gjk][jk][be];
151
if(Fints.params->rowtot[Gac] && Fints.params->coltot[Gac])
152
F_ieac = Fints.matrix[Gac][ie][ac];
154
value_c += t_jkbe * F_ieac;
157
/* +t_jkce * F_ieba */
159
for(e=0; e < virtpi[Ge]; e++) {
162
ce = T2.params->colidx[C][E];
163
ie = Fints.params->rowidx[I][E];
165
t_jkce = F_ieba = 0.0;
167
if(T2.params->rowtot[Gjk] && T2.params->coltot[Gjk])
168
t_jkce = T2.matrix[Gjk][jk][ce];
170
if(Fints.params->rowtot[Gba] && Fints.params->coltot[Gba])
171
F_ieba = Fints.matrix[Gba][ie][ba];
173
value_c += t_jkce * F_ieba;
176
/* +t_ikae * F_jebc */
178
for(e=0; e < virtpi[Ge]; e++) {
181
ae = T2.params->colidx[A][E];
182
je = Fints.params->rowidx[J][E];
184
t_ikae = F_jebc = 0.0;
186
if(T2.params->rowtot[Gik] && T2.params->coltot[Gik])
187
t_ikae = T2.matrix[Gik][ik][ae];
189
if(Fints.params->rowtot[Gbc] && Fints.params->coltot[Gbc])
190
F_jebc = Fints.matrix[Gbc][je][bc];
192
value_c += t_ikae * F_jebc;
195
/* -t_ikbe * F_jeac */
197
for(e=0; e < virtpi[Ge]; e++) {
200
be = T2.params->colidx[B][E];
201
je = Fints.params->rowidx[J][E];
203
t_ikbe = F_jeac = 0.0;
205
if(T2.params->rowtot[Gik] && T2.params->coltot[Gik])
206
t_ikbe = T2.matrix[Gik][ik][be];
208
if(Fints.params->rowtot[Gac] && Fints.params->coltot[Gac])
209
F_jeac = Fints.matrix[Gac][je][ac];
211
value_c -= t_ikbe * F_jeac;
214
/* -t_ikce * F_jeba */
216
for(e=0; e < virtpi[Ge]; e++) {
219
ce = T2.params->colidx[C][E];
220
je = Fints.params->rowidx[J][E];
222
t_ikce = F_jeba = 0.0;
224
if(T2.params->rowtot[Gik] && T2.params->coltot[Gik])
225
t_ikce = T2.matrix[Gik][ik][ce];
227
if(Fints.params->rowtot[Gba] && Fints.params->coltot[Gba])
228
F_jeba = Fints.matrix[Gba][je][ba];
230
value_c -= t_ikce * F_jeba;
233
/* -t_ijae * F_kebc */
235
for(e=0; e < virtpi[Ge]; e++) {
238
ae = T2.params->colidx[A][E];
239
ke = Fints.params->rowidx[K][E];
241
t_ijae = F_kebc = 0.0;
243
if(T2.params->rowtot[Gij] && T2.params->coltot[Gij])
244
t_ijae = T2.matrix[Gij][ij][ae];
246
if(Fints.params->rowtot[Gbc] && Fints.params->coltot[Gbc])
247
F_kebc = Fints.matrix[Gbc][ke][bc];
249
value_c -= t_ijae * F_kebc;
252
/* +t_ijbe * F_keac */
254
for(e=0; e < virtpi[Ge]; e++) {
257
be = T2.params->colidx[B][E];
258
ke = Fints.params->rowidx[K][E];
260
t_ijbe = F_keac = 0.0;
262
if(T2.params->rowtot[Gij] && T2.params->coltot[Gij])
263
t_ijbe = T2.matrix[Gij][ij][be];
265
if(Fints.params->rowtot[Gac] && Fints.params->coltot[Gac])
266
F_keac = Fints.matrix[Gac][ke][ac];
268
value_c += t_ijbe * F_keac;
271
/* +t_ijce * F_keba */
273
for(e=0; e < virtpi[Ge]; e++) {
276
ce = T2.params->colidx[C][E];
277
ke = Fints.params->rowidx[K][E];
279
t_ijce = F_keba = 0.0;
281
if(T2.params->rowtot[Gij] && T2.params->coltot[Gij])
282
t_ijce = T2.matrix[Gij][ij][ce];
284
if(Fints.params->rowtot[Gba] && Fints.params->coltot[Gba])
285
F_keba = Fints.matrix[Gba][ke][ba];
287
value_c += t_ijce * F_keba;
290
/** <oo||ov> --> connected triples **/
292
/* -t_imbc * E_jkma */
294
for(m=0; m < occpi[Gm]; m++) {
297
im = T2.params->rowidx[I][M];
298
ma = Eints.params->colidx[M][A];
300
t_imbc = E_jkma = 0.0;
302
if(T2.params->rowtot[Gbc] && T2.params->coltot[Gbc])
303
t_imbc = T2.matrix[Gbc][im][bc];
305
if(Eints.params->rowtot[Gjk] && Eints.params->coltot[Gjk])
306
E_jkma = Eints.matrix[Gjk][jk][ma];
308
value_c -= t_imbc * E_jkma;
311
/* +t_imac * E_jkmb */
313
for(m=0; m < occpi[Gm]; m++) {
316
im = T2.params->rowidx[I][M];
317
mb = Eints.params->colidx[M][B];
319
t_imac = E_jkmb = 0.0;
321
if(T2.params->rowtot[Gac] && T2.params->coltot[Gac])
322
t_imac = T2.matrix[Gac][im][ac];
324
if(Eints.params->rowtot[Gjk] && Eints.params->coltot[Gjk])
325
E_jkmb = Eints.matrix[Gjk][jk][mb];
327
value_c += t_imac * E_jkmb;
330
/* +t_imba * E_jkmc */
332
for(m=0; m < occpi[Gm]; m++) {
335
im = T2.params->rowidx[I][M];
336
mc = Eints.params->colidx[M][C];
338
t_imba = E_jkmc = 0.0;
340
if(T2.params->rowtot[Gba] && T2.params->coltot[Gba])
341
t_imba = T2.matrix[Gba][im][ba];
343
if(Eints.params->rowtot[Gjk] && Eints.params->coltot[Gjk])
344
E_jkmc = Eints.matrix[Gjk][jk][mc];
346
value_c += t_imba * E_jkmc;
349
/* +t_jmbc * E_ikma */
351
for(m=0; m < occpi[Gm]; m++) {
354
jm = T2.params->rowidx[J][M];
355
ma = Eints.params->colidx[M][A];
357
t_jmbc = E_ikma = 0.0;
359
if(T2.params->rowtot[Gbc] && T2.params->coltot[Gbc])
360
t_jmbc = T2.matrix[Gbc][jm][bc];
362
if(Eints.params->rowtot[Gik] && Eints.params->coltot[Gik])
363
E_ikma = Eints.matrix[Gik][ik][ma];
365
value_c += t_jmbc * E_ikma;
368
/* -t_jmac * E_ikmb */
370
for(m=0; m < occpi[Gm]; m++) {
373
jm = T2.params->rowidx[J][M];
374
mb = Eints.params->colidx[M][B];
376
t_jmac = E_ikmb = 0.0;
378
if(T2.params->rowtot[Gac] && T2.params->coltot[Gac])
379
t_jmac = T2.matrix[Gac][jm][ac];
381
if(Eints.params->rowtot[Gik] && Eints.params->coltot[Gik])
382
E_ikmb = Eints.matrix[Gik][ik][mb];
384
value_c -= t_jmac * E_ikmb;
387
/* -t_jmba * E_ikmc */
389
for(m=0; m < occpi[Gm]; m++) {
392
jm = T2.params->rowidx[J][M];
393
mc = Eints.params->colidx[M][C];
395
t_jmba = E_ikmc = 0.0;
397
if(T2.params->rowtot[Gba] && T2.params->coltot[Gba])
398
t_jmba = T2.matrix[Gba][jm][ba];
400
if(Eints.params->rowtot[Gik] && Eints.params->coltot[Gik])
401
E_ikmc = Eints.matrix[Gik][ik][mc];
403
value_c -= t_jmba * E_ikmc;
406
/* +t_kmbc * E_jima */
408
for(m=0; m < occpi[Gm]; m++) {
411
km = T2.params->rowidx[K][M];
412
ma = Eints.params->colidx[M][A];
414
t_kmbc = E_jima = 0.0;
416
if(T2.params->rowtot[Gbc] && T2.params->coltot[Gbc])
417
t_kmbc = T2.matrix[Gbc][km][bc];
419
if(Eints.params->rowtot[Gji] && Eints.params->coltot[Gji])
420
E_jima = Eints.matrix[Gji][ji][ma];
422
value_c += t_kmbc * E_jima;
425
/* -t_kmac * E_jimb */
427
for(m=0; m < occpi[Gm]; m++) {
430
km = T2.params->rowidx[K][M];
431
mb = Eints.params->colidx[M][B];
433
t_kmac = E_jimb = 0.0;
435
if(T2.params->rowtot[Gac] && T2.params->coltot[Gac])
436
t_kmac = T2.matrix[Gac][km][ac];
438
if(Eints.params->rowtot[Gji] && Eints.params->coltot[Gji])
439
E_jimb = Eints.matrix[Gji][ji][mb];
441
value_c -= t_kmac * E_jimb;
444
/* -t_kmba * E_jimc */
446
for(m=0; m < occpi[Gm]; m++) {
449
km = T2.params->rowidx[K][M];
450
mc = Eints.params->colidx[M][C];
452
t_kmba = E_jimc = 0.0;
454
if(T2.params->rowtot[Gba] && T2.params->coltot[Gba])
455
t_kmba = T2.matrix[Gba][km][ba];
457
if(Eints.params->rowtot[Gji] && Eints.params->coltot[Gji])
458
E_jimc = Eints.matrix[Gji][ji][mc];
460
value_c -= t_kmba * E_jimc;
463
/** disconnected triples **/
468
if(Gi == Ga && Gjk == Gbc) {
471
if(T1.params->rowtot[Gi] && T1.params->coltot[Gi])
472
t_ia = T1.matrix[Gi][i][a];
474
if(Dints.params->rowtot[Gjk] && Dints.params->coltot[Gjk])
475
D_jkbc = Dints.matrix[Gjk][jk][bc];
477
value_d += t_ia * D_jkbc;
481
if(Gi == Gb && Gjk == Gac) {
484
if(T1.params->rowtot[Gi] && T1.params->coltot[Gi])
485
t_ib = T1.matrix[Gi][i][b];
487
if(Dints.params->rowtot[Gjk] && Dints.params->coltot[Gjk])
488
D_jkac = Dints.matrix[Gjk][jk][ac];
490
value_d -= t_ib * D_jkac;
494
if(Gi == Gc && Gjk == Gba) {
497
if(T1.params->rowtot[Gi] && T1.params->coltot[Gi])
498
t_ic = T1.matrix[Gi][i][c];
500
if(Dints.params->rowtot[Gjk] && Dints.params->coltot[Gjk])
501
D_jkba = Dints.matrix[Gjk][jk][ba];
503
value_d -= t_ic * D_jkba;
507
if(Gj == Ga && Gik == Gbc) {
510
if(T1.params->rowtot[Gj] && T1.params->coltot[Gj])
511
t_ja = T1.matrix[Gj][j][a];
513
if(Dints.params->rowtot[Gik] && Dints.params->coltot[Gik])
514
D_ikbc = Dints.matrix[Gik][ik][bc];
516
value_d -= t_ja * D_ikbc;
520
if(Gj == Gb && Gik == Gac) {
523
if(T1.params->rowtot[Gj] && T1.params->coltot[Gj])
524
t_jb = T1.matrix[Gj][j][b];
526
if(Dints.params->rowtot[Gik] && Dints.params->coltot[Gik])
527
D_ikac = Dints.matrix[Gik][ik][ac];
529
value_d += t_jb * D_ikac;
533
if(Gj == Gc && Gik == Gba) {
536
if(T1.params->rowtot[Gj] && T1.params->coltot[Gj])
537
t_jc = T1.matrix[Gj][j][c];
539
if(Dints.params->rowtot[Gik] && Dints.params->coltot[Gik])
540
D_ikba = Dints.matrix[Gik][ik][ba];
542
value_d += t_jc * D_ikba;
546
if(Gk == Ga && Gji == Gbc) {
549
if(T1.params->rowtot[Gk] && T1.params->coltot[Gk])
550
t_ka = T1.matrix[Gk][k][a];
552
if(Dints.params->rowtot[Gji] && Dints.params->coltot[Gji])
553
D_jibc = Dints.matrix[Gji][ji][bc];
555
value_d -= t_ka * D_jibc;
559
if(Gk == Gb && Gji == Gac) {
562
if(T1.params->rowtot[Gk] && T1.params->coltot[Gk])
563
t_kb = T1.matrix[Gk][k][b];
565
if(Dints.params->rowtot[Gji] && Dints.params->coltot[Gji])
566
D_jiac = Dints.matrix[Gji][ji][ac];
568
value_d += t_kb * D_jiac;
572
if(Gk == Gc && Gji == Gba) {
575
if(T1.params->rowtot[Gk] && T1.params->coltot[Gk])
576
t_kc = T1.matrix[Gk][k][c];
578
if(Dints.params->rowtot[Gji] && Dints.params->coltot[Gji])
579
D_jiba = Dints.matrix[Gji][ji][ba];
581
value_d += t_kc * D_jiba;
585
if(fabs(value_c) > 1e-7) {
587
fprintf(outfile, "%d %d %d %d %d %d %20.14f\n", I, J, K, A, B, C, value_c);
591
/* Compute the Fock denominator */
593
if(fIJ.params->rowtot[Gi])
594
denom += fIJ.matrix[Gi][i][i];
595
if(fIJ.params->rowtot[Gj])
596
denom += fIJ.matrix[Gj][j][j];
597
if(fIJ.params->rowtot[Gk])
598
denom += fIJ.matrix[Gk][k][k];
599
if(fAB.params->rowtot[Ga])
600
denom -= fAB.matrix[Ga][a][a];
601
if(fAB.params->rowtot[Gb])
602
denom -= fAB.matrix[Gb][b][b];
603
if(fAB.params->rowtot[Gc])
604
denom -= fAB.matrix[Gc][c][c];
606
ET_AAA += (value_d + value_c) * value_c / denom;
624
/* fprintf(outfile, "cnt = %d\n", cnt); */
626
/* fprintf(outfile, "ET_AAA = %20.14f\n", ET_AAA); */
628
for(h=0; h < nirreps; h++) {
629
dpd_buf4_mat_irrep_close(&T2, h);
630
dpd_buf4_mat_irrep_close(&Fints, h);
631
dpd_buf4_mat_irrep_close(&Eints, h);
632
dpd_buf4_mat_irrep_close(&Dints, h);
636
dpd_buf4_close(&Fints);
637
dpd_buf4_close(&Eints);
638
dpd_buf4_close(&Dints);
640
dpd_file2_mat_close(&T1);
641
dpd_file2_close(&T1);
643
dpd_file2_mat_close(&fIJ);
644
dpd_file2_mat_close(&fAB);
645
dpd_file2_close(&fIJ);
646
dpd_file2_close(&fAB);
651
}} // namespace psi::cctriples