4
#include<libciomr/libciomr.h>
5
#include<libpsio/psio.h>
7
#include<libchkpt/chkpt.h>
8
#include<libint/libint.h>
14
#include"moinfo_corr.h"
21
static int *cachefiles, **cachelist;
25
int h, ij, ab, row, col, row_offset, col_offset;
26
int nactive, nocc, nvirt, nao;
28
int *virtpi, *vir_sym;
30
double **T2_MO, **T2_AO, **T2;
33
nao = BasisSet.num_ao;
35
/* grab some basic data from CC_INFO */
36
psio_open(CC_INFO, PSIO_OPEN_OLD);
37
psio_read_entry(CC_INFO, "No. of Active Orbitals", (char *) &(nactive),
39
occpi = init_int_array(Symmetry.nirreps);
40
virtpi = init_int_array(Symmetry.nirreps);
41
occ_sym = init_int_array(nactive);
42
vir_sym = init_int_array(nactive);
43
psio_read_entry(CC_INFO, "Active Occ Orbs Per Irrep",
44
(char *) occpi, sizeof(int)*Symmetry.nirreps);
45
psio_read_entry(CC_INFO, "Active Virt Orbs Per Irrep",
46
(char *) virtpi, sizeof(int)*Symmetry.nirreps);
47
psio_read_entry(CC_INFO, "Active Occ Orb Symmetry",
48
(char *) occ_sym, sizeof(int)*Symmetry.nirreps);
49
psio_read_entry(CC_INFO, "Active Virt Orb Symmetry",
50
(char *) vir_sym, sizeof(int)*Symmetry.nirreps);
51
psio_close(CC_INFO, 1);
54
for(h=0; h < Symmetry.nirreps; h++) {
55
nocc += occpi[h]; nvirt += virtpi[h];
58
cachefiles = init_int_array(PSIO_MAXUNIT);
59
/* assuming no caching for DPD here */
60
cachelist = init_int_matrix(12,12);
65
/* open the T-amplitude file for r/w */
66
psio_open(CC_TAMPS, PSIO_OPEN_OLD);
68
/*--- Initialize DPD library ---*/
69
dpd_init(1, Symmetry.nirreps, UserOptions.memory, 0, cachefiles, cachelist, NULL,
70
2, occpi, occ_sym, virtpi, vir_sym);
72
/* Grab the MO-basis T2's provided by ccenergy */
73
T2_MO = block_matrix(nocc*nocc,nvirt*nvirt);
74
dpd_buf4_init(&tau, CC_TAMPS, 0, 0, 5, 0, 5, 0, "tauIjAb");
75
row_offset = col_offset = 0;
76
for(h=0,row=0,col=0; h < Symmetry.nirreps; h++) {
77
dpd_buf4_mat_irrep_init(&tau, h);
78
dpd_buf4_mat_irrep_rd(&tau, h);
81
row_offset += tau.params->rowtot[h-1];
82
col_offset += tau.params->coltot[h-1];
85
for(row=0; row < tau.params->rowtot[h]; row++) {
86
for(col=0; col < tau.params->coltot[h]; col++) {
87
T2_MO[row_offset+row][col_offset+col] = tau.matrix[h][row][col];
91
dpd_buf4_mat_irrep_close(&tau, h);
95
/* half-transform the T2's */
96
A = block_matrix(nvirt, nao);
97
T2_AO = block_matrix(nocc*nocc, nao*nao);
98
for(ij=0; ij < nocc*nocc; ij++) {
101
C_DGEMM('n','n',nvirt,nao,nvirt,1.0,&(T2_MO[ij][0]),nvirt,
102
&(MOInfo.scf_evec_uocc[0][0][0]),nao,0.0,A[0],nao);
104
C_DGEMM('t','n',nao,nao,nvirt,1.0,&(MOInfo.scf_evec_uocc[0][0][0]),nao,
105
A[0],nao,0.0,&(T2_AO[ij][0]),nao);
110
/* transpose T2 to AO*AO x MO*MO */
111
T2 = block_matrix(nao*nao,nocc*nocc);
112
for(ij=0; ij < nocc*nocc; ij++)
113
for(ab=0; ab < nao*nao; ab++)
114
T2[ab][ij] = T2_AO[ij][ab];
118
CCInfo.T2_t = block_matrix(nao*nao,nocc*nocc);
120
CCInfo.nvirt = nvirt;
122
free(occpi); free(occ_sym);
123
free(virtpi); free(vir_sym);
129
void cleanup_ccinfo()
131
int h, ij, ab, row, col, row_offset, col_offset;
132
int nocc, nvirt, nao;
133
double **T2, **A, **T2_MO;
137
nvirt = CCInfo.nvirt;
138
nao = BasisSet.num_ao;
140
free_block(CCInfo.T2_s);
142
/* transpose target T2 back to MO*MO x AO*AO */
143
T2 = block_matrix(nocc*nocc, nao*nao);
144
for(ij=0; ij < nocc*nocc; ij++) {
145
for(ab=0; ab < nao*nao; ab++) {
146
T2[ij][ab] = CCInfo.T2_t[ab][ij];
149
free_block(CCInfo.T2_t);
151
/* transform T2 back to MO basis */
152
A = block_matrix(nao,nvirt);
153
T2_MO = block_matrix(nocc*nocc,nvirt*nvirt);
154
for(ij=0; ij < nocc*nocc; ij++) {
155
C_DGEMM('n','t',nao,nvirt,nao,1.0,T2[ij],nao,
156
MOInfo.scf_evec_uocc[0][0],nao,0.0,A[0],nvirt);
157
C_DGEMM('n','n',nvirt,nvirt,nao,1.0,MOInfo.scf_evec_uocc[0][0],nao,
158
A[0],nvirt,0.0,T2_MO[ij],nvirt);
163
/* Put T2 back into the DPD buffer */
164
dpd_buf4_init(&tau, CC_TAMPS, 0, 0, 5, 0, 5, 0, "New tIjAb");
165
row_offset = col_offset = 0;
166
for(h=0; h < Symmetry.nirreps; h++) {
167
dpd_buf4_mat_irrep_init(&tau, h);
168
dpd_buf4_mat_irrep_rd(&tau, h);
171
row_offset += tau.params->rowtot[h-1];
172
col_offset += tau.params->coltot[h-1];
175
for(row=0; row < tau.params->rowtot[h]; row++) {
176
for(col=0; col < tau.params->coltot[h]; col++) {
177
tau.matrix[h][row][col] += T2_MO[row+row_offset][col+col_offset];
180
dpd_buf4_mat_irrep_wrt(&tau, h);
181
dpd_buf4_mat_irrep_close(&tau, h);
183
dpd_buf4_close(&tau);
187
free_int_matrix(cachelist,12);
191
/* close the T-amplitude file */
192
psio_close(CC_TAMPS, 1);