~ubuntu-branches/ubuntu/quantal/psicode/quantal

« back to all changes in this revision

Viewing changes to src/bin/detci/params.cc

  • Committer: Bazaar Package Importer
  • Author(s): Michael Banck
  • Date: 2006-09-10 14:01:33 UTC
  • Revision ID: james.westby@ubuntu.com-20060910140133-ib2j86trekykfsfv
Tags: upstream-3.2.3
ImportĀ upstreamĀ versionĀ 3.2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
** PARAMS.CC: File contains functions which get or print the running
 
3
**    parameters for the CI calculation.
 
4
**
 
5
** David Sherrill, 16 November 1994
 
6
**
 
7
*/
 
8
 
 
9
#define EXTERN
 
10
 
 
11
extern "C" {
 
12
#include <stdlib.h>
 
13
#include <stdio.h>
 
14
#include <string.h>
 
15
#ifdef AIX
 
16
#include <string.h>
 
17
#endif
 
18
#include <libipv1/ip_lib.h>
 
19
#include <libipv1/ip_data.gbl>
 
20
#include <libciomr/libciomr.h>
 
21
#include <libqt/qt.h>
 
22
#include <libchkpt/chkpt.h>
 
23
#include <psifiles.h>
 
24
#include "structs.h"
 
25
#include "globals.h"
 
26
}
 
27
 
 
28
 
 
29
/*
 
30
** get_parameters(): Function gets the program running parameters such
 
31
**   as convergence.  These are stored in the Parameters data structure.
 
32
*/
 
33
void get_parameters(void)
 
34
{
 
35
   int i, errcod;
 
36
   int iopen=0, tval;
 
37
   char line1[133];
 
38
   
 
39
   /* default value of Ms0 depends on iopen but is modified below 
 
40
    * depending on value of opentype
 
41
    */
 
42
 
 
43
   chkpt_init(PSIO_OPEN_OLD);
 
44
   Parameters.Ms0 = !(chkpt_rd_iopen());
 
45
   chkpt_close();
 
46
 
 
47
   /* need to figure out wheter to filter tei's */
 
48
   errcod = ip_string("DERTYPE", &(Parameters.dertype),0); 
 
49
   if(errcod == IPE_KEY_NOT_FOUND) {
 
50
     Parameters.dertype = (char *) malloc(sizeof(char)*5);
 
51
     strcpy(Parameters.dertype, "NONE");
 
52
   }
 
53
 
 
54
   errcod = ip_string("WFN", &(Parameters.wfn),0);
 
55
   if(errcod == IPE_KEY_NOT_FOUND) {
 
56
     Parameters.wfn = (char *) malloc(sizeof(char)*5);
 
57
     strcpy(Parameters.wfn, "NONE");
 
58
   }
 
59
 
 
60
  if (strcmp(Parameters.dertype, "FIRST")==0 ||
 
61
      strcmp(Parameters.wfn, "DETCAS")==0) Parameters.filter_ints = 1;
 
62
  else Parameters.filter_ints = 0;
 
63
 
 
64
 
 
65
   /* Parameters.print_lvl is set in detci.cc */
 
66
   /* Parameters.have_special_conv is set in detci.cc */
 
67
   Parameters.ex_lvl = 2;
 
68
   Parameters.val_ex_lvl = 0;
 
69
   Parameters.maxiter = 12;
 
70
   Parameters.max_dets = 10000;
 
71
   Parameters.num_roots = 1;
 
72
   Parameters.istop = 0;
 
73
   Parameters.print_ciblks = 0;
 
74
   Parameters.S = 0;
 
75
   Parameters.opentype = PARM_OPENTYPE_UNKNOWN;
 
76
   Parameters.ref_sym = -1;
 
77
   Parameters.oei_file = PSIF_OEI;  /* always need fzc operator */
 
78
   Parameters.oei_erase = 0;
 
79
   Parameters.tei_file = PSIF_MO_TEI;
 
80
   Parameters.tei_erase = 0;
 
81
   Parameters.h0blocksize = 400;
 
82
   Parameters.h0guess_size = 100;
 
83
   Parameters.h0block_coupling = 0;
 
84
   Parameters.h0block_coupling_size = 0;
 
85
   Parameters.nprint = 20;
 
86
   Parameters.hd_ave = EVANGELISTI;
 
87
   Parameters.hd_otf = TRUE;
 
88
   Parameters.nodfile = 0;
 
89
   Parameters.fzc = 1;
 
90
   Parameters.fci = 0;
 
91
   Parameters.fci_strings = 0;
 
92
   Parameters.mixed = 1;
 
93
   Parameters.mixed4 = 1;
 
94
   Parameters.r4s = 0;
 
95
   Parameters.repl_otf = 0;
 
96
   Parameters.calc_ssq = 0;
 
97
   Parameters.mpn = 0;
 
98
   Parameters.save_mpn2 = 0;
 
99
   Parameters.mpn_schmidt = 0;
 
100
   Parameters.wigner = 0;
 
101
   Parameters.perturbation_parameter = 1.0;
 
102
   Parameters.z_scale_H = 0;
 
103
 
 
104
   Parameters.ras1_lvl = -1;
 
105
   Parameters.ras1_min = -1;
 
106
   Parameters.a_ras1_lvl = -1;
 
107
   Parameters.a_ras1_min = -1;
 
108
   Parameters.b_ras1_lvl = -1;
 
109
   Parameters.b_ras1_min = -1;
 
110
   Parameters.a_ras3_max = -1;
 
111
   Parameters.b_ras3_max = -1;
 
112
   Parameters.ras3_lvl = -1;
 
113
   Parameters.ras3_max = -1;
 
114
   Parameters.ras4_lvl = -1;
 
115
   Parameters.ras4_max = -1;
 
116
   Parameters.ras34_max = -1;
 
117
 
 
118
   if (strcmp(Parameters.wfn, "DETCAS")==0)
 
119
     Parameters.guess_vector = PARM_GUESS_VEC_DFILE;
 
120
   else
 
121
     Parameters.guess_vector = PARM_GUESS_VEC_H0_BLOCK;
 
122
 
 
123
   Parameters.icore = 1;
 
124
   Parameters.diag_method = METHOD_DAVIDSON_LIU_SEM;
 
125
   Parameters.precon = PRECON_DAVIDSON;
 
126
   Parameters.update = UPDATE_DAVIDSON;
 
127
   Parameters.maxnvect = 0;
 
128
   Parameters.collapse_size = 1;
 
129
   Parameters.lse = 0;
 
130
   Parameters.lse_collapse = 3;
 
131
   Parameters.lse_tolerance = 3;
 
132
   Parameters.genci = 0;
 
133
   Parameters.neg_only = 1;
 
134
   Parameters.zero_blocks = 0;
 
135
 
 
136
   Parameters.nunits = 1;
 
137
   Parameters.first_tmp_unit = 50;
 
138
   Parameters.first_hd_tmp_unit = 0;
 
139
   Parameters.num_hd_tmp_units = 0;
 
140
   Parameters.first_c_tmp_unit = 0;
 
141
   Parameters.num_c_tmp_units = 0;
 
142
   Parameters.first_s_tmp_unit = 0;
 
143
   Parameters.num_s_tmp_units = 0;
 
144
   Parameters.first_d_tmp_unit = 0;
 
145
   Parameters.num_d_tmp_units = 0;
 
146
   
 
147
   Parameters.restart = 0;
 
148
   Parameters.restart_vecs = 0;
 
149
   Parameters.restart_iter = 0;
 
150
   Parameters.bendazzoli = 0;
 
151
 
 
152
   if (strcmp(Parameters.dertype, "FIRST")==0 ||
 
153
      strcmp(Parameters.wfn, "DETCAS")==0) {
 
154
     Parameters.convergence = 7;
 
155
     Parameters.energy_convergence = 8;
 
156
     Parameters.opdm = 1;
 
157
     Parameters.opdm_write = 1;
 
158
     Parameters.tpdm = 1;
 
159
     Parameters.tpdm_write = 1;
 
160
   }
 
161
 
 
162
   else {
 
163
     Parameters.convergence = 4;
 
164
     Parameters.energy_convergence = 6;
 
165
     Parameters.opdm = 0;
 
166
     Parameters.opdm_write = 0;
 
167
     Parameters.tpdm = 0;
 
168
     Parameters.tpdm_write = 0;
 
169
   }
 
170
 
 
171
   Parameters.opdm_file = PSIF_MO_OPDM;
 
172
   Parameters.opdm_print = 0;
 
173
   Parameters.opdm_diag = 0;
 
174
   Parameters.opdm_wrtnos = 0;
 
175
   Parameters.opdm_orbsfile = 76;
 
176
   Parameters.opdm_ave = 0;
 
177
   Parameters.opdm_orbs_root = -1;
 
178
   Parameters.opdm_ke = 0;
 
179
   Parameters.tpdm_file = PSIF_MO_TPDM;
 
180
   Parameters.tpdm_print = 0;
 
181
   Parameters.root = 1;
 
182
 
 
183
   Parameters.nthreads = 1;
 
184
   Parameters.pthreads = 0;
 
185
   Parameters.sf_restrict = 0;
 
186
 
 
187
   errcod = ip_data("EX_LVL","%d",&(Parameters.ex_lvl),0);
 
188
   errcod = ip_data("VAL_EX_LVL","%d",&(Parameters.val_ex_lvl),0);
 
189
   errcod = ip_data("MAX_DET","%d",&(Parameters.max_dets),0);
 
190
   errcod = ip_data("MAXITER","%d",&(Parameters.maxiter),0);
 
191
   errcod = ip_data("NUM_ROOTS","%d",&(Parameters.num_roots),0);
 
192
   errcod = ip_boolean("ISTOP",&(Parameters.istop),0);
 
193
   errcod = ip_data("PRINT","%d",&(Parameters.print_lvl),0);
 
194
   errcod = ip_boolean("PRINT_CIBLKS",&(Parameters.print_ciblks),0);
 
195
   errcod = ip_data("CONVERGENCE","%d",&(Parameters.convergence),0);
 
196
   errcod = ip_data("ENERGY_CONVERGENCE","%d",
 
197
               &(Parameters.energy_convergence),0);
 
198
   errcod = ip_data("S","%d",&(Parameters.S),0);
 
199
 
 
200
   /* this stuff was appropriate to the OPENTYPE keyword in PSI2 */
 
201
   errcod = ip_data("OPENTYPE","%s",line1,0);
 
202
   if (errcod == IPE_OK) {
 
203
      if (strcmp(line1, "NONE")==0) { 
 
204
         Parameters.opentype = PARM_OPENTYPE_NONE;
 
205
         Parameters.Ms0 = 1;
 
206
         }
 
207
      else if (strcmp(line1, "HIGHSPIN")==0) {
 
208
         Parameters.opentype = PARM_OPENTYPE_HIGHSPIN;
 
209
         Parameters.Ms0 = 0;
 
210
         }
 
211
      else if (strcmp(line1, "SINGLET")==0) {
 
212
         Parameters.opentype = PARM_OPENTYPE_SINGLET;
 
213
         Parameters.Ms0 = 1;
 
214
         }
 
215
      else Parameters.opentype = PARM_OPENTYPE_UNKNOWN;
 
216
      } 
 
217
   else { /* no opentype keyword, as appropriate for PSI3 */
 
218
     errcod = ip_data("REFERENCE","%s",line1,0);
 
219
     /* fprintf(outfile, "line1 = "); 
 
220
     for (int ij = 0; ij<3; ij++) fprintf(outfile, "%1c", line1[ij]); 
 
221
     fprintf(outfile,"\n");
 
222
     */
 
223
     if (errcod == IPE_OK) {
 
224
       if (strcmp(line1, "RHF")==0) {
 
225
         Parameters.opentype = PARM_OPENTYPE_NONE;
 
226
         Parameters.Ms0 = 1;
 
227
         }
 
228
       else if (strcmp(line1, "ROHF")==0) {
 
229
         if (ip_data("MULTP","%d",&tval,0) == IPE_OK) {
 
230
           if (tval == 1) {
 
231
             Parameters.opentype = PARM_OPENTYPE_SINGLET;
 
232
             Parameters.Ms0 = 1;
 
233
             }
 
234
           else {
 
235
             Parameters.opentype = PARM_OPENTYPE_HIGHSPIN;
 
236
             Parameters.Ms0 = 0;
 
237
             }
 
238
           }
 
239
         else {
 
240
           fprintf(outfile, "detci: trouble reading MULTP\n");
 
241
           exit(0);
 
242
           }
 
243
         }  /* end ROHF parsing */
 
244
       else {
 
245
         fprintf(outfile, "detci: can only handle RHF or ROHF\n");
 
246
         exit(0);
 
247
         }
 
248
       }
 
249
     else Parameters.opentype = PARM_OPENTYPE_UNKNOWN;
 
250
     } /* end PSI3 parsing */
 
251
 
 
252
   errcod = ip_boolean("MS0",&(Parameters.Ms0),0);
 
253
   errcod = ip_data("REF_SYM","%d",&(Parameters.ref_sym),0);
 
254
   errcod = ip_data("OEI_FILE","%d",&(Parameters.oei_file),0);
 
255
   errcod = ip_boolean("OEI_ERASE",&(Parameters.oei_erase),0);
 
256
   errcod = ip_data("TEI_FILE","%d",&(Parameters.tei_file),0);
 
257
   errcod = ip_boolean("TEI_ERASE",&(Parameters.tei_erase),0);
 
258
   errcod = ip_data("H0_BLOCKSIZE","%d",&(Parameters.h0blocksize),0);
 
259
   Parameters.h0guess_size = Parameters.h0blocksize;
 
260
   errcod = ip_data("H0_GUESS_SIZE","%d",&(Parameters.h0guess_size),0);
 
261
   if (Parameters.h0guess_size > Parameters.h0blocksize)
 
262
     Parameters.h0guess_size = Parameters.h0blocksize; 
 
263
   errcod = ip_data("H0_BLOCK_COUPLING_SIZE","%d",
 
264
                    &(Parameters.h0block_coupling_size),0);
 
265
   errcod = ip_boolean("H0_BLOCK_COUPLING",&(Parameters.h0block_coupling),0);
 
266
   errcod = ip_data("NPRINT","%d",&(Parameters.nprint),0);
 
267
   errcod = ip_boolean("FREEZE_CORE",&(Parameters.fzc),0);
 
268
   errcod = ip_boolean("FCI",&(Parameters.fci),0);
 
269
   if (Parameters.fci) Parameters.fci_strings = 1;
 
270
   errcod = ip_boolean("FCI_STRINGS",&(Parameters.fci_strings),0);
 
271
   errcod = ip_boolean("MIXED",&(Parameters.mixed),0);
 
272
   errcod = ip_boolean("MIXED4",&(Parameters.mixed4),0);
 
273
   errcod = ip_boolean("R4S",&(Parameters.r4s),0);
 
274
   errcod = ip_boolean("REPL_OTF",&(Parameters.repl_otf),0);
 
275
   errcod = ip_boolean("CALC_SSQ",&(Parameters.calc_ssq),0);
 
276
   errcod = ip_boolean("MPN",&(Parameters.mpn),0);
 
277
   if (Parameters.mpn) {
 
278
     Parameters.mpn_schmidt = FALSE;
 
279
     Parameters.wigner = TRUE;
 
280
     Parameters.guess_vector = PARM_GUESS_VEC_UNIT;
 
281
     Parameters.hd_ave = ORB_ENER;
 
282
     Parameters.update = UPDATE_DAVIDSON;
 
283
     Parameters.hd_otf = TRUE;
 
284
     Parameters.nodfile = TRUE;
 
285
     }
 
286
   errcod = ip_data("SAVE_MPN2","%d",&(Parameters.save_mpn2),0);
 
287
   errcod = ip_data("PERTURBATION_PARAMETER","%lf",
 
288
            &(Parameters.perturbation_parameter),0);
 
289
   
 
290
   if (Parameters.perturbation_parameter <= 1.0 && 
 
291
       Parameters.perturbation_parameter >= -1.0) Parameters.z_scale_H = 1;
 
292
/*
 
293
   else { fprintf(outfile, "Parameters.perturbation_parameters beyond the"
 
294
                 "bounds of -1.0 >= z <= 1.0\n");
 
295
         exit(0);
 
296
        }
 
297
*/
 
298
   errcod = ip_boolean("MPN_SCHMIDT",&(Parameters.mpn_schmidt),0);
 
299
   errcod = ip_boolean("WIGNER",&(Parameters.wigner),0);
 
300
 
 
301
   errcod = ip_data("A_RAS3_MAX","%d",&(Parameters.a_ras3_max),0);
 
302
   errcod = ip_data("B_RAS3_MAX","%d",&(Parameters.b_ras3_max),0);
 
303
   errcod = ip_data("RAS3_MAX","%d",&(Parameters.ras3_max),0);
 
304
   errcod = ip_data("RAS4_MAX","%d",&(Parameters.ras4_max),0);
 
305
   errcod = ip_data("RAS34_MAX","%d",&(Parameters.ras34_max),0);
 
306
   errcod = ip_data("GUESS_VECTOR", "%s", line1, 0);
 
307
   if (errcod == IPE_OK) {
 
308
      if (strcmp(line1, "UNIT")==0) 
 
309
         Parameters.guess_vector = PARM_GUESS_VEC_UNIT;
 
310
      else if (strcmp(line1, "H0_BLOCK")==0) 
 
311
         Parameters.guess_vector = PARM_GUESS_VEC_H0_BLOCK;
 
312
      else if (strcmp(line1, "DFILE")==0) 
 
313
         Parameters.guess_vector = PARM_GUESS_VEC_DFILE;
 
314
      /* else if (Parameters.mpn) Parameters.guess_vector = PARM_GUESS_VEC_UNIT; */ 
 
315
      else if (strcmp(line1, "IMPORT")==0)
 
316
         Parameters.guess_vector = PARM_GUESS_VEC_IMPORT;
 
317
      else Parameters.guess_vector = PARM_GUESS_VEC_UNIT;
 
318
      }
 
319
   errcod = ip_data("ICORE", "%d", &(Parameters.icore),0);
 
320
   errcod = ip_boolean("GENCI",&(Parameters.genci),0) ;
 
321
   errcod = ip_data("HD_AVE","%s",line1, 0); 
 
322
   if (errcod == IPE_OK) {
 
323
     if (strcmp(line1, "HD_EXACT")==0)    Parameters.hd_ave = HD_EXACT;
 
324
     if (strcmp(line1, "HD_KAVE")==0)     Parameters.hd_ave = HD_KAVE;
 
325
     if (strcmp(line1, "ORB_ENER")==0)    Parameters.hd_ave = ORB_ENER;
 
326
     if (strcmp(line1, "EVANGELISTI")==0) Parameters.hd_ave = EVANGELISTI;
 
327
     if (strcmp(line1, "LEININGER")==0)   Parameters.hd_ave = LEININGER;
 
328
     if (strcmp(line1, "Z_KAVE")==0)      Parameters.hd_ave = Z_HD_KAVE;
 
329
     /* if (Parameters.mpn) Parameters.hd_ave = ORB_ENER; */ 
 
330
       }
 
331
   errcod = ip_boolean("HD_OTF",&(Parameters.hd_otf),0); 
 
332
   if (errcod == IPE_OK) Parameters.hd_otf = TRUE;
 
333
   errcod = ip_boolean("NODFILE",&(Parameters.nodfile),0); 
 
334
   if (Parameters.num_roots > 1) Parameters.nodfile = FALSE;
 
335
 
 
336
   errcod = ip_data("DIAG_METHOD","%s",line1, 0);
 
337
   if (errcod == IPE_OK) {
 
338
      if (strcmp(line1, "RSP")==0) Parameters.diag_method = METHOD_RSP;
 
339
      if (strcmp(line1, "OLSEN")==0) Parameters.diag_method = METHOD_OLSEN;
 
340
      if (strcmp(line1, "MITRUSHENKOV")==0) 
 
341
        Parameters.diag_method = METHOD_MITRUSHENKOV;
 
342
      if (strcmp(line1, "DAVIDSON")==0) 
 
343
        Parameters.diag_method = METHOD_DAVIDSON_LIU_SEM;
 
344
      if (strcmp(line1, "SEM")==0) 
 
345
        Parameters.diag_method = METHOD_DAVIDSON_LIU_SEM;
 
346
      if (strcmp(line1, "SEMTEST")==0) 
 
347
        Parameters.diag_method = METHOD_RSPTEST_OF_SEM;
 
348
      }
 
349
 
 
350
   errcod = ip_data("PRECONDITIONER","%s",line1, 0);
 
351
   if (errcod == IPE_OK) {
 
352
      if (strcmp(line1, "LANCZOS")==0) Parameters.precon = PRECON_LANCZOS;
 
353
      if (strcmp(line1, "DAVIDSON")==0) Parameters.precon = PRECON_DAVIDSON;
 
354
      if (strcmp(line1, "GEN_DAVIDSON")==0) 
 
355
        Parameters.precon = PRECON_GEN_DAVIDSON;
 
356
      if (strcmp(line1, "H0BLOCK")==0) Parameters.precon = PRECON_GEN_DAVIDSON;
 
357
      if (strcmp(line1, "H0BLOCK_INV")==0) 
 
358
        Parameters.precon = PRECON_H0BLOCK_INVERT;
 
359
      if (strcmp(line1, "ITER_INV")==0) 
 
360
        Parameters.precon = PRECON_H0BLOCK_ITER_INVERT;
 
361
      if (strcmp(line1, "H0BLOCK_COUPLING")==0) 
 
362
        Parameters.precon = PRECON_H0BLOCK_COUPLING;
 
363
      if (strcmp(line1, "EVANGELISTI")==0) 
 
364
        Parameters.precon = PRECON_EVANGELISTI;
 
365
      }
 
366
   errcod = ip_data("UPDATE","%s",line1, 0);
 
367
   if (errcod == IPE_OK) {
 
368
      if (strcmp(line1, "DAVIDSON")==0) Parameters.update = UPDATE_DAVIDSON;
 
369
      if (strcmp(line1, "OLSEN")==0) Parameters.update = UPDATE_OLSEN;
 
370
      }
 
371
   if (Parameters.diag_method < METHOD_DAVIDSON_LIU_SEM && 
 
372
       Parameters.update==UPDATE_DAVIDSON) {
 
373
     fprintf(outfile,"DAVIDSON update not available for OLSEN or MITRUSH"
 
374
             " iterators\n");
 
375
     Parameters.update = UPDATE_OLSEN;
 
376
     }
 
377
   if (Parameters.precon==PRECON_EVANGELISTI && (Parameters.update!=UPDATE_DAVIDSON 
 
378
        || Parameters.diag_method!=METHOD_DAVIDSON_LIU_SEM)) {
 
379
     fprintf(outfile,"EVANGELISTI preconditioner not available for OLSEN or"
 
380
                     " MITRUSH iterators or updates.\n");
 
381
     Parameters.update = UPDATE_DAVIDSON;
 
382
     }
 
383
   
 
384
   errcod = ip_boolean("ZERO_BLOCKS",&(Parameters.zero_blocks),0);
 
385
   if (Parameters.icore || !Parameters.mpn) Parameters.zero_blocks = 0;
 
386
   Parameters.num_init_vecs = Parameters.num_roots;
 
387
   errcod = ip_data("NUM_INIT_VECS","%d",&(Parameters.num_init_vecs),0);
 
388
 
 
389
   errcod = ip_data("COLLAPSE_SIZE", "%d", &(Parameters.collapse_size),0);
 
390
   if (Parameters.collapse_size < 1) Parameters.collapse_size = 1;
 
391
 
 
392
   errcod = ip_data("LSE_COLLAPSE", "%d", &(Parameters.lse_collapse),0);
 
393
   if (Parameters.lse_collapse < 1) Parameters.lse_collapse = 3;
 
394
 
 
395
   errcod = ip_boolean("LSE",&(Parameters.lse),0) ;
 
396
 
 
397
   errcod = ip_data("LSE_TOLERANCE", "%d", &(Parameters.lse_tolerance),0);
 
398
 
 
399
   errcod = ip_data("MAXNVECT", "%d", &(Parameters.maxnvect),0);
 
400
   if (Parameters.maxnvect == 0 &&  
 
401
       Parameters.diag_method == METHOD_DAVIDSON_LIU_SEM) {
 
402
      Parameters.maxnvect = Parameters.maxiter * Parameters.num_roots
 
403
         + Parameters.num_init_vecs;
 
404
      }
 
405
   else if (Parameters.maxnvect == 0 && 
 
406
            Parameters.diag_method == METHOD_RSPTEST_OF_SEM) {
 
407
      Parameters.maxnvect = Parameters.maxiter * Parameters.num_roots
 
408
         + Parameters.num_init_vecs;
 
409
      }
 
410
   else if (Parameters.maxnvect == 0 && 
 
411
            Parameters.diag_method == METHOD_MITRUSHENKOV) {
 
412
      Parameters.maxnvect = 2;
 
413
      }
 
414
   else if (Parameters.maxnvect == 0 && 
 
415
            Parameters.diag_method == METHOD_OLSEN) {
 
416
      Parameters.maxnvect = 1;
 
417
      }
 
418
   else { /* the user tried to specify a value for maxnvect...check it */
 
419
   /*    if (Parameters.maxnvect / (Parameters.collapse_size * 
 
420
         Parameters.num_roots) < 2) {
 
421
         fprintf(outfile, "maxnvect must be at least twice collapse_size *");
 
422
         fprintf(outfile, " num_roots.\n"); 
 
423
         exit(0);
 
424
         }
 
425
   */
 
426
      }
 
427
      
 
428
   errcod = ip_data("NUNITS", "%d", &(Parameters.nunits),0);
 
429
   errcod = ip_data("FIRST_TMP_UNIT", "%d", &(Parameters.first_tmp_unit),0);
 
430
   errcod = ip_data("FIRST_HD_TMP_UNIT","%d",&(Parameters.first_hd_tmp_unit),0);
 
431
   errcod = ip_data("FIRST_C_TMP_UNIT","%d",&(Parameters.first_c_tmp_unit),0);
 
432
   errcod = ip_data("FIRST_S_TMP_UNIT","%d",&(Parameters.first_s_tmp_unit),0);
 
433
   errcod = ip_data("FIRST_D_TMP_UNIT","%d",&(Parameters.first_d_tmp_unit),0);
 
434
   errcod = ip_data("NUM_HD_TMP_UNITS","%d",&(Parameters.num_hd_tmp_units),0);
 
435
   errcod = ip_data("NUM_C_TMP_UNITS","%d",&(Parameters.num_c_tmp_units),0);
 
436
   errcod = ip_data("NUM_S_TMP_UNITS","%d",&(Parameters.num_s_tmp_units),0);
 
437
   errcod = ip_data("NUM_D_TMP_UNITS","%d",&(Parameters.num_d_tmp_units),0);
 
438
 
 
439
   if (Parameters.first_hd_tmp_unit == 0) 
 
440
     Parameters.first_hd_tmp_unit = Parameters.first_tmp_unit;
 
441
/*   if ( (Parameters.num_hd_tmp_units == 0) && (!Parameters.hd_otf) ) */
 
442
   if (Parameters.num_hd_tmp_units == 0)
 
443
     Parameters.num_hd_tmp_units = 1;
 
444
   if (Parameters.first_c_tmp_unit == 0) Parameters.first_c_tmp_unit = 
 
445
      Parameters.first_hd_tmp_unit + Parameters.num_hd_tmp_units;
 
446
   if (Parameters.num_c_tmp_units == 0) Parameters.num_c_tmp_units = 
 
447
      Parameters.nunits;
 
448
   if (Parameters.first_s_tmp_unit == 0) Parameters.first_s_tmp_unit = 
 
449
      Parameters.first_c_tmp_unit + Parameters.num_c_tmp_units;
 
450
   if (Parameters.num_s_tmp_units == 0) Parameters.num_s_tmp_units = 
 
451
      Parameters.nunits;
 
452
   if (Parameters.first_d_tmp_unit == 0) Parameters.first_d_tmp_unit =
 
453
      Parameters.first_s_tmp_unit + Parameters.num_s_tmp_units;
 
454
 /*  if ( (Parameters.num_d_tmp_units == 0) && (!Parameters.nodfile) ) */
 
455
   if (Parameters.num_d_tmp_units == 0) 
 
456
     Parameters.num_d_tmp_units = 1;
 
457
 
 
458
   errcod = ip_boolean("RESTART",&(Parameters.restart),0);
 
459
   errcod = ip_data("RESTART_ITER","%d",&(Parameters.restart_iter),0);
 
460
   errcod = ip_data("RESTART_VECS","%d",&(Parameters.restart_vecs),0);
 
461
   if (Parameters.restart && (errcod!=IPE_OK || Parameters.restart_vecs==0)) {
 
462
      fprintf(outfile, "For RESTART must specify nonzero RESTART_VECS\n");
 
463
      exit(0);
 
464
      }
 
465
   errcod = ip_boolean("BENDAZZOLI",&(Parameters.bendazzoli),0) ;
 
466
   if (Parameters.bendazzoli & !Parameters.fci) Parameters.bendazzoli=0;
 
467
 
 
468
   /* Parse the OPDM stuff.  It is possible to give incompatible options,
 
469
    * but we will try to eliminate some of those.  Parameters_opdm will
 
470
    * function as the master switch for all other OPDM parameters.
 
471
    */
 
472
   errcod = ip_boolean("OPDM_PRINT",&(Parameters.opdm_print),0);
 
473
   errcod = ip_data("OPDM_FILE","%d",&(Parameters.opdm_file),0);
 
474
   errcod = ip_boolean("WRTNOS",&(Parameters.opdm_wrtnos),0);
 
475
   errcod = ip_boolean("OPDM_DIAG",&(Parameters.opdm_diag),0);
 
476
   errcod = ip_boolean("OPDM_AVE",&(Parameters.opdm_ave),0);
 
477
   errcod = ip_data("ORBSFILE","%d",&(Parameters.opdm_orbsfile),0);
 
478
   errcod = ip_data("ORBS_ROOT","%d",&(Parameters.opdm_orbs_root),0);
 
479
   errcod = ip_boolean("OPDM_KE",&(Parameters.opdm_ke),0);
 
480
   errcod = ip_data("ROOT","%d",&(Parameters.root),0);
 
481
   Parameters.root -= 1;
 
482
   
 
483
   if (Parameters.opdm_orbs_root != -1) Parameters.opdm_orbs_root -= 1;
 
484
   if (Parameters.opdm_orbs_root < 0) Parameters.opdm_orbs_root = 0;
 
485
   if (Parameters.opdm_wrtnos) Parameters.opdm_diag = 1;
 
486
   if (Parameters.opdm_print || Parameters.opdm_diag || Parameters.opdm_wrtnos 
 
487
       || Parameters.opdm_ave || Parameters.opdm_ke) Parameters.opdm = 1;
 
488
   errcod = ip_boolean("OPDM",&(Parameters.opdm),0);
 
489
   if (Parameters.opdm) Parameters.opdm_write = 1;
 
490
   errcod = ip_boolean("OPDM_WRITE",&(Parameters.opdm_write),0);
 
491
   errcod = ip_boolean("OPDM_PRINT",&(Parameters.opdm_print),0);
 
492
   errcod = ip_data("OPDM_DIAG","%d",&(Parameters.opdm_diag),0);
 
493
 
 
494
   errcod = ip_boolean("TPDM",&(Parameters.tpdm),0);
 
495
   if (Parameters.tpdm) Parameters.tpdm_write = 1;
 
496
   errcod = ip_boolean("TPDM_WRITE",&(Parameters.tpdm_write),0);
 
497
   errcod = ip_boolean("TPDM_PRINT",&(Parameters.tpdm_print),0);
 
498
   errcod = ip_data("TPDM_FILE","%d",&(Parameters.tpdm_file),0);
 
499
 
 
500
   if (Parameters.guess_vector == PARM_GUESS_VEC_DFILE &&
 
501
       strcmp(Parameters.wfn, "DETCAS")!=0) {
 
502
 
 
503
      chkpt_init(PSIO_OPEN_OLD);
 
504
      i = chkpt_rd_phase_check();
 
505
      chkpt_close();
 
506
 
 
507
      if (!i) {
 
508
         fprintf(outfile, "Can't use d file guess: SCF phase not checked\n");
 
509
         if (Parameters.h0guess_size) {
 
510
            Parameters.guess_vector = PARM_GUESS_VEC_H0_BLOCK;
 
511
            if (Parameters.precon == PRECON_GEN_DAVIDSON)
 
512
              Parameters.precon = PRECON_H0BLOCK_ITER_INVERT;
 
513
         }
 
514
         else Parameters.guess_vector = PARM_GUESS_VEC_UNIT;
 
515
      }
 
516
     }
 
517
   if (Parameters.num_init_vecs < Parameters.num_roots)
 
518
     Parameters.num_init_vecs = Parameters.num_roots;
 
519
   if (Parameters.guess_vector == PARM_GUESS_VEC_UNIT &&
 
520
       Parameters.num_init_vecs > 1) {
 
521
     Parameters.guess_vector = PARM_GUESS_VEC_H0_BLOCK;
 
522
     fprintf(outfile,"Warning: Unit vec option not available for more than"
 
523
             " one root\n");
 
524
     }
 
525
   if (Parameters.guess_vector == PARM_GUESS_VEC_UNIT)
 
526
     Parameters.h0blocksize = Parameters.h0guess_size = 1;
 
527
 
 
528
   errcod = ip_data("NTHREADS", "%d", &(Parameters.nthreads),0);
 
529
   if (Parameters.nthreads < 1) Parameters.nthreads = 1;
 
530
   errcod = ip_boolean("PTHREADS",&(Parameters.pthreads),0);
 
531
   if (!Parameters.pthreads) Parameters.nthreads = 1;
 
532
 
 
533
   Parameters.export_ci_vector = 0;
 
534
   errcod = ip_boolean("EXPORT_VECTOR", &(Parameters.export_ci_vector), 0);
 
535
 
 
536
   Parameters.num_export = 0;
 
537
   if (Parameters.export_ci_vector) {
 
538
     Parameters.num_export = 1;
 
539
     errcod = ip_data("NUM_EXPORT", "%d", &(Parameters.num_export), 0);
 
540
     if (Parameters.num_export > Parameters.num_roots) {
 
541
       fprintf(outfile, "Warning: can't export %d roots if %d requested\n",
 
542
         Parameters.num_export, Parameters.num_roots);
 
543
       Parameters.num_export = Parameters.num_roots;
 
544
     }
 
545
   } 
 
546
   
 
547
   errcod = ip_boolean("SF_RESTRICT",&(Parameters.sf_restrict),0);
 
548
 
 
549
   /* The filter_guess options are used to filter out some trial
 
550
      vectors which may not have the appropriate phase convention
 
551
      between two determinants.  This is useful to remove, e.g.,
 
552
      delta states when a sigma state is desired.  The user
 
553
      inputs two determinants (by giving the absolute alpha string
 
554
      number and beta string number for each), and also the
 
555
      desired phase between these two determinants for guesses
 
556
      which are to be kept.
 
557
    */
 
558
   Parameters.filter_guess = 0;
 
559
   errcod = ip_boolean("FILTER_GUESS",&(Parameters.filter_guess),0);
 
560
   if (errcod == IPE_OK && Parameters.filter_guess == 1) {
 
561
     Parameters.filter_guess_sign = 1;
 
562
     errcod = ip_data("FILTER_GUESS_SIGN","%d",
 
563
                      &(Parameters.filter_guess_sign),0);
 
564
     if (errcod != IPE_OK || (Parameters.filter_guess_sign != 1 &&
 
565
         Parameters.filter_guess_sign != -1)) {
 
566
       fprintf(outfile, "FILTER_GUESS_SIGN should be 1 or -1 !\n");
 
567
       abort();
 
568
     }
 
569
     errcod = ip_count("FILTER_GUESS_DET1",&i,0); 
 
570
     if (errcod != IPE_OK || i != 2) {
 
571
       fprintf(outfile, "Need to specify FILTER_GUESS_DET1 = "
 
572
                        "(alphastr betastr)\n");
 
573
       abort();
 
574
     }
 
575
     else {
 
576
       errcod = ip_data("FILTER_GUESS_DET1","%d",
 
577
                        &(Parameters.filter_guess_Ia),1,0);
 
578
       errcod = ip_data("FILTER_GUESS_DET1","%d",
 
579
                        &(Parameters.filter_guess_Ib),1,1);
 
580
     }
 
581
 
 
582
     errcod = ip_count("FILTER_GUESS_DET2",&i,0); 
 
583
     if (errcod != IPE_OK || i != 2) {
 
584
       fprintf(outfile, "Need to specify FILTER_GUESS_DET2 = "
 
585
                        "(alphastr betastr)\n");
 
586
       abort();
 
587
     }
 
588
     else {
 
589
       errcod = ip_data("FILTER_GUESS_DET2","%d",
 
590
                        &(Parameters.filter_guess_Ja),1,0);
 
591
       errcod = ip_data("FILTER_GUESS_DET2","%d",
 
592
                        &(Parameters.filter_guess_Jb),1,1);
 
593
     }
 
594
   } /* end the filter_guess stuff */
 
595
}
 
596
 
 
597
 
 
598
/*
 
599
** print_parameters(): Function prints the program's running parameters
 
600
**   found in the Parameters structure.
 
601
*/
 
602
void print_parameters(void)
 
603
{
 
604
   fprintf(outfile, "\n");
 
605
   fprintf(outfile, "PARAMETERS: \n");
 
606
   fprintf(outfile, "   EX LVL        =   %6d      H0 BLOCKSIZE =   %6d\n", 
 
607
      Parameters.ex_lvl, Parameters.h0blocksize);
 
608
   fprintf(outfile, "   VAL EX LVL    =   %6d      H0 GUESS SIZE=   %6d\n", 
 
609
      Parameters.val_ex_lvl, Parameters.h0guess_size);
 
610
   fprintf(outfile, "   H0COUPLINGSIZE=   %6d      H0 COUPLING  =   %6s\n", 
 
611
      Parameters.h0block_coupling_size, Parameters.h0block_coupling ? "yes" : "no");
 
612
   fprintf(outfile, "   NPRINT        =   %6d      MAX DET      =   %6d\n", 
 
613
      Parameters.nprint, Parameters.max_dets);
 
614
   fprintf(outfile, "   MAXITER       =   %6d      FREEZE CORE  =   %6s\n", 
 
615
      Parameters.maxiter, Parameters.fzc ? "yes" : "no");
 
616
   fprintf(outfile, "   NUM ROOTS     =   %6d      ICORE        =   %6d\n", 
 
617
      Parameters.num_roots, Parameters.icore);
 
618
   fprintf(outfile, "   PRINT         =   %6d      FCI          =   %6s\n", 
 
619
      Parameters.print_lvl, Parameters.fci ? "yes" : "no");
 
620
   if (Parameters.have_special_conv) 
 
621
      fprintf(outfile, 
 
622
         "   CONV          =   %8.2g    MIXED        =   %6s\n", 
 
623
         Parameters.special_conv, Parameters.mixed ? "yes" : "no");
 
624
   else
 
625
      fprintf(outfile, "   CONV          =   %6d      MIXED        =   %6s\n", 
 
626
         Parameters.convergence, Parameters.mixed ? "yes" : "no");
 
627
 
 
628
   fprintf(outfile, "   E CONV        =   %6d      MIXED4       =   %6s\n", 
 
629
      Parameters.energy_convergence, Parameters.mixed4 ? "yes" : "no");
 
630
   fprintf(outfile, "   OEI FILE      =   %6d      R4S          =   %6s\n", 
 
631
      Parameters.oei_file, Parameters.r4s ? "yes" : "no");
 
632
   fprintf(outfile, "   OEI ERASE     =   %6s      REPL OTF     =   %6s\n",  
 
633
      Parameters.oei_erase ? "yes" : "no", Parameters.repl_otf ? "yes" : "no");
 
634
   fprintf(outfile, "   TEI FILE      =   %6d      DIAG METHOD  =   ", 
 
635
      Parameters.tei_file);
 
636
 
 
637
   switch (Parameters.diag_method) {
 
638
      case 0:
 
639
         fprintf(outfile, "%6s\n", "RSP");
 
640
         break;
 
641
      case 1:
 
642
         fprintf(outfile, "%6s\n", "OLSEN");
 
643
         break;
 
644
      case 2:
 
645
         fprintf(outfile, "%6s\n", "MITRUS");
 
646
         break;
 
647
      case 3:
 
648
         fprintf(outfile, "%6s\n", "SEM");
 
649
         break;
 
650
      case 4:
 
651
         fprintf(outfile, "%6s\n", "SEMTEST");
 
652
         break;
 
653
      default:
 
654
         fprintf(outfile, "%6s\n", "???");
 
655
         break;
 
656
      } 
 
657
 
 
658
   fprintf(outfile, "   PRECONDITIONER= ");
 
659
   switch (Parameters.precon) {
 
660
      case PRECON_LANCZOS:
 
661
         fprintf(outfile, "%6s", " LANCZOS    ");
 
662
         break;
 
663
      case PRECON_DAVIDSON:
 
664
         fprintf(outfile, "%6s", "DAVIDSON    ");
 
665
         break;
 
666
      case PRECON_GEN_DAVIDSON:
 
667
         fprintf(outfile, "%6s", "GEN_DAVIDSON");
 
668
         break;
 
669
      case PRECON_H0BLOCK_INVERT:
 
670
         fprintf(outfile, "%6s", "H0BLOCK_INV ");
 
671
         break;
 
672
      case PRECON_H0BLOCK_ITER_INVERT:
 
673
         fprintf(outfile, "%6s", "ITER_INV    ");
 
674
         break;
 
675
      case PRECON_H0BLOCK_COUPLING:
 
676
         fprintf(outfile, "%6s", "H0_COUPLING ");
 
677
         break;
 
678
      case PRECON_EVANGELISTI:
 
679
         fprintf(outfile, "%6s", "EVANGELISTI ");
 
680
         break;
 
681
      default:
 
682
         fprintf(outfile, "%6s", "???         ");
 
683
         break;
 
684
      } 
 
685
 
 
686
   fprintf(outfile, "  UPDATE       =   ");
 
687
   switch (Parameters.update) {
 
688
     case 1:
 
689
       fprintf(outfile, "%6s\n", "DAVIDSON");
 
690
       break;
 
691
     case 2:
 
692
       fprintf(outfile, "%6s\n", "OLSEN");  
 
693
       break;
 
694
     default:
 
695
       fprintf(outfile, "%6s\n", "???");
 
696
       break;
 
697
      }
 
698
 
 
699
   fprintf(outfile, "   S             =   %6d      Ms0          =   %6s\n",
 
700
      Parameters.S, Parameters.Ms0 ? "yes" : "no");           
 
701
   fprintf(outfile, "   TEI ERASE     =   %6s      MAXNVECT     =   %6d\n", 
 
702
      Parameters.tei_erase ? "yes" : "no", Parameters.maxnvect);
 
703
   fprintf(outfile, "   RESTART       =   %6s      RESTART VECS =   %6d\n",
 
704
      Parameters.restart ? "yes" : "no", Parameters.restart_vecs);
 
705
   fprintf(outfile, "   GUESS VECTOR  =  ");
 
706
   switch (Parameters.guess_vector) {
 
707
      case PARM_GUESS_VEC_UNIT:
 
708
         fprintf(outfile, "%7s", "UNIT");
 
709
         break; 
 
710
      case PARM_GUESS_VEC_H0_BLOCK:
 
711
         fprintf(outfile, "%7s", "H0BLOCK");
 
712
         break;
 
713
      case PARM_GUESS_VEC_DFILE:
 
714
         fprintf(outfile, "%7s", "D FILE");
 
715
         break;
 
716
      case PARM_GUESS_VEC_IMPORT:
 
717
         fprintf(outfile, "%7s", "IMPORT");
 
718
         break;
 
719
      default:
 
720
         fprintf(outfile, "%7s", "???");
 
721
         break;
 
722
      }
 
723
   fprintf(outfile, "      OPENTYPE     = ");
 
724
   switch (Parameters.opentype) {
 
725
      case PARM_OPENTYPE_NONE:
 
726
         fprintf(outfile, "%8s\n", "NONE");
 
727
         break;
 
728
      case PARM_OPENTYPE_HIGHSPIN:
 
729
         fprintf(outfile, "%8s\n", "HIGHSPIN");
 
730
         break;
 
731
      case PARM_OPENTYPE_SINGLET:
 
732
         fprintf(outfile, "%8s\n", "SINGLET");
 
733
         break;
 
734
      default:
 
735
         fprintf(outfile, "%8s\n", "???"); 
 
736
         break;
 
737
      }
 
738
   fprintf(outfile, "   GENCI ALG     =   %6s",
 
739
      Parameters.genci ? "yes" : "no");
 
740
   if (Parameters.ref_sym == -1)
 
741
      fprintf(outfile, "      REF SYM      =   %6s\n", "auto");
 
742
   else
 
743
      fprintf(outfile, "      REF SYM      =   %6d\n", Parameters.ref_sym);
 
744
 
 
745
   fprintf(outfile, "   COLLAPSE SIZE =   %6d", Parameters.collapse_size);
 
746
   fprintf(outfile, "      HD AVE       =");
 
747
   switch (Parameters.hd_ave) {
 
748
     case HD_EXACT:
 
749
       fprintf(outfile," %11s\n", "HD_EXACT");
 
750
       break;
 
751
     case HD_KAVE:
 
752
       fprintf(outfile," %11s\n", "HD_KAVE");
 
753
       break;
 
754
     case ORB_ENER:
 
755
       fprintf(outfile," %11s\n", "ORB_ENER");
 
756
       break;
 
757
     case EVANGELISTI:
 
758
       fprintf(outfile," %11s\n", "EVANGELISTI");
 
759
       break;
 
760
     case LEININGER:
 
761
       fprintf(outfile," %11s\n", "LEININGER");
 
762
       break;
 
763
     default:
 
764
       fprintf(outfile," %11s\n", "???");       
 
765
       break;
 
766
     }
 
767
 
 
768
   fprintf(outfile, "   LSE           =   %6s      LSE ITER     =   %6d\n", 
 
769
           Parameters.lse ? "yes" : "no", Parameters.lse_iter);
 
770
   fprintf(outfile, "   HD OTF        =   %6s      NO DFILE     =   %6s\n", 
 
771
           Parameters.hd_otf ? "yes" : "no", Parameters.nodfile ? "yes":"no");
 
772
   fprintf(outfile, "   MPN           =   %6s      MPN SCHMIDT  =   %6s\n",
 
773
           Parameters.mpn ? "yes":"no", Parameters.mpn_schmidt ? "yes":"no");
 
774
   fprintf(outfile, "   WIGNER        =   %6s      ZERO BLOCKS  =   %6s\n", 
 
775
           Parameters.wigner ? "yes":"no", Parameters.zero_blocks ? "yes":"no");
 
776
   fprintf(outfile, "   PERT Z        =   %1.4f      ROOT         =   %6d\n",
 
777
           Parameters.perturbation_parameter, Parameters.root);
 
778
   fprintf(outfile, "   PTHREADS      =   %6s      NTHREADS     =   %6d\n",
 
779
           Parameters.pthreads ? "yes":"no", Parameters.nthreads);
 
780
   fprintf(outfile, "   EXPORT VECTOR =   %6s      NUM EXPORT   =   %6d\n",
 
781
           Parameters.export_ci_vector ? "yes":"no", Parameters.num_export);
 
782
   fprintf(outfile, "   FILTER_GUESS  =   %6s      SF_RESTRICT  =   %6s\n",
 
783
           Parameters.filter_guess ?  "yes":"no",
 
784
           Parameters.sf_restrict ? "yes":"no");
 
785
   fprintf(outfile, "\n   FILES         =     %3d %3d %3d %3d\n",
 
786
      Parameters.first_hd_tmp_unit, Parameters.first_c_tmp_unit,
 
787
      Parameters.first_s_tmp_unit, Parameters.first_d_tmp_unit);
 
788
 
 
789
   fprintf(outfile, "\n") ;
 
790
   fflush(outfile) ;
 
791
}
 
792
 
 
793
 
 
794
/*
 
795
** set_ras_parms(): Set the RAS parameters or their conventional equivalents
 
796
**   (i.e. fermi level, etc).
 
797
**
 
798
*/
 
799
void set_ras_parms(void)
 
800
{
 
801
   int i,j,cnt;
 
802
   int errcod;
 
803
   int tot_expl_el,nras2alp,nras2bet,betsocc;
 
804
   int *ras1, *ras2, *ras3;
 
805
   int *orbsym;
 
806
 
 
807
   for (i=0,j=0; i<CalcInfo.nirreps; i++) j += CalcInfo.ras_opi[0][i];
 
808
   Parameters.a_ras1_lvl = Parameters.b_ras1_lvl = Parameters.ras1_lvl = j-1;
 
809
 
 
810
   /* figure out how many electrons are in RAS II */
 
811
   /* alpha electrons */
 
812
   for (i=0,nras2alp=0,betsocc=0; i<CalcInfo.nirreps; i++) {
 
813
      j = CalcInfo.docc[i] - CalcInfo.frozen_docc[i] - CalcInfo.ras_opi[0][i];
 
814
      if (Parameters.opentype == PARM_OPENTYPE_HIGHSPIN) {
 
815
         j += CalcInfo.socc[i];
 
816
         }
 
817
      else if (Parameters.opentype == PARM_OPENTYPE_SINGLET) {
 
818
         if (betsocc + CalcInfo.socc[i] <= CalcInfo.spab)
 
819
            betsocc += CalcInfo.socc[i];
 
820
         else {
 
821
            j += CalcInfo.socc[i] - (CalcInfo.spab - betsocc);
 
822
            betsocc = CalcInfo.spab;
 
823
            }
 
824
         }
 
825
      if (j > 0) nras2alp += j;
 
826
      if (j > CalcInfo.ras_opi[1][i]) {
 
827
         fprintf(outfile, "(set_ras_parms): detecting %d electrons ",
 
828
            j - CalcInfo.ras_opi[1][i]);
 
829
         fprintf(outfile, "in RAS III for irrep %d.\n", i);
 
830
         fprintf(outfile, "Some parts of DETCI assume all elec in I and II\n");
 
831
         }
 
832
      }
 
833
   /* beta electrons */
 
834
   for (i=0,nras2bet=0,betsocc=0; i<CalcInfo.nirreps; i++) {
 
835
      j = CalcInfo.docc[i] - CalcInfo.frozen_docc[i] - CalcInfo.ras_opi[0][i];
 
836
      if (Parameters.opentype == PARM_OPENTYPE_SINGLET && CalcInfo.socc[i]) {
 
837
         if (betsocc + CalcInfo.socc[i] <= CalcInfo.spab)
 
838
            j += CalcInfo.socc[i];
 
839
         else {
 
840
            j += CalcInfo.spab - betsocc;
 
841
            betsocc = CalcInfo.spab;
 
842
            }
 
843
         }
 
844
      if (j > 0) nras2bet += j;
 
845
      if (j > CalcInfo.ras_opi[1][i]) {
 
846
         fprintf(outfile, "(set_ras_parms): detecting %d electrons ",
 
847
            j - CalcInfo.ras_opi[1][i]);
 
848
         fprintf(outfile, "in RAS III for irrep %d.\n", i);
 
849
         fprintf(outfile, "Some parts of DETCI assume all elec in I and II\n");
 
850
         }
 
851
      }
 
852
 
 
853
   Parameters.a_ras1_max = (CalcInfo.num_alp_expl >
 
854
         Parameters.a_ras1_lvl + 1) ? Parameters.a_ras1_lvl + 1 :
 
855
         (CalcInfo.num_alp_expl) ;
 
856
   if (Parameters.fzc) Parameters.a_ras1_max += CalcInfo.num_fzc_orbs;
 
857
 
 
858
   Parameters.b_ras1_max = (CalcInfo.num_bet_expl >
 
859
         Parameters.b_ras1_lvl + 1) ? Parameters.b_ras1_lvl + 1:
 
860
         (CalcInfo.num_bet_expl) ;
 
861
   if (Parameters.fzc) Parameters.b_ras1_max += CalcInfo.num_fzc_orbs;
 
862
 
 
863
   for (i=0,j=0; i<CalcInfo.nirreps; i++) j += CalcInfo.ras_opi[1][i];
 
864
   Parameters.ras3_lvl = Parameters.ras1_lvl + j + 1;
 
865
 
 
866
   for (i=0,j=0; i<CalcInfo.nirreps; i++) j += CalcInfo.ras_opi[2][i];
 
867
   Parameters.ras4_lvl = Parameters.ras3_lvl + j;
 
868
 
 
869
 
 
870
   /* check Parameters to make sure everything consistent */
 
871
 
 
872
   /* deduce Parameters.a_ras3_max and Parameters.b_ras3_max if needed */
 
873
   if (Parameters.a_ras3_max == -1 || Parameters.b_ras3_max == -1) {
 
874
      if (Parameters.ras3_max != -1) { /* have parsed ras3_max */
 
875
         Parameters.a_ras3_max = (Parameters.ras3_max <= CalcInfo.num_alp_expl)
 
876
            ? Parameters.ras3_max : CalcInfo.num_alp_expl;
 
877
         Parameters.b_ras3_max = (Parameters.ras3_max <= CalcInfo.num_bet_expl)
 
878
            ? Parameters.ras3_max : CalcInfo.num_bet_expl;
 
879
         }
 
880
      else {
 
881
         Parameters.a_ras3_max = (Parameters.ex_lvl <= CalcInfo.num_alp_expl) 
 
882
            ? Parameters.ex_lvl : CalcInfo.num_alp_expl;
 
883
         Parameters.b_ras3_max = (Parameters.ex_lvl <= CalcInfo.num_bet_expl) 
 
884
            ? Parameters.ex_lvl : CalcInfo.num_bet_expl; 
 
885
         }
 
886
      }
 
887
 
 
888
   if (Parameters.ras4_max != -1) { /* have parsed */
 
889
      Parameters.a_ras4_max = (Parameters.ras4_max <= CalcInfo.num_alp_expl)
 
890
        ? Parameters.ras4_max : CalcInfo.num_alp_expl;
 
891
      Parameters.b_ras4_max = (Parameters.ras4_max <= CalcInfo.num_bet_expl)
 
892
        ? Parameters.ras4_max : CalcInfo.num_bet_expl;
 
893
      }
 
894
   else {
 
895
      Parameters.a_ras4_max = Parameters.a_ras3_max;
 
896
      Parameters.b_ras4_max = Parameters.b_ras3_max;
 
897
   }
 
898
 
 
899
   if (Parameters.ras34_max != -1) { /* have parsed */
 
900
      Parameters.a_ras34_max = Parameters.ras34_max;
 
901
      Parameters.b_ras34_max = Parameters.ras34_max;
 
902
      }
 
903
   else {
 
904
      Parameters.a_ras34_max = Parameters.a_ras3_max;
 
905
      Parameters.b_ras34_max = Parameters.b_ras3_max;
 
906
      }
 
907
 
 
908
   i = Parameters.ras4_lvl - Parameters.ras3_lvl;
 
909
   if (Parameters.a_ras3_max > i) Parameters.a_ras3_max = i;
 
910
   if (Parameters.b_ras3_max > i) Parameters.b_ras3_max = i;
 
911
 
 
912
   i = CalcInfo.num_ci_orbs - Parameters.ras4_lvl;
 
913
   if (Parameters.a_ras4_max > i) Parameters.a_ras4_max = i;
 
914
   if (Parameters.b_ras4_max > i) Parameters.b_ras4_max = i;
 
915
 
 
916
   i = CalcInfo.num_ci_orbs - Parameters.ras3_lvl;
 
917
   if (Parameters.a_ras34_max > i) Parameters.a_ras34_max = i;
 
918
   if (Parameters.b_ras34_max > i) Parameters.b_ras34_max = i;
 
919
 
 
920
   i = (CalcInfo.num_alp_expl <= Parameters.a_ras1_lvl + 1) ? 
 
921
      CalcInfo.num_alp_expl : Parameters.a_ras1_lvl + 1;
 
922
   Parameters.a_ras1_min = i - Parameters.ex_lvl -
 
923
      Parameters.val_ex_lvl;
 
924
   if (Parameters.a_ras1_min < 0) Parameters.a_ras1_min = 0;
 
925
   Parameters.a_ras1_min += CalcInfo.num_fzc_orbs;
 
926
   Parameters.a_ras1_min += CalcInfo.num_cor_orbs;
 
927
 
 
928
   i = (CalcInfo.num_bet_expl <= Parameters.b_ras1_lvl + 1) ? 
 
929
      CalcInfo.num_bet_expl : Parameters.b_ras1_lvl + 1;
 
930
   Parameters.b_ras1_min = i - Parameters.ex_lvl -
 
931
      Parameters.val_ex_lvl;
 
932
   if (Parameters.b_ras1_min < 0) Parameters.b_ras1_min = 0;
 
933
   Parameters.b_ras1_min += CalcInfo.num_fzc_orbs;
 
934
   Parameters.b_ras1_min += CalcInfo.num_cor_orbs;
 
935
 
 
936
   tot_expl_el = CalcInfo.num_alp_expl + CalcInfo.num_bet_expl;
 
937
   if (Parameters.ras3_max == -1) {
 
938
      Parameters.ras3_max = (Parameters.ex_lvl <= tot_expl_el) ?
 
939
         Parameters.ex_lvl : tot_expl_el ;
 
940
      }
 
941
   else {
 
942
      if (Parameters.ras3_max > tot_expl_el) 
 
943
         Parameters.ras3_max = tot_expl_el;
 
944
      }
 
945
 
 
946
   if (Parameters.ras34_max == -1) Parameters.ras34_max = Parameters.ras3_max;
 
947
 
 
948
   i = 2 * (Parameters.ras4_lvl - Parameters.ras3_lvl);
 
949
   if (i < Parameters.ras3_max) Parameters.ras3_max = i;
 
950
 
 
951
   i = 2 * (CalcInfo.num_ci_orbs - Parameters.ras3_lvl);
 
952
   if (i < Parameters.ras34_max) Parameters.ras34_max = i;
 
953
 
 
954
   i = (tot_expl_el < 2*(Parameters.ras1_lvl + 1)) ? tot_expl_el :
 
955
      2*(Parameters.ras1_lvl + 1) ;
 
956
   
 
957
   Parameters.ras1_min = i - Parameters.ex_lvl - 
 
958
      Parameters.val_ex_lvl + 2 * CalcInfo.num_fzc_orbs;
 
959
   
 
960
   if (Parameters.a_ras1_min + Parameters.b_ras1_min > Parameters.ras1_min)
 
961
      Parameters.ras1_min = Parameters.a_ras1_min + Parameters.b_ras1_min;
 
962
 
 
963
   if (Parameters.ras4_max == -1) {
 
964
      Parameters.ras4_max = (Parameters.ex_lvl <= tot_expl_el) ?
 
965
         Parameters.ex_lvl : tot_expl_el;
 
966
      }
 
967
 
 
968
   i = 2 * (CalcInfo.num_ci_orbs - Parameters.ras4_lvl);
 
969
   if (i < Parameters.ras4_max) Parameters.ras4_max = i;
 
970
 
 
971
   if (Parameters.print_lvl) {
 
972
      fprintf(outfile, "   RAS1 LVL     =   %6d      A RAS3 MAX   =   %6d\n",
 
973
         Parameters.ras1_lvl, Parameters.a_ras3_max);
 
974
      fprintf(outfile, "   RAS1 MIN     =   %6d      B RAS3 MAX   =   %6d\n",
 
975
         Parameters.ras1_min, Parameters.b_ras3_max);
 
976
      fprintf(outfile, "   A RAS1 LVL   =   %6d      RAS4 LVL     =   %6d\n", 
 
977
         Parameters.a_ras1_lvl, Parameters.ras4_lvl);
 
978
      fprintf(outfile, "   A RAS1 MIN   =   %6d      A RAS4 MAX   =   %6d\n", 
 
979
         Parameters.a_ras1_min, Parameters.a_ras4_max);
 
980
      fprintf(outfile, "   A RAS1 MAX   =   %6d      B RAS4 MAX   =   %6d\n", 
 
981
         Parameters.a_ras1_max, Parameters.b_ras4_max);
 
982
      fprintf(outfile, "   B RAS1 LVL   =   %6d      RAS4 MAX     =   %6d\n", 
 
983
         Parameters.b_ras1_lvl, Parameters.ras4_max);
 
984
      fprintf(outfile, "   B RAS1 MIN   =   %6d      A RAS34 MAX  =   %6d\n", 
 
985
         Parameters.b_ras1_min, Parameters.a_ras34_max);
 
986
      fprintf(outfile, "   B RAS1 MAX   =   %6d      B RAS34 MAX  =   %6d\n", 
 
987
         Parameters.b_ras1_max, Parameters.b_ras34_max);
 
988
      fprintf(outfile, "   RAS3 LVL     =   %6d      RAS34 MAX    =   %6d\n", 
 
989
         Parameters.ras3_lvl, Parameters.ras34_max);
 
990
      fprintf(outfile, "   RAS3 MAX     =   %6d\n", Parameters.ras3_max);
 
991
 
 
992
   
 
993
      fprintf(outfile, "\n");
 
994
      fprintf(outfile, "   DOCC         = ") ;
 
995
      for (i=0; i<CalcInfo.nirreps; i++) {
 
996
         fprintf(outfile, "%2d ", CalcInfo.docc[i]) ;
 
997
         }
 
998
      fprintf(outfile, "\n   SOCC         = ") ;
 
999
      for (i=0; i<CalcInfo.nirreps; i++) {
 
1000
         fprintf(outfile, "%2d ", CalcInfo.socc[i]) ;
 
1001
         }
 
1002
      fprintf(outfile, "\n   FROZEN DOCC  = ") ;
 
1003
      for (i=0; i<CalcInfo.nirreps; i++) {
 
1004
         fprintf(outfile, "%2d ", CalcInfo.frozen_docc[i]) ;
 
1005
         }
 
1006
      fprintf(outfile, "\n   FROZEN UOCC  = ") ;
 
1007
      for (i=0; i<CalcInfo.nirreps; i++) {
 
1008
         fprintf(outfile, "%2d ", CalcInfo.frozen_uocc[i]) ;
 
1009
         }
 
1010
      fprintf(outfile, "\n");
 
1011
      for (i=0; i<4; i++) {
 
1012
         fprintf(outfile, "   RAS %d        = ",i+1);
 
1013
         for (j=0; j<CalcInfo.nirreps; j++) {
 
1014
            fprintf(outfile,"%2d ",CalcInfo.ras_opi[i][j]);
 
1015
            }
 
1016
         fprintf(outfile, "\n");
 
1017
         }
 
1018
 
 
1019
      fprintf(outfile,
 
1020
         "*******************************************************\n\n");
 
1021
      }
 
1022
}
 
1023
 
 
1024
 
 
1025