3
\brief Enter brief description of file here
9
#include <libciomr/libciomr.h>
10
#include <libdpd/dpd.h>
17
This function computes contributions to singles and doubles of
18
matrix elements of triples:
19
SIA <-- <S|(Dints) <T|(Wmbij,Wabei) CMNEF |0> |T> / (w-wt)
20
SIjAb <-- <D|(FME,WmAEf,WMnIe) <T|(Wmbij,Wabei) CMNEF |0> |T> / (w-wt)
24
These are used to make X3 quantity in T3_RHF:
25
CIjAb, WAbEi, WMbIj, fIJ2, fAB2, omega
28
void cc3_sigma_RHF(dpdbuf4 *CIjAb, dpdbuf4 *WAbEi, dpdbuf4 *WMbIj,
29
int do_singles, dpdbuf4 *Dints, dpdfile2 *SIA,
30
int do_doubles, dpdfile2 *FME, dpdbuf4 *WmAEf, dpdbuf4 *WMnIe,
31
dpdbuf4 *SIjAb, int *occpi, int *occ_off, int *virtpi, int *vir_off,
32
double omega, FILE *outfile)
35
int Gi, Gj, Gk, Gl, Ga, Gb, Gc, Gd;
36
int i, j, k, l, a, b, c, d;
37
int I, J, K, L, A, B, C, D;
38
int kj, jk, ji, ij, ik, ki;
39
int Gkj, Gjk, Gji, Gij, Gik, Gki, Gkd;
40
int Gijk, GS, GC, GWX3, GW, GX3, nrows,ncols;
41
int ab, ba, ac, ca, bc, cb;
42
int Gab, Gba, Gac, Gca, Gbc, Gcb, Gid, Gjd;
43
int id, jd, kd, ad, bd, cd;
44
int il, jl, kl, la, lb, lc, li, lk;
46
int Gad, Gdi, Gdj, Gdk, Glc, Gli, Glk,cnt;
48
double value, F_val, t_val, E_val;
49
double dijk, denom, *tvect, **Z;
50
double value_ia, value_ka, denom_ia, denom_ka;
51
dpdfile2 fIJ, fIJ2, fAB, fAB2, SIA_inc;
52
dpdbuf4 SIjAb_inc, buf4_tmp;
55
nirreps = CIjAb->params->nirreps;
57
/* these are sent to T3 function */
58
dpd_file2_init(&fIJ2, CC_OEI, 0, 0, 0, "fIJ");
59
dpd_file2_init(&fAB2, CC_OEI, 0, 1, 1, "fAB");
60
dpd_file2_mat_init(&fIJ2);
61
dpd_file2_mat_init(&fAB2);
62
dpd_file2_mat_rd(&fIJ2);
63
dpd_file2_mat_rd(&fAB2);
65
dpd_file2_init(&fIJ, CC_OEI, 0, 0, 0, "fIJ");
66
dpd_file2_init(&fAB, CC_OEI, 0, 1, 1, "fAB");
67
dpd_file2_mat_init(&fIJ);
68
dpd_file2_mat_init(&fAB);
69
dpd_file2_mat_rd(&fIJ);
70
dpd_file2_mat_rd(&fAB);
71
dpd_file2_mat_init(FME);
72
dpd_file2_mat_rd(FME);
74
GC = CIjAb->file.my_irrep;
75
GWX3 = WAbEi->file.my_irrep;
77
GW = WmAEf->file.my_irrep;
78
GS = SIjAb->file.my_irrep;
80
fprintf(outfile,"problem with irreps in cc3_sigma_RHF()\n");
84
dpd_file2_init(&SIA_inc, CC_TMP0, GS, 0, 1, "CC3 SIA"); /* T3->S1 increment */
85
dpd_file2_mat_init(&SIA_inc);
88
dpd_buf4_init(&SIjAb_inc, CC_TMP0, GS, 0, 5, 0, 5, 0, "CC3 SIjAb");
89
dpd_buf4_scm(&SIjAb_inc, 0);
92
for(h=0; h < nirreps; h++) {
93
dpd_buf4_mat_irrep_init(CIjAb, h);
94
dpd_buf4_mat_irrep_rd(CIjAb, h);
95
dpd_buf4_mat_irrep_init(WMbIj, h);
96
dpd_buf4_mat_irrep_rd(WMbIj, h);
99
dpd_buf4_mat_irrep_init(Dints, h);
100
dpd_buf4_mat_irrep_rd(Dints, h);
103
dpd_buf4_mat_irrep_init(WMnIe, h);
104
dpd_buf4_mat_irrep_rd(WMnIe, h);
106
dpd_buf4_mat_irrep_init(&SIjAb_inc, h);
109
W3 = (double ***) malloc(nirreps * sizeof(double **));
110
W3a = (double ***) malloc(nirreps * sizeof(double **));
112
for(Gi=0; Gi < nirreps; Gi++) {
113
for(Gj=0; Gj < nirreps; Gj++) {
115
for(Gk=0; Gk < nirreps; Gk++) {
120
/* allocate memory for all irrep blocks of (ab,c) */
121
for(Gab=0; Gab < nirreps; Gab++) {
122
Gc = Gab ^ Gijk ^ GX3;
123
W3[Gab] = dpd_block_matrix(WAbEi->params->coltot[Gab], virtpi[Gc]);
125
for(Ga=0; Ga < nirreps; Ga++) {
126
Gbc = Ga ^ Gijk ^ GX3;
127
W3a[Ga] = dpd_block_matrix(virtpi[Ga], WAbEi->params->coltot[Gbc]);
130
for(i=0; i < occpi[Gi]; i++) {
132
for(j=0; j < occpi[Gj]; j++) {
134
for(k=0; k < occpi[Gk]; k++) {
137
ij = CIjAb->params->rowidx[I][J];
138
ji = CIjAb->params->rowidx[J][I];
139
ik = CIjAb->params->rowidx[I][K];
140
ki = CIjAb->params->rowidx[K][I];
141
jk = CIjAb->params->rowidx[J][K];
142
kj = CIjAb->params->rowidx[K][J];
146
T3_RHF(W3, nirreps, I, Gi, J, Gj, K, Gk, CIjAb, WAbEi, WMbIj,
147
&fIJ2, &fAB2, occpi, occ_off, virtpi, vir_off, omega);
152
/* do (Wmnie*X3(ab,c) --> SIjAb) contractions that use W3(ab,c) first */
155
timer_on("X3*Wmnie");
157
/* S_liba <-- -2.0 * t_ijkabc W_jklc */
158
/* S_ilab <-- -2.0 * t_ijkabc W_jklc */
159
for(Gl=0; Gl < nirreps; Gl++) {
164
lc = WMnIe->col_offset[Gjk][Gl];
165
nrows = SIjAb_inc.params->coltot[Gab];
169
if(nrows && ncols && nlinks) {
170
Z = dpd_block_matrix(nrows, ncols);
172
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
173
&(WMnIe->matrix[Gjk][jk][lc]), nlinks, 0.0, Z[0], ncols);
175
for(l=0; l < ncols; l++) {
177
li = SIjAb_inc.params->rowidx[L][I];
178
il = SIjAb_inc.params->rowidx[I][L];
179
for(ab=0; ab < nrows; ab++) {
180
A = SIjAb_inc.params->colorb[Gab][ab][0];
181
B = SIjAb_inc.params->colorb[Gab][ab][1];
182
ba = SIjAb_inc.params->colidx[B][A];
183
SIjAb_inc.matrix[Gli][li][ba] -= 2.0 * Z[ab][l];
184
SIjAb_inc.matrix[Gli][il][ab] -= 2.0 * Z[ab][l];
187
dpd_free_block(Z, nrows, ncols);
191
/* S_lkba <-- + t_ijkabc W_jilc */
192
/* S_klab <-- + t_ijkabc W_jilc */
193
for(Gl=0; Gl < nirreps; Gl++) {
198
lc = WMnIe->col_offset[Gji][Gl];
199
nrows = SIjAb_inc.params->coltot[Gab];
203
if(nrows && ncols && nlinks) {
204
Z = dpd_block_matrix(nrows, ncols);
206
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
207
&(WMnIe->matrix[Gji][ji][lc]), nlinks, 0.0, Z[0], ncols);
209
for(l=0; l < ncols; l++) {
211
lk = SIjAb_inc.params->rowidx[L][K];
212
kl = SIjAb_inc.params->rowidx[K][L];
213
for(ab=0; ab < nrows; ab++) {
214
A = SIjAb_inc.params->colorb[Gab][ab][0];
215
B = SIjAb_inc.params->colorb[Gab][ab][1];
216
ba = SIjAb_inc.params->colidx[B][A];
217
SIjAb_inc.matrix[Glk][lk][ba] += Z[ab][l];
218
SIjAb_inc.matrix[Glk][kl][ab] += Z[ab][l];
221
dpd_free_block(Z, nrows, ncols);
225
/* S_liba <-- + t_ijkabc W_kjlc */
226
/* S_ilab <-- + t_ijkabc W_kjlc */
227
for(Gl=0; Gl < nirreps; Gl++) {
232
lc = WMnIe->col_offset[Gkj][Gl];
233
nrows = SIjAb_inc.params->coltot[Gab];
237
if(nrows && ncols && nlinks) {
238
Z = dpd_block_matrix(nrows, ncols);
240
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3[Gab][0], nlinks,
241
&(WMnIe->matrix[Gkj][kj][lc]), nlinks, 0.0, Z[0], ncols);
243
for(l=0; l < ncols; l++) {
245
li = SIjAb_inc.params->rowidx[L][I];
246
il = SIjAb_inc.params->rowidx[I][L];
247
for(ab=0; ab < nrows; ab++) {
248
A = SIjAb_inc.params->colorb[Gab][ab][0];
249
B = SIjAb_inc.params->colorb[Gab][ab][1];
250
ba = SIjAb_inc.params->colidx[B][A];
251
SIjAb_inc.matrix[Gli][li][ba] += Z[ab][l];
252
SIjAb_inc.matrix[Gli][il][ab] += Z[ab][l];
255
dpd_free_block(Z, nrows, ncols);
259
timer_off("X3*Wmnie");
261
} /* end Wmnie*X3 doubles contributions */
266
/* sort W(ab,c) to W(a,bc) */
267
for(Gab=0; Gab < nirreps; Gab++) {
268
Gc = Gab ^ Gijk ^ GX3;
269
for(ab=0; ab < WAbEi->params->coltot[Gab]; ab++ ){
270
A = WAbEi->params->colorb[Gab][ab][0];
271
B = WAbEi->params->colorb[Gab][ab][1];
272
Ga = WAbEi->params->rsym[A];
275
for(c=0; c < virtpi[Gc]; c++) {
277
bc = WAbEi->params->colidx[B][C];
278
W3a[Ga][a][bc] = W3[Gab][ab][c];
283
timer_off("X3_sort");
286
/*** X3(a,bc)*Dints --> SIA Contributions ***/
288
/* Note: the do_singles code has not been used where Dints!=A1
289
as this non-symmetric case does not arise for CC3 EOM energies */
291
/* S_ia <-- t_ijkabc Djkbc */
295
ncols = Dints->params->coltot[Gbc];
298
C_DGEMV('n', nrows, ncols, 1.0, W3a[Ga][0], ncols,
299
&(Dints->matrix[Gjk][jk][0]), 1, 1.0, SIA_inc.matrix[Gi][i], 1);
301
/* S_ka <-- tijkabc Djibc */
305
ncols = Dints->params->coltot[Gbc];
308
C_DGEMV('n', nrows, ncols, -1.0, W3a[Ga][0], ncols,
309
&(Dints->matrix[Gji][ji][0]), 1, 1.0, SIA_inc.matrix[Gk][k], 1);
312
/*** X3(a,bc)*Wamef --> SIjAb Contributions ***/
315
timer_on("X3*Wamef");
317
/* S_IjAb <-- t_ijkabc F_kc */
318
/* S_jIbA <-- t_ijkabc F_kc */
321
nrows = SIjAb_inc.params->coltot[Gij^GS];
325
tvect = init_array(nrows);
326
C_DGEMV('n', nrows, ncols, 1.0, W3[Gab][0], ncols, FME->matrix[Gk][k], 1,
329
for(cnt=0; cnt<nrows; ++cnt) {
330
A = SIjAb_inc.params->colorb[Gab][cnt][0];
331
B = SIjAb_inc.params->colorb[Gab][cnt][1];
332
ba = SIjAb_inc.params->colidx[B][A];
333
SIjAb_inc.matrix[Gij][ij][cnt] += tvect[cnt];
334
SIjAb_inc.matrix[Gij][ji][ba] += tvect[cnt];
339
/* S_KjAb <-- - t_ijkabc F_ic */
340
/* S_jKbA <-- - t_ijkabc F_ic */
343
nrows = SIjAb_inc.params->coltot[Gkj^GS];
347
tvect = init_array(nrows);
348
C_DGEMV('n', nrows, ncols, 1.0, W3[Gab][0], ncols, FME->matrix[Gi][i], 1,
351
for(cnt=0; cnt<nrows; ++cnt) {
352
A = SIjAb_inc.params->colorb[Gab][cnt][0];
353
B = SIjAb_inc.params->colorb[Gab][cnt][1];
354
ba = SIjAb_inc.params->colidx[B][A];
355
SIjAb_inc.matrix[Gkj][kj][cnt] -= tvect[cnt];
356
SIjAb_inc.matrix[Gkj][jk][ba] -= tvect[cnt];
361
/* S_ijad <-- 2.0 * t_ijkabc W_kdbc */
362
/* S_jida <-- 2.0 * t_ijkabc W_kdbc */
363
for(Gd=0; Gd < nirreps; Gd++) {
369
nlinks = WmAEf->params->coltot[Gkd^GW];
371
if(nrows && ncols && nlinks) {
372
kd = WmAEf->row_offset[Gkd][K];
373
WmAEf->matrix[Gkd] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gkd^GW]);
374
dpd_buf4_mat_irrep_rd_block(WmAEf, Gkd, kd, virtpi[Gd]);
376
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
377
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
378
WmAEf->matrix[Gkd][0], nlinks, 1.0, Z[0], ncols);
380
for(a=0; a < virtpi[Ga]; a++) {
382
for(d=0; d < virtpi[Gd]; d++) {
384
ad = SIjAb_inc.params->colidx[A][D];
385
da = SIjAb_inc.params->colidx[D][A];
386
SIjAb_inc.matrix[Gij][ij][ad] += 2.0 * Z[a][d];
387
SIjAb_inc.matrix[Gij][ji][da] += 2.0 * Z[a][d];
392
dpd_free_block(WmAEf->matrix[Gkd], virtpi[Gd], WmAEf->params->coltot[Gkd^GW]);
396
/* S_kjad <-- - t_ijkabc W_idbc */
397
/* S_jkda <-- - t_ijkabc W_idbc */
398
for(Gd=0; Gd < nirreps; Gd++) {
404
nlinks = WmAEf->params->coltot[Gid^GW];
406
if(nrows && ncols && nlinks) {
407
id = WmAEf->row_offset[Gid][I];
408
WmAEf->matrix[Gid] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gid^GW]);
409
dpd_buf4_mat_irrep_rd_block(WmAEf, Gid, id, virtpi[Gd]);
411
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
412
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
413
WmAEf->matrix[Gid][0], nlinks, 1.0, Z[0], ncols);
415
for(a=0; a < virtpi[Ga]; a++) {
417
for(d=0; d < virtpi[Gd]; d++) {
419
ad = SIjAb_inc.params->colidx[A][D];
420
da = SIjAb_inc.params->colidx[D][A];
421
SIjAb_inc.matrix[Gkj][kj][ad] -= Z[a][d];
422
SIjAb_inc.matrix[Gjk][jk][da] -= Z[a][d];
427
dpd_free_block(WmAEf->matrix[Gid], virtpi[Gd], WmAEf->params->coltot[Gid^GW]);
431
/* S_kida <-- - t_ijkabc W_jdbc */
432
/* S_ikad <-- - t_ijkabc W_jdbc */
433
for(Gd=0; Gd < nirreps; Gd++) {
439
nlinks = WmAEf->params->coltot[Gjd^GW];
441
if(nrows && ncols && nlinks) {
442
jd = WmAEf->row_offset[Gjd][J];
443
WmAEf->matrix[Gjd] = dpd_block_matrix(virtpi[Gd], WmAEf->params->coltot[Gjd^GW]);
444
dpd_buf4_mat_irrep_rd_block(WmAEf, Gjd, jd, virtpi[Gd]);
446
Z = block_matrix(virtpi[Ga], virtpi[Gd]);
447
C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W3a[Ga][0], nlinks,
448
WmAEf->matrix[Gjd][0], nlinks, 1.0, Z[0], ncols);
450
for(a=0; a < virtpi[Ga]; a++) {
452
for(d=0; d < virtpi[Gd]; d++) {
454
ad = SIjAb_inc.params->colidx[A][D];
455
da = SIjAb_inc.params->colidx[D][A];
456
SIjAb_inc.matrix[Gki][ki][da] -= Z[a][d];
457
SIjAb_inc.matrix[Gik][ik][ad] -= Z[a][d];
461
dpd_free_block(WmAEf->matrix[Gjd], virtpi[Gd], WmAEf->params->coltot[Gjd^GW]);
465
timer_off("X3*Wamef");
467
} /* end Wamef*X3->Sijab contributions */
472
for(Gab=0; Gab < nirreps; Gab++) {
473
Gc = Gab ^ Gijk ^ GX3;
474
dpd_free_block(W3[Gab], WAbEi->params->coltot[Gab], virtpi[Gc]);
476
for(Ga=0; Ga < nirreps; Ga++) {
477
Gbc = Ga ^ Gijk ^ GX3;
478
dpd_free_block(W3a[Ga], virtpi[Ga], WAbEi->params->coltot[Gbc]);
484
/* close up files and update sigma vectors */
485
dpd_file2_mat_close(&fIJ);
486
dpd_file2_mat_close(&fAB);
487
dpd_file2_mat_close(FME);
488
dpd_file2_close(&fIJ);
489
dpd_file2_close(&fAB);
491
dpd_file2_mat_close(&fIJ2);
492
dpd_file2_mat_close(&fAB2);
493
dpd_file2_close(&fIJ2);
494
dpd_file2_close(&fAB2);
497
for(h=0; h < nirreps; h++)
498
dpd_buf4_mat_irrep_close(Dints, h);
499
dpd_file2_mat_wrt(&SIA_inc);
500
dpd_file2_mat_close(&SIA_inc);
501
dpd_file2_axpy(&SIA_inc, SIA, 1, 0);
502
dpd_file2_close(&SIA_inc);
506
for(h=0; h < nirreps; h++) {
507
dpd_buf4_mat_irrep_close(WMnIe, h);
508
dpd_buf4_mat_irrep_wrt(&SIjAb_inc, h);
509
dpd_buf4_mat_irrep_close(&SIjAb_inc, h);
511
dpd_buf4_axpy(&SIjAb_inc, SIjAb, 1);
512
dpd_buf4_close(&SIjAb_inc);