2
#include <libipv1/ip_lib.h>
3
#include <libciomr/libciomr.h>
4
#include <libpsio/psio.h>
5
#include <libchkpt/chkpt.h>
10
/* get_moinfo(): Routine to obtain basic orbital information from
13
** T. Daniel Crawford, October 1996
14
** Modified for STABLE by TDC March, 2000 */
18
int i, j, h, p, q, errcod, nactive, nirreps, nfzc, nfzv;
20
chkpt_init(PSIO_OPEN_OLD);
21
moinfo.nirreps = chkpt_rd_nirreps();
22
moinfo.nmo = chkpt_rd_nmo();
23
moinfo.nso = chkpt_rd_nso();
24
moinfo.labels = chkpt_rd_irr_labs();
25
moinfo.orbspi = chkpt_rd_orbspi();
26
moinfo.clsdpi = chkpt_rd_clsdpi();
27
moinfo.openpi = chkpt_rd_openpi();
30
nirreps = moinfo.nirreps;
32
psio_read_entry(CC_INFO, "Reference Wavefunction", (char *) &(params.ref),
35
/* Get frozen and active orbital lookups from CC_INFO */
36
moinfo.frdocc = init_int_array(nirreps);
37
moinfo.fruocc = init_int_array(nirreps);
38
psio_read_entry(CC_INFO, "Frozen Core Orbs Per Irrep",
39
(char *) moinfo.frdocc, sizeof(int)*nirreps);
40
psio_read_entry(CC_INFO, "Frozen Virt Orbs Per Irrep",
41
(char *) moinfo.fruocc, sizeof(int)*nirreps);
44
for(h=0; h < nirreps; h++) {
45
nfzc += moinfo.frdocc[h];
46
nfzv += moinfo.fruocc[h];
49
fprintf(outfile, "\n\tStability analysis incorrect for frozen orbital calculations.\n");
50
exit(PSI_RETURN_FAILURE);
53
psio_read_entry(CC_INFO, "No. of Active Orbitals", (char *) &(nactive),
56
if(params.ref == 2) { /** UHF **/
58
moinfo.aoccpi = init_int_array(nirreps);
59
moinfo.boccpi = init_int_array(nirreps);
60
moinfo.avirtpi = init_int_array(nirreps);
61
moinfo.bvirtpi = init_int_array(nirreps);
63
psio_read_entry(CC_INFO, "Active Alpha Occ Orbs Per Irrep",
64
(char *) moinfo.aoccpi, sizeof(int)*moinfo.nirreps);
65
psio_read_entry(CC_INFO, "Active Beta Occ Orbs Per Irrep",
66
(char *) moinfo.boccpi, sizeof(int)*moinfo.nirreps);
67
psio_read_entry(CC_INFO, "Active Alpha Virt Orbs Per Irrep",
68
(char *) moinfo.avirtpi, sizeof(int)*moinfo.nirreps);
69
psio_read_entry(CC_INFO, "Active Beta Virt Orbs Per Irrep",
70
(char *) moinfo.bvirtpi, sizeof(int)*moinfo.nirreps);
72
moinfo.aocc_sym = init_int_array(nactive);
73
moinfo.bocc_sym = init_int_array(nactive);
74
moinfo.avir_sym = init_int_array(nactive);
75
moinfo.bvir_sym = init_int_array(nactive);
77
psio_read_entry(CC_INFO, "Active Alpha Occ Orb Symmetry",
78
(char *) moinfo.aocc_sym, sizeof(int)*nactive);
79
psio_read_entry(CC_INFO, "Active Beta Occ Orb Symmetry",
80
(char *) moinfo.bocc_sym, sizeof(int)*nactive);
81
psio_read_entry(CC_INFO, "Active Alpha Virt Orb Symmetry",
82
(char *) moinfo.avir_sym, sizeof(int)*nactive);
83
psio_read_entry(CC_INFO, "Active Beta Virt Orb Symmetry",
84
(char *) moinfo.bvir_sym, sizeof(int)*nactive);
86
moinfo.aocc_off = init_int_array(moinfo.nirreps);
87
moinfo.bocc_off = init_int_array(moinfo.nirreps);
88
moinfo.avir_off = init_int_array(moinfo.nirreps);
89
moinfo.bvir_off = init_int_array(moinfo.nirreps);
90
psio_read_entry(CC_INFO, "Active Alpha Occ Orb Offsets",
91
(char *) moinfo.aocc_off, sizeof(int)*moinfo.nirreps);
92
psio_read_entry(CC_INFO, "Active Beta Occ Orb Offsets",
93
(char *) moinfo.bocc_off, sizeof(int)*moinfo.nirreps);
94
psio_read_entry(CC_INFO, "Active Alpha Virt Orb Offsets",
95
(char *) moinfo.avir_off, sizeof(int)*moinfo.nirreps);
96
psio_read_entry(CC_INFO, "Active Beta Virt Orb Offsets",
97
(char *) moinfo.bvir_off, sizeof(int)*moinfo.nirreps);
99
moinfo.qt_aocc = init_int_array(nactive);
100
moinfo.qt_bocc = init_int_array(nactive);
101
moinfo.qt_avir = init_int_array(nactive);
102
moinfo.qt_bvir = init_int_array(nactive);
104
psio_read_entry(CC_INFO, "CC->QT Alpha Active Occ Order",
105
(char *) moinfo.qt_aocc, sizeof(int)*nactive);
106
psio_read_entry(CC_INFO, "CC->QT Beta Active Occ Order",
107
(char *) moinfo.qt_bocc, sizeof(int)*nactive);
108
psio_read_entry(CC_INFO, "CC->QT Alpha Active Virt Order",
109
(char *) moinfo.qt_avir, sizeof(int)*nactive);
110
psio_read_entry(CC_INFO, "CC->QT Beta Active Virt Order",
111
(char *) moinfo.qt_bvir, sizeof(int)*nactive);
115
else { /** RHF or ROHF **/
117
moinfo.occpi = init_int_array(nirreps);
118
moinfo.virtpi = init_int_array(nirreps);
119
psio_read_entry(CC_INFO, "Active Occ Orbs Per Irrep",
120
(char *) moinfo.occpi, sizeof(int)*nirreps);
121
psio_read_entry(CC_INFO, "Active Virt Orbs Per Irrep",
122
(char *) moinfo.virtpi, sizeof(int)*nirreps);
124
moinfo.occ_sym = init_int_array(nactive);
125
moinfo.vir_sym = init_int_array(nactive);
126
psio_read_entry(CC_INFO, "Active Occ Orb Symmetry",
127
(char *) moinfo.occ_sym, sizeof(int)*nactive);
128
psio_read_entry(CC_INFO, "Active Virt Orb Symmetry",
129
(char *) moinfo.vir_sym, sizeof(int)*nactive);
131
moinfo.occ_off = init_int_array(moinfo.nirreps);
132
moinfo.vir_off = init_int_array(moinfo.nirreps);
133
psio_read_entry(CC_INFO, "Active Occ Orb Offsets",
134
(char *) moinfo.occ_off, sizeof(int)*moinfo.nirreps);
135
psio_read_entry(CC_INFO, "Active Virt Orb Offsets",
136
(char *) moinfo.vir_off, sizeof(int)*moinfo.nirreps);
138
/* Get CC->QT and QT->CC active occupied and virtual reordering arrays */
139
moinfo.qt_occ = init_int_array(nactive);
140
moinfo.qt_vir = init_int_array(nactive);
141
psio_read_entry(CC_INFO, "CC->QT Active Occ Order",
142
(char *) moinfo.qt_occ, sizeof(int)*nactive);
143
psio_read_entry(CC_INFO, "CC->QT Active Virt Order",
144
(char *) moinfo.qt_vir, sizeof(int)*nactive);
147
/* Compute spatial-orbital reordering arrays */
148
if(params.ref == 0 || params.ref == 1) {
149
moinfo.pitzer2qt = init_int_array(moinfo.nmo);
150
moinfo.qt2pitzer = init_int_array(moinfo.nmo);
151
reorder_qt(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
152
moinfo.pitzer2qt, moinfo.orbspi, moinfo.nirreps);
153
for(i=0; i < moinfo.nmo; i++) {
154
j = moinfo.pitzer2qt[i];
155
moinfo.qt2pitzer[j] = i;
158
else if(params.ref == 2) {
159
moinfo.pitzer2qt_a = init_int_array(moinfo.nmo);
160
moinfo.qt2pitzer_a = init_int_array(moinfo.nmo);
161
moinfo.pitzer2qt_b = init_int_array(moinfo.nmo);
162
moinfo.qt2pitzer_b = init_int_array(moinfo.nmo);
163
reorder_qt_uhf(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
164
moinfo.pitzer2qt_a, moinfo.pitzer2qt_b, moinfo.orbspi,
166
for(i=0; i < moinfo.nmo; i++) {
167
j = moinfo.pitzer2qt_a[i];
168
moinfo.qt2pitzer_a[j] = i;
169
j = moinfo.pitzer2qt_b[i];
170
moinfo.qt2pitzer_b[j] = i;
175
/* Adjust clsdpi array for frozen orbitals */
176
for(i=0; i < nirreps; i++)
177
moinfo.clsdpi[i] -= moinfo.frdocc[i];
179
moinfo.uoccpi = init_int_array(moinfo.nirreps);
180
for(i=0; i < nirreps; i++)
181
moinfo.uoccpi[i] = moinfo.orbspi[i] - moinfo.clsdpi[i] -
182
moinfo.openpi[i] - moinfo.fruocc[i] -
186
/* Frees memory allocated in get_moinfo() and dumps out the energy. */
197
for(i=0; i < moinfo.nirreps; i++)
198
free(moinfo.labels[i]);
201
if(params.ref == 2) {
204
free(moinfo.avirtpi);
205
free(moinfo.bvirtpi);
206
free(moinfo.aocc_sym);
207
free(moinfo.bocc_sym);
208
free(moinfo.avir_sym);
209
free(moinfo.bvir_sym);
210
free(moinfo.aocc_off);
211
free(moinfo.bocc_off);
212
free(moinfo.avir_off);
213
free(moinfo.bvir_off);
214
free(moinfo.qt_aocc);
215
free(moinfo.qt_bocc);
216
free(moinfo.qt_avir);
217
free(moinfo.qt_bvir);
222
free(moinfo.occ_sym);
223
free(moinfo.vir_sym);
224
free(moinfo.occ_off);
225
free(moinfo.vir_off);