3
\brief Enter brief description of file here
7
#include <libipv1/ip_lib.h>
8
#include <libciomr/libciomr.h>
9
#include <libchkpt/chkpt.h>
10
#include <libpsio/psio.h>
17
namespace psi { namespace cceom {
20
** get_moinfo(): Routine to obtain basic orbital information from
23
** T. Daniel Crawford, October 1996
24
** Modified by TDC, March 1999
29
int i, j, h, p, q, errcod, nactive, nirreps, sym;
30
double ***C, ***Ca, ***Cb;
33
chkpt_init(PSIO_OPEN_OLD);
34
moinfo.nirreps = chkpt_rd_nirreps();
35
moinfo.nmo = chkpt_rd_nmo();
36
moinfo.nso = chkpt_rd_nso();
37
moinfo.iopen = chkpt_rd_iopen();
38
moinfo.labels = chkpt_rd_irr_labs();
39
moinfo.enuc = chkpt_rd_enuc();
40
moinfo.escf = chkpt_rd_escf();
41
moinfo.sopi = chkpt_rd_sopi();
42
moinfo.orbspi = chkpt_rd_orbspi();
43
moinfo.clsdpi = chkpt_rd_clsdpi();
44
moinfo.openpi = chkpt_rd_openpi();
45
moinfo.phase = chkpt_rd_phase_check();
49
for (i=0;i<moinfo.nirreps;++i)
50
for (j=0;j<moinfo.openpi[i];++j)
54
nirreps = moinfo.nirreps;
56
psio_read_entry(CC_INFO, "Reference Wavefunction", (char *) &(params.ref),
59
/* Get frozen and active orbital lookups from CC_INFO */
60
moinfo.frdocc = init_int_array(nirreps);
61
moinfo.fruocc = init_int_array(nirreps);
62
psio_read_entry(CC_INFO, "Frozen Core Orbs Per Irrep",
63
(char *) moinfo.frdocc, sizeof(int)*nirreps);
64
psio_read_entry(CC_INFO, "Frozen Virt Orbs Per Irrep",
65
(char *) moinfo.fruocc, sizeof(int)*nirreps);
67
psio_read_entry(CC_INFO, "No. of Active Orbitals", (char *) &(nactive),
70
if (params.ref == 0 || params.ref == 1) { /** RHF or ROHF **/
72
moinfo.occpi = init_int_array(nirreps);
73
moinfo.virtpi = init_int_array(nirreps);
74
psio_read_entry(CC_INFO, "Active Occ Orbs Per Irrep",
75
(char *) moinfo.occpi, sizeof(int)*nirreps);
76
psio_read_entry(CC_INFO, "Active Virt Orbs Per Irrep",
77
(char *) moinfo.virtpi, sizeof(int)*nirreps);
79
moinfo.occ_sym = init_int_array(nactive);
80
moinfo.vir_sym = init_int_array(nactive);
81
psio_read_entry(CC_INFO, "Active Occ Orb Symmetry",
82
(char *) moinfo.occ_sym, sizeof(int)*nactive);
83
psio_read_entry(CC_INFO, "Active Virt Orb Symmetry",
84
(char *) moinfo.vir_sym, sizeof(int)*nactive);
86
moinfo.occ_off = init_int_array(moinfo.nirreps);
87
moinfo.vir_off = init_int_array(moinfo.nirreps);
88
psio_read_entry(CC_INFO, "Active Occ Orb Offsets",
89
(char *) moinfo.occ_off, sizeof(int)*moinfo.nirreps);
90
psio_read_entry(CC_INFO, "Active Virt Orb Offsets",
91
(char *) moinfo.vir_off, sizeof(int)*moinfo.nirreps);
96
moinfo.aoccpi = init_int_array(nirreps);
97
moinfo.boccpi = init_int_array(nirreps);
98
moinfo.avirtpi = init_int_array(nirreps);
99
moinfo.bvirtpi = init_int_array(nirreps);
101
psio_read_entry(CC_INFO, "Active Alpha Occ Orbs Per Irrep",
102
(char *) moinfo.aoccpi, sizeof(int)*moinfo.nirreps);
103
psio_read_entry(CC_INFO, "Active Beta Occ Orbs Per Irrep",
104
(char *) moinfo.boccpi, sizeof(int)*moinfo.nirreps);
105
psio_read_entry(CC_INFO, "Active Alpha Virt Orbs Per Irrep",
106
(char *) moinfo.avirtpi, sizeof(int)*moinfo.nirreps);
107
psio_read_entry(CC_INFO, "Active Beta Virt Orbs Per Irrep",
108
(char *) moinfo.bvirtpi, sizeof(int)*moinfo.nirreps);
110
moinfo.aocc_sym = init_int_array(nactive);
111
moinfo.bocc_sym = init_int_array(nactive);
112
moinfo.avir_sym = init_int_array(nactive);
113
moinfo.bvir_sym = init_int_array(nactive);
115
psio_read_entry(CC_INFO, "Active Alpha Occ Orb Symmetry",
116
(char *) moinfo.aocc_sym, sizeof(int)*nactive);
117
psio_read_entry(CC_INFO, "Active Beta Occ Orb Symmetry",
118
(char *) moinfo.bocc_sym, sizeof(int)*nactive);
119
psio_read_entry(CC_INFO, "Active Alpha Virt Orb Symmetry",
120
(char *) moinfo.avir_sym, sizeof(int)*nactive);
121
psio_read_entry(CC_INFO, "Active Beta Virt Orb Symmetry",
122
(char *) moinfo.bvir_sym, sizeof(int)*nactive);
124
moinfo.aocc_off = init_int_array(moinfo.nirreps);
125
moinfo.bocc_off = init_int_array(moinfo.nirreps);
126
moinfo.avir_off = init_int_array(moinfo.nirreps);
127
moinfo.bvir_off = init_int_array(moinfo.nirreps);
128
psio_read_entry(CC_INFO, "Active Alpha Occ Orb Offsets",
129
(char *) moinfo.aocc_off, sizeof(int)*moinfo.nirreps);
130
psio_read_entry(CC_INFO, "Active Beta Occ Orb Offsets",
131
(char *) moinfo.bocc_off, sizeof(int)*moinfo.nirreps);
133
psio_read_entry(CC_INFO, "Active Alpha Virt Orb Offsets",
134
(char *) moinfo.avir_off, sizeof(int)*moinfo.nirreps);
135
psio_read_entry(CC_INFO, "Active Beta Virt Orb Offsets",
136
(char *) moinfo.bvir_off, sizeof(int)*moinfo.nirreps);
139
/* Build sosym array (for AO-basis BT2) */
140
moinfo.sosym = init_int_array(moinfo.nso);
141
for(h=0,q=0; h < nirreps; h++)
142
for(p=0; p < moinfo.sopi[h]; p++)
143
moinfo.sosym[q++] = h;
145
/* Get the active virtual orbitals */
146
if(params.ref == 0 || params.ref == 1) { /** RHF/ROHF **/
148
C = (double ***) malloc(nirreps * sizeof(double **));
150
for(h=0; h < nirreps; h++) {
151
if(moinfo.sopi[h] && moinfo.virtpi[h]) {
152
C[h] = block_matrix(moinfo.sopi[h],moinfo.virtpi[h]);
153
psio_read(CC_INFO, "RHF/ROHF Active Virtual Orbitals", (char *) C[h][0],
154
moinfo.sopi[h]*moinfo.virtpi[h]*sizeof(double), next, &next);
159
else if(params.ref == 2) { /** UHF **/
161
Ca = (double ***) malloc(nirreps * sizeof(double **));
163
for(h=0; h < nirreps; h++) {
164
if(moinfo.sopi[h] && moinfo.avirtpi[h]) {
165
Ca[h] = block_matrix(moinfo.sopi[h],moinfo.avirtpi[h]);
166
psio_read(CC_INFO, "UHF Active Alpha Virtual Orbs", (char *) Ca[h][0],
167
moinfo.sopi[h]*moinfo.avirtpi[h]*sizeof(double), next, &next);
173
Cb = (double ***) malloc(nirreps * sizeof(double **));
175
for(h=0; h < nirreps; h++) {
176
if(moinfo.sopi[h] && moinfo.bvirtpi[h]) {
177
Cb[h] = block_matrix(moinfo.sopi[h],moinfo.bvirtpi[h]);
178
psio_read(CC_INFO, "UHF Active Beta Virtual Orbs", (char *) Cb[h][0],
179
moinfo.sopi[h]*moinfo.bvirtpi[h]*sizeof(double), next, &next);
185
/* Adjust clsdpi array for frozen orbitals */
186
for(i=0; i < nirreps; i++)
187
moinfo.clsdpi[i] -= moinfo.frdocc[i];
189
moinfo.uoccpi = init_int_array(moinfo.nirreps);
190
for(i=0; i < nirreps; i++)
191
moinfo.uoccpi[i] = moinfo.orbspi[i] - moinfo.clsdpi[i] -
192
moinfo.openpi[i] - moinfo.fruocc[i] -
195
if(params.ref == 0) {
197
for(h=0; h < moinfo.nirreps; h++) moinfo.nvirt += moinfo.virtpi[h];
200
psio_read_entry(CC_INFO, "Reference Energy", (char *) &(moinfo.eref),
203
fprintf(outfile,"\n\tNuclear Rep. energy (chkpt) = %20.15f\n",moinfo.enuc);
204
fprintf(outfile, "\tSCF energy (chkpt) = %20.15f\n",moinfo.escf);
205
fprintf(outfile, "\tReference energy (file100) = %20.15f\n",moinfo.eref);
210
/* Frees memory allocated in get_moinfo() and dumps out the energy. */
215
if(params.ref == 0 || params.ref == 1) {
216
for(h=0; h < moinfo.nirreps; h++)
217
if(moinfo.sopi[h] && moinfo.virtpi[h]) free_block(moinfo.C[h]);
220
else if(params.ref == 2) {
221
for(h=0; h < moinfo.nirreps; h++)
222
if(moinfo.sopi[h] && moinfo.avirtpi[h]) free_block(moinfo.Ca[h]);
224
for(h=0; h < moinfo.nirreps; h++)
225
if(moinfo.sopi[h] && moinfo.bvirtpi[h]) free_block(moinfo.Cb[h]);
236
for(i=0; i < moinfo.nirreps; i++)
237
free(moinfo.labels[i]);
239
if(params.ref == 2) {
242
free(moinfo.avirtpi);
243
free(moinfo.bvirtpi);
244
free(moinfo.aocc_sym);
245
free(moinfo.bocc_sym);
246
free(moinfo.avir_sym);
247
free(moinfo.bvir_sym);
252
free(moinfo.occ_sym);
253
free(moinfo.vir_sym);
259
}} // namespace psi::cceom