124
127
/* Local correlation decs */
125
128
int nso, nocc, nvir;
126
int *pairdom_len, *pairdom_nrlen, *weak_pairs;
127
double ***V, ***W, *eps_occ, **eps_vir;
128
129
double *T1tilde, *T1bar, **T2tilde, **T2bar, **X1, **X2;
130
132
C_irr = RIA->my_irrep;
131
133
nirreps = RIA->params->nirreps;
133
if(params.local && local.filter_singles) {
136
138
nocc = local.nocc;
137
139
nvir = local.nvir;
140
eps_occ = local.eps_occ;
141
eps_vir = local.eps_vir;
142
pairdom_len = local.pairdom_len;
143
pairdom_nrlen = local.pairdom_nrlen;
144
weak_pairs = local.weak_pairs;
146
dpd_file2_mat_init(RIA);
147
dpd_file2_mat_rd(RIA);
149
for(i=0; i < nocc; i++) {
152
if(!pairdom_len[ii]) {
153
fprintf(outfile, "\n\tlocal_filter_T1: Pair ii = [%d] is zero-length, which makes no sense.\n",ii);
157
T1tilde = init_array(pairdom_len[ii]);
158
T1bar = init_array(pairdom_nrlen[ii]);
160
/* Transform the virtuals to the redundant projected virtual basis */
161
C_DGEMV('t', nvir, pairdom_len[ii], 1.0, &(V[ii][0][0]), pairdom_len[ii],
162
&(RIA->matrix[0][i][0]), 1, 0.0, &(T1tilde[0]), 1);
164
/* Transform the virtuals to the non-redundant virtual basis */
165
C_DGEMV('t', pairdom_len[ii], pairdom_nrlen[ii], 1.0, &(W[ii][0][0]), pairdom_nrlen[ii],
166
&(T1tilde[0]), 1, 0.0, &(T1bar[0]), 1);
168
for(a=0; a < pairdom_nrlen[ii]; a++) {
169
tval = eval + eps_occ[i] - eps_vir[ii][a];
170
if(fabs(tval) > 0.0001) T1bar[a] /= tval;
173
/* Transform the new T1's to the redundant projected virtual basis */
174
C_DGEMV('n', pairdom_len[ii], pairdom_nrlen[ii], 1.0, &(W[ii][0][0]), pairdom_nrlen[ii],
175
&(T1bar[0]), 1, 0.0, &(T1tilde[0]), 1);
177
/* Transform the new T1's to the MO basis */
178
C_DGEMV('n', nvir, pairdom_len[ii], 1.0, &(V[ii][0][0]), pairdom_len[ii],
179
&(T1tilde[0]), 1, 0.0, &(RIA->matrix[0][i][0]), 1);
185
dpd_file2_mat_wrt(RIA);
186
dpd_file2_mat_close(RIA);
141
local.pairdom_len = init_int_array(nocc*nocc);
142
local.pairdom_nrlen = init_int_array(nocc*nocc);
143
local.eps_occ = init_array(nocc);
144
local.weak_pairs = init_int_array(nocc*nocc);
145
psio_read_entry(CC_INFO, "Local Pair Domain Length", (char *) local.pairdom_len,
146
nocc*nocc*sizeof(int));
147
psio_read_entry(CC_INFO, "Local Pair Domain Length (Non-redundant basis)", (char *) local.pairdom_nrlen,
148
nocc*nocc*sizeof(int));
149
psio_read_entry(CC_INFO, "Local Occupied Orbital Energies", (char *) local.eps_occ,
150
nocc*sizeof(double));
151
psio_read_entry(CC_INFO, "Local Weak Pairs", (char *) local.weak_pairs,
152
nocc*nocc*sizeof(int));
154
local.W = (double ***) malloc(nocc * nocc * sizeof(double **));
155
local.V = (double ***) malloc(nocc * nocc * sizeof(double **));
156
local.eps_vir = (double **) malloc(nocc * nocc * sizeof(double *));
158
for(ij=0; ij < nocc*nocc; ij++) {
159
local.eps_vir[ij] = init_array(local.pairdom_nrlen[ij]);
160
psio_read(CC_INFO, "Local Virtual Orbital Energies", (char *) local.eps_vir[ij],
161
local.pairdom_nrlen[ij]*sizeof(double), next, &next);
164
for(ij=0; ij < nocc*nocc; ij++) {
165
local.V[ij] = block_matrix(nvir,local.pairdom_len[ij]);
166
psio_read(CC_INFO, "Local Residual Vector (V)", (char *) local.V[ij][0],
167
nvir*local.pairdom_len[ij]*sizeof(double), next, &next);
170
for(ij=0; ij < nocc*nocc; ij++) {
171
local.W[ij] = block_matrix(local.pairdom_len[ij],local.pairdom_nrlen[ij]);
172
psio_read(CC_INFO, "Local Transformation Matrix (W)", (char *) local.W[ij][0],
173
local.pairdom_len[ij]*local.pairdom_nrlen[ij]*sizeof(double), next, &next);
176
if(local.filter_singles) {
178
dpd_file2_mat_init(RIA);
179
dpd_file2_mat_rd(RIA);
181
for(i=0; i < nocc; i++) {
184
if(!local.pairdom_len[ii]) {
185
fprintf(outfile, "\n\tlocal_filter_T1: Pair ii = [%d] is zero-length, which makes no sense.\n",ii);
189
T1tilde = init_array(local.pairdom_len[ii]);
190
T1bar = init_array(local.pairdom_nrlen[ii]);
192
/* Transform the virtuals to the redundant projected virtual basis */
193
C_DGEMV('t', nvir, local.pairdom_len[ii], 1.0, &(local.V[ii][0][0]), local.pairdom_len[ii],
194
&(RIA->matrix[0][i][0]), 1, 0.0, &(T1tilde[0]), 1);
196
/* Transform the virtuals to the non-redundant virtual basis */
197
C_DGEMV('t', local.pairdom_len[ii], local.pairdom_nrlen[ii], 1.0, &(local.W[ii][0][0]), local.pairdom_nrlen[ii],
198
&(T1tilde[0]), 1, 0.0, &(T1bar[0]), 1);
200
for(a=0; a < local.pairdom_nrlen[ii]; a++) {
201
tval = eval + local.eps_occ[i] - local.eps_vir[ii][a];
202
if(fabs(tval) > 0.0001) T1bar[a] /= tval;
205
/* Transform the new T1's to the redundant projected virtual basis */
206
C_DGEMV('n', local.pairdom_len[ii], local.pairdom_nrlen[ii], 1.0, &(local.W[ii][0][0]), local.pairdom_nrlen[ii],
207
&(T1bar[0]), 1, 0.0, &(T1tilde[0]), 1);
209
/* Transform the new T1's to the MO basis */
210
C_DGEMV('n', nvir, local.pairdom_len[ii], 1.0, &(local.V[ii][0][0]), local.pairdom_len[ii],
211
&(T1tilde[0]), 1, 0.0, &(RIA->matrix[0][i][0]), 1);
217
dpd_file2_mat_wrt(RIA);
218
dpd_file2_mat_close(RIA);
189
222
dpd_file2_mat_init(RIA);
228
250
for(i=0,ij=0; i < nocc; i++) {
229
251
for(j=0; j < nocc; j++,ij++) {
231
if(!weak_pairs[ij]) {
253
if(!local.weak_pairs[ij]) {
233
255
/* Transform the virtuals to the redundant projected virtual basis */
234
C_DGEMM('t', 'n', pairdom_len[ij], nvir, nvir, 1.0, &(V[ij][0][0]), pairdom_len[ij],
256
C_DGEMM('t', 'n', local.pairdom_len[ij], nvir, nvir, 1.0, &(local.V[ij][0][0]), local.pairdom_len[ij],
235
257
&(RIjAb->matrix[0][ij][0]), nvir, 0.0, &(X1[0][0]), nvir);
236
C_DGEMM('n', 'n', pairdom_len[ij], pairdom_len[ij], nvir, 1.0, &(X1[0][0]), nvir,
237
&(V[ij][0][0]), pairdom_len[ij], 0.0, &(T2tilde[0][0]), nso);
258
C_DGEMM('n', 'n', local.pairdom_len[ij], local.pairdom_len[ij], nvir, 1.0, &(X1[0][0]), nvir,
259
&(local.V[ij][0][0]), local.pairdom_len[ij], 0.0, &(T2tilde[0][0]), nso);
239
261
/* Transform the virtuals to the non-redundant virtual basis */
240
C_DGEMM('t', 'n', pairdom_nrlen[ij], pairdom_len[ij], pairdom_len[ij], 1.0,
241
&(W[ij][0][0]), pairdom_nrlen[ij], &(T2tilde[0][0]), nso, 0.0, &(X2[0][0]), nso);
242
C_DGEMM('n', 'n', pairdom_nrlen[ij], pairdom_nrlen[ij], pairdom_len[ij], 1.0,
243
&(X2[0][0]), nso, &(W[ij][0][0]), pairdom_nrlen[ij], 0.0, &(T2bar[0][0]), nvir);
262
C_DGEMM('t', 'n', local.pairdom_nrlen[ij], local.pairdom_len[ij], local.pairdom_len[ij], 1.0,
263
&(local.W[ij][0][0]), local.pairdom_nrlen[ij], &(T2tilde[0][0]), nso, 0.0, &(X2[0][0]), nso);
264
C_DGEMM('n', 'n', local.pairdom_nrlen[ij], local.pairdom_nrlen[ij], local.pairdom_len[ij], 1.0,
265
&(X2[0][0]), nso, &(local.W[ij][0][0]), local.pairdom_nrlen[ij], 0.0, &(T2bar[0][0]), nvir);
245
267
/* Divide the new amplitudes by the denominators */
246
for(a=0; a < pairdom_nrlen[ij]; a++) {
247
for(b=0; b < pairdom_nrlen[ij]; b++) {
248
tval = eval + eps_occ[i]+eps_occ[j]-eps_vir[ij][a]-eps_vir[ij][b];
268
for(a=0; a < local.pairdom_nrlen[ij]; a++) {
269
for(b=0; b < local.pairdom_nrlen[ij]; b++) {
270
tval = eval + local.eps_occ[i]+local.eps_occ[j]-local.eps_vir[ij][a]-local.eps_vir[ij][b];
249
271
if(fabs(tval) > 0.0001) T2bar[a][b] /= tval;
253
275
/* Transform the new T2's to the redundant virtual basis */
254
C_DGEMM('n', 'n', pairdom_len[ij], pairdom_nrlen[ij], pairdom_nrlen[ij], 1.0,
255
&(W[ij][0][0]), pairdom_nrlen[ij], &(T2bar[0][0]), nvir, 0.0, &(X1[0][0]), nvir);
256
C_DGEMM('n','t', pairdom_len[ij], pairdom_len[ij], pairdom_nrlen[ij], 1.0,
257
&(X1[0][0]), nvir, &(W[ij][0][0]), pairdom_nrlen[ij], 0.0, &(T2tilde[0][0]), nso);
276
C_DGEMM('n', 'n', local.pairdom_len[ij], local.pairdom_nrlen[ij], local.pairdom_nrlen[ij], 1.0,
277
&(local.W[ij][0][0]), local.pairdom_nrlen[ij], &(T2bar[0][0]), nvir, 0.0, &(X1[0][0]), nvir);
278
C_DGEMM('n','t', local.pairdom_len[ij], local.pairdom_len[ij], local.pairdom_nrlen[ij], 1.0,
279
&(X1[0][0]), nvir, &(local.W[ij][0][0]), local.pairdom_nrlen[ij], 0.0, &(T2tilde[0][0]), nso);
259
281
/* Transform the new T2's to the MO basis */
260
C_DGEMM('n', 'n', nvir, pairdom_len[ij], pairdom_len[ij], 1.0,
261
&(V[ij][0][0]), pairdom_len[ij], &(T2tilde[0][0]), nso, 0.0, &(X2[0][0]), nso);
262
C_DGEMM('n', 't', nvir, nvir, pairdom_len[ij], 1.0, &(X2[0][0]), nso,
263
&(V[ij][0][0]), pairdom_len[ij], 0.0, &(RIjAb->matrix[0][ij][0]), nvir);
282
C_DGEMM('n', 'n', nvir, local.pairdom_len[ij], local.pairdom_len[ij], 1.0,
283
&(local.V[ij][0][0]), local.pairdom_len[ij], &(T2tilde[0][0]), nso, 0.0, &(X2[0][0]), nso);
284
C_DGEMM('n', 't', nvir, nvir, local.pairdom_len[ij], 1.0, &(X2[0][0]), nso,
285
&(local.V[ij][0][0]), local.pairdom_len[ij], 0.0, &(RIjAb->matrix[0][ij][0]), nvir);
265
287
else /* This must be a neglected weak pair; force it to zero */
266
288
memset((void *) RIjAb->matrix[0][ij], 0, nvir*nvir*sizeof(double));