~ubuntu-branches/ubuntu/vivid/psicode/vivid

« back to all changes in this revision

Viewing changes to src/bin/cclambda/cc3_l3l2.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Banck
  • Date: 2008-06-07 16:49:57 UTC
  • mfrom: (2.1.2 hardy)
  • Revision ID: james.westby@ubuntu.com-20080607164957-8pifvb133yjlkagn
Tags: 3.3.0-3
* debian/rules (DEB_MAKE_CHECK_TARGET): Do not abort test suite on
  failures.
* debian/rules (DEB_CONFIGURE_EXTRA_FLAGS): Set ${bindir} to /usr/lib/psi.
* debian/rules (install/psi3): Move psi3 file to /usr/bin.
* debian/patches/07_464867_move_executables.dpatch: New patch, add
  /usr/lib/psi to the $PATH, so that the moved executables are found.
  (closes: #464867)
* debian/patches/00list: Adjusted.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <stdlib.h>
 
3
#include <math.h>
 
4
#include <libdpd/dpd.h>
 
5
#include <libqt/qt.h>
 
6
#define EXTERN
 
7
#include "globals.h"
 
8
 
 
9
void cc3_l3l2_RHF_AAA(void);
 
10
void cc3_l3l2_RHF_AAB(void);
 
11
 
 
12
void L3_AAA(double ***W1, int nirreps, int I, int Gi, int J, int Gj, int K, int Gk, 
 
13
            dpdbuf4 *T2, dpdbuf4 *F, dpdbuf4 *E, dpdfile2 *fIJ, dpdfile2 *fAB, 
 
14
            dpdbuf4 *D, dpdbuf4 *LIJAB, dpdfile2 *LIA, dpdfile2 *FME,
 
15
            int *occpi, int *occ_off, int *virtpi, int *vir_off);
 
16
 
 
17
void L3_AAB(double ***W1, int nirreps, int I, int Gi, int J, int Gj, int K, int Gk, 
 
18
            dpdbuf4 *T2AA, dpdbuf4 *T2AB, dpdbuf4 *T2BA, dpdbuf4 *FAA, dpdbuf4 *FAB, dpdbuf4 *FBA,
 
19
            dpdbuf4 *EAA, dpdbuf4 *EAB, dpdbuf4 *EBA, dpdfile2 *fIJ, dpdfile2 *fij, 
 
20
            dpdfile2 *fAB, dpdfile2 *fab, dpdbuf4 *DAA, dpdbuf4 *DAB, dpdbuf4 *LIJAB, dpdbuf4 *LIjAb,
 
21
            dpdfile2 *LIA, dpdfile2 *Lia, dpdfile2 *FME, dpdfile2 *Fme,
 
22
            int *aoccpi, int *aocc_off, int *boccpi, int *bocc_off,
 
23
            int *avirtpi, int *avir_off, int *bvirtpi, int *bvir_off);
 
24
 
 
25
void cc3_l3l2(void)
 
26
{
 
27
  if(params.ref == 0) {
 
28
    cc3_l3l2_RHF_AAA();
 
29
    cc3_l3l2_RHF_AAB();
 
30
  }
 
31
}
 
32
 
 
33
void cc3_l3l2_RHF_AAA(void)
 
34
{
 
35
  int h, nirreps;
 
36
  int *occ_off, *occpi;
 
37
  int *vir_off, *virtpi;
 
38
  int Gijk;
 
39
  int Gi, Gj, Gk;
 
40
  int Ga, Gb, Gc;
 
41
  int Gab, ab;
 
42
  int i, j, k, I, J, K;
 
43
  int a, b, c, A, B, C;
 
44
  double ***W1, ***W2;
 
45
  dpdbuf4 L, E, F;
 
46
  dpdfile2 fIJ, fAB;
 
47
  dpdfile2 FME, LIA;
 
48
  dpdbuf4 Dints, LIJAB;
 
49
  dpdbuf4 WMAFE, WMNIE;
 
50
  dpdbuf4 ZIGDE, T2;
 
51
  dpdbuf4 ZDMAE;
 
52
  dpdbuf4 ZLMAO;
 
53
  dpdbuf4 ZIMLE;
 
54
  dpdbuf4 L2new, L2, D2;
 
55
  int Gjk, jk, Gid, id, Gik, ik;
 
56
  int Gd, d, DD;
 
57
  int cd, dc;
 
58
  int Gm, m, M;
 
59
  int Gmi, mi, im, mc;
 
60
  int Gjd, jd;
 
61
  int Gij, ij, Gmk, mk, am, Gbc, bc;
 
62
  int ac, mb;
 
63
  int nrows, ncols, nlinks;
 
64
  double **Z;
 
65
 
 
66
  nirreps = moinfo.nirreps;
 
67
  occpi = moinfo.occpi;
 
68
  occ_off = moinfo.occ_off;
 
69
  virtpi = moinfo.virtpi;
 
70
  vir_off = moinfo.vir_off;
 
71
 
 
72
  dpd_buf4_init(&WMAFE, CC3_HET1, 0, 10, 5, 10, 7, 0, "CC3 WABEI (IE,B>A)");
 
73
  dpd_buf4_init(&WMNIE, CC3_HET1, 0, 0, 10, 2, 10, 0, "CC3 WMBIJ (I>J,MB)");
 
74
  for(h=0; h < nirreps; h++) {
 
75
    dpd_buf4_mat_irrep_init(&WMNIE, h);
 
76
    dpd_buf4_mat_irrep_rd(&WMNIE, h);
 
77
  }
 
78
 
 
79
  dpd_buf4_init(&L2new, CC3_MISC, 0, 0, 5, 0, 5, 0, "CC3 LIJAB");
 
80
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_init(&L2new, h);
 
81
 
 
82
  dpd_buf4_init(&ZIGDE, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZIGDE");
 
83
  dpd_buf4_scm(&ZIGDE, 0.0); /* must be cleared in each iteration */
 
84
 
 
85
  dpd_buf4_init(&ZDMAE, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZDMAE (MD,AE)");
 
86
  dpd_buf4_scm(&ZDMAE, 0.0);
 
87
 
 
88
  dpd_buf4_init(&ZLMAO, CC3_MISC, 0, 0, 11, 0, 11, 0, "CC3 ZLMAO");
 
89
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_init(&ZLMAO, h);
 
90
 
 
91
  dpd_buf4_init(&ZIMLE, CC3_MISC, 0, 0, 10, 0, 10, 0, "CC3 ZIMLE");
 
92
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_init(&ZIMLE, h);
 
93
 
 
94
  dpd_buf4_init(&T2, CC_TAMPS, 0, 0, 5, 2, 7, 0, "tIJAB");
 
95
  for(h=0; h < nirreps; h++) {
 
96
    dpd_buf4_mat_irrep_init(&T2, h);
 
97
    dpd_buf4_mat_irrep_rd(&T2, h);
 
98
  }
 
99
 
 
100
  dpd_file2_init(&fIJ, CC_OEI, 0, 0, 0, "fIJ");
 
101
  dpd_file2_init(&fAB, CC_OEI, 0, 1, 1, "fAB");
 
102
 
 
103
  dpd_buf4_init(&L, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "LIJAB");
 
104
  dpd_buf4_init(&F, CC3_HET1, 0, 10, 5, 10, 7, 0, "CC3 WAMEF (MA,F>E)");
 
105
  dpd_buf4_init(&E, CC3_HET1, 0, 0, 10, 2, 10, 0, "CC3 WMNIE (M>N,IE)");
 
106
 
 
107
  dpd_buf4_init(&Dints, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij||ab>");
 
108
  dpd_buf4_init(&LIJAB, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "LIJAB");
 
109
  dpd_file2_init(&LIA, CC_LAMBDA, 0, 0, 1, "LIA");
 
110
  dpd_file2_init(&FME, CC_OEI, 0, 0, 1, "FME");
 
111
 
 
112
  W1 = (double ***) malloc(nirreps * sizeof(double **));
 
113
  W2 = (double ***) malloc(nirreps * sizeof(double **));
 
114
 
 
115
  for(Gi=0; Gi < nirreps; Gi++) {
 
116
    for(Gj=0; Gj < nirreps; Gj++) {
 
117
      Gij = Gi ^ Gj;
 
118
      for(Gk=0; Gk < nirreps; Gk++) {
 
119
        Gijk = Gi ^ Gj ^ Gk;
 
120
 
 
121
        Gjk = Gj ^ Gk;
 
122
        Gik = Gi ^ Gk;
 
123
 
 
124
        for(Gab=0; Gab < nirreps; Gab++) {
 
125
          Gc = Gab ^ Gijk; /* totally symmetric */
 
126
          W1[Gab] = dpd_block_matrix(F.params->coltot[Gab], virtpi[Gc]);
 
127
        }
 
128
        for(Ga=0; Ga < nirreps; Ga++) {
 
129
          Gbc = Ga ^ Gijk; /* totally symmetric */
 
130
          W2[Ga] = dpd_block_matrix(virtpi[Ga], F.params->coltot[Gbc]);
 
131
        }
 
132
 
 
133
        for(i=0; i < occpi[Gi]; i++) {
 
134
          I = occ_off[Gi] + i;
 
135
          for(j=0; j < occpi[Gj]; j++) {
 
136
            J = occ_off[Gj] + j;
 
137
            for(k=0; k < occpi[Gk]; k++) {
 
138
              K = occ_off[Gk] + k;
 
139
 
 
140
              L3_AAA(W1, nirreps, I, Gi, J, Gj, K, Gk, &L, &F, &E, &fIJ, &fAB,
 
141
                     &Dints, &LIJAB, &LIA, &FME, occpi, occ_off, virtpi, vir_off);
 
142
 
 
143
              /* L_JKDC <-- +1/2 t_IJKABC W_ABID (IDAB) */
 
144
              /* L_JKCD <-- -1/2 t_IJKABC W_ABID (IDAB) */
 
145
              jk = L2new.params->rowidx[J][K];
 
146
              for(Gd=0; Gd < nirreps; Gd++) {
 
147
                Gab = Gid = Gi ^ Gd;  /* assumes Wieab is totally symmetric */
 
148
                Gc = Gab ^ Gijk;  /* assumes T3 is totally symmetric */
 
149
 
 
150
                id = WMAFE.row_offset[Gid][I];
 
151
 
 
152
                Z = block_matrix(virtpi[Gc],virtpi[Gd]);
 
153
                WMAFE.matrix[Gid] = dpd_block_matrix(virtpi[Gd], WMAFE.params->coltot[Gid]);
 
154
                dpd_buf4_mat_irrep_rd_block(&WMAFE, Gid, id, virtpi[Gd]);
 
155
 
 
156
                nrows = virtpi[Gc];
 
157
                ncols = virtpi[Gd];
 
158
                nlinks = WMAFE.params->coltot[Gid];
 
159
 
 
160
                if(nrows && ncols && nlinks)
 
161
                  C_DGEMM('t', 't', nrows, ncols, nlinks, 0.5, W1[Gab][0], nrows, 
 
162
                          WMAFE.matrix[Gid][0], nlinks, 0.0, Z[0], ncols);
 
163
 
 
164
                for(c=0; c < virtpi[Gc]; c++) {
 
165
                  C = vir_off[Gc] + c;
 
166
                  for(d=0; d < virtpi[Gd]; d++) {
 
167
                    DD = vir_off[Gd] + d;
 
168
                    cd = L2new.params->colidx[C][DD];
 
169
                    dc = L2new.params->colidx[DD][C];
 
170
                    L2new.matrix[Gjk][jk][dc] += Z[c][d];
 
171
                    L2new.matrix[Gjk][jk][cd] += -Z[c][d];
 
172
                  }
 
173
                }
 
174
                dpd_free_block(WMAFE.matrix[Gid], virtpi[Gd], WMAFE.params->coltot[Gid]);
 
175
                free_block(Z);
 
176
              }
 
177
 
 
178
              /* t_MIAB <-- +1/2 t_IJKABC W_JKMC */
 
179
              /* t_IMAB <-- -1/2 t_IJKABC W_JKMC */
 
180
              jk = WMNIE.params->rowidx[J][K];
 
181
              for(Gm=0; Gm < nirreps; Gm++) {
 
182
                Gab = Gmi = Gm ^ Gi;  /* assumes totally symmetric */
 
183
                Gc = Gab ^ Gijk;      /* assumes totally symmetric */
 
184
 
 
185
                mc = WMNIE.col_offset[Gjk][Gm];
 
186
 
 
187
                nrows = F.params->coltot[Gab];
 
188
                ncols = occpi[Gm];
 
189
                nlinks = virtpi[Gc];
 
190
 
 
191
                Z = dpd_block_matrix(nrows, ncols);
 
192
 
 
193
                if(nrows && ncols && nlinks) 
 
194
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 0.5, W1[Gab][0], nlinks,
 
195
                          &(WMNIE.matrix[Gjk][jk][mc]), nlinks, 0.0, Z[0], ncols);
 
196
 
 
197
                for(m=0; m < ncols; m++) {
 
198
                  M = occ_off[Gm] + m;
 
199
                  mi = L2new.params->rowidx[M][I];
 
200
                  im = L2new.params->rowidx[I][M];
 
201
                  for(ab=0; ab < nrows; ab++) {
 
202
                    L2new.matrix[Gmi][mi][ab] += Z[ab][m];
 
203
                    L2new.matrix[Gmi][im][ab] -= Z[ab][m];
 
204
                  }
 
205
                }
 
206
 
 
207
                dpd_free_block(Z, nrows, ncols);
 
208
              }
 
209
 
 
210
              /* Z_IDAB <-- 1/2 L_IJKABC t_JKDC */
 
211
 
 
212
              jk = T2.params->rowidx[J][K];
 
213
              for(Gab=0; Gab < nirreps; Gab++) {
 
214
                Gid = Gab; /* totally symmetric */
 
215
                Gc = Gab ^ Gijk; /* totally symmetric */
 
216
                Gd = Gi ^ Gid;
 
217
 
 
218
                nrows = virtpi[Gd];
 
219
                ncols = ZIGDE.params->coltot[Gid];
 
220
                nlinks = virtpi[Gc];
 
221
 
 
222
                dc = T2.col_offset[Gjk][Gd];
 
223
                id = ZIGDE.row_offset[Gid][I];
 
224
                ZIGDE.matrix[Gid] = dpd_block_matrix(nrows, ncols);
 
225
                dpd_buf4_mat_irrep_rd_block(&ZIGDE, Gid, id, nrows);
 
226
 
 
227
                if(nrows && ncols && nlinks)
 
228
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 0.5, &(T2.matrix[Gjk][jk][dc]), nlinks,
 
229
                          W1[Gab][0], nlinks, 1.0, ZIGDE.matrix[Gid][0], ncols);
 
230
 
 
231
                dpd_buf4_mat_irrep_wrt_block(&ZIGDE, Gid, id, nrows);
 
232
                dpd_free_block(ZIGDE.matrix[Gid], nrows, ncols);
 
233
              }
 
234
 
 
235
              /* Z_JDAB <-- 1/2 L_IJKABC t_IKDC */
 
236
              ik = T2.params->rowidx[I][K];
 
237
              for(Gab=0; Gab < nirreps; Gab++) {
 
238
                Gjd = Gab; /* totally symmetric */
 
239
                Gc = Gab ^ Gijk; /* totally symmetric */
 
240
                Gd = Gj ^ Gjd;
 
241
 
 
242
                nrows = virtpi[Gd];
 
243
                ncols = ZDMAE.params->coltot[Gjd];
 
244
                nlinks = virtpi[Gc];
 
245
 
 
246
                dc = T2.col_offset[Gik][Gd];
 
247
                jd = ZDMAE.row_offset[Gjd][J];
 
248
                ZDMAE.matrix[Gjd] = dpd_block_matrix(nrows, ncols);
 
249
                dpd_buf4_mat_irrep_rd_block(&ZDMAE, Gjd, jd, nrows);
 
250
 
 
251
                if(nrows && ncols && nlinks) 
 
252
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 0.5, &(T2.matrix[Gik][ik][dc]), nlinks,
 
253
                          W1[Gab][0], nlinks, 1.0, ZDMAE.matrix[Gjd][0], ncols);
 
254
 
 
255
                dpd_buf4_mat_irrep_wrt_block(&ZDMAE, Gjd, jd, nrows);
 
256
                dpd_free_block(ZDMAE.matrix[Gjd], nrows, ncols);
 
257
              }
 
258
 
 
259
              /* Z_IJAM <-- -1/2 L_IJKABC t_MKBC */
 
260
              /* sort W(AB,C) to W(A,BC) */
 
261
              for(Gab=0; Gab < nirreps; Gab++) {
 
262
                Gc = Gab ^ Gijk;
 
263
                for(ab=0; ab < F.params->coltot[Gab]; ab++) {
 
264
                  A = F.params->colorb[Gab][ab][0];
 
265
                  B = F.params->colorb[Gab][ab][1];
 
266
                  Ga = F.params->rsym[A];
 
267
                  a = A - vir_off[Ga];
 
268
                  for(c=0; c < virtpi[Gc]; c++) {
 
269
                    C = vir_off[Gc] + c;
 
270
                    bc = F.params->colidx[B][C];
 
271
                    W2[Ga][a][bc] = W1[Gab][ab][c];
 
272
                  }
 
273
                }
 
274
              }
 
275
 
 
276
              ij = ZLMAO.params->rowidx[I][J];
 
277
 
 
278
              for(Gm=0; Gm < nirreps; Gm++) {
 
279
                Gbc = Gmk = Gm ^ Gk; /* totally symmetric */
 
280
                Ga = Gij ^ Gm; /* totally symmetric */
 
281
 
 
282
                nrows = virtpi[Ga];
 
283
                ncols = T2.params->coltot[Gmk];
 
284
 
 
285
                for(m=0; m < occpi[Gm]; m++) {
 
286
                  M = occ_off[Gm] + m;
 
287
                  mk = T2.params->rowidx[M][K];
 
288
                  am = ZLMAO.col_offset[Gij][Ga] + m;
 
289
 
 
290
                  if(nrows && ncols)
 
291
                    C_DGEMV('n', nrows, ncols, -0.5, W2[Ga][0], ncols, T2.matrix[Gmk][mk], 1, 
 
292
                            1.0, &(ZLMAO.matrix[Gij][ij][am]), occpi[Gm]);
 
293
                }
 
294
              }
 
295
 
 
296
              /* Z_IJMB <-- -1/2 L_IJKABC t_MKAC */
 
297
              /* sort W(AB,C) to W(B,AC) */
 
298
              for(Gab=0; Gab < nirreps; Gab++) {
 
299
                Gc = Gab ^ Gijk;
 
300
                for(ab=0; ab < F.params->coltot[Gab]; ab++) {
 
301
                  A = F.params->colorb[Gab][ab][0];
 
302
                  B = F.params->colorb[Gab][ab][1];
 
303
                  Gb = F.params->ssym[B];
 
304
                  b = B - vir_off[Gb];
 
305
                  for(c=0; c < virtpi[Gc]; c++) {
 
306
                    C = vir_off[Gc] + c;
 
307
                    ac = F.params->colidx[A][C];
 
308
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
309
                  }
 
310
                }
 
311
              }
 
312
 
 
313
              ij = ZIMLE.params->rowidx[I][J];
 
314
 
 
315
              for(Gm=0; Gm < nirreps; Gm++) {
 
316
                Gb = Gm ^ Gij; /* totally symmetric */
 
317
                Gmk = Gm ^ Gk;
 
318
 
 
319
                nrows = virtpi[Gb];
 
320
                ncols = T2.params->coltot[Gmk];
 
321
 
 
322
                for(m=0; m < occpi[Gm]; m++) {
 
323
                  M = occ_off[Gm] + m;
 
324
                  mk = T2.params->rowidx[M][K];
 
325
                  mb = ZIMLE.col_offset[Gij][Gm] + m * virtpi[Gb];
 
326
 
 
327
                  if(nrows && ncols)
 
328
                    C_DGEMV('n', nrows, ncols, -0.5, W2[Gb][0], ncols, T2.matrix[Gmk][mk], 1,
 
329
                            1.0, &(ZIMLE.matrix[Gij][ij][mb]), 1);
 
330
                }
 
331
 
 
332
              }
 
333
 
 
334
 
 
335
            } /* k */
 
336
          } /* j */
 
337
        } /* i */
 
338
 
 
339
        for(Gab=0; Gab < nirreps; Gab++) {
 
340
          Gc = Gab ^ Gijk; /* totally symmetric */
 
341
          dpd_free_block(W1[Gab], F.params->coltot[Gab], virtpi[Gc]);
 
342
        }
 
343
        for(Ga=0; Ga < nirreps; Ga++) {
 
344
          Gbc = Ga ^ Gijk; /* totally symmetric */
 
345
          dpd_free_block(W2[Ga], virtpi[Ga], F.params->coltot[Gbc]);
 
346
        }
 
347
 
 
348
      } /* Gk */
 
349
    } /* Gj */
 
350
  } /* Gi */
 
351
 
 
352
  free(W1);
 
353
  free(W2);
 
354
 
 
355
  dpd_buf4_close(&E);
 
356
  dpd_buf4_close(&F);
 
357
  dpd_buf4_close(&L);
 
358
 
 
359
  dpd_file2_close(&fIJ);
 
360
  dpd_file2_close(&fAB);
 
361
 
 
362
  dpd_file2_close(&FME);
 
363
  dpd_file2_close(&LIA);
 
364
  dpd_buf4_close(&Dints);
 
365
  dpd_buf4_close(&LIJAB);
 
366
 
 
367
  dpd_buf4_close(&WMAFE);
 
368
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&WMNIE, h);
 
369
  dpd_buf4_close(&WMNIE);
 
370
 
 
371
  dpd_buf4_close(&ZIGDE);
 
372
  dpd_buf4_close(&ZDMAE);
 
373
 
 
374
  for(h=0; h < nirreps; h++) {
 
375
    dpd_buf4_mat_irrep_wrt(&ZLMAO, h);
 
376
    dpd_buf4_mat_irrep_close(&ZLMAO, h);
 
377
  }
 
378
  dpd_buf4_close(&ZLMAO);
 
379
 
 
380
  for(h=0; h < nirreps; h++) {
 
381
    dpd_buf4_mat_irrep_wrt(&ZIMLE, h);
 
382
    dpd_buf4_mat_irrep_close(&ZIMLE, h);
 
383
  }
 
384
  dpd_buf4_close(&ZIMLE);
 
385
 
 
386
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&T2, h);
 
387
  dpd_buf4_close(&T2);
 
388
 
 
389
  for(h=0; h < nirreps; h++) {
 
390
    dpd_buf4_mat_irrep_wrt(&L2new, h);
 
391
    dpd_buf4_mat_irrep_close(&L2new, h);
 
392
  }
 
393
  dpd_buf4_init(&D2, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
 
394
  dpd_buf4_dirprd(&D2, &L2new);
 
395
  dpd_buf4_close(&D2);
 
396
  dpd_buf4_init(&L2, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "New LIJAB");
 
397
  dpd_buf4_axpy(&L2new, &L2, 1);
 
398
  dpd_buf4_close(&L2);
 
399
  dpd_buf4_close(&L2new);
 
400
 
 
401
}
 
402
 
 
403
void cc3_l3l2_RHF_AAB(void)
 
404
{
 
405
  int h, nirreps;
 
406
  int *occ_off, *occpi;
 
407
  int *vir_off, *virtpi;
 
408
  int Gi, Gj, Gk, Gijk;
 
409
  int Ga, Gb, Gc, Gab;
 
410
  int i, j, k, I, J, K;
 
411
  int a, b, c, A, B, C;
 
412
  int ab;
 
413
  double ***W1, ***W2;
 
414
  dpdbuf4 L2AA, L2AB, L2BA, EAA, EAB, EBA, FAA, FAB, FBA;
 
415
  dpdfile2 fIJ, fAB, fij, fab;
 
416
  dpdbuf4 DAAints, DABints, LIJAB, LIjAb;
 
417
  dpdfile2 LIA, Lia, FME, Fme;
 
418
  dpdbuf4 L2AAnew, L2ABnew, L2, D2;
 
419
  dpdbuf4 WmAfE, WMnIe, WMAFE, WMaFe, WMNIE, WmNiE;
 
420
  dpdbuf4 ZIGDE, T2AB, T2AA, ZIgDe;
 
421
  dpdbuf4 ZDMAE, ZDmAe, ZdMAe;
 
422
  dpdbuf4 ZLMAO, ZLmAo;
 
423
  dpdbuf4 ZIMLE, ZImLe, ZImlE;
 
424
  int nrows, ncols, nlinks;
 
425
  int Gcb, cb;
 
426
  int Gij, ij, Gji, ji, Gjk, jk, kj, Gkj;
 
427
  int Gd, d, DD, ad, da, Gkd, kd;
 
428
  int Gm, m, M, Gmi, mi, im, mc;
 
429
  int Gid, id, dc, cd;
 
430
  int Gac, ac, Gca, ca, bd, db;
 
431
  int Gbc, bc, Gmk, mk, km, Gim, ma, am;
 
432
  int Gik, ik, Gki, ki, Gjd, jd;
 
433
  int Gmj, mj, cm, Gjm, jm;
 
434
  int mb;
 
435
  double **Z;
 
436
 
 
437
  nirreps = moinfo.nirreps;
 
438
  occpi = moinfo.occpi;
 
439
  occ_off = moinfo.occ_off;
 
440
  virtpi = moinfo.virtpi;
 
441
  vir_off = moinfo.vir_off;
 
442
 
 
443
  dpd_buf4_init(&L2AAnew, CC3_MISC, 0, 0, 5, 0, 5, 0, "CC3 LIJAB");
 
444
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_init(&L2AAnew, h);
 
445
 
 
446
  dpd_buf4_init(&L2ABnew, CC3_MISC, 0, 0, 5, 0, 5, 0, "CC3 LIjAb");
 
447
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_init(&L2ABnew, h);
 
448
 
 
449
  dpd_buf4_init(&T2AB, CC_TAMPS, 0, 0, 5, 0, 5, 0, "tIjAb");
 
450
  dpd_buf4_init(&T2AA, CC_TAMPS, 0, 0, 5, 2, 7, 0, "tIJAB");
 
451
  for(h=0; h < nirreps; h++) {
 
452
    dpd_buf4_mat_irrep_init(&T2AB, h);
 
453
    dpd_buf4_mat_irrep_rd(&T2AB, h);
 
454
 
 
455
    dpd_buf4_mat_irrep_init(&T2AA, h);
 
456
    dpd_buf4_mat_irrep_rd(&T2AA, h);
 
457
  }
 
458
 
 
459
  dpd_buf4_init(&ZIGDE, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZIGDE");
 
460
  dpd_buf4_scm(&ZIGDE, 0.0); /* this must be cleared in each iteration */
 
461
  dpd_buf4_init(&ZIgDe, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZIgDe");
 
462
  dpd_buf4_scm(&ZIgDe, 0.0); /* this must be cleared in each iteration */
 
463
 
 
464
  dpd_buf4_init(&ZDMAE, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZDMAE (MD,AE)");
 
465
  dpd_buf4_scm(&ZDMAE, 0.0); /* must be cleared in each iteration */
 
466
  dpd_buf4_init(&ZDmAe, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZDmAe (mD,Ae)");
 
467
  dpd_buf4_scm(&ZDmAe, 0.0); /* must be cleared in each iteration */
 
468
  dpd_buf4_init(&ZdMAe, CC3_MISC, 0, 10, 5, 10, 5, 0, "CC3 ZdMAe (Md,Ae)");
 
469
  dpd_buf4_scm(&ZdMAe, 0.0); /* must be cleared in each iteration */
 
470
 
 
471
  dpd_buf4_init(&ZLMAO, CC3_MISC, 0, 0, 11, 0, 11, 0, "CC3 ZLMAO");
 
472
  dpd_buf4_init(&ZLmAo, CC3_MISC, 0, 0, 11, 0, 11, 0, "CC3 ZLmAo");
 
473
  for(h=0; h < nirreps; h++) {
 
474
    dpd_buf4_mat_irrep_init(&ZLMAO, h);
 
475
    dpd_buf4_mat_irrep_rd(&ZLMAO, h);
 
476
 
 
477
    dpd_buf4_mat_irrep_init(&ZLmAo, h);
 
478
  }
 
479
 
 
480
  dpd_buf4_init(&ZIMLE, CC3_MISC, 0, 0, 10, 0, 10, 0, "CC3 ZIMLE");
 
481
  dpd_buf4_init(&ZImLe, CC3_MISC, 0, 0, 10, 0, 10, 0, "CC3 ZImLe");
 
482
  dpd_buf4_init(&ZImlE, CC3_MISC, 0, 0, 10, 0, 10, 0, "CC3 ZImlE");
 
483
  for(h=0; h < nirreps; h++) {
 
484
    dpd_buf4_mat_irrep_init(&ZIMLE, h);
 
485
    dpd_buf4_mat_irrep_rd(&ZIMLE, h);
 
486
 
 
487
    dpd_buf4_mat_irrep_init(&ZImLe, h);
 
488
    dpd_buf4_mat_irrep_init(&ZImlE, h);
 
489
  }
 
490
 
 
491
  dpd_buf4_init(&WmAfE, CC3_HET1, 0, 10, 5, 10, 5, 0, "CC3 WAbEi (iE,bA)");
 
492
  dpd_buf4_init(&WMAFE, CC3_HET1, 0, 10, 5, 10, 7, 0, "CC3 WABEI (IE,B>A)");
 
493
  dpd_buf4_init(&WMaFe, CC3_HET1, 0, 10, 5, 10, 5, 0, "CC3 WaBeI (Ie,Ba)");
 
494
 
 
495
  dpd_buf4_init(&WMnIe, CC3_HET1, 0, 0, 10, 0, 10, 0, "CC3 WMbIj (Ij,Mb)");
 
496
  dpd_buf4_init(&WMNIE, CC3_HET1, 0, 0, 10, 2, 10, 0, "CC3 WMBIJ (I>J,MB)");
 
497
  dpd_buf4_init(&WmNiE, CC3_HET1, 0, 0, 10, 0, 10, 0, "CC3 WmBiJ (iJ,mB)");
 
498
  for(h=0; h < nirreps; h++) {
 
499
    dpd_buf4_mat_irrep_init(&WMnIe, h);
 
500
    dpd_buf4_mat_irrep_rd(&WMnIe, h);
 
501
    dpd_buf4_mat_irrep_init(&WMNIE, h);
 
502
    dpd_buf4_mat_irrep_rd(&WMNIE, h);
 
503
    dpd_buf4_mat_irrep_init(&WmNiE, h);
 
504
    dpd_buf4_mat_irrep_rd(&WmNiE, h);
 
505
  }
 
506
 
 
507
  dpd_file2_init(&fIJ, CC_OEI, 0, 0, 0, "fIJ");
 
508
  dpd_file2_init(&fAB, CC_OEI, 0, 1, 1, "fAB");
 
509
  dpd_file2_init(&fij, CC_OEI, 0, 0, 0, "fij");
 
510
  dpd_file2_init(&fab, CC_OEI, 0, 1, 1, "fab");
 
511
 
 
512
  dpd_buf4_init(&L2AA, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "LIJAB");
 
513
  dpd_buf4_init(&L2AB, CC_LAMBDA, 0, 0, 5, 0, 5, 0, "LIjAb");
 
514
  dpd_buf4_init(&L2BA, CC_LAMBDA, 0, 0, 5, 0, 5, 0, "LiJaB");
 
515
  dpd_buf4_init(&FAA, CC3_HET1, 0, 10, 5, 10, 7, 0, "CC3 WAMEF (MA,F>E)");
 
516
  dpd_buf4_init(&FAB, CC3_HET1, 0, 10, 5, 10, 5, 0, "CC3 WaMeF (Ma,Fe)");
 
517
  dpd_buf4_init(&FBA, CC3_HET1, 0, 10, 5, 10, 5, 0, "CC3 WAmEf (mA,fE)");
 
518
  dpd_buf4_init(&EAA, CC3_HET1, 0, 0, 10, 2, 10, 0, "CC3 WMNIE (M>N,IE)");
 
519
  dpd_buf4_init(&EAB, CC3_HET1, 0, 0, 10, 0, 10, 0, "CC3 WMnIe (Mn,Ie)");
 
520
  dpd_buf4_init(&EBA, CC3_HET1, 0, 0, 10, 0, 10, 0, "CC3 WmNiE (mN,iE)");
 
521
 
 
522
  dpd_buf4_init(&DAAints, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij||ab>");
 
523
  dpd_buf4_init(&DABints, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij|ab>");
 
524
  dpd_buf4_init(&LIJAB, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "LIJAB");
 
525
  dpd_buf4_init(&LIjAb, CC_LAMBDA, 0, 0, 5, 0, 5, 0, "LIjAb");
 
526
  dpd_file2_init(&LIA, CC_LAMBDA, 0, 0, 1, "LIA");
 
527
  dpd_file2_init(&Lia, CC_LAMBDA, 0, 0, 1, "Lia");
 
528
  dpd_file2_init(&FME, CC_OEI, 0, 0, 1, "FME");
 
529
  dpd_file2_init(&Fme, CC_OEI, 0, 0, 1, "Fme");
 
530
 
 
531
  W1 = (double ***) malloc(nirreps * sizeof(double **));
 
532
  W2 = (double ***) malloc(nirreps * sizeof(double **));
 
533
 
 
534
  for(Gi=0; Gi < nirreps; Gi++) {
 
535
    for(Gj=0; Gj < nirreps; Gj++) {
 
536
      Gij = Gji = Gi ^ Gj;
 
537
      for(Gk=0; Gk < nirreps; Gk++) {
 
538
        Gijk = Gi ^ Gj ^ Gk;
 
539
 
 
540
        Gjk = Gkj = Gj ^ Gk;
 
541
        Gik = Gki = Gi ^ Gk;
 
542
 
 
543
        for(Gab=0; Gab < nirreps; Gab++) {
 
544
          Gc = Gab ^ Gijk; /* totally symmetric */
 
545
          W1[Gab] = dpd_block_matrix(FAA.params->coltot[Gab], virtpi[Gc]);
 
546
        }
 
547
        for(Ga=0; Ga < nirreps; Ga++) {
 
548
          Gcb = Ga ^ Gijk; /* assumes totally symmetric */
 
549
          W2[Ga] = dpd_block_matrix(virtpi[Ga], WmAfE.params->coltot[Gcb]);  /* alpha-beta-alpha */
 
550
        }
 
551
 
 
552
        for(i=0; i < occpi[Gi]; i++) {
 
553
          I = occ_off[Gi] + i;
 
554
          for(j=0; j < occpi[Gj]; j++) {
 
555
            J = occ_off[Gj] + j;
 
556
            for(k=0; k < occpi[Gk]; k++) {
 
557
              K = occ_off[Gk] + k;
 
558
 
 
559
              L3_AAB(W1, nirreps, I, Gi, J, Gj, K, Gk, &L2AA, &L2AB, &L2BA, 
 
560
                     &FAA, &FAB, &FBA, &EAA, &EAB, &EBA, &fIJ, &fij, &fAB, &fab,
 
561
                     &DAAints, &DABints, &LIJAB, &LIjAb, &LIA, &Lia, &FME, &Fme,
 
562
                     occpi, occ_off, occpi, occ_off, virtpi, vir_off, virtpi, vir_off);
 
563
 
 
564
              /* t_JIDA <-- t_IJkABc W_kDcB */
 
565
              /* sort W1(AB,c) to W2(A,cB) */
 
566
              for(Gab=0; Gab < nirreps; Gab++) {
 
567
                Gc = Gab ^ Gijk;
 
568
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
569
                  A = FAA.params->colorb[Gab][ab][0];
 
570
                  B = FAA.params->colorb[Gab][ab][1];
 
571
                  Ga = FAA.params->rsym[A];
 
572
                  a = A - vir_off[Ga];
 
573
                  for(c=0; c < virtpi[Gc]; c++) {
 
574
                    C = vir_off[Gc] + c;
 
575
                    cb = WmAfE.params->colidx[C][B];
 
576
                    W2[Ga][a][cb] = W1[Gab][ab][c];
 
577
                  }
 
578
                }
 
579
              }
 
580
 
 
581
              ji = L2AAnew.params->rowidx[J][I];
 
582
 
 
583
              for(Gd=0; Gd < nirreps; Gd++) {
 
584
                Gcb = Gkd = Gk ^ Gd; /* assumes totally symmetric */
 
585
                Ga = Gd ^ Gij;       /* assumes totally symmetric */
 
586
 
 
587
                kd = WmAfE.row_offset[Gkd][K];
 
588
                WmAfE.matrix[Gkd] = dpd_block_matrix(virtpi[Gd], WmAfE.params->coltot[Gkd]);
 
589
                dpd_buf4_mat_irrep_rd_block(&WmAfE, Gkd, kd, virtpi[Gd]);
 
590
                Z = block_matrix(virtpi[Ga], virtpi[Gd]);
 
591
 
 
592
                nrows = virtpi[Ga];
 
593
                ncols = virtpi[Gd];
 
594
                nlinks = WmAfE.params->coltot[Gkd];
 
595
 
 
596
                if(nrows && ncols && nlinks)
 
597
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W2[Ga][0], nlinks, 
 
598
                          WmAfE.matrix[Gkd][0], nlinks, 0.0, Z[0], ncols);
 
599
 
 
600
                for(a=0; a < virtpi[Ga]; a++) {
 
601
                  A = vir_off[Ga] + a;
 
602
                  for(d=0; d < virtpi[Gd]; d++) {
 
603
                    DD = vir_off[Gd] + d;
 
604
                    ad = L2AAnew.params->colidx[A][DD];
 
605
                    da = L2AAnew.params->colidx[DD][A];
 
606
                    L2AAnew.matrix[Gij][ji][ad] += -Z[a][d];
 
607
                    L2AAnew.matrix[Gij][ji][da] += Z[a][d];
 
608
                  }
 
609
                }
 
610
 
 
611
                dpd_free_block(WmAfE.matrix[Gkd], virtpi[Gd], WmAfE.params->coltot[Gkd]);
 
612
                free_block(Z);
 
613
              }
 
614
 
 
615
              /* t_MIAB <--- +t_IJkABc W_JkMc */
 
616
              /* t_IMAB <--- -t_IJkABc W_JkMc */
 
617
 
 
618
              jk = WMnIe.params->rowidx[J][K];
 
619
 
 
620
              for(Gm=0; Gm < nirreps; Gm++) {
 
621
                Gab = Gmi = Gm ^ Gi;  /* assumes totally symmetric */
 
622
                Gc = Gab ^ Gijk;      /* assumes totally symmetric */
 
623
 
 
624
                mc = WMnIe.col_offset[Gjk][Gm];
 
625
 
 
626
                nrows = FAA.params->coltot[Gab];
 
627
                ncols = occpi[Gm];
 
628
                nlinks = virtpi[Gc];
 
629
 
 
630
                Z = dpd_block_matrix(nrows, ncols);
 
631
 
 
632
                if(nrows && ncols && nlinks)
 
633
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W1[Gab][0], nlinks,
 
634
                          &(WMnIe.matrix[Gjk][jk][mc]), nlinks, 0.0, Z[0], ncols);
 
635
 
 
636
                for(m=0; m < ncols; m++) {
 
637
                  M = occ_off[Gm] + m;
 
638
                  mi = L2AAnew.params->rowidx[M][I];
 
639
                  im = L2AAnew.params->rowidx[I][M];
 
640
                  for(ab=0; ab < nrows; ab++) {
 
641
                    L2AAnew.matrix[Gmi][mi][ab] += Z[ab][m];
 
642
                    L2AAnew.matrix[Gmi][im][ab] -= Z[ab][m];
 
643
                  }
 
644
                }
 
645
 
 
646
                dpd_free_block(Z, nrows, ncols);
 
647
              }
 
648
 
 
649
              /* t_JkDc <-- 1/2 t_IJkABc W_IDAB */
 
650
              /* t_KjCd <-- 1/2 t_IJkABc W_IDAB */
 
651
 
 
652
              jk = L2ABnew.params->rowidx[J][K];
 
653
              kj = L2ABnew.params->rowidx[K][J];
 
654
 
 
655
              for(Gd=0; Gd < nirreps; Gd++) {
 
656
                Gab = Gid = Gi ^ Gd; /* assumes totally symmetric */
 
657
                Gc = Gab ^ Gijk;     /* assumes totally symmetric */
 
658
 
 
659
                id = WMAFE.row_offset[Gid][I];
 
660
                WMAFE.matrix[Gid] = dpd_block_matrix(virtpi[Gd], WMAFE.params->coltot[Gid]);
 
661
                dpd_buf4_mat_irrep_rd_block(&WMAFE, Gid, id, virtpi[Gd]);
 
662
                Z = block_matrix(virtpi[Gc], virtpi[Gd]);
 
663
 
 
664
                nrows = virtpi[Gc];
 
665
                ncols = virtpi[Gd];
 
666
                nlinks = WMAFE.params->coltot[Gid];
 
667
 
 
668
                if(nrows && ncols && nlinks)
 
669
                  C_DGEMM('t', 't', nrows, ncols, nlinks, 0.5, W1[Gab][0], nrows,
 
670
                          WMAFE.matrix[Gid][0], nlinks, 0.0, Z[0], ncols);
 
671
 
 
672
                for(c=0; c < virtpi[Gc]; c++) {
 
673
                  C = vir_off[Gc] + c;
 
674
                  for(d=0; d < virtpi[Gd]; d++) {
 
675
                    DD = vir_off[Gd] + d;
 
676
                    dc = L2ABnew.params->colidx[DD][C];
 
677
                    cd = L2ABnew.params->colidx[C][DD];
 
678
                    L2ABnew.matrix[Gjk][jk][dc] += Z[c][d];
 
679
                    L2ABnew.matrix[Gjk][kj][cd] += Z[c][d];
 
680
                  }
 
681
                }
 
682
 
 
683
                free_block(Z);
 
684
                dpd_free_block(WMAFE.matrix[Gid], virtpi[Gd], WMAFE.params->coltot[Gid]);
 
685
              }
 
686
 
 
687
              /* t_JkBd <-- t_IJkABc W_IdAc */
 
688
              /* t_KjBd <-- t_IJkABc W_IdAc */
 
689
              /* sort W1(AB,c) to W2(B,Ac) */
 
690
              for(Gab=0; Gab < nirreps; Gab++) {
 
691
                Gc = Gab ^ Gijk;
 
692
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
693
                  A = FAA.params->colorb[Gab][ab][0];
 
694
                  B = FAA.params->colorb[Gab][ab][1];
 
695
                  Gb = FAA.params->ssym[B];
 
696
                  b = B - vir_off[Gb];
 
697
                  for(c=0; c < virtpi[Gc]; c++) {
 
698
                    C = vir_off[Gc] + c;
 
699
                    ac = WMaFe.params->colidx[A][C];
 
700
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
701
                  }
 
702
                }
 
703
              }
 
704
 
 
705
              jk = L2ABnew.params->rowidx[J][K];
 
706
              kj = L2ABnew.params->rowidx[K][J];
 
707
 
 
708
              for(Gd=0; Gd < nirreps; Gd++) {
 
709
                Gac = Gid = Gi ^ Gd; /* assumes totally symmetric */
 
710
                Gb = Gac ^ Gijk;     /* assumes totally symmetric */
 
711
 
 
712
                id = WMaFe.row_offset[Gid][I]; 
 
713
                WMaFe.matrix[Gid] = dpd_block_matrix(virtpi[Gd], WMaFe.params->coltot[Gid]);
 
714
                dpd_buf4_mat_irrep_rd_block(&WMaFe, Gid, id, virtpi[Gd]);
 
715
                Z = block_matrix(virtpi[Gb], virtpi[Gd]);
 
716
 
 
717
                nrows = virtpi[Gb];
 
718
                ncols = virtpi[Gd];
 
719
                nlinks = WMaFe.params->coltot[Gid];
 
720
 
 
721
                if(nrows && ncols && nlinks)
 
722
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, W2[Gb][0], nlinks,
 
723
                          WMaFe.matrix[Gid][0], nlinks, 0.0, Z[0], ncols);
 
724
 
 
725
                for(b=0; b < virtpi[Gb]; b++) {
 
726
                  B = vir_off[Gb] + b;
 
727
                  for(d=0; d < virtpi[Gd]; d++) {
 
728
                    DD = vir_off[Gd] + d;
 
729
                    bd = L2ABnew.params->colidx[B][DD];
 
730
                    db = L2ABnew.params->colidx[DD][B];
 
731
                    L2ABnew.matrix[Gjk][jk][bd] += Z[b][d];
 
732
                    L2ABnew.matrix[Gjk][kj][db] += Z[b][d];
 
733
                  }
 
734
                }
 
735
 
 
736
                dpd_free_block(WMaFe.matrix[Gid], virtpi[Gd], WMaFe.params->coltot[Gid]);
 
737
                free_block(Z);
 
738
              }
 
739
 
 
740
              /* t_MkBc <-- 1/2 t_IJkABc W_IJMA */
 
741
              /* sort W(AB,c) to W(A,Bc) */
 
742
              for(Gab=0; Gab < nirreps; Gab++) {
 
743
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
744
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
745
                  A = FAA.params->colorb[Gab][ab][0];
 
746
                  B = FAA.params->colorb[Gab][ab][1];
 
747
                  Ga = FAA.params->rsym[A];
 
748
                  a = A - vir_off[Ga];
 
749
                  for(c=0; c < virtpi[Gc]; c++) {
 
750
                    C = vir_off[Gc] + c;
 
751
                    bc = L2ABnew.params->colidx[B][C];
 
752
                    W2[Ga][a][bc] = W1[Gab][ab][c];
 
753
                  }
 
754
                }
 
755
              }
 
756
 
 
757
              ij = WMNIE.params->rowidx[I][J];
 
758
 
 
759
              for(Gm=0; Gm < nirreps; Gm++) {
 
760
                Gbc = Gmk = Gm ^ Gk;  /* assumes totally symmetric */
 
761
                Ga = Gbc ^ Gijk;      /* assumes totally symmetric */
 
762
 
 
763
                ma = WMNIE.col_offset[Gij][Gm];
 
764
 
 
765
                nrows = L2ABnew.params->coltot[Gmk];
 
766
                ncols = occpi[Gm];
 
767
                nlinks = virtpi[Ga];
 
768
 
 
769
                Z = dpd_block_matrix(nrows, ncols);
 
770
 
 
771
                if(nrows && ncols && nlinks)
 
772
                  C_DGEMM('t', 't', nrows, ncols, nlinks, 0.5, W2[Ga][0], nrows,
 
773
                          &(WMNIE.matrix[Gij][ij][ma]), nlinks, 0.0, Z[0], ncols);
 
774
 
 
775
                for(m=0; m < occpi[Gm]; m++) {
 
776
                  M = occ_off[Gm] + m;
 
777
                  mk = L2ABnew.params->rowidx[M][K];
 
778
                  km = L2ABnew.params->rowidx[K][M];
 
779
                  for(Gb=0; Gb < nirreps; Gb++) {
 
780
                    Gc = Gbc ^ Gb;
 
781
                    for(b=0; b < virtpi[Gb]; b++) {
 
782
                      B = vir_off[Gb] + b;
 
783
                      for(c=0; c < virtpi[Gc]; c++) {
 
784
                        C = vir_off[Gc] + c;
 
785
                        bc = L2ABnew.params->colidx[B][C];
 
786
                        cb = L2ABnew.params->colidx[C][B];
 
787
                        L2ABnew.matrix[Gmk][mk][bc] += Z[bc][m];
 
788
                        L2ABnew.matrix[Gmk][km][cb] += Z[bc][m];
 
789
                      }
 
790
                    }
 
791
                  }
 
792
                }
 
793
 
 
794
                dpd_free_block(Z, nrows, ncols);
 
795
              }
 
796
 
 
797
              /* t_ImBc <-- t_IJkABc W_kJmA */
 
798
              /* sort W(AB,c) to W(A,Bc) */
 
799
              for(Gab=0; Gab < nirreps; Gab++) {
 
800
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
801
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
802
                  A = FAA.params->colorb[Gab][ab][0];
 
803
                  B = FAA.params->colorb[Gab][ab][1];
 
804
                  Ga = FAA.params->rsym[A];
 
805
                  a = A - vir_off[Ga];
 
806
                  for(c=0; c < virtpi[Gc]; c++) {
 
807
                    C = vir_off[Gc] + c;
 
808
                    bc = L2ABnew.params->colidx[B][C];
 
809
                    W2[Ga][a][bc] = W1[Gab][ab][c];
 
810
                  }
 
811
                }
 
812
              }
 
813
 
 
814
              kj = WmNiE.params->rowidx[K][J];
 
815
 
 
816
              for(Gm=0; Gm < nirreps; Gm++) {
 
817
                Gbc = Gim = Gi ^ Gm;  /* assumes totally symmetric */
 
818
                Ga = Gbc ^ Gijk;      /* assumes totally symmetric */
 
819
 
 
820
                ma = WmNiE.col_offset[Gjk][Gm];
 
821
 
 
822
                nrows = L2ABnew.params->coltot[Gim];
 
823
                ncols = occpi[Gm];
 
824
                nlinks = virtpi[Ga];
 
825
 
 
826
                Z = dpd_block_matrix(nrows, ncols);
 
827
 
 
828
                if(nrows && ncols && nlinks)
 
829
                  C_DGEMM('t', 't', nrows, ncols, nlinks, 1.0, W2[Ga][0], nrows,
 
830
                          &(WmNiE.matrix[Gjk][kj][ma]), nlinks, 0.0, Z[0], ncols);
 
831
 
 
832
                for(m=0; m < occpi[Gm]; m++) {
 
833
                  M = occ_off[Gm] + m;
 
834
                  im = L2ABnew.params->rowidx[I][M];
 
835
                  mi = L2ABnew.params->rowidx[M][I];
 
836
                  for(Gb=0; Gb < nirreps; Gb++) {
 
837
                    Gc = Gbc ^ Gb;
 
838
                    for(b=0; b < virtpi[Gb]; b++) {
 
839
                      B = vir_off[Gb] + b;
 
840
                      for(c=0; c < virtpi[Gc]; c++) {
 
841
                        C = vir_off[Gc] + c;
 
842
                        bc = L2ABnew.params->colidx[B][C];
 
843
                        cb = L2ABnew.params->colidx[C][B];
 
844
                        L2ABnew.matrix[Gim][im][bc] += Z[bc][m];
 
845
                        L2ABnew.matrix[Gim][mi][cb] += Z[bc][m];
 
846
                      }
 
847
                    }
 
848
                  }
 
849
                }
 
850
 
 
851
                dpd_free_block(Z, nrows, ncols);
 
852
              }
 
853
 
 
854
              /* Z_IDAB <-- L_IJkABc t_JkDc */
 
855
 
 
856
              jk = T2AB.params->rowidx[J][K];
 
857
              for(Gab=0; Gab < nirreps; Gab++) {
 
858
                Gid = Gab; /* totally symmetric */
 
859
                Gc = Gab ^ Gijk; /* totally symmetric */
 
860
                Gd = Gi ^ Gid;
 
861
 
 
862
                nrows = virtpi[Gd];
 
863
                ncols = ZIGDE.params->coltot[Gid];
 
864
                nlinks = virtpi[Gc];
 
865
 
 
866
                dc = T2AB.col_offset[Gjk][Gd];
 
867
                id = ZIGDE.row_offset[Gid][I];
 
868
                ZIGDE.matrix[Gid] = dpd_block_matrix(nrows, ncols);
 
869
 
 
870
                if(nrows && ncols && nlinks) {
 
871
                  dpd_buf4_mat_irrep_rd_block(&ZIGDE, Gid, id, nrows);
 
872
 
 
873
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, &(T2AB.matrix[Gjk][jk][dc]), nlinks,
 
874
                          W1[Gab][0], nlinks, 1.0, ZIGDE.matrix[Gid][0], ncols);
 
875
 
 
876
                  dpd_buf4_mat_irrep_wrt_block(&ZIGDE, Gid, id, nrows);
 
877
                }
 
878
 
 
879
                dpd_free_block(ZIGDE.matrix[Gid], nrows, ncols);
 
880
              }
 
881
 
 
882
              /* ZkDCa <-- 1/2 L_ijKabC t_ijdb */
 
883
 
 
884
              ij = T2AA.params->rowidx[I][J];
 
885
 
 
886
              /* sort W(ab,C) to W(b,Ca) */
 
887
              for(Gab=0; Gab < nirreps; Gab++) {
 
888
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
889
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
890
                  A = FAA.params->colorb[Gab][ab][0];
 
891
                  B = FAA.params->colorb[Gab][ab][1];
 
892
                  Gb = FAA.params->ssym[B];
 
893
                  b = B - vir_off[Gb];
 
894
                  for(c=0; c < virtpi[Gc]; c++) {
 
895
                    C = vir_off[Gc] + c;
 
896
                    ca = ZIgDe.params->colidx[C][A];
 
897
                    W2[Gb][b][ca] = W1[Gab][ab][c];
 
898
                  }
 
899
                }
 
900
              }
 
901
 
 
902
              for(Gb=0; Gb < nirreps; Gb++) {
 
903
                Gd = Gb ^ Gij; /* totally symmetric */
 
904
                Gca = Gkd = Gk ^ Gd; /* totally symmetric */
 
905
 
 
906
                nrows = virtpi[Gd];
 
907
                ncols = ZIgDe.params->coltot[Gkd];
 
908
                nlinks = virtpi[Gb];
 
909
 
 
910
                db = T2AA.col_offset[Gij][Gd];
 
911
                kd = ZIgDe.row_offset[Gkd][K];
 
912
                ZIgDe.matrix[Gkd] = dpd_block_matrix(nrows, ncols);
 
913
                dpd_buf4_mat_irrep_rd_block(&ZIgDe, Gkd, kd, nrows);
 
914
 
 
915
                if(nrows && ncols && nlinks)
 
916
                  C_DGEMM('n', 'n', nrows, ncols, nlinks, 0.5, &(T2AA.matrix[Gij][ij][db]), nlinks,
 
917
                          W2[Gb][0], ncols, 1.0, ZIgDe.matrix[Gkd][0], ncols);
 
918
 
 
919
                dpd_buf4_mat_irrep_wrt_block(&ZIgDe, Gkd, kd, nrows);
 
920
                dpd_free_block(ZIgDe.matrix[Gkd], nrows, ncols);
 
921
              }
 
922
 
 
923
              /* Z_IdAc <-- L_IJkABc t_JkBd */
 
924
 
 
925
              jk = T2AB.params->rowidx[J][K];
 
926
 
 
927
              /* sort W(AB,c) to W(B,Ac) */
 
928
              for(Gab=0; Gab < nirreps; Gab++) {
 
929
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
930
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
931
                  A = FAA.params->colorb[Gab][ab][0];
 
932
                  B = FAA.params->colorb[Gab][ab][1];
 
933
                  Gb = FAA.params->ssym[B];
 
934
                  b = B - vir_off[Gb];
 
935
                  for(c=0; c < virtpi[Gc]; c++) {
 
936
                    C = vir_off[Gc] + c;
 
937
                    ac = ZIgDe.params->colidx[A][C];
 
938
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
939
                  }
 
940
                }
 
941
              }
 
942
 
 
943
              for(Gb=0; Gb < nirreps; Gb++) {
 
944
                Gd = Gb ^ Gjk; /* totally symmetric */
 
945
                Gac = Gid = Gi ^ Gd; /* totally symmetric */
 
946
 
 
947
                nrows = virtpi[Gd]; 
 
948
                ncols = ZIgDe.params->coltot[Gid];
 
949
                nlinks = virtpi[Gb];
 
950
 
 
951
                bd = T2AB.col_offset[Gjk][Gb];
 
952
                id = ZIgDe.row_offset[Gid][I];
 
953
                ZIgDe.matrix[Gid] = dpd_block_matrix(nrows, ncols);
 
954
                dpd_buf4_mat_irrep_rd_block(&ZIgDe, Gid, id, nrows);
 
955
 
 
956
                if(nrows && ncols && nlinks)
 
957
                  C_DGEMM('t', 'n', nrows, ncols, nlinks, 1.0, &(T2AB.matrix[Gjk][jk][bd]), nrows,
 
958
                          W2[Gb][0], ncols, 1.0, ZIgDe.matrix[Gid][0], ncols);
 
959
 
 
960
                dpd_buf4_mat_irrep_wrt_block(&ZIgDe, Gid, id, nrows);
 
961
                dpd_free_block(ZIgDe.matrix[Gid], nrows, ncols);
 
962
              }
 
963
 
 
964
              /* Z_JDAB <-- 1/2 L_IJkABc t_IkDc */
 
965
              ik = T2AB.params->rowidx[I][K];
 
966
              for(Gab=0; Gab < nirreps; Gab++) {
 
967
                Gjd = Gab; /* totally symmetric */
 
968
                Gc = Gab ^ Gijk; /* totally symmetric */
 
969
                Gd = Gj ^ Gjd;
 
970
 
 
971
                nrows = virtpi[Gd];
 
972
                ncols = ZDMAE.params->coltot[Gjd];
 
973
                nlinks = virtpi[Gc];
 
974
 
 
975
                dc = T2AB.col_offset[Gik][Gd];
 
976
                jd = ZDMAE.row_offset[Gjd][J];
 
977
                ZDMAE.matrix[Gjd] = dpd_block_matrix(nrows, ncols);
 
978
                dpd_buf4_mat_irrep_rd_block(&ZDMAE, Gjd, jd, nrows);
 
979
 
 
980
                if(nrows && ncols && nlinks) 
 
981
                  C_DGEMM('n', 't', nrows, ncols, nlinks, 1.0, &(T2AB.matrix[Gik][ik][dc]), nlinks,
 
982
                          W1[Gab][0], nlinks, 1.0, ZDMAE.matrix[Gjd][0], ncols);
 
983
 
 
984
                dpd_buf4_mat_irrep_wrt_block(&ZDMAE, Gjd, jd, nrows);
 
985
                dpd_free_block(ZDMAE.matrix[Gjd], nrows, ncols);
 
986
              }
 
987
 
 
988
              /* Z_kDAc <-- 1/2 L_IJkABc t_IJDB */
 
989
              ij = T2AA.params->rowidx[I][J];
 
990
              /* sort W(AB,c) to W(B,Ac) */
 
991
              for(Gab=0; Gab < nirreps; Gab++) {
 
992
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
993
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
994
                  A = FAA.params->colorb[Gab][ab][0];
 
995
                  B = FAA.params->colorb[Gab][ab][1];
 
996
                  Gb = FAA.params->ssym[B];
 
997
                  b = B - vir_off[Gb];
 
998
                  for(c=0; c < virtpi[Gc]; c++) {
 
999
                    C = vir_off[Gc] + c;
 
1000
                    ac = ZDmAe.params->colidx[A][C];
 
1001
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
1002
                  }
 
1003
                }
 
1004
              }
 
1005
 
 
1006
              for(Gb=0; Gb < nirreps; Gb++) {
 
1007
                Gd = Gb ^ Gij; /* totally symmetric */
 
1008
                Gac = Gkd = Gk ^ Gd; /* totally symmetric */
 
1009
 
 
1010
                nrows = virtpi[Gd]; 
 
1011
                ncols = ZDmAe.params->coltot[Gkd];
 
1012
                nlinks = virtpi[Gb];
 
1013
 
 
1014
                db = T2AA.col_offset[Gij][Gd];
 
1015
                kd = ZDmAe.row_offset[Gkd][K];
 
1016
                ZDmAe.matrix[Gkd] = dpd_block_matrix(nrows, ncols);
 
1017
                dpd_buf4_mat_irrep_rd_block(&ZDmAe, Gkd, kd, nrows);
 
1018
 
 
1019
                if(nrows && ncols && nlinks)
 
1020
                  C_DGEMM('n', 'n', nrows, ncols, nlinks, 0.5, &(T2AA.matrix[Gij][ij][db]), nlinks,
 
1021
                          W2[Gb][0], ncols, 1.0, ZDmAe.matrix[Gkd][0], ncols);
 
1022
 
 
1023
                dpd_buf4_mat_irrep_wrt_block(&ZDmAe, Gkd, kd, nrows);
 
1024
                dpd_free_block(ZDmAe.matrix[Gkd], nrows, ncols);
 
1025
              }
 
1026
 
 
1027
              /* Z_iDCa <-- L_ijKabC t_KjDb */
 
1028
              kj = T2AB.params->rowidx[K][J];
 
1029
              /* sort W(AB,c) to W(B,Ca) */
 
1030
              for(Gab=0; Gab < nirreps; Gab++) {
 
1031
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
1032
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
1033
                  A = FAA.params->colorb[Gab][ab][0];
 
1034
                  B = FAA.params->colorb[Gab][ab][1];
 
1035
                  Gb = FAA.params->ssym[B];
 
1036
                  b = B - vir_off[Gb];
 
1037
                  for(c=0; c < virtpi[Gc]; c++) {
 
1038
                    C = vir_off[Gc] + c;
 
1039
                    ca = ZDmAe.params->colidx[C][A];
 
1040
                    W2[Gb][b][ca] = W1[Gab][ab][c];
 
1041
                  }
 
1042
                }
 
1043
              }
 
1044
 
 
1045
              for(Gb=0; Gb < nirreps; Gb++) {
 
1046
                Gd = Gb ^ Gkj; /* totally symmetric */
 
1047
                Gca = Gid = Gi ^ Gd; /* totally symmetric */
 
1048
 
 
1049
                nrows = virtpi[Gd]; 
 
1050
                ncols = ZDmAe.params->coltot[Gid];
 
1051
                nlinks = virtpi[Gb];
 
1052
 
 
1053
                db = T2AB.col_offset[Gkj][Gd];
 
1054
                id = ZDmAe.row_offset[Gid][I];
 
1055
                ZDmAe.matrix[Gid] = dpd_block_matrix(nrows, ncols);
 
1056
                dpd_buf4_mat_irrep_rd_block(&ZDmAe, Gid, id, nrows);
 
1057
 
 
1058
                if(nrows && ncols && nlinks)
 
1059
                  C_DGEMM('n', 'n', nrows, ncols, nlinks, 1.0, &(T2AB.matrix[Gkj][kj][db]), nlinks,
 
1060
                          W2[Gb][0], ncols, 1.0, ZDmAe.matrix[Gid][0], ncols);
 
1061
 
 
1062
                dpd_buf4_mat_irrep_wrt_block(&ZDmAe, Gid, id, nrows);
 
1063
                dpd_free_block(ZDmAe.matrix[Gid], nrows, ncols);
 
1064
              }
 
1065
 
 
1066
              /* Z_KdCa <-- -1/2 L_ijKabC t_ijdb */
 
1067
              ij = T2AA.params->rowidx[I][J];
 
1068
              /* sort W(AB,c) to W(B,Ca) */
 
1069
              for(Gab=0; Gab < nirreps; Gab++) {
 
1070
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
1071
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
1072
                  A = FAA.params->colorb[Gab][ab][0];
 
1073
                  B = FAA.params->colorb[Gab][ab][1];
 
1074
                  Gb = FAA.params->ssym[B];
 
1075
                  b = B - vir_off[Gb];
 
1076
                  for(c=0; c < virtpi[Gc]; c++) {
 
1077
                    C = vir_off[Gc] + c;
 
1078
                    ca = ZdMAe.params->colidx[C][A];
 
1079
                    W2[Gb][b][ca] = W1[Gab][ab][c];
 
1080
                  }
 
1081
                }
 
1082
              }
 
1083
 
 
1084
              for(Gb=0; Gb < nirreps; Gb++) {
 
1085
                Gd = Gb ^ Gij; /* totally symmetric */
 
1086
                Gca = Gkd = Gk ^ Gd; /* totally symmetric */
 
1087
 
 
1088
                nrows = virtpi[Gd]; 
 
1089
                ncols = ZdMAe.params->coltot[Gkd];
 
1090
                nlinks = virtpi[Gb];
 
1091
 
 
1092
                db = T2AA.col_offset[Gij][Gd];
 
1093
                kd = ZdMAe.row_offset[Gkd][K];
 
1094
                ZdMAe.matrix[Gkd] = dpd_block_matrix(nrows, ncols);
 
1095
                dpd_buf4_mat_irrep_rd_block(&ZdMAe, Gkd, kd, nrows);
 
1096
 
 
1097
                if(nrows && ncols && nlinks)
 
1098
                  C_DGEMM('n', 'n', nrows, ncols, nlinks, -0.5, &(T2AA.matrix[Gij][ij][db]), nlinks,
 
1099
                          W2[Gb][0], ncols, 1.0, ZdMAe.matrix[Gkd][0], ncols);
 
1100
 
 
1101
                dpd_buf4_mat_irrep_wrt_block(&ZdMAe, Gkd, kd, nrows);
 
1102
                dpd_free_block(ZdMAe.matrix[Gkd], nrows, ncols);
 
1103
              }
 
1104
 
 
1105
              /* Z_JdAc <-- L_IJkABc t_IkBd */
 
1106
              ik = T2AB.params->rowidx[I][K];
 
1107
 
 
1108
              /* sort W(AB,c) to W(B,Ca) */
 
1109
              for(Gab=0; Gab < nirreps; Gab++) {
 
1110
                Gc = Gab ^ Gijk;  /* assumes totally symmetric */
 
1111
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++ ){
 
1112
                  A = FAA.params->colorb[Gab][ab][0];
 
1113
                  B = FAA.params->colorb[Gab][ab][1];
 
1114
                  Gb = FAA.params->ssym[B];
 
1115
                  b = B - vir_off[Gb];
 
1116
                  for(c=0; c < virtpi[Gc]; c++) {
 
1117
                    C = vir_off[Gc] + c;
 
1118
                    ac = ZdMAe.params->colidx[A][C];
 
1119
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
1120
                  }
 
1121
                }
 
1122
              }
 
1123
 
 
1124
              for(Gb=0; Gb < nirreps; Gb++) {
 
1125
                Gd = Gb ^ Gik; /* totally symmetric */
 
1126
                Gca = Gjd = Gj ^ Gd; /* totally symmetric */
 
1127
 
 
1128
                nrows = virtpi[Gd]; 
 
1129
                ncols = ZdMAe.params->coltot[Gjd];
 
1130
                nlinks = virtpi[Gb];
 
1131
 
 
1132
                bd = T2AB.col_offset[Gik][Gb];
 
1133
                jd = ZdMAe.row_offset[Gjd][J];
 
1134
                ZdMAe.matrix[Gjd] = dpd_block_matrix(nrows, ncols);
 
1135
                dpd_buf4_mat_irrep_rd_block(&ZdMAe, Gjd, jd, nrows);
 
1136
 
 
1137
                if(nrows && ncols && nlinks)
 
1138
                  C_DGEMM('t', 'n', nrows, ncols, nlinks, 1.0, &(T2AB.matrix[Gik][ik][bd]), nrows,
 
1139
                          W2[Gb][0], ncols, 1.0, ZdMAe.matrix[Gjd][0], ncols);
 
1140
 
 
1141
                dpd_buf4_mat_irrep_wrt_block(&ZdMAe, Gjd, jd, nrows);
 
1142
                dpd_free_block(ZdMAe.matrix[Gjd], nrows, ncols);
 
1143
              }
 
1144
 
 
1145
              /* Z_IJAM <-- -1/2 L_IJkABc t_MkBc */
 
1146
              /* sort W(AB,C) to W(A,BC) */
 
1147
              for(Gab=0; Gab < nirreps; Gab++) {
 
1148
                Gc = Gab ^ Gijk;
 
1149
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
1150
                  A = FAA.params->colorb[Gab][ab][0];
 
1151
                  B = FAA.params->colorb[Gab][ab][1];
 
1152
                  Ga = FAA.params->rsym[A];
 
1153
                  a = A - vir_off[Ga];
 
1154
                  for(c=0; c < virtpi[Gc]; c++) {
 
1155
                    C = vir_off[Gc] + c;
 
1156
                    bc = FAA.params->colidx[B][C];
 
1157
                    W2[Ga][a][bc] = W1[Gab][ab][c];
 
1158
                  }
 
1159
                }
 
1160
              }
 
1161
 
 
1162
              ij = ZLMAO.params->rowidx[I][J];
 
1163
 
 
1164
              for(Gm=0; Gm < nirreps; Gm++) {
 
1165
                Gbc = Gmk = Gm ^ Gk; /* totally symmetric */
 
1166
                Ga = Gij ^ Gm; /* totally symmetric */
 
1167
 
 
1168
                nrows = virtpi[Ga];
 
1169
                ncols = T2AB.params->coltot[Gmk];
 
1170
 
 
1171
                for(m=0; m < occpi[Gm]; m++) {
 
1172
                  M = occ_off[Gm] + m;
 
1173
                  mk = T2AB.params->rowidx[M][K];
 
1174
                  am = ZLMAO.col_offset[Gij][Ga] + m;
 
1175
 
 
1176
                  if(nrows && ncols)
 
1177
                    C_DGEMV('n', nrows, ncols, -1.0, W2[Ga][0], ncols, T2AB.matrix[Gmk][mk], 1, 
 
1178
                            1.0, &(ZLMAO.matrix[Gij][ij][am]), occpi[Gm]);
 
1179
                }
 
1180
              }
 
1181
 
 
1182
              /* Z_KiCm <-- -1/2 L_ijKabC t_mjab */
 
1183
              ki = ZLmAo.params->rowidx[K][I];
 
1184
 
 
1185
              for(Gm=0; Gm < nirreps; Gm++) {
 
1186
                Gab = Gmj = Gm ^ Gj; /* totally symmetric */
 
1187
                Gc = Gm ^ Gki; /* totally symmetric */
 
1188
 
 
1189
                nrows = T2AA.params->coltot[Gmj];
 
1190
                ncols = virtpi[Gc];
 
1191
 
 
1192
                for(m=0; m < occpi[Gm]; m++) {
 
1193
                  M = occ_off[Gm] + m;
 
1194
                  mj = T2AA.params->rowidx[M][J];
 
1195
                  cm = ZLmAo.col_offset[Gki][Gc] + m;
 
1196
 
 
1197
                  if(nrows && ncols)
 
1198
                    C_DGEMV('t', nrows, ncols, -0.5, W1[Gab][0], ncols, T2AA.matrix[Gmj][mj], 1,
 
1199
                            1.0, &(ZLmAo.matrix[Gki][ki][cm]), occpi[Gm]);
 
1200
                }
 
1201
              }
 
1202
 
 
1203
              /* Z_IkAm <-- - L_IJkABc t_mJcB */
 
1204
              /* sort W(AB,C) to W(A,CB) */
 
1205
              for(Gab=0; Gab < nirreps; Gab++) {
 
1206
                Gc = Gab ^ Gijk;
 
1207
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
1208
                  A = FAA.params->colorb[Gab][ab][0];
 
1209
                  B = FAA.params->colorb[Gab][ab][1];
 
1210
                  Ga = FAA.params->rsym[A];
 
1211
                  a = A - vir_off[Ga];
 
1212
                  for(c=0; c < virtpi[Gc]; c++) {
 
1213
                    C = vir_off[Gc] + c;
 
1214
                    cb = FAA.params->colidx[C][B];
 
1215
                    W2[Ga][a][cb] = W1[Gab][ab][c];
 
1216
                  }
 
1217
                }
 
1218
              }
 
1219
 
 
1220
              ik = ZLmAo.params->rowidx[I][K];
 
1221
 
 
1222
              for(Gm=0; Gm < nirreps; Gm++) {
 
1223
                Gbc = Gmj = Gm ^ Gj; /* totally symmetric */
 
1224
                Ga = Gm ^ Gik; /* totally symmetric */
 
1225
 
 
1226
                nrows = virtpi[Ga];
 
1227
                ncols = T2AB.params->coltot[Gmj];
 
1228
 
 
1229
                for(m=0; m < occpi[Gm]; m++) {
 
1230
                  M = occ_off[Gm] + m;
 
1231
                  mj = T2AB.params->rowidx[M][J];
 
1232
                  am = ZLmAo.col_offset[Gik][Ga] + m;
 
1233
 
 
1234
                  if(nrows && ncols)
 
1235
                    C_DGEMV('n', nrows, ncols, -1.0, W2[Ga][0], ncols, T2AB.matrix[Gmj][mj], 1,
 
1236
                            1.0, &(ZLmAo.matrix[Gik][ik][am]), occpi[Gm]);
 
1237
                }
 
1238
              }
 
1239
 
 
1240
              /* Z_IJMB <-- - L_IJkABc t_MkAc */
 
1241
              /* sort W(AB,C) to W(B,AC) */
 
1242
              for(Gab=0; Gab < nirreps; Gab++) {
 
1243
                Gc = Gab ^ Gijk;
 
1244
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
1245
                  A = FAA.params->colorb[Gab][ab][0];
 
1246
                  B = FAA.params->colorb[Gab][ab][1];
 
1247
                  Gb = FAA.params->ssym[B];
 
1248
                  b = B - vir_off[Gb];
 
1249
                  for(c=0; c < virtpi[Gc]; c++) {
 
1250
                    C = vir_off[Gc] + c;
 
1251
                    ac = FAA.params->colidx[A][C];
 
1252
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
1253
                  }
 
1254
                }
 
1255
              }
 
1256
 
 
1257
              ij = ZIMLE.params->rowidx[I][J];
 
1258
 
 
1259
              for(Gm=0; Gm < nirreps; Gm++) {
 
1260
                Gb = Gm ^ Gij; /* totally symmetric */
 
1261
                Gmk = Gm ^ Gk;
 
1262
 
 
1263
                nrows = virtpi[Gb];
 
1264
                ncols = T2AB.params->coltot[Gmk];
 
1265
 
 
1266
                for(m=0; m < occpi[Gm]; m++) {
 
1267
                  M = occ_off[Gm] + m;
 
1268
                  mk = T2AB.params->rowidx[M][K];
 
1269
                  mb = ZIMLE.col_offset[Gij][Gm] + m * virtpi[Gb];
 
1270
 
 
1271
                  if(nrows && ncols)
 
1272
                    C_DGEMV('n', nrows, ncols, -1.0, W2[Gb][0], ncols, T2AB.matrix[Gmk][mk], 1,
 
1273
                            1.0, &(ZIMLE.matrix[Gij][ij][mb]), 1);
 
1274
                }
 
1275
 
 
1276
              }
 
1277
 
 
1278
              /* Z_IkMc <-- -1/2 L_IJkABc t_MJAB */ 
 
1279
              ik = ZImLe.params->rowidx[I][K];
 
1280
              for(Gm=0; Gm < nirreps; Gm++) {
 
1281
                Gc = Gm ^ Gik ; /* totally symmetric */
 
1282
                Gab = Gmj = Gm ^ Gj; /* totally symmetric */
 
1283
 
 
1284
                nrows = T2AA.params->coltot[Gmj];
 
1285
                ncols = virtpi[Gc];
 
1286
 
 
1287
                for(m=0; m < occpi[Gm]; m++) {
 
1288
                  M = occ_off[Gm] + m;
 
1289
                  mj = T2AA.params->rowidx[M][J];
 
1290
                  mc = ZImLe.col_offset[Gik][Gm] + m * virtpi[Gc];
 
1291
 
 
1292
                  if(nrows && ncols)
 
1293
                    C_DGEMV('t', nrows, ncols, -0.5, W1[Gab][0], ncols, T2AA.matrix[Gmj][mj], 1,
 
1294
                            1.0, &(ZImLe.matrix[Gik][ik][mc]), 1);
 
1295
                }
 
1296
              }
 
1297
 
 
1298
              /* Z_KiMa <-- - L_ijKabC t_MjCb */
 
1299
              /* sort W(AB,C) to W(A,CB) */
 
1300
              for(Gab=0; Gab < nirreps; Gab++) {
 
1301
                Gc = Gab ^ Gijk;
 
1302
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
1303
                  A = FAA.params->colorb[Gab][ab][0];
 
1304
                  B = FAA.params->colorb[Gab][ab][1];
 
1305
                  Ga = FAA.params->rsym[A];
 
1306
                  a = A - vir_off[Ga];
 
1307
                  for(c=0; c < virtpi[Gc]; c++) {
 
1308
                    C = vir_off[Gc] + c;
 
1309
                    cb = FAA.params->colidx[C][B];
 
1310
                    W2[Ga][a][cb] = W1[Gab][ab][c];
 
1311
                  }
 
1312
                }
 
1313
              }
 
1314
 
 
1315
              ki = ZImLe.params->rowidx[K][I];
 
1316
              for(Gm=0; Gm < nirreps; Gm++) {
 
1317
                Ga = Gm ^ Gki; /* totally symmetric */
 
1318
                Gmj = Gm ^ Gj;
 
1319
 
 
1320
                nrows = virtpi[Ga];
 
1321
                ncols = T2AB.params->coltot[Gmj];
 
1322
 
 
1323
                for(m=0; m < occpi[Gm]; m++) {
 
1324
                  M = occ_off[Gm] + m;
 
1325
                  mj = T2AB.params->rowidx[M][J];
 
1326
                  ma = ZImLe.col_offset[Gki][Gm] + m * virtpi[Ga];
 
1327
 
 
1328
                  if(nrows && ncols)
 
1329
                    C_DGEMV('n', nrows, ncols, -1.0, W2[Ga][0], ncols, T2AB.matrix[Gmj][mj], 1,
 
1330
                            1.0, &(ZImLe.matrix[Gki][ki][ma]), 1);
 
1331
                }
 
1332
              }
 
1333
 
 
1334
              /* Z_KimC <-- 1/2 L_ijKabC t_mjab */
 
1335
              ki = ZImlE.params->rowidx[K][I];
 
1336
              for(Gm=0; Gm < nirreps; Gm++) {
 
1337
                Gc = Gm ^ Gki; /* totally symmetric */
 
1338
                Gab = Gmj = Gm ^ Gj;
 
1339
 
 
1340
                nrows = T2AA.params->coltot[Gmj];
 
1341
                ncols = virtpi[Gc];
 
1342
 
 
1343
                for(m=0; m < occpi[Gm]; m++) {
 
1344
                  M = occ_off[Gm] + m;
 
1345
                  mj = T2AA.params->rowidx[M][J];
 
1346
                  mc = ZImlE.col_offset[Gki][Gm] + m * virtpi[Gc];
 
1347
 
 
1348
                  if(nrows && ncols)
 
1349
                    C_DGEMV('t', nrows, ncols, 0.5, W1[Gab][0], ncols, T2AA.matrix[Gmj][mj], 1,
 
1350
                            1.0, &(ZImlE.matrix[Gki][ki][mc]), 1);
 
1351
                }
 
1352
              }
 
1353
 
 
1354
              /* Z_IkmB <-- - l_IJkABc t_JmAc */
 
1355
              ik = ZImlE.params->rowidx[I][K];
 
1356
              /* sort W(AB,C) to W(B,AC) */
 
1357
              for(Gab=0; Gab < nirreps; Gab++) {
 
1358
                Gc = Gab ^ Gijk;
 
1359
                for(ab=0; ab < FAA.params->coltot[Gab]; ab++) {
 
1360
                  A = FAA.params->colorb[Gab][ab][0];
 
1361
                  B = FAA.params->colorb[Gab][ab][1];
 
1362
                  Gb = FAA.params->ssym[B];
 
1363
                  b = B - vir_off[Gb];
 
1364
                  for(c=0; c < virtpi[Gc]; c++) {
 
1365
                    C = vir_off[Gc] + c;
 
1366
                    ac = FAA.params->colidx[A][C];
 
1367
                    W2[Gb][b][ac] = W1[Gab][ab][c];
 
1368
                  }
 
1369
                }
 
1370
              }
 
1371
 
 
1372
              for(Gm=0; Gm < nirreps; Gm++) {
 
1373
                Gb = Gm ^ Gik; /* totally symmetric */
 
1374
                Gjm = Gm ^ Gj;
 
1375
 
 
1376
                nrows = virtpi[Gb];
 
1377
                ncols = T2AB.params->coltot[Gjm];
 
1378
 
 
1379
                for(m=0; m < occpi[Gm]; m++) {
 
1380
                  M = occ_off[Gm] + m;
 
1381
                  jm = T2AB.params->rowidx[J][M];
 
1382
                  mb = ZImlE.col_offset[Gki][Gm] + m * virtpi[Gb];
 
1383
 
 
1384
                  if(nrows && ncols)
 
1385
                    C_DGEMV('n', nrows, ncols, -1.0, W2[Gb][0], ncols, T2AB.matrix[Gjm][jm], 1,
 
1386
                            1.0, &(ZImlE.matrix[Gik][ik][mb]), 1);
 
1387
                }
 
1388
              }
 
1389
 
 
1390
            } /* k */
 
1391
          } /* j */
 
1392
        } /* i */
 
1393
 
 
1394
        for(Gab=0; Gab < nirreps; Gab++) {
 
1395
          Gc = Gab ^ Gijk; /* totally symmetric */
 
1396
          dpd_free_block(W1[Gab], FAA.params->coltot[Gab], virtpi[Gc]);
 
1397
        }
 
1398
        for(Ga=0; Ga < nirreps; Ga++) {
 
1399
          Gcb = Ga ^ Gijk; /* assumes totally symmetric */
 
1400
          dpd_free_block(W2[Ga], virtpi[Ga], WmAfE.params->coltot[Gcb]);
 
1401
        }
 
1402
 
 
1403
      } /* Gk */
 
1404
    } /* Gj */
 
1405
  } /* Gi */
 
1406
 
 
1407
  free(W1);
 
1408
  free(W2);
 
1409
 
 
1410
  dpd_buf4_close(&EAA);
 
1411
  dpd_buf4_close(&EAB);
 
1412
  dpd_buf4_close(&EBA);
 
1413
  dpd_buf4_close(&FAA);
 
1414
  dpd_buf4_close(&FAB);
 
1415
  dpd_buf4_close(&FBA);
 
1416
  dpd_buf4_close(&L2AA);
 
1417
  dpd_buf4_close(&L2AB);
 
1418
  dpd_buf4_close(&L2BA);
 
1419
 
 
1420
  dpd_file2_close(&fIJ);
 
1421
  dpd_file2_close(&fAB);
 
1422
  dpd_file2_close(&fij);
 
1423
  dpd_file2_close(&fab);
 
1424
 
 
1425
  dpd_file2_close(&FME);
 
1426
  dpd_file2_close(&Fme);
 
1427
  dpd_file2_close(&LIA);
 
1428
  dpd_file2_close(&Lia);
 
1429
 
 
1430
  dpd_buf4_close(&DAAints);
 
1431
  dpd_buf4_close(&DABints);
 
1432
  dpd_buf4_close(&LIJAB);
 
1433
  dpd_buf4_close(&LIjAb);
 
1434
 
 
1435
  dpd_buf4_close(&WmAfE);
 
1436
  dpd_buf4_close(&WMAFE);
 
1437
  dpd_buf4_close(&WMaFe);
 
1438
 
 
1439
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&WMnIe, h);
 
1440
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&WMNIE, h);
 
1441
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&WmNiE, h);
 
1442
  dpd_buf4_close(&WMnIe);
 
1443
  dpd_buf4_close(&WMNIE);
 
1444
  dpd_buf4_close(&WmNiE);
 
1445
 
 
1446
  dpd_buf4_close(&ZIgDe);
 
1447
  dpd_buf4_close(&ZIGDE);
 
1448
 
 
1449
  dpd_buf4_close(&ZDMAE);
 
1450
  dpd_buf4_close(&ZDmAe);
 
1451
  dpd_buf4_close(&ZdMAe);
 
1452
 
 
1453
  for(h=0; h < nirreps; h++) {
 
1454
    dpd_buf4_mat_irrep_wrt(&ZLMAO, h);
 
1455
    dpd_buf4_mat_irrep_close(&ZLMAO, h);
 
1456
  }
 
1457
  dpd_buf4_close(&ZLMAO);
 
1458
  for(h=0; h < nirreps; h++) {
 
1459
    dpd_buf4_mat_irrep_wrt(&ZLmAo, h);
 
1460
    dpd_buf4_mat_irrep_close(&ZLmAo, h);
 
1461
  }
 
1462
  dpd_buf4_close(&ZLmAo);
 
1463
 
 
1464
  for(h=0; h < nirreps; h++) {
 
1465
    dpd_buf4_mat_irrep_wrt(&ZIMLE, h);
 
1466
    dpd_buf4_mat_irrep_close(&ZIMLE, h);
 
1467
  }
 
1468
  dpd_buf4_close(&ZIMLE);
 
1469
  for(h=0; h < nirreps; h++) {
 
1470
    dpd_buf4_mat_irrep_wrt(&ZImLe, h);
 
1471
    dpd_buf4_mat_irrep_close(&ZImLe, h);
 
1472
  }
 
1473
  dpd_buf4_close(&ZImLe);
 
1474
  for(h=0; h < nirreps; h++) {
 
1475
    dpd_buf4_mat_irrep_wrt(&ZImlE, h);
 
1476
    dpd_buf4_mat_irrep_close(&ZImlE, h);
 
1477
  }
 
1478
  dpd_buf4_close(&ZImlE);
 
1479
 
 
1480
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&T2AB, h);
 
1481
  for(h=0; h < nirreps; h++) dpd_buf4_mat_irrep_close(&T2AA, h);
 
1482
  dpd_buf4_close(&T2AB);
 
1483
  dpd_buf4_close(&T2AA);
 
1484
 
 
1485
  for(h=0; h < nirreps; h++) {
 
1486
    dpd_buf4_mat_irrep_wrt(&L2AAnew, h);
 
1487
    dpd_buf4_mat_irrep_close(&L2AAnew, h);
 
1488
  }
 
1489
  dpd_buf4_init(&D2, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
 
1490
  dpd_buf4_dirprd(&D2, &L2AAnew);
 
1491
  dpd_buf4_close(&D2);
 
1492
  dpd_buf4_init(&L2, CC_LAMBDA, 0, 0, 5, 2, 7, 0, "New LIJAB");
 
1493
  dpd_buf4_axpy(&L2AAnew, &L2, 1);
 
1494
  dpd_buf4_close(&L2);
 
1495
  dpd_buf4_close(&L2AAnew);
 
1496
 
 
1497
  for(h=0; h < nirreps; h++) {
 
1498
    dpd_buf4_mat_irrep_wrt(&L2ABnew, h);
 
1499
    dpd_buf4_mat_irrep_close(&L2ABnew, h);
 
1500
  }
 
1501
  dpd_buf4_init(&D2, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
 
1502
  dpd_buf4_dirprd(&D2, &L2ABnew);
 
1503
  dpd_buf4_close(&D2);
 
1504
  dpd_buf4_init(&L2, CC_LAMBDA, 0, 0, 5, 0, 5, 0, "New LIjAb");
 
1505
  dpd_buf4_axpy(&L2ABnew, &L2, 1);
 
1506
  dpd_buf4_close(&L2);
 
1507
  dpd_buf4_close(&L2ABnew);
 
1508
 
 
1509
  /* Spin adaptation will remove this.  And yes, this means that all the above
 
1510
     calculations for LIJAB were pointless... -TDC */
 
1511
  dpd_buf4_init(&L2, CC_LAMBDA, 0, 2, 7, 0, 5, 1, "New LIjAb");
 
1512
  dpd_buf4_copy(&L2, CC_LAMBDA, "New LIJAB");
 
1513
  dpd_buf4_copy(&L2, CC_LAMBDA, "New Lijab");
 
1514
  dpd_buf4_close(&L2);
 
1515
 
 
1516
}