~ubuntu-branches/ubuntu/precise/psicode/precise

« back to all changes in this revision

Viewing changes to src/bin/ccsort/get_moinfo.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Banck, Michael Banck, Daniel Leidert
  • Date: 2009-02-23 00:12:02 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090223001202-rutldoy3dimfpesc
Tags: 3.4.0-1
* New upstream release.

[ Michael Banck ]
* debian/patches/01_DESTDIR.dpatch: Refreshed.
* debian/patches/02_FHS.dpatch: Removed, applied upstream.
* debian/patches/03_debian_docdir: Likewise.
* debian/patches/04_man.dpatch: Likewise.
* debian/patches/06_466828_fix_gcc_43_ftbfs.dpatch: Likewise.
* debian/patches/07_464867_move_executables: Fixed and refreshed.
* debian/patches/00list: Adjusted.
* debian/control: Improved description.
* debian/patches-held: Removed.
* debian/rules (install/psi3): Do not ship the ruby bindings for now.

[ Daniel Leidert ]
* debian/rules: Fix txtdir via DEB_MAKE_INSTALL_TARGET.
* debian/patches/01_DESTDIR.dpatch: Refreshed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <stdio.h>
2
 
#include <stdlib.h>
3
 
#include <math.h>
4
 
#include <libipv1/ip_lib.h>
5
 
#include <libciomr/libciomr.h>
6
 
#include <libpsio/psio.h>
7
 
#include <libchkpt/chkpt.h>
8
 
#include <libqt/qt.h>
9
 
#include <psifiles.h>
10
 
#include "MOInfo.h"
11
 
#include "Params.h"
12
 
#define EXTERN
13
 
#include "globals.h"
14
 
 
15
 
/* get_moinfo(): Routine to obtain basic orbital information from
16
 
** chkpt and compute the associated lookup arrays.
17
 
**
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.
23
 
**
24
 
** T. Daniel Crawford, October 1996
25
 
** Modified by TDC March, 1999 */
26
 
 
27
 
void get_moinfo(void)
28
 
{
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;
34
 
  double escf;
35
 
  double ***evects, ***scf_vector;
36
 
  double ***evects_A, ***scf_vector_A;
37
 
  double ***evects_B, ***scf_vector_B;
38
 
  double ***C;
39
 
  int *pitz2qt, *qt2pitz, J, qt_j, pitz_j, pitz_J, *pitz_offset;
40
 
  int *pitz2qt_A, *qt2pitz_A, *pitz2qt_B, *qt2pitz_B;
41
 
  psio_address next;
42
 
  
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();
57
 
  chkpt_close();
58
 
 
59
 
  /* Dump the reference wave function ID to CC_INFO */
60
 
  psio_write_entry(CC_INFO, "Reference Wavefunction",
61
 
                   (char *) &(params.ref), sizeof(int));
62
 
 
63
 
  moinfo.frdocc = get_frzcpi();
64
 
  moinfo.fruocc = get_frzvpi();
65
 
 
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];
70
 
  }
71
 
 
72
 
  if(moinfo.nfzc) {
73
 
    chkpt_init(PSIO_OPEN_OLD);
74
 
    moinfo.efzc = chkpt_rd_efzc();
75
 
    chkpt_close();
76
 
  }
77
 
  else moinfo.efzc = 0.0;
78
 
 
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");
84
 
    fflush(outfile);
85
 
    exit(PSI_RETURN_FAILURE);
86
 
  }
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");
91
 
    fflush(outfile);
92
 
    moinfo.efzc = 0.0;
93
 
  }
94
 
 
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);
100
 
 
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);
109
 
 
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;
113
 
    }
114
 
  }
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;  
121
 
  }
122
 
 
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;
131
 
  }
132
 
 
133
 
  /* Adjust clsdpi array for frozen orbitals */
134
 
  for(i=0; i < moinfo.nirreps; i++)
135
 
    moinfo.clsdpi[i] -= moinfo.frdocc[i];
136
 
 
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] -
141
 
      moinfo.frdocc[i];
142
 
 
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];
148
 
  }
149
 
  nfzc = moinfo.nfzc;
150
 
 
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), 
154
 
                   sizeof(int));
155
 
 
156
 
  /* Number of occupied and virtual orbirals per irrep including
157
 
     open-shells */
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];
172
 
 
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];
177
 
    }
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);
195
 
 
196
 
  }
197
 
  else {
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] +
206
 
        moinfo.openpi[h];
207
 
      moinfo.all_virtpi[h] = moinfo.fruocc[h] + moinfo.uoccpi[h] +
208
 
        moinfo.openpi[h];
209
 
    }
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);
219
 
 
220
 
  }
221
 
 
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. */
232
 
 
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);
243
 
 
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;
250
 
      }
251
 
    }
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;
256
 
        active_a_count++;
257
 
        all_a_count++;
258
 
      }
259
 
    }
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;
264
 
        active_b_count++;
265
 
        all_b_count++;
266
 
      }
267
 
    }
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;
272
 
        active_b_count++;
273
 
        all_b_count++;
274
 
      }
275
 
    }
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;
280
 
        active_a_count++;
281
 
        all_a_count++;
282
 
      }
283
 
    }
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;
289
 
      }
290
 
    }
291
 
 
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);
311
 
  }
312
 
  else {
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);
321
 
 
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;
328
 
      }
329
 
    }
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;
335
 
      }
336
 
    }
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;
346
 
      }
347
 
    }
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;
353
 
      }
354
 
    }
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;
360
 
      }
361
 
    }
362
 
 
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);
378
 
  }
379
 
 
380
 
  if(params.ref == 2) {
381
 
 
382
 
    /**** UHF references ****/
383
 
 
384
 
    /*
385
 
 
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
400
 
    distribute.c).
401
 
 
402
 
 
403
 
    For example, for 3B1 CH2 in a DZ basis with one frozen core
404
 
    orbital and three frozen virtual orbitals:
405
 
    
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
414
 
 
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
423
 
 
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).
428
 
 
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.
436
 
 
437
 
    */
438
 
 
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;
453
 
    }
454
 
 
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);
459
 
 
460
 
    count = 0;
461
 
    offset = 0;
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;
468
 
      }
469
 
    }
470
 
 
471
 
    count = 0;
472
 
    offset = 0;
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;
479
 
      }
480
 
    }
481
 
 
482
 
    count = 0;
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;
490
 
      }
491
 
    }
492
 
 
493
 
    count = 0;
494
 
    offset = nclsd;
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;
501
 
      }
502
 
    }
503
 
 
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);
529
 
 
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;
544
 
    }
545
 
 
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);
550
 
 
551
 
    count = 0;
552
 
    fc_offset = 0;
553
 
    offset = nfzc;
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;
560
 
      }
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;
566
 
      }
567
 
    }
568
 
 
569
 
    count = 0;
570
 
    fc_offset = 0;
571
 
    offset = nfzc;
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;
578
 
      }
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;
584
 
      }
585
 
    }
586
 
 
587
 
    count = 0;
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;
596
 
      }
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;
602
 
      }
603
 
    }
604
 
 
605
 
    count = 0;
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;
614
 
      }
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;
620
 
      }
621
 
    }
622
 
 
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);
628
 
 
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);
633
 
 
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);
638
 
 
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);
643
 
 
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);
648
 
 
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);
653
 
 
654
 
  }  /*** UHF references ***/
655
 
  else {
656
 
 
657
 
    /**** RHF and ROHF references ****/
658
 
 
659
 
    /* 
660
 
 
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
674
 
    distribute.c).
675
 
    
676
 
    For example, for 3B1 CH2 in a DZ basis with one frozen core
677
 
    orbital and three frozen virtual orbitals:
678
 
    
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
687
 
 
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).
692
 
 
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).
701
 
     
702
 
    */
703
 
 
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;
712
 
    }
713
 
 
714
 
    moinfo.occ_sym = init_int_array(moinfo.nactive);
715
 
    moinfo.vir_sym = init_int_array(moinfo.nactive);
716
 
 
717
 
    count = 0;
718
 
    cl_offset = 0;
719
 
    op_offset = nclsd;
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;
726
 
      }
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;
732
 
      }
733
 
    }
734
 
 
735
 
    count = 0;
736
 
    vr_offset = nclsd + nopen;
737
 
    op_offset = nclsd;
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;
744
 
      }
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;
750
 
      }
751
 
    }
752
 
 
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);
766
 
 
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;
775
 
    }
776
 
 
777
 
    moinfo.allocc_sym = init_int_array(moinfo.nmo);
778
 
    moinfo.allvir_sym = init_int_array(moinfo.nmo);
779
 
 
780
 
    count = 0;
781
 
    fc_offset = 0;
782
 
    cl_offset = nfzc;
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;
790
 
      }
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;
796
 
      }
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;
802
 
      }
803
 
    }
804
 
 
805
 
    count = 0;
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;
815
 
      }
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;
821
 
      }
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;
827
 
      }
828
 
    }
829
 
 
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);
843
 
  
844
 
  } /*** RHF and ROHF references ***/
845
 
 
846
 
  /* Calculate occupied and virtual orbital offsets within each irrep */
847
 
 
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);
853
 
 
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];
860
 
    }
861
 
 
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];
868
 
    }
869
 
 
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);
874
 
 
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];
881
 
    }
882
 
 
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];
889
 
    }
890
 
 
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);
896
 
 
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);
901
 
 
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);
906
 
 
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);
911
 
 
912
 
  }
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];
922
 
    }
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];
931
 
    }
932
 
 
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);
942
 
 
943
 
  }
944
 
 
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);
950
 
  fprintf(outfile,
951
 
          "\tLabel\t# MOs\t# FZDC\t# DOCC\t# SOCC\t# VIRT\t# FZVR\n");
952
 
  fprintf(outfile,
953
 
          "\t-----\t-----\t------\t------\t------\t------\t------\n");
954
 
  for(i=0; i < moinfo.nirreps; i++) {
955
 
    fprintf(outfile,
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],
959
 
            moinfo.fruocc[i]);
960
 
  }
961
 
  fprintf(outfile,"\n\tNuclear Rep. energy (chkpt) =  %20.14f\n", moinfo.enuc);
962
 
  fprintf(outfile,  "\tSCF energy          (chkpt) =  %20.14f\n", escf);
963
 
 
964
 
  /* Lastly, build the active virtual orbital SCF eigenvector array for
965
 
     the AO-basis code (see CCENERGY) */
966
 
 
967
 
  if(params.ref == 2) { /*** UHF references ***/
968
 
 
969
 
    pitz_offset = init_int_array(moinfo.nirreps);
970
 
    pitz_offset[0] = 0;
971
 
    for(h=1; h < moinfo.nirreps; h++) {
972
 
      pitz_offset[h] = pitz_offset[h-1] + moinfo.orbspi[h-1];
973
 
    }
974
 
 
975
 
    chkpt_init(PSIO_OPEN_OLD);
976
 
 
977
 
    evects_A = (double ***) malloc(moinfo.nirreps * sizeof(double **));
978
 
    scf_vector_A = (double ***) malloc(moinfo.nirreps * sizeof(double **));
979
 
 
980
 
    next = PSIO_ZERO;
981
 
    for(h=0; h < moinfo.nirreps; h++) {
982
 
      evects_A[h] = chkpt_rd_alpha_scf_irrep(h); /* Pitzer-ordered MO's */
983
 
 
984
 
      if(moinfo.avirtpi[h]) {
985
 
        scf_vector_A[h] = block_matrix(moinfo.orbspi[h], moinfo.avirtpi[h]);
986
 
 
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];
994
 
          }
995
 
        }
996
 
 
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);
999
 
    
1000
 
        free_block(evects_A[h]);
1001
 
        free_block(scf_vector_A[h]);
1002
 
 
1003
 
      }
1004
 
 
1005
 
    }
1006
 
 
1007
 
    free(evects_A);  free(scf_vector_A);
1008
 
 
1009
 
    evects_B = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1010
 
    scf_vector_B = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1011
 
 
1012
 
    next = PSIO_ZERO;
1013
 
    for(h=0; h < moinfo.nirreps; h++) {
1014
 
      evects_B[h] = chkpt_rd_beta_scf_irrep(h); /* Pitzer-ordered MO's */
1015
 
 
1016
 
      if(moinfo.bvirtpi[h]) {
1017
 
        scf_vector_B[h] = block_matrix(moinfo.orbspi[h], moinfo.bvirtpi[h]);
1018
 
 
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];
1026
 
          }
1027
 
        }
1028
 
 
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);
1031
 
 
1032
 
        free_block(evects_B[h]);
1033
 
        free_block(scf_vector_B[h]);
1034
 
 
1035
 
      }
1036
 
 
1037
 
    }
1038
 
 
1039
 
    free(evects_B);  free(scf_vector_B);
1040
 
 
1041
 
    free(pitz_offset);
1042
 
    chkpt_close();
1043
 
  }
1044
 
  else { /*** RHF/ROHF references ***/
1045
 
 
1046
 
    pitz_offset = init_int_array(moinfo.nirreps);
1047
 
    pitz_offset[0] = 0;
1048
 
    for(h=1; h < moinfo.nirreps; h++) {
1049
 
      pitz_offset[h] = pitz_offset[h-1] + moinfo.orbspi[h-1];
1050
 
    }
1051
 
  
1052
 
    chkpt_init(PSIO_OPEN_OLD);
1053
 
    evects = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1054
 
    scf_vector = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1055
 
 
1056
 
    next = PSIO_ZERO;
1057
 
    for(h=0; h < moinfo.nirreps; h++) {
1058
 
      evects[h] = chkpt_rd_scf_irrep(h); /* Pitzer-order MO's */
1059
 
 
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]);
1063
 
 
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];
1071
 
          }
1072
 
        }
1073
 
 
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),
1077
 
                   next, &next);
1078
 
 
1079
 
        free_block(scf_vector[h]);
1080
 
 
1081
 
      }
1082
 
      free_block(evects[h]);
1083
 
    }
1084
 
 
1085
 
    for(h=0; h < moinfo.nirreps; h++) {
1086
 
      evects[h] = chkpt_rd_scf_irrep(h); /* Pitzer-order MO's */
1087
 
      next = PSIO_ZERO;
1088
 
      if(moinfo.occpi[h]) {
1089
 
        scf_vector[h] = block_matrix(moinfo.orbspi[h],moinfo.occpi[h]);
1090
 
 
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];
1098
 
          }
1099
 
        }
1100
 
 
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),
1104
 
                   next, &next);
1105
 
 
1106
 
        free_block(scf_vector[h]);
1107
 
 
1108
 
      }
1109
 
 
1110
 
      free_block(evects[h]);
1111
 
 
1112
 
    /*
1113
 
      fprintf(outfile, "\n\tOriginal SCF Eigenvectors:\n");
1114
 
      print_mat(evects[h], moinfo.orbspi[h], moinfo.orbspi[h], outfile);
1115
 
 
1116
 
      fprintf(outfile, "\n\tRe-ordered Virtual SCF Eigenvectors:\n");
1117
 
      print_mat(scf_vector[h], moinfo.orbspi[h], moinfo.virtpi[h], outfile);
1118
 
    */
1119
 
    }
1120
 
 
1121
 
    C = (double ***) malloc(moinfo.nirreps * sizeof(double **));
1122
 
    next = PSIO_ZERO;
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);
1128
 
      }
1129
 
    }
1130
 
    moinfo.C = C;
1131
 
 
1132
 
    free(evects);  free(scf_vector);
1133
 
    free(pitz_offset);
1134
 
    chkpt_close();
1135
 
  }
1136
 
}