3
#include <libdpd/dpd.h>
10
int iter, h, nirreps, row, col;
11
double energy, conv, rms, value;
13
dpdbuf4 D, T2, newT2, Z;
15
nirreps = moinfo.nirreps;
17
if(params.ref == 0) { /** RHF **/
19
/* build initial guess amplitudes */
20
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij|ab>");
21
dpd_buf4_copy(&D, CC_MISC, "MP2 tIjAb");
24
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
25
if(params.local) local_filter_T2(&T2);
27
dpd_buf4_init(&D, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
28
dpd_buf4_dirprd(&D, &T2);
32
dpd_buf4_copy(&T2, CC_MISC, "New MP2 tIjAb");
35
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D 2<ij|ab> - <ij|ba>");
36
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
37
energy = dpd_buf4_dot(&D, &T2);
42
fprintf(outfile, "\n\tSolving for LMP2 wave function:\n");
43
fprintf(outfile, "\t-------------------------------\n");
44
fprintf(outfile, "\titer = %d LMP2 Energy = %20.14f\n", 0, energy);
47
fprintf(outfile, "\n\tSolving for MP2 wave function:\n");
48
fprintf(outfile, "\t-------------------------------\n");
49
fprintf(outfile, "\titer = %d MP2 Energy = %20.14f\n", 0, energy);
53
for(iter=1; iter < params.maxiter; iter++) {
55
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij|ab>");
56
dpd_buf4_copy(&D, CC_MISC, "New MP2 tIjAb Increment");
59
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb Increment");
60
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
62
dpd_file2_init(&F, CC_OEI, 0, 0, 0, "fIJ");
63
dpd_contract424(&T2, &F, &newT2, 1, 0, 1, -1, 1);
64
dpd_contract244(&F, &T2, &newT2, 0, 0, 0, -1, 1);
67
dpd_file2_init(&F, CC_OEI, 0, 1, 1, "fAB");
68
dpd_contract244(&F, &T2, &newT2, 1, 2, 1, 1, 1);
69
dpd_contract424(&T2, &F, &newT2, 3, 1, 0, 1, 1);
75
local_filter_T2(&newT2);
78
dpd_buf4_init(&D, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
79
dpd_buf4_dirprd(&D, &newT2);
83
dpd_buf4_close(&newT2);
85
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
86
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb Increment");
87
dpd_buf4_axpy(&T2, &newT2, 1);
90
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D 2<ij|ab> - <ij|ba>");
91
energy = dpd_buf4_dot(&D, &newT2);
93
dpd_buf4_close(&newT2);
95
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
96
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
98
for(h=0; h < nirreps; h++) {
99
dpd_buf4_mat_irrep_init(&newT2, h);
100
dpd_buf4_mat_irrep_rd(&newT2, h);
101
dpd_buf4_mat_irrep_init(&T2, h);
102
dpd_buf4_mat_irrep_rd(&T2, h);
104
for(row=0; row < T2.params->rowtot[h]; row++)
105
for(col=0; col < T2.params->coltot[h]; col++) {
106
value = newT2.matrix[h][row][col] - T2.matrix[h][row][col];
107
rms += value * value;
110
dpd_buf4_mat_irrep_close(&T2, h);
111
dpd_buf4_mat_irrep_close(&newT2, h);
114
dpd_buf4_close(&newT2);
118
fprintf(outfile, "\titer = %d LMP2 Energy = %20.14f RMS = %4.3e\n", iter, energy, rms);
121
fprintf(outfile, "\titer = %d MP2 Energy = %20.14f RMS = %4.3e\n", iter, energy, rms);
124
if(rms < params.convergence) {
126
fprintf(outfile, "\n\tMP2 iterations converged.\n\n");
130
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
131
dpd_buf4_copy(&T2, CC_MISC, "MP2 tIjAb");
137
fprintf(outfile, "\n\tMP2 iterative procedure failed.\n");
138
exit(PSI_RETURN_FAILURE);
141
/* spin adapt the final amplitudes */
142
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
143
dpd_buf4_sort(&T2, CC_TMP0, pqsr, 0, 5, "MP2 tIjbA");
144
dpd_buf4_copy(&T2, CC_MISC, "MP2 2 tIjAb - tIjbA");
146
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 2 tIjAb - tIjbA");
147
dpd_buf4_scm(&T2, 2);
148
dpd_buf4_init(&Z, CC_TMP0, 0, 0, 5, 0, 5, 0, "MP2 tIjbA");
149
dpd_buf4_axpy(&Z, &T2, -1);
153
else if(params.ref == 2) { /** UHF **/
154
dpd_buf4_init(&D, CC_DINTS, 0, 2, 7, 2, 7, 0, "D <IJ||AB> (I>J,A>B)");
155
dpd_buf4_copy(&D, CC_MISC, "MP2 tIJAB");
157
dpd_buf4_init(&T2, CC_MISC, 0, 2, 7, 2, 7, 0, "MP2 tIJAB");
158
dpd_buf4_init(&D, CC_DENOM, 0, 1, 6, 1, 6, 0, "dIJAB");
159
dpd_buf4_dirprd(&D, &T2);
163
dpd_buf4_init(&D, CC_DINTS, 0, 12, 17, 12, 17, 0, "D <ij||ab> (i>j,a>b)");
164
dpd_buf4_copy(&D, CC_MISC, "MP2 tijab");
166
dpd_buf4_init(&T2, CC_MISC, 0, 12, 17, 12, 17, 0, "MP2 tijab");
167
dpd_buf4_init(&D, CC_DENOM, 0, 11, 16, 11, 16, 0, "dijab");
168
dpd_buf4_dirprd(&D, &T2);
172
dpd_buf4_init(&D, CC_DINTS, 0, 22, 28, 22, 28, 0, "D <Ij|Ab>");
173
dpd_buf4_copy(&D, CC_MISC, "MP2 tIjAb");
175
dpd_buf4_init(&T2, CC_MISC, 0, 22, 28, 22, 28, 0, "MP2 tIjAb");
176
dpd_buf4_init(&D, CC_DENOM, 0, 22, 28, 22, 28, 0, "dIjAb");
177
dpd_buf4_dirprd(&D, &T2);