5
#include <libciomr/libciomr.h>
6
#include <libdpd/dpd.h>
11
This function computes contributions to singles and doubles of
12
matrix elements of triples:
13
SIA <-- <S|(Dints) <T|(Wmbij,Wabei) CMNEF |0> |T> / (w-wt)
14
SIjAb <-- <D|(FME,WmAEf,WMnIe) <T|(Wmbij,Wabei) CMNEF |0> |T> / (w-wt)
18
These are used to make X3 quantity in T3_RHF:
19
CIjAb, WAbEi, WMbIj, fIJ2, fAB2, omega
22
void cc3_sigma_RHF(dpdbuf4 *CIjAb, dpdbuf4 *WAbEi, dpdbuf4 *WMbIj,
23
int do_singles, dpdbuf4 *Dints, dpdfile2 *SIA,
24
int do_doubles, dpdfile2 *FME, dpdbuf4 *WmAEf, dpdbuf4 *WMnIe,
25
dpdbuf4 *SIjAb, int *occpi, int *occ_off, int *virtpi, int *vir_off,
26
double omega, FILE *outfile)
29
int Gi, Gj, Gk, Gl, Ga, Gb, Gc, Gd;
30
int i, j, k, l, a, b, c, d;
31
int I, J, K, L, A, B, C, D;
32
int kj, jk, ji, ij, ik, ki;
33
int Gkj, Gjk, Gji, Gij, Gik, Gki, Gkd;
34
int Gijk, GS, GC, GWX3, GW, GX3, nrows,ncols;
35
int ab, ba, ac, ca, bc, cb;
36
int Gab, Gba, Gac, Gca, Gbc, Gcb, Gid, Gjd;
37
int id, jd, kd, ad, bd, cd;
38
int il, jl, kl, la, lb, lc, li, lk;
40
int Gad, Gdi, Gdj, Gdk, Glc, Gli, Glk,cnt;
42
double value, F_val, t_val, E_val;
43
double dijk, denom, *tvect, **Z;
44
double value_ia, value_ka, denom_ia, denom_ka;
45
dpdfile2 fIJ, fIJ2, fAB, fAB2, SIA_inc;
46
dpdbuf4 SIjAb_inc, buf4_tmp;
49
nirreps = CIjAb->params->nirreps;
51
/* these are sent to T3 function */
52
dpd_file2_init(&fIJ2, CC_OEI, 0, 0, 0, "fIJ");
53
dpd_file2_init(&fAB2, CC_OEI, 0, 1, 1, "fAB");
54
dpd_file2_mat_init(&fIJ2);
55
dpd_file2_mat_init(&fAB2);
56
dpd_file2_mat_rd(&fIJ2);
57
dpd_file2_mat_rd(&fAB2);
59
dpd_file2_init(&fIJ, CC_OEI, 0, 0, 0, "fIJ");
60
dpd_file2_init(&fAB, CC_OEI, 0, 1, 1, "fAB");
61
dpd_file2_mat_init(&fIJ);
62
dpd_file2_mat_init(&fAB);
63
dpd_file2_mat_rd(&fIJ);
64
dpd_file2_mat_rd(&fAB);
65
dpd_file2_mat_init(FME);
66
dpd_file2_mat_rd(FME);
68
GC = CIjAb->file.my_irrep;
69
GWX3 = WAbEi->file.my_irrep;
71
GW = WmAEf->file.my_irrep;
72
GS = SIjAb->file.my_irrep;
74
fprintf(outfile,"problem with irreps in cc3_sigma_RHF()\n");
78
dpd_file2_init(&SIA_inc, CC_TMP0, GS, 0, 1, "CC3 SIA"); /* T3->S1 increment */
79
dpd_file2_mat_init(&SIA_inc);
82
dpd_buf4_init(&SIjAb_inc, CC_TMP0, GS, 0, 5, 0, 5, 0, "CC3 SIjAb");
83
dpd_buf4_scm(&SIjAb_inc, 0);
86
for(h=0; h < nirreps; h++) {
87
dpd_buf4_mat_irrep_init(CIjAb, h);
88
dpd_buf4_mat_irrep_rd(CIjAb, h);
89
dpd_buf4_mat_irrep_init(WMbIj, h);
90
dpd_buf4_mat_irrep_rd(WMbIj, h);
93
dpd_buf4_mat_irrep_init(Dints, h);
94
dpd_buf4_mat_irrep_rd(Dints, h);
97
dpd_buf4_mat_irrep_init(WMnIe, h);
98
dpd_buf4_mat_irrep_rd(WMnIe, h);
100
dpd_buf4_mat_irrep_init(&SIjAb_inc, h);
103
W3 = (double ***) malloc(nirreps * sizeof(double **));
104
W3a = (double ***) malloc(nirreps * sizeof(double **));
106
for(Gi=0; Gi < nirreps; Gi++) {
107
for(Gj=0; Gj < nirreps; Gj++) {
109
for(Gk=0; Gk < nirreps; Gk++) {
114
/* allocate memory for all irrep blocks of (ab,c) */
115
for(Gab=0; Gab < nirreps; Gab++) {
116
Gc = Gab ^ Gijk ^ GX3;
117
W3[Gab] = dpd_block_matrix(WAbEi->params->coltot[Gab], virtpi[Gc]);
119
for(Ga=0; Ga < nirreps; Ga++) {
120
Gbc = Ga ^ Gijk ^ GX3;
121
W3a[Ga] = dpd_block_matrix(virtpi[Ga], WAbEi->params->coltot[Gbc]);
124
for(i=0; i < occpi[Gi]; i++) {
126
for(j=0; j < occpi[Gj]; j++) {
128
for(k=0; k < occpi[Gk]; k++) {
131
ij = CIjAb->params->rowidx[I][J];
132
ji = CIjAb->params->rowidx[J][I];
133
ik = CIjAb->params->rowidx[I][K];
134
ki = CIjAb->params->rowidx[K][I];
135
jk = CIjAb->params->rowidx[J][K];
136
kj = CIjAb->params->rowidx[K][J];
140
T3_RHF(W3, nirreps, I, Gi, J, Gj, K, Gk, CIjAb, WAbEi, WMbIj,
141
&fIJ2, &fAB2, occpi, occ_off, virtpi, vir_off, omega);
146
/* do (Wmnie*X3(ab,c) --> SIjAb) contractions that use W3(ab,c) first */
149
timer_on("X3*Wmnie");
151
/* S_liba <-- -2.0 * t_ijkabc W_jklc */
152
/* S_ilab <-- -2.0 * t_ijkabc W_jklc */
153
for(Gl=0; Gl < nirreps; Gl++) {
158
lc = WMnIe->col_offset[Gjk][Gl];
159
nrows = SIjAb_inc.params->coltot[Gab];
163
if(nrows && ncols && nlinks) {
164
Z = dpd_block_matrix(nrows, ncols);
166
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
167
&(WMnIe->matrix[Gjk][jk][lc]), nlinks, 0.0, Z[0], ncols);
169
for(l=0; l < ncols; l++) {
171
li = SIjAb_inc.params->rowidx[L][I];
172
il = SIjAb_inc.params->rowidx[I][L];
173
for(ab=0; ab < nrows; ab++) {
174
A = SIjAb_inc.params->colorb[Gab][ab][0];
175
B = SIjAb_inc.params->colorb[Gab][ab][1];
176
ba = SIjAb_inc.params->colidx[B][A];
177
SIjAb_inc.matrix[Gli][li][ba] -= 2.0 * Z[ab][l];
178
SIjAb_inc.matrix[Gli][il][ab] -= 2.0 * Z[ab][l];
181
dpd_free_block(Z, nrows, ncols);
185
/* S_lkba <-- + t_ijkabc W_jilc */
186
/* S_klab <-- + t_ijkabc W_jilc */
187
for(Gl=0; Gl < nirreps; Gl++) {
192
lc = WMnIe->col_offset[Gji][Gl];
193
nrows = SIjAb_inc.params->coltot[Gab];
197
if(nrows && ncols && nlinks) {
198
Z = dpd_block_matrix(nrows, ncols);
200
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
201
&(WMnIe->matrix[Gji][ji][lc]), nlinks, 0.0, Z[0], ncols);
203
for(l=0; l < ncols; l++) {
205
lk = SIjAb_inc.params->rowidx[L][K];
206
kl = SIjAb_inc.params->rowidx[K][L];
207
for(ab=0; ab < nrows; ab++) {
208
A = SIjAb_inc.params->colorb[Gab][ab][0];
209
B = SIjAb_inc.params->colorb[Gab][ab][1];
210
ba = SIjAb_inc.params->colidx[B][A];
211
SIjAb_inc.matrix[Glk][lk][ba] += Z[ab][l];
212
SIjAb_inc.matrix[Glk][kl][ab] += Z[ab][l];
215
dpd_free_block(Z, nrows, ncols);
219
/* S_liba <-- + t_ijkabc W_kjlc */
220
/* S_ilab <-- + t_ijkabc W_kjlc */
221
for(Gl=0; Gl < nirreps; Gl++) {
226
lc = WMnIe->col_offset[Gkj][Gl];
227
nrows = SIjAb_inc.params->coltot[Gab];
231
if(nrows && ncols && nlinks) {
232
Z = dpd_block_matrix(nrows, ncols);
234
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
235
&(WMnIe->matrix[Gkj][kj][lc]), nlinks, 0.0, Z[0], ncols);
237
for(l=0; l < ncols; l++) {
239
li = SIjAb_inc.params->rowidx[L][I];
240
il = SIjAb_inc.params->rowidx[I][L];
241
for(ab=0; ab < nrows; ab++) {
242
A = SIjAb_inc.params->colorb[Gab][ab][0];
243
B = SIjAb_inc.params->colorb[Gab][ab][1];
244
ba = SIjAb_inc.params->colidx[B][A];
245
SIjAb_inc.matrix[Gli][li][ba] += Z[ab][l];
246
SIjAb_inc.matrix[Gli][il][ab] += Z[ab][l];
249
dpd_free_block(Z, nrows, ncols);
253
timer_off("X3*Wmnie");
255
} /* end Wmnie*X3 doubles contributions */
260
/* sort W(ab,c) to W(a,bc) */
261
for(Gab=0; Gab < nirreps; Gab++) {
262
Gc = Gab ^ Gijk ^ GX3;
263
for(ab=0; ab < WAbEi->params->coltot[Gab]; ab++ ){
264
A = WAbEi->params->colorb[Gab][ab][0];
265
B = WAbEi->params->colorb[Gab][ab][1];
266
Ga = WAbEi->params->rsym[A];
269
for(c=0; c < virtpi[Gc]; c++) {
271
bc = WAbEi->params->colidx[B][C];
272
W3a[Ga][a][bc] = W3[Gab][ab][c];
277
timer_off("X3_sort");
280
/*** X3(a,bc)*Dints --> SIA Contributions ***/
282
/* Note: the do_singles code has not been used where Dints!=A1
283
as this non-symmetric case does not arise for CC3 EOM energies */
285
/* S_ia <-- t_ijkabc Djkbc */
289
ncols = Dints->params->coltot[Gbc];
292
C_DGEMV('n', nrows, ncols, 1.0, W3a[Ga][0], ncols,
293
&(Dints->matrix[Gjk][jk][0]), 1, 1.0, SIA_inc.matrix[Gi][i], 1);
295
/* S_ka <-- tijkabc Djibc */
299
ncols = Dints->params->coltot[Gbc];
302
C_DGEMV('n', nrows, ncols, -1.0, W3a[Ga][0], ncols,
303
&(Dints->matrix[Gji][ji][0]), 1, 1.0, SIA_inc.matrix[Gk][k], 1);
306
/*** X3(a,bc)*Wamef --> SIjAb Contributions ***/
309
timer_on("X3*Wamef");
311
/* S_IjAb <-- t_ijkabc F_kc */
312
/* S_jIbA <-- t_ijkabc F_kc */
315
nrows = SIjAb_inc.params->coltot[Gij^GS];
319
tvect = init_array(nrows);
320
C_DGEMV('n', nrows, ncols, 1.0, W3[Gab][0], ncols, FME->matrix[Gk][k], 1,
323
for(cnt=0; cnt<nrows; ++cnt) {
324
A = SIjAb_inc.params->colorb[Gab][cnt][0];
325
B = SIjAb_inc.params->colorb[Gab][cnt][1];
326
ba = SIjAb_inc.params->colidx[B][A];
327
SIjAb_inc.matrix[Gij][ij][cnt] += tvect[cnt];
328
SIjAb_inc.matrix[Gij][ji][ba] += tvect[cnt];
333
/* S_KjAb <-- - t_ijkabc F_ic */
334
/* S_jKbA <-- - t_ijkabc F_ic */
337
nrows = SIjAb_inc.params->coltot[Gkj^GS];
341
tvect = init_array(nrows);
342
C_DGEMV('n', nrows, ncols, 1.0, W3[Gab][0], ncols, FME->matrix[Gi][i], 1,
345
for(cnt=0; cnt<nrows; ++cnt) {
346
A = SIjAb_inc.params->colorb[Gab][cnt][0];
347
B = SIjAb_inc.params->colorb[Gab][cnt][1];
348
ba = SIjAb_inc.params->colidx[B][A];
349
SIjAb_inc.matrix[Gkj][kj][cnt] -= tvect[cnt];
350
SIjAb_inc.matrix[Gkj][jk][ba] -= tvect[cnt];
355
/* S_ijad <-- 2.0 * t_ijkabc W_kdbc */
356
/* S_jida <-- 2.0 * t_ijkabc W_kdbc */
357
for(Gd=0; Gd < nirreps; Gd++) {
363
nlinks = WmAEf->params->coltot[Gkd^GW];
365
if(nrows && ncols && nlinks) {
366
kd = WmAEf->row_offset[Gkd][K];
367
WmAEf->matrix[Gkd] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gkd^GW]);
368
dpd_buf4_mat_irrep_rd_block(WmAEf, Gkd, kd, virtpi[Gd]);
370
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
371
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
372
WmAEf->matrix[Gkd][0], nlinks, 1.0, Z[0], ncols);
374
for(a=0; a < virtpi[Ga]; a++) {
376
for(d=0; d < virtpi[Gd]; d++) {
378
ad = SIjAb_inc.params->colidx[A][D];
379
da = SIjAb_inc.params->colidx[D][A];
380
SIjAb_inc.matrix[Gij][ij][ad] += 2.0 * Z[a][d];
381
SIjAb_inc.matrix[Gij][ji][da] += 2.0 * Z[a][d];
386
dpd_free_block(WmAEf->matrix[Gkd], virtpi[Gd], WmAEf->params->coltot[Gkd^GW]);
390
/* S_kjad <-- - t_ijkabc W_idbc */
391
/* S_jkda <-- - t_ijkabc W_idbc */
392
for(Gd=0; Gd < nirreps; Gd++) {
398
nlinks = WmAEf->params->coltot[Gid^GW];
400
if(nrows && ncols && nlinks) {
401
id = WmAEf->row_offset[Gid][I];
402
WmAEf->matrix[Gid] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gid^GW]);
403
dpd_buf4_mat_irrep_rd_block(WmAEf, Gid, id, virtpi[Gd]);
405
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
406
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
407
WmAEf->matrix[Gid][0], nlinks, 1.0, Z[0], ncols);
409
for(a=0; a < virtpi[Ga]; a++) {
411
for(d=0; d < virtpi[Gd]; d++) {
413
ad = SIjAb_inc.params->colidx[A][D];
414
da = SIjAb_inc.params->colidx[D][A];
415
SIjAb_inc.matrix[Gkj][kj][ad] -= Z[a][d];
416
SIjAb_inc.matrix[Gjk][jk][da] -= Z[a][d];
421
dpd_free_block(WmAEf->matrix[Gid], virtpi[Gd], WmAEf->params->coltot[Gid^GW]);
425
/* S_kida <-- - t_ijkabc W_jdbc */
426
/* S_ikad <-- - t_ijkabc W_jdbc */
427
for(Gd=0; Gd < nirreps; Gd++) {
433
nlinks = WmAEf->params->coltot[Gjd^GW];
435
if(nrows && ncols && nlinks) {
436
jd = WmAEf->row_offset[Gjd][J];
437
WmAEf->matrix[Gjd] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gjd^GW]);
438
dpd_buf4_mat_irrep_rd_block(WmAEf, Gjd, jd, virtpi[Gd]);
440
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
441
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
442
WmAEf->matrix[Gjd][0], nlinks, 1.0, Z[0], ncols);
444
for(a=0; a < virtpi[Ga]; a++) {
446
for(d=0; d < virtpi[Gd]; d++) {
448
ad = SIjAb_inc.params->colidx[A][D];
449
da = SIjAb_inc.params->colidx[D][A];
450
SIjAb_inc.matrix[Gki][ki][da] -= Z[a][d];
451
SIjAb_inc.matrix[Gik][ik][ad] -= Z[a][d];
455
dpd_free_block(WmAEf->matrix[Gjd], virtpi[Gd], WmAEf->params->coltot[Gjd^GW]);
459
timer_off("X3*Wamef");
461
} /* end Wamef*X3->Sijab contributions */
466
for(Gab=0; Gab < nirreps; Gab++) {
467
Gc = Gab ^ Gijk ^ GX3;
468
dpd_free_block(W3[Gab], WAbEi->params->coltot[Gab], virtpi[Gc]);
470
for(Ga=0; Ga < nirreps; Ga++) {
471
Gbc = Ga ^ Gijk ^ GX3;
472
dpd_free_block(W3a[Ga], virtpi[Ga], WAbEi->params->coltot[Gbc]);
478
/* close up files and update sigma vectors */
479
dpd_file2_mat_close(&fIJ);
480
dpd_file2_mat_close(&fAB);
481
dpd_file2_mat_close(FME);
482
dpd_file2_close(&fIJ);
483
dpd_file2_close(&fAB);
485
dpd_file2_mat_close(&fIJ2);
486
dpd_file2_mat_close(&fAB2);
487
dpd_file2_close(&fIJ2);
488
dpd_file2_close(&fAB2);
491
for(h=0; h < nirreps; h++)
492
dpd_buf4_mat_irrep_close(Dints, h);
493
dpd_file2_mat_wrt(&SIA_inc);
494
dpd_file2_mat_close(&SIA_inc);
495
dpd_file2_axpy(&SIA_inc, SIA, 1, 0);
496
dpd_file2_close(&SIA_inc);
500
for(h=0; h < nirreps; h++) {
501
dpd_buf4_mat_irrep_close(WMnIe, h);
502
dpd_buf4_mat_irrep_wrt(&SIjAb_inc, h);
503
dpd_buf4_mat_irrep_close(&SIjAb_inc, h);
505
dpd_buf4_axpy(&SIjAb_inc, SIjAb, 1);
506
dpd_buf4_close(&SIjAb_inc);