3
\brief Enter brief description of file here
8
#include <libciomr/libciomr.h>
9
#include <libiwl/iwl.h>
16
namespace psi { namespace ccenergy {
18
#define INDEX(i,j) ((i>j) ? (ioff[(i)]+(j)) : (ioff[(j)]+(i)))
20
void rhf_fock_build(double **fock, double **D)
25
int lastbuf, idx, p, q, r, s, pq, rs;
32
ntri = nso * (nso+1)/2;
34
/* one-electron contributions */
35
scratch = init_array(ntri);
36
stat = iwl_rdone(PSIF_OEI, PSIF_SO_T, scratch, ntri, 0, 0, outfile);
37
for(i=0, ij=0; i < nso; i++)
38
for(j=0; j <= i; j++, ij++)
39
fock[i][j] = fock[j][i] = scratch[ij];
40
stat = iwl_rdone(PSIF_OEI, PSIF_SO_V, scratch, ntri, 0, 0, outfile);
41
for(i=0, ij=0; i < nso; i++)
42
for(j=0; j <= i; j++, ij++) {
43
fock[i][j] += scratch[ij];
44
if(i!=j) fock[j][i] += scratch[ij];
48
iwl_buf_init(&InBuf, PSIF_SO_TEI, 0.0, 1, 1);
51
lastbuf = InBuf.lastbuf;
52
lblptr = InBuf.labels;
53
valptr = InBuf.values;
55
for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
56
p = abs((int) lblptr[idx++]);
57
q = (int) lblptr[idx++];
58
r = (int) lblptr[idx++];
59
s = (int) lblptr[idx++];
60
value = (double) valptr[InBuf.idx];
66
fprintf(outfile, "%d %d %d %d [%d] [%d] %20.15f\n", p, q, r, s, pq, rs, value);
70
fock[p][q] += 2.0 * D[r][s] * value;
71
fock[p][r] -= D[q][s] * value;
73
if(p!=q && r!=s && pq != rs) {
76
fock[p][q] += 2.0 * D[s][r] * value;
77
fock[p][s] -= D[q][r] * value;
80
fock[q][p] += 2.0 * D[r][s] * value;
81
fock[q][r] -= D[p][s] * value;
84
fock[q][p] += 2.0 * D[s][r] * value;
85
fock[q][s] -= D[p][r] * value;
88
fock[r][s] += 2.0 * D[p][q] * value;
89
fock[r][p] -= D[s][q] * value;
92
fock[r][s] += 2.0 * D[q][p] * value;
93
fock[r][q] -= D[s][p] * value;
96
fock[s][r] += 2.0 * D[p][q] * value;
97
fock[s][p] -= D[r][q] * value;
100
fock[s][r] += 2.0 * D[q][p] * value;
101
fock[s][q] -= D[r][p] * value;
103
else if(p!=q && r!=s && pq==rs) {
106
fock[p][q] += 2.0 * D[s][r] * value;
107
fock[p][s] -= D[q][r] * value;
110
fock[q][p] += 2.0 * D[r][s] * value;
111
fock[q][r] -= D[p][s] * value;
114
fock[q][p] += 2.0 * D[s][r] * value;
115
fock[q][s] -= D[p][r] * value;
118
else if(p!=q && r==s) {
121
fock[q][p] += 2.0 * D[r][s] * value;
122
fock[q][r] -= D[p][s] * value;
125
fock[r][s] += 2.0 * D[p][q] * value;
126
fock[r][p] -= D[s][q] * value;
129
fock[r][s] += 2.0 * D[q][p] * value;
130
fock[r][q] -= D[s][p] * value;
133
else if(p==q && r!=s) {
136
fock[p][q] += 2.0 * D[s][r] * value;
137
fock[p][s] -= D[q][r] * value;
140
fock[r][s] += 2.0 * D[p][q] * value;
141
fock[r][p] -= D[s][q] * value;
144
fock[s][r] += 2.0 * D[p][q] * value;
145
fock[s][p] -= D[r][q] * value;
148
else if(p==q && r==s && pq!=rs) {
151
fock[r][s] += 2.0 * D[p][q] * value;
152
fock[r][p] -= D[s][q] * value;
157
if(!lastbuf) iwl_buf_fetch(&InBuf);
160
iwl_buf_close(&InBuf, 1);
163
void uhf_fock_build(double **fock_a, double **fock_b, double **D_a, double **D_b)
166
int nso, ntri, ntei, stat;
168
int lastbuf, idx, p, q, r, s, pq, rs;
176
ntri = nso * (nso+1)/2;
177
ntei = ntri * (ntri+1)/2;
179
Dt = block_matrix(nso, nso);
180
for(p=0; p < nso; p++)
181
for(q=0; q < nso; q++)
182
Dt[p][q] = D_a[p][q] + D_b[p][q];
184
/* one-electron contributions */
185
scratch = init_array(ntri);
186
stat = iwl_rdone(PSIF_OEI, PSIF_SO_T, scratch, ntri, 0, 0, outfile);
187
for(i=0, ij=0; i < nso; i++)
188
for(j=0; j <= i; j++, ij++) {
189
fock_a[i][j] = fock_a[j][i] = scratch[ij];
190
fock_b[i][j] = fock_b[j][i] = scratch[ij];
192
stat = iwl_rdone(PSIF_OEI, PSIF_SO_V, scratch, ntri, 0, 0, outfile);
193
for(i=0, ij=0; i < nso; i++)
194
for(j=0; j <= i; j++, ij++) {
195
fock_a[i][j] += scratch[ij];
196
if(i!=j) fock_a[j][i] += scratch[ij];
197
fock_b[i][j] += scratch[ij];
198
if(i!=j) fock_b[j][i] += scratch[ij];
202
iwl_buf_init(&InBuf, PSIF_SO_TEI, 0.0, 1, 1);
205
lastbuf = InBuf.lastbuf;
206
lblptr = InBuf.labels;
207
valptr = InBuf.values;
209
for(idx=4*InBuf.idx; InBuf.idx < InBuf.inbuf; InBuf.idx++) {
210
p = abs((int) lblptr[idx++]);
211
q = (int) lblptr[idx++];
212
r = (int) lblptr[idx++];
213
s = (int) lblptr[idx++];
214
value = (double) valptr[InBuf.idx];
220
fprintf(outfile, "%d %d %d %d [%d] [%d] %20.15f\n", p, q, r, s, pq, rs, value);
224
fock_a[p][q] += Dt[r][s] * value;
225
fock_a[p][r] -= D_a[q][s] * value;
226
fock_b[p][q] += Dt[r][s] * value;
227
fock_b[p][r] -= D_b[q][s] * value;
229
if(p!=q && r!=s && pq != rs) {
232
fock_a[p][q] += Dt[s][r] * value;
233
fock_a[p][s] -= D_a[q][r] * value;
234
fock_b[p][q] += Dt[s][r] * value;
235
fock_b[p][s] -= D_b[q][r] * value;
238
fock_a[q][p] += Dt[r][s] * value;
239
fock_a[q][r] -= D_a[p][s] * value;
240
fock_b[q][p] += Dt[r][s] * value;
241
fock_b[q][r] -= D_b[p][s] * value;
244
fock_a[q][p] += Dt[s][r] * value;
245
fock_a[q][s] -= D_a[p][r] * value;
246
fock_b[q][p] += Dt[s][r] * value;
247
fock_b[q][s] -= D_b[p][r] * value;
250
fock_a[r][s] += Dt[p][q] * value;
251
fock_a[r][p] -= D_a[s][q] * value;
252
fock_b[r][s] += Dt[p][q] * value;
253
fock_b[r][p] -= D_b[s][q] * value;
256
fock_a[r][s] += Dt[q][p] * value;
257
fock_a[r][q] -= D_a[s][p] * value;
258
fock_b[r][s] += Dt[q][p] * value;
259
fock_b[r][q] -= D_b[s][p] * value;
262
fock_a[s][r] += Dt[p][q] * value;
263
fock_a[s][p] -= D_a[r][q] * value;
264
fock_b[s][r] += Dt[p][q] * value;
265
fock_b[s][p] -= D_b[r][q] * value;
268
fock_a[s][r] += Dt[q][p] * value;
269
fock_a[s][q] -= D_a[r][p] * value;
270
fock_b[s][r] += Dt[q][p] * value;
271
fock_b[s][q] -= D_b[r][p] * value;
273
else if(p!=q && r!=s && pq==rs) {
276
fock_a[p][q] += Dt[s][r] * value;
277
fock_a[p][s] -= D_a[q][r] * value;
278
fock_b[p][q] += Dt[s][r] * value;
279
fock_b[p][s] -= D_b[q][r] * value;
282
fock_a[q][p] += Dt[r][s] * value;
283
fock_a[q][r] -= D_a[p][s] * value;
284
fock_b[q][p] += Dt[r][s] * value;
285
fock_b[q][r] -= D_b[p][s] * value;
288
fock_a[q][p] += Dt[s][r] * value;
289
fock_a[q][s] -= D_a[p][r] * value;
290
fock_b[q][p] += Dt[s][r] * value;
291
fock_b[q][s] -= D_b[p][r] * value;
294
else if(p!=q && r==s) {
297
fock_a[q][p] += Dt[r][s] * value;
298
fock_a[q][r] -= D_a[p][s] * value;
299
fock_b[q][p] += Dt[r][s] * value;
300
fock_b[q][r] -= D_b[p][s] * value;
303
fock_a[r][s] += Dt[p][q] * value;
304
fock_a[r][p] -= D_a[s][q] * value;
305
fock_b[r][s] += Dt[p][q] * value;
306
fock_b[r][p] -= D_b[s][q] * value;
309
fock_a[r][s] += Dt[q][p] * value;
310
fock_a[r][q] -= D_a[s][p] * value;
311
fock_b[r][s] += Dt[q][p] * value;
312
fock_b[r][q] -= D_b[s][p] * value;
315
else if(p==q && r!=s) {
318
fock_a[p][q] += Dt[s][r] * value;
319
fock_a[p][s] -= D_a[q][r] * value;
320
fock_b[p][q] += Dt[s][r] * value;
321
fock_b[p][s] -= D_b[q][r] * value;
324
fock_a[r][s] += Dt[p][q] * value;
325
fock_a[r][p] -= D_a[s][q] * value;
326
fock_b[r][s] += Dt[p][q] * value;
327
fock_b[r][p] -= D_b[s][q] * value;
330
fock_a[s][r] += Dt[p][q] * value;
331
fock_a[s][p] -= D_a[r][q] * value;
332
fock_b[s][r] += Dt[p][q] * value;
333
fock_b[s][p] -= D_b[r][q] * value;
336
else if(p==q && r==s && pq!=rs) {
339
fock_a[r][s] += Dt[p][q] * value;
340
fock_a[r][p] -= D_a[s][q] * value;
341
fock_b[r][s] += Dt[p][q] * value;
342
fock_b[r][p] -= D_b[s][q] * value;
347
if(!lastbuf) iwl_buf_fetch(&InBuf);
350
iwl_buf_close(&InBuf, 1);
354
}} // namespace psi::ccenergy