2
#include <libdpd/dpd.h>
9
int iter, h, nirreps, row, col;
10
double energy, conv, rms, value;
12
dpdbuf4 D, T2, newT2, Z;
14
nirreps = moinfo.nirreps;
16
if(params.ref == 0) { /** RHF **/
18
/* build initial guess amplitudes */
19
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij|ab>");
20
dpd_buf4_copy(&D, CC_MISC, "MP2 tIjAb");
23
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
24
if(params.local) local_filter_T2(&T2);
26
dpd_buf4_init(&D, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
27
dpd_buf4_dirprd(&D, &T2);
31
dpd_buf4_copy(&T2, CC_MISC, "New MP2 tIjAb");
34
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D 2<ij|ab> - <ij|ba>");
35
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
36
energy = dpd_buf4_dot(&D, &T2);
41
fprintf(outfile, "\n\tSolving for LMP2 wave function:\n");
42
fprintf(outfile, "\t-------------------------------\n");
43
fprintf(outfile, "\titer = %d LMP2 Energy = %20.14f\n", 0, energy);
46
fprintf(outfile, "\n\tSolving for MP2 wave function:\n");
47
fprintf(outfile, "\t-------------------------------\n");
48
fprintf(outfile, "\titer = %d MP2 Energy = %20.14f\n", 0, energy);
52
for(iter=1; iter < params.maxiter; iter++) {
54
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D <ij|ab>");
55
dpd_buf4_copy(&D, CC_MISC, "New MP2 tIjAb Increment");
58
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb Increment");
59
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
61
dpd_file2_init(&F, CC_OEI, 0, 0, 0, "fIJ");
62
dpd_contract424(&T2, &F, &newT2, 1, 0, 1, -1, 1);
63
dpd_contract244(&F, &T2, &newT2, 0, 0, 0, -1, 1);
66
dpd_file2_init(&F, CC_OEI, 0, 1, 1, "fAB");
67
dpd_contract244(&F, &T2, &newT2, 1, 2, 1, 1, 1);
68
dpd_contract424(&T2, &F, &newT2, 3, 1, 0, 1, 1);
74
local_filter_T2(&newT2);
77
dpd_buf4_init(&D, CC_DENOM, 0, 0, 5, 0, 5, 0, "dIjAb");
78
dpd_buf4_dirprd(&D, &newT2);
82
dpd_buf4_close(&newT2);
84
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
85
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb Increment");
86
dpd_buf4_axpy(&T2, &newT2, 1);
89
dpd_buf4_init(&D, CC_DINTS, 0, 0, 5, 0, 5, 0, "D 2<ij|ab> - <ij|ba>");
90
energy = dpd_buf4_dot(&D, &newT2);
92
dpd_buf4_close(&newT2);
94
dpd_buf4_init(&newT2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
95
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
97
for(h=0; h < nirreps; h++) {
98
dpd_buf4_mat_irrep_init(&newT2, h);
99
dpd_buf4_mat_irrep_rd(&newT2, h);
100
dpd_buf4_mat_irrep_init(&T2, h);
101
dpd_buf4_mat_irrep_rd(&T2, h);
103
for(row=0; row < T2.params->rowtot[h]; row++)
104
for(col=0; col < T2.params->coltot[h]; col++) {
105
value = newT2.matrix[h][row][col] - T2.matrix[h][row][col];
106
rms += value * value;
109
dpd_buf4_mat_irrep_close(&T2, h);
110
dpd_buf4_mat_irrep_close(&newT2, h);
113
dpd_buf4_close(&newT2);
117
fprintf(outfile, "\titer = %d LMP2 Energy = %20.14f RMS = %4.3e\n", iter, energy, rms);
120
fprintf(outfile, "\titer = %d MP2 Energy = %20.14f RMS = %4.3e\n", iter, energy, rms);
123
if(rms < params.convergence) {
125
fprintf(outfile, "\n\tMP2 iterations converged.\n\n");
129
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "New MP2 tIjAb");
130
dpd_buf4_copy(&T2, CC_MISC, "MP2 tIjAb");
136
fprintf(outfile, "\n\tMP2 iterative procedure failed.\n");
137
exit(PSI_RETURN_FAILURE);
140
/* spin adapt the final amplitudes */
141
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 tIjAb");
142
dpd_buf4_sort(&T2, CC_TMP0, pqsr, 0, 5, "MP2 tIjbA");
143
dpd_buf4_copy(&T2, CC_MISC, "MP2 2 tIjAb - tIjbA");
145
dpd_buf4_init(&T2, CC_MISC, 0, 0, 5, 0, 5, 0, "MP2 2 tIjAb - tIjbA");
146
dpd_buf4_scm(&T2, 2);
147
dpd_buf4_init(&Z, CC_TMP0, 0, 0, 5, 0, 5, 0, "MP2 tIjbA");
148
dpd_buf4_axpy(&Z, &T2, -1);
152
else if(params.ref == 2) { /** UHF **/
153
dpd_buf4_init(&D, CC_DINTS, 0, 2, 7, 2, 7, 0, "D <IJ||AB> (I>J,A>B)");
154
dpd_buf4_copy(&D, CC_MISC, "MP2 tIJAB");
156
dpd_buf4_init(&T2, CC_MISC, 0, 2, 7, 2, 7, 0, "MP2 tIJAB");
157
dpd_buf4_init(&D, CC_DENOM, 0, 1, 6, 1, 6, 0, "dIJAB");
158
dpd_buf4_dirprd(&D, &T2);
162
dpd_buf4_init(&D, CC_DINTS, 0, 12, 17, 12, 17, 0, "D <ij||ab> (i>j,a>b)");
163
dpd_buf4_copy(&D, CC_MISC, "MP2 tijab");
165
dpd_buf4_init(&T2, CC_MISC, 0, 12, 17, 12, 17, 0, "MP2 tijab");
166
dpd_buf4_init(&D, CC_DENOM, 0, 11, 16, 11, 16, 0, "dijab");
167
dpd_buf4_dirprd(&D, &T2);
171
dpd_buf4_init(&D, CC_DINTS, 0, 22, 28, 22, 28, 0, "D <Ij|Ab>");
172
dpd_buf4_copy(&D, CC_MISC, "MP2 tIjAb");
174
dpd_buf4_init(&T2, CC_MISC, 0, 22, 28, 22, 28, 0, "MP2 tIjAb");
175
dpd_buf4_init(&D, CC_DENOM, 0, 22, 28, 22, 28, 0, "dIjAb");
176
dpd_buf4_dirprd(&D, &T2);