4
#include <libipv1/ip_lib.h>
5
#include <libciomr/libciomr.h>
6
#include <libpsio/psio.h>
7
#include <libchkpt/chkpt.h>
15
/* get_moinfo(): Routine to obtain basic orbital information from
16
** chkpt and compute the associated lookup arrays.
18
** Several loookup arrays are written to CC_INFO at the end of this
19
** routine for use in other CC programs. I do this for two reasons:
20
** (1) I don't want to have to use redundant code for re-computing the
21
** arrays and (2) I don't want to allow certain types of user input
22
** (e.g. orbital occupations) to change between CC programs.
24
** T. Daniel Crawford, October 1996
25
** Modified by TDC March, 1999 */
29
int i, j, h, count, ocount, vcount;
30
int active_count, all_count;
31
int active_a_count, active_b_count, all_a_count, all_b_count;
32
int fc_offset, offset, cl_offset, op_offset, vr_offset, fv_offset;
33
int nfzc, nuocc, nopen, nclsd;
35
double ***evects, ***scf_vector;
36
double ***evects_A, ***scf_vector_A;
37
double ***evects_B, ***scf_vector_B;
39
int *pitz2qt, *qt2pitz, J, qt_j, pitz_j, pitz_J, *pitz_offset;
40
int *pitz2qt_A, *qt2pitz_A, *pitz2qt_B, *qt2pitz_B;
43
chkpt_init(PSIO_OPEN_OLD);
44
moinfo.nirreps = chkpt_rd_nirreps();
45
moinfo.nmo = chkpt_rd_nmo();
46
moinfo.nso = chkpt_rd_nso();
47
moinfo.nao = chkpt_rd_nao();
48
moinfo.iopen = chkpt_rd_iopen();
49
moinfo.labels = chkpt_rd_irr_labs();
50
moinfo.enuc = chkpt_rd_enuc();
51
escf = chkpt_rd_escf();
52
moinfo.orbspi = chkpt_rd_orbspi();
53
moinfo.clsdpi = chkpt_rd_clsdpi();
54
moinfo.openpi = chkpt_rd_openpi();
55
moinfo.usotao = chkpt_rd_usotao();
56
if(params.ref == 0) moinfo.scf = chkpt_rd_scf();
59
/* Dump the reference wave function ID to CC_INFO */
60
psio_write_entry(CC_INFO, "Reference Wavefunction",
61
(char *) &(params.ref), sizeof(int));
63
moinfo.frdocc = get_frzcpi();
64
moinfo.fruocc = get_frzvpi();
66
moinfo.nfzc = moinfo.nfzv = 0;
67
for(i=0; i < moinfo.nirreps; i++) {
68
moinfo.nfzc += moinfo.frdocc[i];
69
moinfo.nfzv += moinfo.fruocc[i];
73
chkpt_init(PSIO_OPEN_OLD);
74
moinfo.efzc = chkpt_rd_efzc();
77
else moinfo.efzc = 0.0;
79
/* Calculation consistency check */
80
if(moinfo.nfzc && (fabs(moinfo.efzc) < 1e-7)) {
81
fprintf(outfile, "\tCCSORT Error: Orbitals are frozen in input,\n");
82
fprintf(outfile, "\tbut frozen core energy is small!\n");
83
fprintf(outfile, "\tCalculation will be aborted...\n");
85
exit(PSI_RETURN_FAILURE);
87
else if(!moinfo.nfzc && fabs(moinfo.efzc)) {
88
fprintf(outfile, "\tCCSORT Warning: No orbitals are frozen,\n");
89
fprintf(outfile, "\tbut the frozen-core energy in chkpt is non-zero.\n");
90
fprintf(outfile, "\tCalculation will continue with zero efzc...\n");
95
/* Dump the frozen orbital arrays to CC_INFO */
96
psio_write_entry(CC_INFO, "Frozen Core Orbs Per Irrep",
97
(char *) moinfo.frdocc, sizeof(int)*moinfo.nirreps);
98
psio_write_entry(CC_INFO, "Frozen Virt Orbs Per Irrep",
99
(char *) moinfo.fruocc, sizeof(int)*moinfo.nirreps);
101
/* Get the Pitzer->QT reordering array and compute its inverse */
102
if(params.ref == 2) { /* UHF */
103
moinfo.pitz2qt_A = init_int_array(moinfo.nmo);
104
moinfo.qt2pitz_A = init_int_array(moinfo.nmo);
105
moinfo.pitz2qt_B = init_int_array(moinfo.nmo);
106
moinfo.qt2pitz_B = init_int_array(moinfo.nmo);
107
reorder_qt_uhf(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
108
moinfo.pitz2qt_A, moinfo.pitz2qt_B, moinfo.orbspi, moinfo.nirreps);
110
for(i=0; i < moinfo.nmo; i++) {
111
moinfo.qt2pitz_A[moinfo.pitz2qt_A[i]] = i;
112
moinfo.qt2pitz_B[moinfo.pitz2qt_B[i]] = i;
115
else { /* RHF and ROHF */
116
moinfo.pitz2qt = init_int_array(moinfo.nmo);
117
moinfo.qt2pitz = init_int_array(moinfo.nmo);
118
reorder_qt(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc,
119
moinfo.fruocc, moinfo.pitz2qt, moinfo.orbspi, moinfo.nirreps);
120
for(i=0; i < moinfo.nmo; i++) moinfo.qt2pitz[moinfo.pitz2qt[i]] = i;
123
/* Compute spatial-orbital reordering arrays */
124
moinfo.pitzer2qt = init_int_array(moinfo.nmo);
125
moinfo.qt2pitzer = init_int_array(moinfo.nmo);
126
reorder_qt(moinfo.clsdpi, moinfo.openpi, moinfo.frdocc, moinfo.fruocc,
127
moinfo.pitzer2qt, moinfo.orbspi, moinfo.nirreps);
128
for(i=0; i < moinfo.nmo; i++) {
129
j = moinfo.pitzer2qt[i];
130
moinfo.qt2pitzer[j] = i;
133
/* Adjust clsdpi array for frozen orbitals */
134
for(i=0; i < moinfo.nirreps; i++)
135
moinfo.clsdpi[i] -= moinfo.frdocc[i];
137
moinfo.uoccpi = init_int_array(moinfo.nirreps);
138
for(i=0; i < moinfo.nirreps; i++)
139
moinfo.uoccpi[i] = moinfo.orbspi[i] - moinfo.clsdpi[i] -
140
moinfo.openpi[i] - moinfo.fruocc[i] -
143
nclsd = nopen = nuocc = 0;
144
for(i=0; i < moinfo.nirreps; i++) {
145
nclsd += moinfo.clsdpi[i];
146
nopen += moinfo.openpi[i];
147
nuocc += moinfo.uoccpi[i];
151
/* Number of non-frozen orbitals */
152
moinfo.nactive = nclsd + nopen + nuocc;
153
psio_write_entry(CC_INFO, "No. of Active Orbitals", (char *) &(moinfo.nactive),
156
/* Number of occupied and virtual orbirals per irrep including
158
if(params.ref == 2) {
159
moinfo.aoccpi = init_int_array(moinfo.nirreps);
160
moinfo.boccpi = init_int_array(moinfo.nirreps);
161
moinfo.avirtpi = init_int_array(moinfo.nirreps);
162
moinfo.bvirtpi = init_int_array(moinfo.nirreps);
163
moinfo.all_aoccpi = init_int_array(moinfo.nirreps);
164
moinfo.all_boccpi = init_int_array(moinfo.nirreps);
165
moinfo.all_avirtpi = init_int_array(moinfo.nirreps);
166
moinfo.all_bvirtpi = init_int_array(moinfo.nirreps);
167
for(h=0; h < moinfo.nirreps; h++) {
168
moinfo.aoccpi[h] = moinfo.clsdpi[h] + moinfo.openpi[h];
169
moinfo.boccpi[h] = moinfo.clsdpi[h];
170
moinfo.avirtpi[h] = moinfo.uoccpi[h];
171
moinfo.bvirtpi[h] = moinfo.uoccpi[h] + moinfo.openpi[h];
173
moinfo.all_aoccpi[h] = moinfo.frdocc[h] + moinfo.clsdpi[h] + moinfo.openpi[h];
174
moinfo.all_boccpi[h] = moinfo.frdocc[h] + moinfo.clsdpi[h];
175
moinfo.all_avirtpi[h] = moinfo.fruocc[h] + moinfo.uoccpi[h];
176
moinfo.all_bvirtpi[h] = moinfo.fruocc[h] + moinfo.uoccpi[h] + moinfo.openpi[h];
178
/* Dump occpi and virtpi arrays to CC_INFO */
179
psio_write_entry(CC_INFO, "Active Alpha Occ Orbs Per Irrep",
180
(char *) moinfo.aoccpi, sizeof(int)*moinfo.nirreps);
181
psio_write_entry(CC_INFO, "Active Beta Occ Orbs Per Irrep",
182
(char *) moinfo.boccpi, sizeof(int)*moinfo.nirreps);
183
psio_write_entry(CC_INFO, "Active Alpha Virt Orbs Per Irrep",
184
(char *) moinfo.avirtpi, sizeof(int)*moinfo.nirreps);
185
psio_write_entry(CC_INFO, "Active Beta Virt Orbs Per Irrep",
186
(char *) moinfo.bvirtpi, sizeof(int)*moinfo.nirreps);
187
psio_write_entry(CC_INFO, "All Alpha Occ Orbs Per Irrep",
188
(char *) moinfo.all_aoccpi, sizeof(int)*moinfo.nirreps);
189
psio_write_entry(CC_INFO, "All Beta Occ Orbs Per Irrep",
190
(char *) moinfo.all_boccpi, sizeof(int)*moinfo.nirreps);
191
psio_write_entry(CC_INFO, "All Alpha Virt Orbs Per Irrep",
192
(char *) moinfo.all_avirtpi, sizeof(int)*moinfo.nirreps);
193
psio_write_entry(CC_INFO, "All Beta Virt Orbs Per Irrep",
194
(char *) moinfo.all_bvirtpi, sizeof(int)*moinfo.nirreps);
198
moinfo.occpi = init_int_array(moinfo.nirreps);
199
moinfo.virtpi = init_int_array(moinfo.nirreps);
200
moinfo.all_occpi = init_int_array(moinfo.nirreps);
201
moinfo.all_virtpi = init_int_array(moinfo.nirreps);
202
for(h=0; h < moinfo.nirreps; h++) {
203
moinfo.occpi[h] = moinfo.clsdpi[h] + moinfo.openpi[h];
204
moinfo.virtpi[h] = moinfo.uoccpi[h] + moinfo.openpi[h];
205
moinfo.all_occpi[h] = moinfo.frdocc[h] + moinfo.clsdpi[h] +
207
moinfo.all_virtpi[h] = moinfo.fruocc[h] + moinfo.uoccpi[h] +
210
/* Dump occpi and virtpi arrays to CC_INFO */
211
psio_write_entry(CC_INFO, "Active Occ Orbs Per Irrep",
212
(char *) moinfo.occpi, sizeof(int)*moinfo.nirreps);
213
psio_write_entry(CC_INFO, "Active Virt Orbs Per Irrep",
214
(char *) moinfo.virtpi, sizeof(int)*moinfo.nirreps);
215
psio_write_entry(CC_INFO, "All Occ Orbs Per Irrep",
216
(char *) moinfo.all_occpi, sizeof(int)*moinfo.nirreps);
217
psio_write_entry(CC_INFO, "All Virt Orbs Per Irrep",
218
(char *) moinfo.all_virtpi, sizeof(int)*moinfo.nirreps);
222
/* Build the boolean arrays for the orbital classification routines.
223
The occ and vir arrays identify active occupied or virtual
224
orbitals (including open shells). The socc array identifies only
225
the singly occupied orbitals. The all_occ and all_vir arrays
226
identify any occupied or virtual orbitals (include open shells
227
and frozen orbitals). The all_socc array identifies only singly
228
occupied orbitals within the full list of orbitals. The frozen
229
array identifies only frozen orbitals. The argument for all
230
arrays much be a QT-ordered index. Most of these are used in the
231
integral sorting routines found in CCSORT and CCDENSITY. */
233
if(params.ref == 2) {
234
moinfo.aocc = init_int_array(moinfo.nactive);
235
moinfo.bocc = init_int_array(moinfo.nactive);
236
moinfo.avir = init_int_array(moinfo.nactive);
237
moinfo.bvir = init_int_array(moinfo.nactive);
238
moinfo.all_aocc = init_int_array(moinfo.nmo);
239
moinfo.all_bocc = init_int_array(moinfo.nmo);
240
moinfo.all_avir = init_int_array(moinfo.nmo);
241
moinfo.all_bvir = init_int_array(moinfo.nmo);
242
moinfo.frozen = init_int_array(moinfo.nmo);
244
active_a_count = active_b_count = all_a_count = all_b_count = 0;
245
for(i=0; i < moinfo.nirreps; i++) {
246
for(j=0; j < moinfo.frdocc[i]; j++, all_a_count++, all_b_count++) {
247
moinfo.all_aocc[all_a_count] = 1;
248
moinfo.all_bocc[all_b_count] = 1;
249
moinfo.frozen[all_a_count] = 1;
252
for(i=0; i < moinfo.nirreps; i++) {
253
for(j=0; j < moinfo.clsdpi[i] + moinfo.openpi[i]; j++) {
254
moinfo.aocc[active_a_count] = 1;
255
moinfo.all_aocc[all_a_count] = 1;
260
for(i=0; i < moinfo.nirreps; i++) {
261
for(j=0; j < moinfo.clsdpi[i]; j++) {
262
moinfo.bocc[active_b_count] = 1;
263
moinfo.all_bocc[all_b_count] = 1;
268
for(i=0; i < moinfo.nirreps; i++) {
269
for(j=0; j < moinfo.openpi[i] + moinfo.uoccpi[i]; j++) {
270
moinfo.bvir[active_b_count] = 1;
271
moinfo.all_bvir[all_b_count] = 1;
276
for(i=0; i < moinfo.nirreps; i++) {
277
for(j=0; j < moinfo.uoccpi[i]; j++) {
278
moinfo.avir[active_a_count] = 1;
279
moinfo.all_avir[all_a_count] = 1;
284
for(i=0; i < moinfo.nirreps; i++) {
285
for(j=0; j < moinfo.fruocc[i]; j++, all_a_count++,all_b_count++) {
286
moinfo.all_avir[all_a_count] = 1;
287
moinfo.all_bvir[all_b_count] = 1;
288
moinfo.frozen[all_a_count] = 1;
292
/* Dump the Boolean arrays to CC_INFO */
293
psio_write_entry(CC_INFO, "Active Alpha Occ Orbital Boolean",
294
(char *) moinfo.aocc, sizeof(int)*moinfo.nactive);
295
psio_write_entry(CC_INFO, "Active Beta Occ Orbital Boolean",
296
(char *) moinfo.bocc, sizeof(int)*moinfo.nactive);
297
psio_write_entry(CC_INFO, "Active Alpha Virt Orbital Boolean",
298
(char *) moinfo.avir, sizeof(int)*moinfo.nactive);
299
psio_write_entry(CC_INFO, "Active Beta Virt Orbital Boolean",
300
(char *) moinfo.bvir, sizeof(int)*moinfo.nactive);
301
psio_write_entry(CC_INFO, "All Alpha Occ Orbital Boolean",
302
(char *) moinfo.all_aocc, sizeof(int)*moinfo.nmo);
303
psio_write_entry(CC_INFO, "All Beta Occ Orbital Boolean",
304
(char *) moinfo.all_bocc, sizeof(int)*moinfo.nmo);
305
psio_write_entry(CC_INFO, "All Alpha Virt Orbital Boolean",
306
(char *) moinfo.all_avir, sizeof(int)*moinfo.nmo);
307
psio_write_entry(CC_INFO, "All Beta Virt Orbital Boolean",
308
(char *) moinfo.all_bvir, sizeof(int)*moinfo.nmo);
309
psio_write_entry(CC_INFO, "Frozen Orbital Boolean",
310
(char *) moinfo.frozen, sizeof(int)*moinfo.nmo);
313
moinfo.occ = init_int_array(moinfo.nactive);
314
moinfo.vir = init_int_array(moinfo.nactive);
315
moinfo.socc = init_int_array(moinfo.nactive);
316
moinfo.all_occ = init_int_array(moinfo.nmo);
317
moinfo.all_vir = init_int_array(moinfo.nmo);
318
moinfo.all_socc = init_int_array(moinfo.nmo);
319
moinfo.frozen = init_int_array(moinfo.nmo);
320
moinfo.orbsym = init_int_array(moinfo.nmo);
322
active_count = all_count = 0;
323
for(i=0; i < moinfo.nirreps; i++) {
324
for(j=0; j < moinfo.frdocc[i]; j++, all_count++) {
325
moinfo.all_occ[all_count] = 1;
326
moinfo.frozen[all_count] = 1;
327
moinfo.orbsym[all_count] = i;
330
for(i=0; i < moinfo.nirreps; i++) {
331
for(j=0; j < moinfo.clsdpi[i]; j++, active_count++, all_count++) {
332
moinfo.occ[active_count] = 1;
333
moinfo.all_occ[all_count] = 1;
334
moinfo.orbsym[all_count] = i;
337
for(i=0; i < moinfo.nirreps; i++) {
338
for(j=0; j < moinfo.openpi[i]; j++, active_count++, all_count++) {
339
moinfo.occ[active_count] = 1;
340
moinfo.vir[active_count] = 1;
341
moinfo.socc[active_count] = 1;
342
moinfo.all_occ[all_count] = 1;
343
moinfo.all_vir[all_count] = 1;
344
moinfo.all_socc[all_count] = 1;
345
moinfo.orbsym[all_count] = i;
348
for(i=0; i < moinfo.nirreps; i++) {
349
for(j=0; j < moinfo.uoccpi[i]; j++, active_count++, all_count++) {
350
moinfo.vir[active_count] = 1;
351
moinfo.all_vir[all_count] = 1;
352
moinfo.orbsym[all_count] = i;
355
for(i=0; i < moinfo.nirreps; i++) {
356
for(j=0; j < moinfo.fruocc[i]; j++, all_count++) {
357
moinfo.all_vir[all_count] = 1;
358
moinfo.frozen[all_count] = 1;
359
moinfo.orbsym[all_count] = i;
363
/* Dump the Boolean arrays to CC_INFO */
364
psio_write_entry(CC_INFO, "Active Occ Orbital Boolean",
365
(char *) moinfo.occ, sizeof(int)*moinfo.nactive);
366
psio_write_entry(CC_INFO, "Active Virt Orbital Boolean",
367
(char *) moinfo.vir, sizeof(int)*moinfo.nactive);
368
psio_write_entry(CC_INFO, "Active Socc Orbital Boolean",
369
(char *) moinfo.socc, sizeof(int)*moinfo.nactive);
370
psio_write_entry(CC_INFO, "All Occ Orbital Boolean",
371
(char *) moinfo.all_occ, sizeof(int)*moinfo.nmo);
372
psio_write_entry(CC_INFO, "All Virt Orbital Boolean",
373
(char *) moinfo.all_vir, sizeof(int)*moinfo.nmo);
374
psio_write_entry(CC_INFO, "All Socc Orbital Boolean",
375
(char *) moinfo.all_socc, sizeof(int)*moinfo.nmo);
376
psio_write_entry(CC_INFO, "Frozen Orbital Boolean",
377
(char *) moinfo.frozen, sizeof(int)*moinfo.nmo);
380
if(params.ref == 2) {
382
/**** UHF references ****/
386
Build relative index arrays which map a QT Standard orbital index
387
into the CC occupied or virtual relative index. Since the QT
388
Standard ordering is different for alpha and beta UHF indices, the
389
CC occupied and virtual orderings are also necessarily different
390
for the different spins. The cc_aocc, cc_bocc, cc_avir, and
391
cc_bvir arrays do not include frozen orbitals and are of length
392
moinfo.nactive. The cc_allaocc, cc_allbocc, cc_allavir,
393
cc_allbvir do include frozen orbitals and are of length
394
moinfo.nmo. In these latter arrays, the frozen orbitals are given
395
FIRST, even in the cc_allavir and cc_allbvir orderings. (This is
396
just like the RHF/ROHF case given below.) These arrays are needed
397
by classification routines used in sorting two-electron integrals
398
(in CCSORT and CCDENSITY) where integrals are divided up by their
399
occupied and virtual index patterns (see classify.c and
403
For example, for 3B1 CH2 in a DZ basis with one frozen core
404
orbital and three frozen virtual orbitals:
406
QT Alpha: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
407
Space: fc d s d s u u u u u u fv fv fv
408
Symm: a1 a1 a1 b2 b1 a1 a1 a1 b1 b2 b2 a1 a1 b2
409
------------------------------------------------------------------
410
cc_aocc: X 0 1 2 3 -1 -1 -1 -1 -1 -1 X X X
411
cc_avir: X -1 -1 -1 -1 0 1 2 3 4 5 X X X
412
cc_allaocc: 0 1 2 3 4 -1 -1 -1 -1 -1 -1 -1 -1 -1
413
cc_allavir: -1 -1 -1 -1 -1 2 3 4 5 7 8 0 1 6
415
QT Beta: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
416
Space: fc d d s u u u s u u u fv fv fv
417
Symm: a1 a1 b2 a1 a1 a1 a1 b1 b1 b2 b2 a1 a1 b2
418
------------------------------------------------------------------
419
cc_bocc: X 0 1 -1 -1 -1 -1 -1 -1 -1 -1 X X X
420
cc_bvir: X -1 -1 0 1 2 3 4 5 6 7 X X X
421
cc_allbocc: 0 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
422
cc_allbvir: -1 -1 -1 2 3 4 5 6 7 9 10 0 1 8
424
A "-1" is used to mark QT indices irrelevant to the given CC
425
ordering array, and an "X" indicates that the element doesn't
426
appear in the CC array at all (i.e., cc_occ and cc_vir are of
427
length nactive and cc_allocc and cc_allvir are of length nmo).
429
Note that I also compute the CC->QT versions of the lookup arrays
430
(qt_aocc, qt_bocc, and qt_avir, and qt_bvir) simultaneously.
431
Hence, if one has an array in CC ordering without frozen orbitals,
432
and needs to convert the array to CC ordering WITH frozen orbitals
433
(i.e. add zeroes in all the right places), then one could loop
434
over the CC active orbitals, compute the QT index for the current
435
orbital, and finally compute the index for the full CC list.
439
/* First the active-orbital CC ordering and symmetry arrays */
440
moinfo.cc_aocc = init_int_array(moinfo.nactive);
441
moinfo.cc_bocc = init_int_array(moinfo.nactive);
442
moinfo.cc_avir = init_int_array(moinfo.nactive);
443
moinfo.cc_bvir = init_int_array(moinfo.nactive);
444
moinfo.qt_aocc = init_int_array(moinfo.nactive);
445
moinfo.qt_bocc = init_int_array(moinfo.nactive);
446
moinfo.qt_avir = init_int_array(moinfo.nactive);
447
moinfo.qt_bvir = init_int_array(moinfo.nactive);
448
for(i=0; i < moinfo.nactive; i++) {
449
moinfo.cc_aocc[i] = moinfo.cc_avir[i] = -1;
450
moinfo.cc_bocc[i] = moinfo.cc_bvir[i] = -1;
451
moinfo.qt_aocc[i] = moinfo.qt_avir[i] = -1;
452
moinfo.qt_bocc[i] = moinfo.qt_bvir[i] = -1;
455
moinfo.aocc_sym = init_int_array(moinfo.nactive);
456
moinfo.bocc_sym = init_int_array(moinfo.nactive);
457
moinfo.avir_sym = init_int_array(moinfo.nactive);
458
moinfo.bvir_sym = init_int_array(moinfo.nactive);
462
for(h=0; h < moinfo.nirreps; h++) {
463
if(h) offset += moinfo.clsdpi[h-1] + moinfo.openpi[h-1];
464
for(i=0; i < moinfo.clsdpi[h] + moinfo.openpi[h]; i++,count++) {
465
moinfo.cc_aocc[offset+i] = count;
466
moinfo.qt_aocc[count] = nfzc + offset + i;
467
moinfo.aocc_sym[count] = h;
473
for(h=0; h < moinfo.nirreps; h++) {
474
if(h) offset += moinfo.clsdpi[h-1];
475
for(i=0; i < moinfo.clsdpi[h]; i++,count++) {
476
moinfo.cc_bocc[offset+i] = count;
477
moinfo.qt_bocc[count] = nfzc + offset + i;
478
moinfo.bocc_sym[count] = h;
483
offset = nclsd + nopen;
484
for(h=0; h < moinfo.nirreps; h++) {
485
if(h) offset += moinfo.uoccpi[h-1];
486
for(i=0; i < moinfo.uoccpi[h]; i++,count++) {
487
moinfo.cc_avir[offset+i] = count;
488
moinfo.qt_avir[count] = nfzc + offset + i;
489
moinfo.avir_sym[count] = h;
495
for(h=0; h < moinfo.nirreps; h++) {
496
if(h) offset += moinfo.uoccpi[h-1] + moinfo.openpi[h-1];
497
for(i=0; i < moinfo.uoccpi[h] + moinfo.openpi[h]; i++,count++) {
498
moinfo.cc_bvir[offset+i] = count;
499
moinfo.qt_bvir[count] = nfzc + offset + i;
500
moinfo.bvir_sym[count] = h;
504
/* Dump the active-orbital CC and QT ordering and symmetry arrays to CC_INFO */
505
psio_write_entry(CC_INFO, "Active Alpha Occ Orb Symmetry",
506
(char *) moinfo.aocc_sym, sizeof(int)*moinfo.nactive);
507
psio_write_entry(CC_INFO, "Active Beta Occ Orb Symmetry",
508
(char *) moinfo.bocc_sym, sizeof(int)*moinfo.nactive);
509
psio_write_entry(CC_INFO, "Active Alpha Virt Orb Symmetry",
510
(char *) moinfo.avir_sym, sizeof(int)*moinfo.nactive);
511
psio_write_entry(CC_INFO, "Active Beta Virt Orb Symmetry",
512
(char *) moinfo.bvir_sym, sizeof(int)*moinfo.nactive);
513
psio_write_entry(CC_INFO, "QT->CC Alpha Active Occ Order",
514
(char *) moinfo.cc_aocc, sizeof(int)*moinfo.nactive);
515
psio_write_entry(CC_INFO, "QT->CC Beta Active Occ Order",
516
(char *) moinfo.cc_bocc, sizeof(int)*moinfo.nactive);
517
psio_write_entry(CC_INFO, "QT->CC Alpha Active Virt Order",
518
(char *) moinfo.cc_avir, sizeof(int)*moinfo.nactive);
519
psio_write_entry(CC_INFO, "QT->CC Beta Active Virt Order",
520
(char *) moinfo.cc_bvir, sizeof(int)*moinfo.nactive);
521
psio_write_entry(CC_INFO, "CC->QT Alpha Active Occ Order",
522
(char *) moinfo.qt_aocc, sizeof(int)*moinfo.nactive);
523
psio_write_entry(CC_INFO, "CC->QT Beta Active Occ Order",
524
(char *) moinfo.qt_bocc, sizeof(int)*moinfo.nactive);
525
psio_write_entry(CC_INFO, "CC->QT Alpha Active Virt Order",
526
(char *) moinfo.qt_avir, sizeof(int)*moinfo.nactive);
527
psio_write_entry(CC_INFO, "CC->QT Beta Active Virt Order",
528
(char *) moinfo.qt_bvir, sizeof(int)*moinfo.nactive);
530
/* Now the all-orbital CC ordering and symmetry arrays */
531
moinfo.cc_allaocc = init_int_array(moinfo.nmo);
532
moinfo.cc_allbocc = init_int_array(moinfo.nmo);
533
moinfo.cc_allavir = init_int_array(moinfo.nmo);
534
moinfo.cc_allbvir = init_int_array(moinfo.nmo);
535
moinfo.qt_allaocc = init_int_array(moinfo.nmo);
536
moinfo.qt_allbocc = init_int_array(moinfo.nmo);
537
moinfo.qt_allavir = init_int_array(moinfo.nmo);
538
moinfo.qt_allbvir = init_int_array(moinfo.nmo);
539
for(i=0; i < moinfo.nmo; i++) {
540
moinfo.cc_allaocc[i] = moinfo.cc_allavir[i] = -1;
541
moinfo.cc_allbocc[i] = moinfo.cc_allbvir[i] = -1;
542
moinfo.qt_allaocc[i] = moinfo.qt_allavir[i] = -1;
543
moinfo.qt_allbocc[i] = moinfo.qt_allbvir[i] = -1;
546
moinfo.allaocc_sym = init_int_array(moinfo.nmo);
547
moinfo.allbocc_sym = init_int_array(moinfo.nmo);
548
moinfo.allavir_sym = init_int_array(moinfo.nmo);
549
moinfo.allbvir_sym = init_int_array(moinfo.nmo);
554
for(h=0; h < moinfo.nirreps; h++) {
555
if(h) fc_offset += moinfo.frdocc[h-1];
556
for(i=0; i < moinfo.frdocc[h]; i++,count++) {
557
moinfo.cc_allaocc[fc_offset+i] = count;
558
moinfo.qt_allaocc[count] = fc_offset+i;
559
moinfo.allaocc_sym[count] = h;
561
if(h) offset += moinfo.clsdpi[h-1] + moinfo.openpi[h-1];
562
for(i=0; i < moinfo.clsdpi[h] + moinfo.openpi[h]; i++,count++) {
563
moinfo.cc_allaocc[offset+i] = count;
564
moinfo.qt_allaocc[count] = offset+i;
565
moinfo.allaocc_sym[count] = h;
572
for(h=0; h < moinfo.nirreps; h++) {
573
if(h) fc_offset += moinfo.frdocc[h-1];
574
for(i=0; i < moinfo.frdocc[h]; i++,count++) {
575
moinfo.cc_allbocc[fc_offset+i] = count;
576
moinfo.qt_allbocc[count] = fc_offset+i;
577
moinfo.allbocc_sym[count] = h;
579
if(h) offset += moinfo.clsdpi[h-1];
580
for(i=0; i < moinfo.clsdpi[h]; i++,count++) {
581
moinfo.cc_allbocc[offset+i] = count;
582
moinfo.qt_allbocc[count] = offset+i;
583
moinfo.allbocc_sym[count] = h;
588
fv_offset = nfzc + nclsd + nopen + nuocc;
589
offset = nfzc + nclsd + nopen;
590
for(h=0; h < moinfo.nirreps; h++) {
591
if(h) fv_offset += moinfo.fruocc[h-1];
592
for(i=0; i < moinfo.fruocc[h]; i++,count++) {
593
moinfo.cc_allavir[fv_offset+i] = count;
594
moinfo.qt_allavir[count] = fv_offset+i;
595
moinfo.allavir_sym[count] = h;
597
if(h) offset += moinfo.uoccpi[h-1];
598
for(i=0; i < moinfo.uoccpi[h]; i++,count++) {
599
moinfo.cc_allavir[offset+i] = count;
600
moinfo.qt_allavir[count] = offset+i;
601
moinfo.allavir_sym[count] = h;
606
fv_offset = nfzc + nclsd + nopen + nuocc;
607
offset = nfzc + nclsd;
608
for(h=0; h < moinfo.nirreps; h++) {
609
if(h) fv_offset += moinfo.fruocc[h-1];
610
for(i=0; i < moinfo.fruocc[h]; i++,count++) {
611
moinfo.cc_allbvir[fv_offset+i] = count;
612
moinfo.qt_allbvir[count] = fv_offset+i;
613
moinfo.allbvir_sym[count] = h;
615
if(h) offset += moinfo.uoccpi[h-1] + moinfo.openpi[h-1];
616
for(i=0; i < moinfo.uoccpi[h] + moinfo.openpi[h]; i++,count++) {
617
moinfo.cc_allbvir[offset+i] = count;
618
moinfo.qt_allbvir[count] = offset+i;
619
moinfo.allbvir_sym[count] = h;
623
/* Dump the all-orbital CC ordering and symmetry arrays to CC_INFO */
624
psio_write_entry(CC_INFO, "All Alpha Occ Orb Symmetry",
625
(char *) moinfo.allaocc_sym, sizeof(int)*moinfo.nmo);
626
psio_write_entry(CC_INFO, "All Beta Occ Orb Symmetry",
627
(char *) moinfo.allbocc_sym, sizeof(int)*moinfo.nmo);
629
psio_write_entry(CC_INFO, "All Alpha Virt Orb Symmetry",
630
(char *) moinfo.allavir_sym, sizeof(int)*moinfo.nmo);
631
psio_write_entry(CC_INFO, "All Beta Virt Orb Symmetry",
632
(char *) moinfo.allbvir_sym, sizeof(int)*moinfo.nmo);
634
psio_write_entry(CC_INFO, "QT->CC All Alpha Occ Order",
635
(char *) moinfo.cc_allaocc, sizeof(int)*moinfo.nmo);
636
psio_write_entry(CC_INFO, "QT->CC All Beta Occ Order",
637
(char *) moinfo.cc_allbocc, sizeof(int)*moinfo.nmo);
639
psio_write_entry(CC_INFO, "QT->CC All Alpha Virt Order",
640
(char *) moinfo.cc_allavir, sizeof(int)*moinfo.nmo);
641
psio_write_entry(CC_INFO, "QT->CC All Beta Virt Order",
642
(char *) moinfo.cc_allbvir, sizeof(int)*moinfo.nmo);
644
psio_write_entry(CC_INFO, "CC->QT All Alpha Occ Order",
645
(char *) moinfo.qt_allaocc, sizeof(int)*moinfo.nmo);
646
psio_write_entry(CC_INFO, "CC->QT All Beta Occ Order",
647
(char *) moinfo.qt_allbocc, sizeof(int)*moinfo.nmo);
649
psio_write_entry(CC_INFO, "CC->QT All Alpha Virt Order",
650
(char *) moinfo.qt_allavir, sizeof(int)*moinfo.nmo);
651
psio_write_entry(CC_INFO, "CC->QT All Beta Virt Order",
652
(char *) moinfo.qt_allbvir, sizeof(int)*moinfo.nmo);
654
} /*** UHF references ***/
657
/**** RHF and ROHF references ****/
661
Build relative index arrays which map a QT Standard orbital index
662
into the CC occupied or virtual relative index. In the CC
663
occupied ordering (given by "cc_allocc"), the orbitals are
664
organized with all frozen core orbitals first, followed by doubly
665
occupied orbitals, followed by singly occupied orbitals. In the
666
CC virtual ordering (given by "cc_allvir"), the orbitals are
667
organized with all frozen virtual orbitals first, followed by
668
active unoccupied orbitals, followed by the singly occupied
669
orbitals. The "cc_occ" and "cc_vir" arrays are defined similarly,
670
but without frozen orbitals. These arrays are needed by
671
classification routines used in sorting two-electron integrals
672
(in CCSORT and CCDENSITY) where integrals are divided up by their
673
occupied and virtual index patterns (see classify.c and
676
For example, for 3B1 CH2 in a DZ basis with one frozen core
677
orbital and three frozen virtual orbitals:
679
QT: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
680
Space: fc d d s s u u u u u u fv fv fv
681
Symm: a1 a1 b2 a1 b1 a1 a1 a1 b1 b2 b2 a1 a1 b2
682
-----------------------------------------------------------------
683
cc_occ: X 0 3 1 2 -1 -1 -1 -1 -1 -1 X X X
684
cc_vir: X -1 -1 3 5 0 1 2 4 6 7 X X X
685
cc_allocc: 0 1 4 2 3 -1 -1 -1 -1 -1 -1 -1 -1 -1
686
cc_allvir: -1 -1 -1 5 7 2 3 4 6 9 10 0 1 8
688
A "-1" is used to mark QT indices irrelevant to the given CC
689
ordering array, and an "X" indicates that the element doesn't
690
appear in the CC array at all (i.e., cc_occ and cc_vir are of
691
length nactive and cc_allocc and cc_allvir are of length nmo).
693
Note that I also compute the CC->QT versions of the cc_occ and
694
cc_vir arrays (qt_occ and qt_vir, respectively) simultaneously.
695
Hence, if one has an array in CC ordering without frozen orbitals,
696
and needs to convert the array to CC ordering WITH frozen orbitals
697
(i.e. add zeroes in all the right places), then one could loop
698
over the CC active orbitals, compute the QT index for the current
699
orbital (using qt_occ or qt_vir), and finally compute the index
700
for the full CC list (using cc_allocc or cc_allvir).
704
/* First the active-orbital CC ordering and symmetry arrays */
705
moinfo.cc_occ = init_int_array(moinfo.nactive);
706
moinfo.cc_vir = init_int_array(moinfo.nactive);
707
moinfo.qt_occ = init_int_array(moinfo.nactive);
708
moinfo.qt_vir = init_int_array(moinfo.nactive);
709
for(i=0; i < moinfo.nactive; i++) {
710
moinfo.cc_occ[i] = moinfo.cc_vir[i] = -1;
711
moinfo.qt_occ[i] = moinfo.qt_vir[i] = -1;
714
moinfo.occ_sym = init_int_array(moinfo.nactive);
715
moinfo.vir_sym = init_int_array(moinfo.nactive);
720
for(h=0; h < moinfo.nirreps; h++) {
721
if(h) cl_offset += moinfo.clsdpi[h-1];
722
for(i=0; i < moinfo.clsdpi[h]; i++,count++) {
723
moinfo.cc_occ[cl_offset+i] = count;
724
moinfo.qt_occ[count] = nfzc + cl_offset+i;
725
moinfo.occ_sym[count] = h;
727
if(h) op_offset += moinfo.openpi[h-1];
728
for(i=0; i < moinfo.openpi[h]; i++,count++) {
729
moinfo.cc_occ[op_offset+i] = count;
730
moinfo.qt_occ[count] = nfzc + op_offset+i;
731
moinfo.occ_sym[count] = h;
736
vr_offset = nclsd + nopen;
738
for(h=0; h < moinfo.nirreps; h++) {
739
if(h) vr_offset += moinfo.uoccpi[h-1];
740
for(i=0; i < moinfo.uoccpi[h]; i++,count++) {
741
moinfo.cc_vir[vr_offset+i] = count;
742
moinfo.qt_vir[count] = nfzc + vr_offset+i;
743
moinfo.vir_sym[count] = h;
745
if(h) op_offset += moinfo.openpi[h-1];
746
for(i=0; i < moinfo.openpi[h]; i++,count++) {
747
moinfo.cc_vir[op_offset+i] = count;
748
moinfo.qt_vir[count] = nfzc + op_offset+i;
749
moinfo.vir_sym[count] = h;
753
/* Dump the active-orbital CC and QT ordering and symmetry arrays to CC_INFO */
754
psio_write_entry(CC_INFO, "Active Occ Orb Symmetry",
755
(char *) moinfo.occ_sym, sizeof(int)*moinfo.nactive);
756
psio_write_entry(CC_INFO, "Active Virt Orb Symmetry",
757
(char *) moinfo.vir_sym, sizeof(int)*moinfo.nactive);
758
psio_write_entry(CC_INFO, "QT->CC Active Occ Order",
759
(char *) moinfo.cc_occ, sizeof(int)*moinfo.nactive);
760
psio_write_entry(CC_INFO, "QT->CC Active Virt Order",
761
(char *) moinfo.cc_vir, sizeof(int)*moinfo.nactive);
762
psio_write_entry(CC_INFO, "CC->QT Active Occ Order",
763
(char *) moinfo.qt_occ, sizeof(int)*moinfo.nactive);
764
psio_write_entry(CC_INFO, "CC->QT Active Virt Order",
765
(char *) moinfo.qt_vir, sizeof(int)*moinfo.nactive);
767
/* Now the all-orbital CC ordering and symmetry arrays */
768
moinfo.cc_allocc = init_int_array(moinfo.nmo);
769
moinfo.cc_allvir = init_int_array(moinfo.nmo);
770
moinfo.qt_allocc = init_int_array(moinfo.nmo);
771
moinfo.qt_allvir = init_int_array(moinfo.nmo);
772
for(i=0; i < moinfo.nmo; i++) {
773
moinfo.cc_allocc[i] = moinfo.cc_allvir[i] = -1;
774
moinfo.qt_allocc[i] = moinfo.qt_allvir[i] = -1;
777
moinfo.allocc_sym = init_int_array(moinfo.nmo);
778
moinfo.allvir_sym = init_int_array(moinfo.nmo);
783
op_offset = nfzc + nclsd;
784
for(h=0; h < moinfo.nirreps; h++) {
785
if(h) fc_offset += moinfo.frdocc[h-1];
786
for(i=0; i < moinfo.frdocc[h]; i++,count++) {
787
moinfo.cc_allocc[fc_offset+i] = count;
788
moinfo.qt_allocc[count] = fc_offset+i;
789
moinfo.allocc_sym[count] = h;
791
if(h) cl_offset += moinfo.clsdpi[h-1];
792
for(i=0; i < moinfo.clsdpi[h]; i++,count++) {
793
moinfo.cc_allocc[cl_offset+i] = count;
794
moinfo.qt_allocc[count] = cl_offset+i;
795
moinfo.allocc_sym[count] = h;
797
if(h) op_offset += moinfo.openpi[h-1];
798
for(i=0; i < moinfo.openpi[h]; i++,count++) {
799
moinfo.cc_allocc[op_offset+i] = count;
800
moinfo.qt_allocc[count] = op_offset+i;
801
moinfo.allocc_sym[count] = h;
806
fv_offset = nfzc + nclsd + nopen + nuocc;
807
vr_offset = nfzc + nclsd + nopen;
808
op_offset = nfzc + nclsd;
809
for(h=0; h < moinfo.nirreps; h++) {
810
if(h) fv_offset += moinfo.fruocc[h-1];
811
for(i=0; i < moinfo.fruocc[h]; i++,count++) {
812
moinfo.cc_allvir[fv_offset+i] = count;
813
moinfo.qt_allvir[count] = fv_offset+i;
814
moinfo.allvir_sym[count] = h;
816
if(h) vr_offset += moinfo.uoccpi[h-1];
817
for(i=0; i < moinfo.uoccpi[h]; i++,count++) {
818
moinfo.cc_allvir[vr_offset+i] = count;
819
moinfo.qt_allvir[count] = vr_offset+i;
820
moinfo.allvir_sym[count] = h;
822
if(h) op_offset += moinfo.openpi[h-1];
823
for(i=0; i < moinfo.openpi[h]; i++,count++) {
824
moinfo.cc_allvir[op_offset+i] = count;
825
moinfo.qt_allvir[count] = op_offset+i;
826
moinfo.allvir_sym[count] = h;
830
/* Dump the all-orbital CC ordering and symmetry arrays to CC_INFO */
831
psio_write_entry(CC_INFO, "All Occ Orb Symmetry",
832
(char *) moinfo.allocc_sym, sizeof(int)*moinfo.nmo);
833
psio_write_entry(CC_INFO, "All Virt Orb Symmetry",
834
(char *) moinfo.allvir_sym, sizeof(int)*moinfo.nmo);
835
psio_write_entry(CC_INFO, "QT->CC All Occ Order",
836
(char *) moinfo.cc_allocc, sizeof(int)*moinfo.nmo);
837
psio_write_entry(CC_INFO, "QT->CC All Virt Order",
838
(char *) moinfo.cc_allvir, sizeof(int)*moinfo.nmo);
839
psio_write_entry(CC_INFO, "CC->QT All Occ Order",
840
(char *) moinfo.qt_allocc, sizeof(int)*moinfo.nmo);
841
psio_write_entry(CC_INFO, "CC->QT All Virt Order",
842
(char *) moinfo.qt_allvir, sizeof(int)*moinfo.nmo);
844
} /*** RHF and ROHF references ***/
846
/* Calculate occupied and virtual orbital offsets within each irrep */
848
if(params.ref == 2) { /*** UHF references ***/
849
moinfo.aocc_off = init_int_array(moinfo.nirreps);
850
moinfo.bocc_off = init_int_array(moinfo.nirreps);
851
moinfo.avir_off = init_int_array(moinfo.nirreps);
852
moinfo.bvir_off = init_int_array(moinfo.nirreps);
854
ocount = moinfo.aoccpi[0]; vcount = moinfo.avirtpi[0];
855
for(h=1; h < moinfo.nirreps; h++) {
856
moinfo.aocc_off[h] = ocount;
857
ocount += moinfo.aoccpi[h];
858
moinfo.avir_off[h] = vcount;
859
vcount += moinfo.avirtpi[h];
862
ocount = moinfo.boccpi[0]; vcount = moinfo.bvirtpi[0];
863
for(h=1; h < moinfo.nirreps; h++) {
864
moinfo.bocc_off[h] = ocount;
865
ocount += moinfo.boccpi[h];
866
moinfo.bvir_off[h] = vcount;
867
vcount += moinfo.bvirtpi[h];
870
moinfo.all_aocc_off = init_int_array(moinfo.nirreps);
871
moinfo.all_bocc_off = init_int_array(moinfo.nirreps);
872
moinfo.all_avir_off = init_int_array(moinfo.nirreps);
873
moinfo.all_bvir_off = init_int_array(moinfo.nirreps);
875
ocount = moinfo.all_aoccpi[0]; vcount = moinfo.all_avirtpi[0];
876
for(h=1; h < moinfo.nirreps; h++) {
877
moinfo.all_aocc_off[h] = ocount;
878
ocount += moinfo.all_aoccpi[h];
879
moinfo.all_avir_off[h] = vcount;
880
vcount += moinfo.all_avirtpi[h];
883
ocount = moinfo.all_boccpi[0]; vcount = moinfo.all_bvirtpi[0];
884
for(h=1; h < moinfo.nirreps; h++) {
885
moinfo.all_bocc_off[h] = ocount;
886
ocount += moinfo.all_boccpi[h];
887
moinfo.all_bvir_off[h] = vcount;
888
vcount += moinfo.all_bvirtpi[h];
891
/* Dump occ_off and vir_off arrays to CC_INFO */
892
psio_write_entry(CC_INFO, "Active Alpha Occ Orb Offsets",
893
(char *) moinfo.aocc_off, sizeof(int)*moinfo.nirreps);
894
psio_write_entry(CC_INFO, "Active Beta Occ Orb Offsets",
895
(char *) moinfo.bocc_off, sizeof(int)*moinfo.nirreps);
897
psio_write_entry(CC_INFO, "Active Alpha Virt Orb Offsets",
898
(char *) moinfo.avir_off, sizeof(int)*moinfo.nirreps);
899
psio_write_entry(CC_INFO, "Active Beta Virt Orb Offsets",
900
(char *) moinfo.bvir_off, sizeof(int)*moinfo.nirreps);
902
psio_write_entry(CC_INFO, "All Alpha Occ Orb Offsets",
903
(char *) moinfo.all_aocc_off, sizeof(int)*moinfo.nirreps);
904
psio_write_entry(CC_INFO, "All Beta Occ Orb Offsets",
905
(char *) moinfo.all_bocc_off, sizeof(int)*moinfo.nirreps);
907
psio_write_entry(CC_INFO, "All Alpha Virt Orb Offsets",
908
(char *) moinfo.all_avir_off, sizeof(int)*moinfo.nirreps);
909
psio_write_entry(CC_INFO, "All Beta Virt Orb Offsets",
910
(char *) moinfo.all_bvir_off, sizeof(int)*moinfo.nirreps);
913
else { /*** RHF/ROHF references ***/
914
moinfo.occ_off = init_int_array(moinfo.nirreps);
915
moinfo.vir_off = init_int_array(moinfo.nirreps);
916
ocount = moinfo.occpi[0]; vcount = moinfo.virtpi[0];
917
for(h=1; h < moinfo.nirreps; h++) {
918
moinfo.occ_off[h] = ocount;
919
ocount += moinfo.occpi[h];
920
moinfo.vir_off[h] = vcount;
921
vcount += moinfo.virtpi[h];
923
moinfo.all_occ_off = init_int_array(moinfo.nirreps);
924
moinfo.all_vir_off = init_int_array(moinfo.nirreps);
925
ocount = moinfo.all_occpi[0]; vcount = moinfo.all_virtpi[0];
926
for(h=1; h < moinfo.nirreps; h++) {
927
moinfo.all_occ_off[h] = ocount;
928
ocount += moinfo.all_occpi[h];
929
moinfo.all_vir_off[h] = vcount;
930
vcount += moinfo.all_virtpi[h];
933
/* Dump occ_off and vir_off arrays to CC_INFO */
934
psio_write_entry(CC_INFO, "Active Occ Orb Offsets",
935
(char *) moinfo.occ_off, sizeof(int)*moinfo.nirreps);
936
psio_write_entry(CC_INFO, "Active Virt Orb Offsets",
937
(char *) moinfo.vir_off, sizeof(int)*moinfo.nirreps);
938
psio_write_entry(CC_INFO, "All Occ Orb Offsets",
939
(char *) moinfo.all_occ_off, sizeof(int)*moinfo.nirreps);
940
psio_write_entry(CC_INFO, "All Virt Orb Offsets",
941
(char *) moinfo.all_vir_off, sizeof(int)*moinfo.nirreps);
945
fprintf(outfile,"\n\tChkpt Parameters:\n");
946
fprintf(outfile,"\t--------------------\n");
947
fprintf(outfile,"\tNumber of irreps = %d\n",moinfo.nirreps);
948
fprintf(outfile,"\tNumber of MOs = %d\n",moinfo.nmo);
949
fprintf(outfile,"\tNumber of active MOs = %d\n\n",moinfo.nactive);
951
"\tLabel\t# MOs\t# FZDC\t# DOCC\t# SOCC\t# VIRT\t# FZVR\n");
953
"\t-----\t-----\t------\t------\t------\t------\t------\n");
954
for(i=0; i < moinfo.nirreps; i++) {
956
"\t %s\t %d\t %d\t %d\t %d\t %d\t %d\n",
957
moinfo.labels[i],moinfo.orbspi[i],moinfo.frdocc[i],
958
moinfo.clsdpi[i],moinfo.openpi[i],moinfo.uoccpi[i],
961
fprintf(outfile,"\n\tNuclear Rep. energy (chkpt) = %20.14f\n", moinfo.enuc);
962
fprintf(outfile, "\tSCF energy (chkpt) = %20.14f\n", escf);
964
/* Lastly, build the active virtual orbital SCF eigenvector array for
965
the AO-basis code (see CCENERGY) */
967
if(params.ref == 2) { /*** UHF references ***/
969
pitz_offset = init_int_array(moinfo.nirreps);
971
for(h=1; h < moinfo.nirreps; h++) {
972
pitz_offset[h] = pitz_offset[h-1] + moinfo.orbspi[h-1];
975
chkpt_init(PSIO_OPEN_OLD);
977
evects_A = (double ***) malloc(moinfo.nirreps * sizeof(double **));
978
scf_vector_A = (double ***) malloc(moinfo.nirreps * sizeof(double **));
981
for(h=0; h < moinfo.nirreps; h++) {
982
evects_A[h] = chkpt_rd_alpha_scf_irrep(h); /* Pitzer-ordered MO's */
984
if(moinfo.avirtpi[h]) {
985
scf_vector_A[h] = block_matrix(moinfo.orbspi[h], moinfo.avirtpi[h]);
987
for(i=0; i < moinfo.orbspi[h]; i++) {
988
for(j=0; j < moinfo.avirtpi[h]; j++) { /* CC-ordered relative index */
989
J = moinfo.avir_off[h] + j; /* CC-ordered absolute index */
990
qt_j = moinfo.qt_avir[J]; /* QT-ordered absolute index */
991
pitz_J = moinfo.qt2pitz_A[qt_j]; /* Pitzer-ordered absolute index */
992
pitz_j = pitz_J - pitz_offset[h]; /* Pitzer-ordered relative index */
993
scf_vector_A[h][i][j] = evects_A[h][i][pitz_j];
997
psio_write(CC_INFO, "UHF Active Alpha Virtual Orbs", (char *) scf_vector_A[h][0],
998
moinfo.orbspi[h]*moinfo.avirtpi[h]*sizeof(double), next, &next);
1000
free_block(evects_A[h]);
1001
free_block(scf_vector_A[h]);
1007
free(evects_A); free(scf_vector_A);
1009
evects_B = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1010
scf_vector_B = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1013
for(h=0; h < moinfo.nirreps; h++) {
1014
evects_B[h] = chkpt_rd_beta_scf_irrep(h); /* Pitzer-ordered MO's */
1016
if(moinfo.bvirtpi[h]) {
1017
scf_vector_B[h] = block_matrix(moinfo.orbspi[h], moinfo.bvirtpi[h]);
1019
for(i=0; i < moinfo.orbspi[h]; i++) {
1020
for(j=0; j < moinfo.bvirtpi[h]; j++) { /* CC-ordered relative index */
1021
J = moinfo.bvir_off[h] + j; /* CC-ordered absolute index */
1022
qt_j = moinfo.qt_bvir[J]; /* QT-ordered absolute index */
1023
pitz_J = moinfo.qt2pitz_B[qt_j]; /* Pitzer-ordered absolute index */
1024
pitz_j = pitz_J - pitz_offset[h]; /* Pitzer-ordered relative index */
1025
scf_vector_B[h][i][j] = evects_B[h][i][pitz_j];
1029
psio_write(CC_INFO, "UHF Active Beta Virtual Orbs", (char *) scf_vector_B[h][0],
1030
moinfo.orbspi[h]*moinfo.bvirtpi[h]*sizeof(double), next, &next);
1032
free_block(evects_B[h]);
1033
free_block(scf_vector_B[h]);
1039
free(evects_B); free(scf_vector_B);
1044
else { /*** RHF/ROHF references ***/
1046
pitz_offset = init_int_array(moinfo.nirreps);
1048
for(h=1; h < moinfo.nirreps; h++) {
1049
pitz_offset[h] = pitz_offset[h-1] + moinfo.orbspi[h-1];
1052
chkpt_init(PSIO_OPEN_OLD);
1053
evects = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1054
scf_vector = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1057
for(h=0; h < moinfo.nirreps; h++) {
1058
evects[h] = chkpt_rd_scf_irrep(h); /* Pitzer-order MO's */
1060
/* Are there active virtuals in this irrep? */
1061
if(moinfo.virtpi[h]) {
1062
scf_vector[h] = block_matrix(moinfo.orbspi[h],moinfo.virtpi[h]);
1064
for(i=0; i < moinfo.orbspi[h]; i++) {
1065
for(j=0; j < moinfo.virtpi[h]; j++) { /* CC-ordered relative index */
1066
J = moinfo.vir_off[h] + j; /* CC-ordered absolute index */
1067
qt_j = moinfo.qt_vir[J]; /* QT-ordered absolute index */
1068
pitz_J = moinfo.qt2pitz[qt_j]; /* Pitzer-ordered absolute index */
1069
pitz_j = pitz_J - pitz_offset[h]; /* Pitzer-order relative index */
1070
scf_vector[h][i][j] = evects[h][i][pitz_j];
1074
psio_write(CC_INFO, "RHF/ROHF Active Virtual Orbitals",
1075
(char *) scf_vector[h][0],
1076
moinfo.orbspi[h]*moinfo.virtpi[h]*sizeof(double),
1079
free_block(scf_vector[h]);
1082
free_block(evects[h]);
1085
for(h=0; h < moinfo.nirreps; h++) {
1086
evects[h] = chkpt_rd_scf_irrep(h); /* Pitzer-order MO's */
1088
if(moinfo.occpi[h]) {
1089
scf_vector[h] = block_matrix(moinfo.orbspi[h],moinfo.occpi[h]);
1091
for(i=0; i < moinfo.orbspi[h]; i++) {
1092
for(j=0; j < moinfo.occpi[h]; j++) { /* CC-ordered relative index */
1093
J = moinfo.occ_off[h] + j; /* CC-ordered absolute index */
1094
qt_j = moinfo.qt_occ[J]; /* QT-ordered absolute index */
1095
pitz_J = moinfo.qt2pitz[qt_j]; /* Pitzer-ordered absolute index */
1096
pitz_j = pitz_J - pitz_offset[h]; /* Pitzer-order relative index */
1097
scf_vector[h][i][j] = evects[h][i][pitz_j];
1101
psio_write(CC_INFO, "RHF/ROHF Active Occupied Orbitals",
1102
(char *) scf_vector[h][0],
1103
moinfo.orbspi[h]*moinfo.occpi[h]*sizeof(double),
1106
free_block(scf_vector[h]);
1110
free_block(evects[h]);
1113
fprintf(outfile, "\n\tOriginal SCF Eigenvectors:\n");
1114
print_mat(evects[h], moinfo.orbspi[h], moinfo.orbspi[h], outfile);
1116
fprintf(outfile, "\n\tRe-ordered Virtual SCF Eigenvectors:\n");
1117
print_mat(scf_vector[h], moinfo.orbspi[h], moinfo.virtpi[h], outfile);
1121
C = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1123
for(h=0; h < moinfo.nirreps; h++) {
1124
if(moinfo.orbspi[h] && moinfo.virtpi[h]) {
1125
C[h] = block_matrix(moinfo.orbspi[h],moinfo.virtpi[h]);
1126
psio_read(CC_INFO, "RHF/ROHF Active Virtual Orbitals", (char *) C[h][0],
1127
moinfo.orbspi[h]*moinfo.virtpi[h]*sizeof(double), next, &next);
1132
free(evects); free(scf_vector);