4
#include <libipv1/ip_lib.h>
5
#include <libciomr/libciomr.h>
6
#include <libpsio/psio.h>
7
#include <libchkpt/chkpt.h>
13
/* get_moinfo(): Routine to obtain basic orbital information from
14
** chkpt and compute the associated lookup arrays.
20
int nfzc, nuocc, nopen, nclsd;
22
int *offset, this_offset;
24
chkpt_init(PSIO_OPEN_OLD);
25
moinfo.nirreps = chkpt_rd_nirreps();
26
moinfo.nmo = chkpt_rd_nmo();
27
moinfo.nso = chkpt_rd_nso();
28
moinfo.nao = chkpt_rd_nao();
29
moinfo.labels = chkpt_rd_irr_labs();
30
moinfo.enuc = chkpt_rd_enuc();
31
escf = chkpt_rd_escf();
32
moinfo.sopi = chkpt_rd_sopi();
33
moinfo.mopi = chkpt_rd_orbspi();
34
moinfo.clsdpi = chkpt_rd_clsdpi();
35
moinfo.openpi = chkpt_rd_openpi();
38
moinfo.frdocc = get_frzcpi();
39
moinfo.fruocc = get_frzvpi();
41
moinfo.nfzc = moinfo.nfzv = 0;
42
for(i=0; i < moinfo.nirreps; i++) {
43
moinfo.nfzc += moinfo.frdocc[i];
44
moinfo.nfzv += moinfo.fruocc[i];
47
/* Compute spatial-orbial reordering arrays */
48
if(params.ref == 0 || params.ref == 1) {
49
moinfo.pitzer2qt = init_int_array(moinfo.nmo);
50
reorder_qt(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
51
moinfo.pitzer2qt, moinfo.mopi, moinfo.nirreps);
53
else if(params.ref == 2) {
54
moinfo.pitzer2qt_A = init_int_array(moinfo.nmo);
55
moinfo.pitzer2qt_B = init_int_array(moinfo.nmo);
56
reorder_qt_uhf(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
57
moinfo.pitzer2qt_A, moinfo.pitzer2qt_B, moinfo.mopi, moinfo.nirreps);
60
/* We want mopi to include only active orbitals */
61
for(h=0; h < moinfo.nirreps; h++)
62
moinfo.mopi[h] = moinfo.mopi[h] - moinfo.frdocc[h] - moinfo.fruocc[h];
64
/* SO and MO symmetry arrays */
65
moinfo.sosym = init_int_array(moinfo.nso);
66
for(h=0,count=0; h < moinfo.nirreps; h++)
67
for(i=0; i < moinfo.sopi[h]; i++,count++)
68
moinfo.sosym[count] = h;
70
moinfo.mosym = init_int_array(moinfo.nmo - moinfo.nfzc - moinfo.nfzv);
71
for(h=0,count=0; h < moinfo.nirreps; h++)
72
for(i=0; i < moinfo.mopi[h]; i++,count++)
73
moinfo.mosym[count] = h;
75
/* Adjust clsdpi array for frozen orbitals */
76
for(i=0; i < moinfo.nirreps; i++)
77
moinfo.clsdpi[i] -= moinfo.frdocc[i];
79
moinfo.uoccpi = init_int_array(moinfo.nirreps);
80
for(i=0; i < moinfo.nirreps; i++)
81
moinfo.uoccpi[i] = moinfo.mopi[i] - moinfo.clsdpi[i] - moinfo.openpi[i];
83
nclsd = nopen = nuocc = 0;
84
for(i=0; i < moinfo.nirreps; i++) {
85
nclsd += moinfo.clsdpi[i];
86
nopen += moinfo.openpi[i];
87
nuocc += moinfo.uoccpi[i];
91
moinfo.nactive = nclsd + nopen + nuocc;
93
/* more orbital reordering arrays */
94
offset = init_int_array(moinfo.nirreps);
95
for(h=1; h < moinfo.nirreps; h++)
96
offset[h] = offset[h-1] + moinfo.mopi[h-1];
98
if(params.ref == 0 || params.ref == 1) {
100
moinfo.act2qt = init_int_array(moinfo.nactive);
103
for(h=0; h < moinfo.nirreps; h++) {
104
this_offset = offset[h];
105
for(p=0; p < moinfo.clsdpi[h]; p++)
106
moinfo.act2qt[this_offset+p] = count++;
108
for(h=0; h < moinfo.nirreps; h++) {
109
this_offset = offset[h] + moinfo.clsdpi[h];
110
for(p=0; p < moinfo.openpi[h]; p++)
111
moinfo.act2qt[this_offset+p] = count++;
113
for(h=0; h < moinfo.nirreps; h++) {
114
this_offset = offset[h] + moinfo.clsdpi[h] + moinfo.openpi[h];
115
for(p=0; p < moinfo.uoccpi[h]; p++)
116
moinfo.act2qt[this_offset+p] = count++;
119
else if(params.ref == 2) {
120
moinfo.act2qt_A = init_int_array(moinfo.nactive);
121
moinfo.act2qt_B = init_int_array(moinfo.nactive);
124
for(h=0; h < moinfo.nirreps; h++) {
125
this_offset = offset[h];
126
for(p=0; p < moinfo.clsdpi[h] + moinfo.openpi[h]; p++)
127
moinfo.act2qt_A[this_offset+p] = count++;
129
for(h=0; h < moinfo.nirreps; h++) {
130
this_offset = offset[h] + moinfo.clsdpi[h] + moinfo.openpi[h];
131
for(p=0; p < moinfo.uoccpi[h]; p++)
132
moinfo.act2qt_A[this_offset+p] = count++;
136
for(h=0; h < moinfo.nirreps; h++) {
137
this_offset = offset[h];
138
for(p=0; p < moinfo.clsdpi[h]; p++)
139
moinfo.act2qt_B[this_offset+p] = count++;
141
for(h=0; h < moinfo.nirreps; h++) {
142
this_offset = offset[h] + moinfo.clsdpi[h];
143
for(p=0; p < moinfo.openpi[h]+moinfo.uoccpi[h]; p++)
144
moinfo.act2qt_B[this_offset+p] = count++;
149
if(params.print_lvl) {
150
fprintf(outfile,"\tChkpt Parameters:\n");
151
fprintf(outfile,"\t--------------------\n");
152
fprintf(outfile,"\tNumber of irreps = %d\n",moinfo.nirreps);
153
fprintf(outfile,"\tNumber of SOs = %d\n",moinfo.nso);
154
fprintf(outfile,"\tNumber of MOs = %d\n",moinfo.nmo);
155
fprintf(outfile,"\tNumber of active MOs = %d\n\n",moinfo.nactive);
157
"\tLabel\t# SOs\t# FZDC\t# DOCC\t# SOCC\t# VIRT\t# FZVR\n");
159
"\t-----\t-----\t------\t------\t------\t------\t------\n");
160
for(i=0; i < moinfo.nirreps; i++) {
162
"\t %s\t %d\t %d\t %d\t %d\t %d\t %d\n",
163
moinfo.labels[i],moinfo.sopi[i],moinfo.frdocc[i],
164
moinfo.clsdpi[i],moinfo.openpi[i],moinfo.uoccpi[i],
167
fprintf(outfile,"\n\tNuclear Rep. energy (chkpt) = %20.14f\n", moinfo.enuc);
168
fprintf(outfile, "\tSCF energy (chkpt) = %20.14f\n", escf);
184
for(h=0; h < moinfo.nirreps; h++)
185
free(moinfo.labels[h]);
187
if(params.ref == 0 || params.ref == 1) {
188
free(moinfo.pitzer2qt);
191
else if(params.ref == 2) {
192
free(moinfo.pitzer2qt_A);
193
free(moinfo.pitzer2qt_B);
194
free(moinfo.act2qt_A);
195
free(moinfo.act2qt_B);