3
\brief Enter brief description of file here
6
/*! \defgroup CCENERGY ccenergy: Compute the Coupled-Cluster Energy */
11
#include <libciomr/libciomr.h>
12
#include <libiwl/iwl.h>
14
#include <libdpd/dpd.h>
16
namespace psi { namespace ccenergy {
18
int AO_contribute(struct iwlbuf *InBuf, dpdbuf4 *tau1_AO, dpdbuf4 *tau2_AO)
24
int Gp, Gq, Gr, Gs, Gpr, Gps, Gqr, Gqs, Grp, Gsp, Grq, Gsq;
25
int pr, ps, qr, qs, rp, rq, sp, sq, pq, rs;
28
lblptr = InBuf->labels;
29
valptr = InBuf->values;
31
for(idx=4*InBuf->idx; InBuf->idx < InBuf->inbuf; InBuf->idx++) {
32
p = abs((int) lblptr[idx++]);
33
q = (int) lblptr[idx++];
34
r = (int) lblptr[idx++];
35
s = (int) lblptr[idx++];
37
value = (double) valptr[InBuf->idx];
39
if(fabs(value) > 1e-8)
40
fprintf(stdout, "%d %d %d %d %20.14f\n", p, q, r, s, value);
44
Gp = tau1_AO->params->psym[p];
45
Gq = tau1_AO->params->psym[q];
46
Gr = tau1_AO->params->psym[r];
47
Gs = tau1_AO->params->psym[s];
54
pq = tau1_AO->params->rowidx[p][q];
55
rs = tau1_AO->params->rowidx[r][s];
57
pr = tau1_AO->params->rowidx[p][r];
58
rp = tau1_AO->params->rowidx[r][p];
59
ps = tau1_AO->params->rowidx[p][s];
60
sp = tau1_AO->params->rowidx[s][p];
61
qr = tau1_AO->params->rowidx[q][r];
62
rq = tau1_AO->params->rowidx[r][q];
63
qs = tau1_AO->params->rowidx[q][s];
64
sq = tau1_AO->params->rowidx[s][q];
67
if(tau1_AO->params->coltot[Gpr])
68
C_DAXPY(tau1_AO->params->coltot[Gpr], value, tau1_AO->matrix[Gpr][qs], 1,
69
tau2_AO->matrix[Gpr][pr], 1);
71
if(p!=q && r!=s && pq != rs) {
74
if(tau1_AO->params->coltot[Gps])
75
C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
76
tau2_AO->matrix[Gps][ps], 1);
79
if(tau1_AO->params->coltot[Gqr])
80
C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
81
tau2_AO->matrix[Gqr][qr], 1);
84
if(tau1_AO->params->coltot[Gqs])
85
C_DAXPY(tau1_AO->params->coltot[Gqs], value, tau1_AO->matrix[Gqs][pr], 1,
86
tau2_AO->matrix[Gqs][qs], 1);
89
if(tau1_AO->params->coltot[Grp])
90
C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
91
tau2_AO->matrix[Grp][rp], 1);
94
if(tau1_AO->params->coltot[Gsp])
95
C_DAXPY(tau1_AO->params->coltot[Gsp], value, tau1_AO->matrix[Gsp][rq], 1,
96
tau2_AO->matrix[Gsp][sp], 1);
99
if(tau1_AO->params->coltot[Grq])
100
C_DAXPY(tau1_AO->params->coltot[Grq], value, tau1_AO->matrix[Grq][sp], 1,
101
tau2_AO->matrix[Grq][rq], 1);
104
if(tau1_AO->params->coltot[Gsq])
105
C_DAXPY(tau1_AO->params->coltot[Gsq], value, tau1_AO->matrix[Gsq][rp], 1,
106
tau2_AO->matrix[Gsq][sq],1 );
109
else if(p!=q && r!=s && pq==rs) {
112
if(tau1_AO->params->coltot[Gps])
113
C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
114
tau2_AO->matrix[Gps][ps], 1);
117
if(tau1_AO->params->coltot[Gqr])
118
C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
119
tau2_AO->matrix[Gqr][qr], 1);
122
if(tau1_AO->params->coltot[Gqs])
123
C_DAXPY(tau1_AO->params->coltot[Gqs], value, tau1_AO->matrix[Gqs][pr], 1,
124
tau2_AO->matrix[Gqs][qs], 1);
127
else if(p!=q && r==s) {
130
if(tau1_AO->params->coltot[Gqr])
131
C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
132
tau2_AO->matrix[Gqr][qr], 1);
135
if(tau1_AO->params->coltot[Grp])
136
C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
137
tau2_AO->matrix[Grp][rp], 1);
140
if(tau1_AO->params->coltot[Grq])
141
C_DAXPY(tau1_AO->params->coltot[Grq], value, tau1_AO->matrix[Grq][sp], 1,
142
tau2_AO->matrix[Grq][rq], 1);
146
else if(p==q && r!=s) {
149
if(tau1_AO->params->coltot[Gps])
150
C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
151
tau2_AO->matrix[Gps][ps], 1);
154
if(tau1_AO->params->coltot[Grp])
155
C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
156
tau2_AO->matrix[Grp][rp], 1);
159
if(tau1_AO->params->coltot[Gsp])
160
C_DAXPY(tau1_AO->params->coltot[Gsp], value, tau1_AO->matrix[Gsp][rq], 1,
161
tau2_AO->matrix[Gsp][sp], 1);
165
else if(p==q && r==s && pq != rs) {
168
if(tau1_AO->params->coltot[Grp])
169
C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
170
tau2_AO->matrix[Grp][rp], 1);
178
}} // namespace psi::ccenergy