5
#include <libdpd/dpd.h>
6
#include <libciomr/libciomr.h>
12
void cphf_F(char *cart)
14
int irrep, row, a, i, asym, isym, num_ai, info, *ipiv;
19
psio_open(PSIF_MO_HESS, 1);
20
dpd_buf4_init(&A, PSIF_MO_HESS, 0, 11, 11, 11, 11, 0, "A(AI,BJ)");
22
if (!strcmp(cart,"X")) {
23
irrep = moinfo.irrep_x;
25
/* sort Mu elements into a single vector for lineq solver */
26
dpd_file2_init(&mu, CC_OEI, irrep, 0, 1, "Mu_X_IA");
27
dpd_file2_mat_init(&mu);
28
dpd_file2_mat_rd(&mu);
29
num_ai = A.params->rowtot[irrep];
30
vector = init_array(num_ai);
31
for(row=0; row < num_ai; row++) {
32
i = A.params->roworb[irrep][row][0];
33
a = A.params->roworb[irrep][row][1];
34
isym = A.params->psym[i];
35
asym = A.params->qsym[a];
36
vector[row] = -mu.matrix[asym][a-A.params->qoff[asym]][i-A.params->poff[isym]];
38
dpd_file2_mat_close(&mu);
41
/* grab current irrep of MO Hessian */
42
dpd_buf4_mat_irrep_init(&A, irrep);
43
dpd_buf4_mat_irrep_rd(&A, irrep);
46
/* solve CPHF equations */
47
ipiv = init_int_array(num_ai);
48
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
50
fprintf(outfile, "CCSORT: cphf_F: Error in C_DGESV. Info = %d. Cart = X. Exiting.\n", info);
51
exit(PSI_RETURN_FAILURE);
55
dpd_buf4_mat_irrep_close(&A, irrep);
57
/* sort CPHF solution to DPD format */
58
dpd_file2_init(&mu, CC_OEI, irrep, 1, 0, "CPHF Uf_X_AI");
59
dpd_file2_mat_init(&mu);
60
for(row=0; row < num_ai; row++) {
61
a = A.params->roworb[irrep][row][0];
62
i = A.params->roworb[irrep][row][1];
63
asym = A.params->psym[a];
64
isym = A.params->qsym[i];
65
mu.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
67
dpd_file2_mat_wrt(&mu);
71
if (!strcmp(cart,"Y")) {
72
irrep = moinfo.irrep_y;
74
/* sort Mu elements into a single vector for lineq solver */
75
dpd_file2_init(&mu, CC_OEI, irrep, 0, 1, "Mu_Y_IA");
76
dpd_file2_mat_init(&mu);
77
dpd_file2_mat_rd(&mu);
78
num_ai = A.params->rowtot[irrep];
79
vector = init_array(num_ai);
80
for(row=0; row < num_ai; row++) {
81
i = A.params->roworb[irrep][row][0];
82
a = A.params->roworb[irrep][row][1];
83
isym = A.params->psym[i];
84
asym = A.params->qsym[a];
85
vector[row] = -mu.matrix[asym][a-A.params->qoff[asym]][i-A.params->poff[isym]];
87
dpd_file2_mat_close(&mu);
90
/* grab current irrep of MO Hessian */
91
dpd_buf4_mat_irrep_init(&A, irrep);
92
dpd_buf4_mat_irrep_rd(&A, irrep);
95
/* solve CPHF equations */
96
ipiv = init_int_array(num_ai);
97
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
99
fprintf(outfile, "CCSORT: cphf_F: Error in C_DGESV. Info = %d. Cart = Y. Exiting.\n", info);
100
exit(PSI_RETURN_FAILURE);
104
dpd_buf4_mat_irrep_close(&A, irrep);
106
/* sort CPHF solution to DPD format */
107
dpd_file2_init(&mu, CC_OEI, irrep, 1, 0, "CPHF Uf_Y_AI");
108
dpd_file2_mat_init(&mu);
109
for(row=0; row < num_ai; row++) {
110
a = A.params->roworb[irrep][row][0];
111
i = A.params->roworb[irrep][row][1];
112
asym = A.params->psym[a];
113
isym = A.params->qsym[i];
114
mu.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
116
dpd_file2_mat_wrt(&mu);
117
dpd_file2_close(&mu);
120
if (!strcmp(cart,"Z")) {
121
irrep = moinfo.irrep_z;
123
/* sort Mu elements into a single vector for lineq solver */
124
dpd_file2_init(&mu, CC_OEI, irrep, 0, 1, "Mu_Z_IA");
125
dpd_file2_mat_init(&mu);
126
dpd_file2_mat_rd(&mu);
127
num_ai = A.params->rowtot[irrep];
128
vector = init_array(num_ai);
129
for(row=0; row < num_ai; row++) {
130
i = A.params->roworb[irrep][row][0];
131
a = A.params->roworb[irrep][row][1];
132
isym = A.params->psym[i];
133
asym = A.params->qsym[a];
134
vector[row] = -mu.matrix[asym][a-A.params->qoff[asym]][i-A.params->poff[isym]];
136
dpd_file2_mat_close(&mu);
137
dpd_file2_close(&mu);
139
/* grab current irrep of MO Hessian */
140
dpd_buf4_mat_irrep_init(&A, irrep);
141
dpd_buf4_mat_irrep_rd(&A, irrep);
143
/* solve CPHF equations */
144
ipiv = init_int_array(num_ai);
145
info = C_DGESV(num_ai, 1, &(A.matrix[irrep][0][0]), num_ai, ipiv, vector, num_ai);
147
fprintf(outfile, "CCSORT: cphf_F: Error in C_DGESV. Info = %d. Cart = Z. Exiting.\n", info);
148
exit(PSI_RETURN_FAILURE);
152
dpd_buf4_mat_irrep_close(&A, irrep);
154
/* sort CPHF solution to DPD format */
155
dpd_file2_init(&mu, CC_OEI, irrep, 1, 0, "CPHF Uf_Z_AI");
156
dpd_file2_mat_init(&mu);
157
for(row=0; row < num_ai; row++) {
158
a = A.params->roworb[irrep][row][0];
159
i = A.params->roworb[irrep][row][1];
160
asym = A.params->psym[a];
161
isym = A.params->qsym[i];
162
mu.matrix[asym][a-A.params->poff[asym]][i-A.params->qoff[isym]] = vector[row];
164
dpd_file2_mat_wrt(&mu);
165
dpd_file2_close(&mu);
170
if (!strcmp(cart,"Z"))
171
psio_close(PSIF_MO_HESS, 0);
173
psio_close(PSIF_MO_HESS, 1);