3
#include <libciomr/libciomr.h>
4
#include <libdpd/dpd.h>
12
int h, i, dim, dim_A, dim_B;
14
int ai, bj, ck, c, k, C, K, Ksym;
15
double **A, *eps, **v;
17
dpdbuf4 A_AA, A_BB, A_AB;
19
double **singlet_evals, **triplet_evals, **uhf_evals;
21
if(params.ref == 0) { /**RHF **/
23
singlet_evals = (double **) malloc(moinfo.nirreps * sizeof(double *));
24
for(h=0; h < moinfo.nirreps; h++)
25
singlet_evals[h] = init_array(params.rpi[h]);
27
dpd_buf4_init(&A_AA, CC_MISC, 0, 11, 11, 11, 11, 0, "A(AI,BJ)");
29
for(h=0; h < moinfo.nirreps; h++) {
30
dim = A_AA.params->rowtot[h];
31
eps = init_array(dim);
32
v = block_matrix(dim, dim);
34
dpd_buf4_mat_irrep_init(&A_AA, h);
35
dpd_buf4_mat_irrep_rd(&A_AA, h);
37
if(!strcmp(params.diag_method,"FULL"))
38
sq_rsp(dim, dim, A_AA.matrix[h], eps, 1, v, 1e-14);
39
else if(!strcmp(params.diag_method,"DAVIDSON")) {
40
nroot = david(A_AA.matrix[h], dim, params.rpi[h], eps, v, params.convergence, 0);
42
if(nroot != params.rpi[h])
43
fprintf(outfile, "\tDavidson algorithm converged only %d roots in irrep %d.\n",
47
dpd_buf4_mat_irrep_close(&A_AA, h);
50
fprintf(outfile, "RHF-CIS Singlet Eigenvectors for irrep %d:\n", h);
51
print_mat(v, dim, params.rpi[h], outfile);
54
/* Store the eigenvectors in DPD entries and save the eigenvalues*/
55
for(root=0; root < params.rpi[h]; root++) {
57
sprintf(lbl, "BIA(%d)[%d] singlet", root, h);
58
dpd_file2_init(&B, CC_OEI, h, 0, 1, lbl);
59
dpd_file2_mat_init(&B);
60
for(ck=0; ck < dim; ck++) {
61
c = A_AA.params->roworb[h][ck][0];
62
k = A_AA.params->roworb[h][ck][1];
64
K = B.params->rowidx[k];
65
C = B.params->colidx[c];
67
Ksym = B.params->psym[k];
69
B.matrix[Ksym][K][C] = v[ck][root];
71
dpd_file2_mat_wrt(&B);
72
dpd_file2_mat_close(&B);
75
singlet_evals[h][root] = eps[root];
82
dpd_buf4_close(&A_AA);
84
triplet_evals = (double **) malloc(moinfo.nirreps * sizeof(double *));
85
for(h=0; h < moinfo.nirreps; h++)
86
triplet_evals[h] = init_array(params.rpi[h]);
88
dpd_buf4_init(&A_AA, CC_MISC, 0, 11, 11, 11, 11, 0, "A(AI,BJ) triplet");
90
for(h=0; h < moinfo.nirreps; h++) {
91
dim = A_AA.params->rowtot[h];
92
eps = init_array(dim);
93
v = block_matrix(dim, dim);
95
dpd_buf4_mat_irrep_init(&A_AA, h);
96
dpd_buf4_mat_irrep_rd(&A_AA, h);
98
if(!strcmp(params.diag_method, "FULL"))
99
sq_rsp(dim, dim, A_AA.matrix[h], eps, 1, v, 1e-14);
100
else if(!strcmp(params.diag_method,"DAVIDSON")) {
101
nroot = david(A_AA.matrix[h], dim, params.rpi[h], eps, v, params.convergence, 0);
103
if(nroot != params.rpi[h])
104
fprintf(outfile, "\tDavidson algorithm converged only %d roots in irrep %d.\n",
108
dpd_buf4_mat_irrep_close(&A_AA, h);
110
/* Store the eigenvectors in DPD entries and save the eigenvalues*/
111
for(root=0; root < params.rpi[h]; root++) {
113
sprintf(lbl, "BIA(%d)[%d] triplet", root, h);
114
dpd_file2_init(&B, CC_OEI, h, 0, 1, lbl);
115
dpd_file2_mat_init(&B);
116
for(ck=0; ck < dim; ck++) {
117
c = A_AA.params->roworb[h][ck][0];
118
k = A_AA.params->roworb[h][ck][1];
120
K = B.params->rowidx[k];
121
C = B.params->colidx[c];
123
Ksym = B.params->psym[k];
125
B.matrix[Ksym][K][C] = v[ck][root];
127
dpd_file2_mat_wrt(&B);
128
dpd_file2_mat_close(&B);
131
triplet_evals[h][root] = eps[root];
137
dpd_buf4_close(&A_AA);
139
moinfo.singlet_evals = singlet_evals;
140
moinfo.triplet_evals = triplet_evals;
143
else if(params.ref == 2) { /** UHF **/
145
uhf_evals = (double **) malloc(moinfo.nirreps * sizeof(double *));
146
for(h=0; h < moinfo.nirreps; h++)
147
uhf_evals[h] = init_array(params.rpi[h]);
149
dpd_buf4_init(&A_AA, CC_MISC, 0, 21, 21, 21, 21, 0, "A(AI,BJ)");
150
dpd_buf4_init(&A_BB, CC_MISC, 0, 31, 31, 31, 31, 0, "A(ai,bj)");
151
dpd_buf4_init(&A_AB, CC_MISC, 0, 21, 31, 21, 31, 0, "A(AI,bj)");
152
for(h=0; h < moinfo.nirreps; h++) {
153
dim_A = A_AA.params->rowtot[h];
154
dim_B = A_BB.params->rowtot[h];
158
A = block_matrix(dim, dim);
159
eps = init_array(dim);
160
v = block_matrix(dim, dim);
162
dpd_buf4_mat_irrep_init(&A_AA, h);
163
dpd_buf4_mat_irrep_rd(&A_AA, h);
164
for(ai=0; ai < dim_A; ai++)
165
for(bj=0; bj < dim_A; bj++)
166
A[ai][bj] = A_AA.matrix[h][ai][bj];
167
dpd_buf4_mat_irrep_close(&A_AA, h);
169
dpd_buf4_mat_irrep_init(&A_BB, h);
170
dpd_buf4_mat_irrep_rd(&A_BB, h);
171
for(ai=0; ai < dim_B; ai++)
172
for(bj=0; bj < dim_B; bj++)
173
A[ai+dim_A][bj+dim_A] = A_BB.matrix[h][ai][bj];
174
dpd_buf4_mat_irrep_close(&A_BB, h);
176
dpd_buf4_mat_irrep_init(&A_AB, h);
177
dpd_buf4_mat_irrep_rd(&A_AB, h);
178
for(ai=0; ai < dim_A; ai++)
179
for(bj=0; bj < dim_B; bj++)
180
A[ai][bj+dim_A] = A[bj+dim_A][ai] = A_AB.matrix[h][ai][bj];
181
dpd_buf4_mat_irrep_close(&A_AB, h);
183
if(!strcmp(params.diag_method,"FULL"))
184
sq_rsp(dim, dim, A, eps, 1, v, 1e-12);
185
else if(!strcmp(params.diag_method,"DAVIDSON")) {
186
nroot = david(A, dim, params.rpi[h], eps, v, params.convergence, 0);
188
if(nroot != params.rpi[h])
189
fprintf(outfile, "\tDavidson algorithm converged only %d roots in irrep %d.\n",
194
fprintf(outfile, "UHF-CIS Eigenvectors for irrep %d:\n", h);
195
print_mat(v, dim, params.rpi[h], outfile);
198
/* Store the eigenvectors in DPD entries and save the eigenvalues */
199
for(root=0; root < params.rpi[h]; root++) {
200
sprintf(lbl, "BIA(%d)[%d]", root, h);
201
dpd_file2_init(&B, CC_OEI, h, 0, 1, lbl);
202
dpd_file2_mat_init(&B);
203
for(ck=0; ck < dim_A; ck++) {
204
c = A_AA.params->roworb[h][ck][0];
205
k = A_AA.params->roworb[h][ck][1];
207
K = B.params->rowidx[k];
208
C = B.params->colidx[c];
210
Ksym = B.params->psym[k];
212
B.matrix[Ksym][K][C] = v[ck][root];
214
dpd_file2_mat_wrt(&B);
215
dpd_file2_mat_close(&B);
218
sprintf(lbl, "Bia(%d)[%d]", root, h);
219
dpd_file2_init(&B, CC_OEI, h, 2, 3, lbl);
220
dpd_file2_mat_init(&B);
221
for(ck=0; ck < dim_B; ck++) {
222
c = A_BB.params->roworb[h][ck][0];
223
k = A_BB.params->roworb[h][ck][1];
225
K = B.params->rowidx[k];
226
C = B.params->colidx[c];
228
Ksym = B.params->psym[k];
230
B.matrix[Ksym][K][C] = v[ck+dim_A][root];
232
dpd_file2_mat_wrt(&B);
233
dpd_file2_mat_close(&B);
236
uhf_evals[h][root] = eps[root];
243
dpd_buf4_close(&A_AA);
244
dpd_buf4_close(&A_BB);
245
dpd_buf4_close(&A_AB);
247
moinfo.uhf_evals = uhf_evals;