3
\brief Enter brief description of file here
9
#include <libdpd/dpd.h>
10
#include <libciomr/libciomr.h>
16
namespace psi { namespace ccsort {
18
void cphf_B(const char *cart)
20
int irrep, row, a, i, asym, isym, num_ai, info, *ipiv;
21
double *vector, *vector2, polar;
25
psio_open(PSIF_MO_HESS, 1);
26
dpd_buf4_init(&A, PSIF_MO_HESS, 0, 11, 11, 11, 11, 0, "B(AI,BJ)");
28
if (!strcmp(cart, "X")) {
29
irrep = moinfo.irrep_x;
31
/* sort L elements into a single vector for lineq solver */
32
dpd_file2_init(&L, CC_OEI, irrep, 0, 1, "L_X_IA");
33
dpd_file2_mat_init(&L);
35
num_ai = A.params->rowtot[irrep];
36
vector = init_array(num_ai);
37
for(row=0; row < num_ai; row++) {
38
a = A.params->roworb[irrep][row][0];
39
i = A.params->roworb[irrep][row][1];
40
asym = A.params->psym[a];
41
isym = A.params->qsym[i];
42
vector[row] = L.matrix[isym][i-A.params->qoff[isym]][a-A.params->poff[asym]];
44
dpd_file2_mat_close(&L);
47
/* grab current irrep of MO Hessian */
48
dpd_buf4_mat_irrep_init(&A, irrep);
49
dpd_buf4_mat_irrep_rd(&A, irrep);
52
/* solve CPHF equations */
53
ipiv = init_int_array(num_ai);
54
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
56
fprintf(outfile, "CCSORT: cphf_B: Error in C_DGESV. Info = %d. Exiting.\n", info);
57
exit(PSI_RETURN_FAILURE);
61
dpd_buf4_mat_irrep_close(&A, irrep);
63
/* sort CPHF solution to DPD format */
64
dpd_file2_init(&L, CC_OEI, irrep, 1, 0, "CPHF Ub_X_AI");
65
dpd_file2_mat_init(&L);
66
for(row=0; row < num_ai; row++) {
67
a = A.params->roworb[irrep][row][0];
68
i = A.params->roworb[irrep][row][1];
69
asym = A.params->psym[a];
70
isym = A.params->qsym[i];
71
L.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
73
dpd_file2_mat_wrt(&L);
77
if (!strcmp(cart, "Y")) {
78
irrep = moinfo.irrep_y;
80
/* sort L elements into a single vector for lineq solver */
81
dpd_file2_init(&L, CC_OEI, irrep, 0, 1, "L_Y_IA");
82
dpd_file2_mat_init(&L);
84
num_ai = A.params->rowtot[irrep];
85
vector = init_array(num_ai);
86
for(row=0; row < num_ai; row++) {
87
a = A.params->roworb[irrep][row][0];
88
i = A.params->roworb[irrep][row][1];
89
asym = A.params->psym[a];
90
isym = A.params->qsym[i];
91
vector[row] = L.matrix[isym][i-A.params->qoff[isym]][a-A.params->poff[asym]];
93
dpd_file2_mat_close(&L);
96
/* grab current irrep of MO Hessian */
97
dpd_buf4_mat_irrep_init(&A, irrep);
98
dpd_buf4_mat_irrep_rd(&A, irrep);
101
/* solve CPHF equations */
102
ipiv = init_int_array(num_ai);
103
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
105
fprintf(outfile, "CCSORT: cphf_B: Error in C_DGESV. Info = %d. Exiting.\n", info);
106
exit(PSI_RETURN_FAILURE);
110
dpd_buf4_mat_irrep_close(&A, irrep);
112
/* sort CPHF solution to DPD format */
113
dpd_file2_init(&L, CC_OEI, irrep, 1, 0, "CPHF Ub_Y_AI");
114
dpd_file2_mat_init(&L);
115
for(row=0; row < num_ai; row++) {
116
a = A.params->roworb[irrep][row][0];
117
i = A.params->roworb[irrep][row][1];
118
asym = A.params->psym[a];
119
isym = A.params->qsym[i];
120
L.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
122
dpd_file2_mat_wrt(&L);
126
if (!strcmp(cart, "Z")) {
127
irrep = moinfo.irrep_z;
129
/* sort L elements into a single vector for lineq solver */
130
dpd_file2_init(&L, CC_OEI, irrep, 0, 1, "L_Z_IA");
131
dpd_file2_mat_init(&L);
132
dpd_file2_mat_rd(&L);
133
num_ai = A.params->rowtot[irrep];
134
vector = init_array(num_ai);
135
for(row=0; row < num_ai; row++) {
136
a = A.params->roworb[irrep][row][0];
137
i = A.params->roworb[irrep][row][1];
138
asym = A.params->psym[a];
139
isym = A.params->qsym[i];
140
vector[row] = L.matrix[isym][i-A.params->qoff[isym]][a-A.params->poff[asym]];
142
dpd_file2_mat_close(&L);
146
vector2 = init_array(num_ai);
147
for(row=0; row < num_ai; row++) vector2[row] = vector[row];
150
/* grab current irrep of MO Hessian */
151
dpd_buf4_mat_irrep_init(&A, irrep);
152
dpd_buf4_mat_irrep_rd(&A, irrep);
154
/* solve CPHF equations */
155
ipiv = init_int_array(num_ai);
156
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
158
fprintf(outfile, "CCSORT: cphf_B: Error in C_DGESV. Info = %d. Exiting.\n", info);
159
exit(PSI_RETURN_FAILURE);
163
dpd_buf4_mat_irrep_close(&A, irrep);
167
for(row=0; row < num_ai; row++) polar += vector2[row] * vector[row];
169
fprintf(outfile, "\talpha_zz = %20.12f\n", polar);
173
/* sort CPHF solution to DPD format */
174
dpd_file2_init(&L, CC_OEI, irrep, 1, 0, "CPHF Ub_Z_AI");
175
dpd_file2_mat_init(&L);
176
for(row=0; row < num_ai; row++) {
177
a = A.params->roworb[irrep][row][0];
178
i = A.params->roworb[irrep][row][1];
179
asym = A.params->psym[a];
180
isym = A.params->qsym[i];
181
L.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
183
dpd_file2_mat_wrt(&L);
188
if (!strcmp(cart,"Z"))
189
psio_close(PSIF_MO_HESS, 0);
191
psio_close(PSIF_MO_HESS, 1);
194
}} // namespace psi::ccsort