3
\brief Enter brief description of file here
9
#include <libipv1/ip_lib.h>
10
#include <libciomr/libciomr.h>
13
#include <libchkpt/chkpt.h>
20
namespace psi { namespace cclambda {
24
int errcod, iconv,i,j,k,l,prop_sym,prop_root, excited_method=0;
25
int *states_per_irrep, prop_all, lambda_and_Ls = 0;
29
/* check WFN keyword in input */
30
errcod = ip_string("WFN", &(params.wfn), 0);
31
excited_method = cc_excited(params.wfn);
33
if(!strcmp(params.wfn,"CC2") || !strcmp(params.wfn,"EOM_CC2")) {
34
psio_read_entry(CC_INFO, "CC2 Energy", (char *) &(moinfo.ecc),
36
fprintf(outfile, "\tCC2 energy (CC_INFO) = %20.15f\n",moinfo.ecc);
37
fprintf(outfile, "\tTotal CC2 energy (CC_INFO) = %20.15f\n",
38
moinfo.eref+moinfo.ecc);
40
else if(!strcmp(params.wfn,"CCSD") || !strcmp(params.wfn,"EOM_CCSD")) {
41
psio_read_entry(CC_INFO, "CCSD Energy", (char *) &(moinfo.ecc),
43
fprintf(outfile, "\tCCSD energy (CC_INFO) = %20.15f\n",moinfo.ecc);
44
fprintf(outfile, "\tTotal CCSD energy (CC_INFO) = %20.15f\n",
45
moinfo.eref+moinfo.ecc);
47
else if(!strcmp(params.wfn,"CC3") || !strcmp(params.wfn,"EOM_CC3")) {
48
psio_read_entry(CC_INFO, "CC3 Energy", (char *) &(moinfo.ecc),
50
fprintf(outfile, "\tCC3 energy (CC_INFO) = %20.15f\n",moinfo.ecc);
51
fprintf(outfile, "\tTotal CC3 energy (CC_INFO) = %20.15f\n",
52
moinfo.eref+moinfo.ecc);
55
/* read in the easy-to-understand parameters */
57
params.convergence = 1e-7;
58
errcod = ip_data("CONVERGENCE","%d",&(iconv),0);
59
if(errcod == IPE_OK) params.convergence = 1.0*pow(10.0,(double) -iconv);
62
errcod = ip_boolean("RESTART", &(params.restart),0);
63
if(!moinfo.phase) params.restart = 0;
65
fndcor(&(params.memory),infile,outfile);
68
errcod = ip_data("PRINT", "%d", &(params.print),0);
71
errcod = ip_data("CACHELEV", "%d", &(params.cachelev),0);
74
if(ip_exist("SEKINO",0)) {
75
errcod = ip_boolean("SEKINO", ¶ms.sekino, 0);
76
if(errcod != IPE_OK) params.sekino = 0;
80
errcod = ip_boolean("DIIS", ¶ms.diis, 0);
83
errcod = ip_boolean("AO_BASIS", &(params.aobasis),0);
84
params.aobasis = 0; /* AO basis code not yet working for lambda */
86
if(ip_exist("ABCD",0)) {
87
errcod = ip_string("ABCD", &(params.abcd), 0);
88
if(strcmp(params.abcd,"NEW") && strcmp(params.abcd,"OLD")) {
89
fprintf(outfile, "Invalid ABCD algorithm: %s\n", params.abcd);
90
exit(PSI_RETURN_FAILURE);
93
else params.abcd = strdup("NEW");
96
if(ip_exist("NUM_AMPS",0)) {
97
errcod = ip_data("NUM_AMPS", "%d", &(params.num_amps), 0);
100
/* Determine DERTYPE */
102
if(ip_exist("DERTYPE",0)) {
103
errcod = ip_string("DERTYPE", &(junk),0);
104
if(errcod != IPE_OK) {
105
printf("Invalid value of input keyword DERTYPE: %s\n", junk);
106
exit(PSI_RETURN_FAILURE);
108
else if(!strcmp(junk,"NONE")) params.dertype = 0;
109
else if(!strcmp(junk,"FIRST")) params.dertype = 1;
110
else if(!strcmp(junk,"RESPONSE")) params.dertype = 3; /* linear response */
112
printf("Invalid value of input keyword DERTYPE: %s\n", junk);
113
exit(PSI_RETURN_FAILURE);
117
else { /* DERTYPE is absent, assume 1 if jobtype=opt; 0 if jobtype=oeprop */
118
ip_string("JOBTYPE", &(junk),0);
119
if(!strcmp(junk,"OEPROP")) params.dertype = 0;
120
else if(!strcmp(junk,"OPT")) params.dertype = 1;
122
printf("Don't know what to do with DERTYPE missing and jobtype: %s\n", junk);
123
exit(PSI_RETURN_FAILURE);
128
/* begin local parameters */
130
errcod = ip_boolean("LOCAL", &(params.local),0);
132
errcod = ip_data("LOCAL_CUTOFF", "%lf", &(local.cutoff), 0);
133
if(ip_exist("LOCAL_METHOD",0)) {
134
errcod = ip_string("LOCAL_METHOD", &(local.method), 0);
135
if(strcmp(local.method,"AOBASIS") && strcmp(local.method,"WERNER")) {
136
fprintf(outfile, "Invalid local correlation method: %s\n", local.method);
137
exit(PSI_RETURN_FAILURE);
140
else if(params.local) {
141
local.method = (char *) malloc(7 * sizeof(char));
142
sprintf(local.method, "%s", "WERNER");
145
if(ip_exist("LOCAL_WEAKP",0)) {
146
errcod = ip_string("LOCAL_WEAKP", &(local.weakp), 0);
147
if(strcmp(local.weakp,"MP2") && strcmp(local.weakp,"NEGLECT") && strcmp(local.weakp,"NONE")) {
148
fprintf(outfile, "Invalid method for treating local pairs: %s\n", local.weakp);
149
exit(PSI_RETURN_FAILURE);
152
else if(params.local) {
153
local.weakp = (char *) malloc(4 * sizeof(char));
154
sprintf(local.weakp, "%s", "NONE");
157
if(params.dertype == 3)
158
local.filter_singles = 0;
160
local.filter_singles = 1;
161
ip_boolean("LOCAL_FILTER_SINGLES", &(local.filter_singles), 0);
163
local.cphf_cutoff = 0.10;
164
ip_data("LOCAL_CPHF_CUTOFF", "%lf", &(local.cphf_cutoff), 0);
166
local.freeze_core = NULL;
167
ip_string("FREEZE_CORE", &local.freeze_core, 0);
168
if(local.freeze_core == NULL) local.freeze_core = strdup("FALSE");
170
if(ip_exist("LOCAL_PAIRDEF",0)){
171
errcod = ip_string("LOCAL_PAIRDEF", &(local.pairdef), 0);
172
if(strcmp(local.pairdef,"BP") && strcmp(local.pairdef,"RESPONSE")) {
173
fprintf(outfile, "Invalid keyword for strong/weak pair definition: %s\n", local.pairdef);
174
exit(PSI_RETURN_FAILURE);
177
else if(params.local && params.dertype == 3)
178
local.pairdef = strdup("RESPONSE");
179
else if(params.local)
180
local.pairdef = strdup("BP");
182
/* Now setup the structure which determines what will be solved */
183
/* if --zeta, use Xi and solve for Zeta */
184
/* if (DERTYPE == FIRST) determine ground vs. excited from wfn.
185
if ground, do only lambda.
186
if excited, compute only one L chosen as described below.
188
/* if (DERTYPE == RESPONSE), determine ground vs. excited from wfn.
190
if excited, also do L(s) chosen as described below */
191
/* if (DERTYPE == NONE) determine ground vs. excited from wfn.
193
if excited, also do L(s) chosen as described below */
194
/* To determine which L(s) to compute for multiple L(s):
195
Check PROP_ALL in input
196
- If (PROP_ALL == true), compute L for all excited states.
197
- If false, check PROP_SYM for irrep desired, and PROP_ROOT
198
for root desired, as in cceom. */
199
/* To determine which L(s) to compute for single L(s)
200
- Check PROP_SYM for irrep desired, and PROP_ROOT
201
for root desired, as in cceom. */
203
/* setup property variables for excited states */
204
if (cc_excited(params.wfn)) {
205
chkpt_init(PSIO_OPEN_OLD);
206
if (chkpt_rd_override_occ()) {
207
states_per_irrep = chkpt_rd_statespi();
210
ip_count("STATES_PER_IRREP", &i, 0);
211
states_per_irrep = (int *) malloc(moinfo.nirreps * sizeof(int));
212
for (i=0;i<moinfo.nirreps;++i)
213
errcod = ip_data("STATES_PER_IRREP","%d",&(states_per_irrep[i]),1,i);
218
if (ip_exist("PROP_ALL",0)) ip_boolean("PROP_ALL",&prop_all,0);
219
/* command-line overrides this keyword (at least for now) */
220
if (params.all) prop_all = 1;
222
if (ip_exist("PROP_SYM",0)) { /* read symmetry of state for properties */
223
ip_data("PROP_SYM","%d",&(prop_sym),0);
225
prop_sym = moinfo.sym^prop_sym;
227
else { /* just use last irrep of states requested for symmetry of states */
228
for (i=0;i<moinfo.nirreps;++i) {
229
if (states_per_irrep[i] > 0)
230
prop_sym = i^moinfo.sym;
234
if (ip_exist("PROP_ROOT",0)) { /* read prop_root */
235
ip_data("PROP_ROOT","%d",&(prop_root),0);
238
else { /* just use highest root, if you need only one of them */
239
prop_root = states_per_irrep[prop_sym^moinfo.sym];
245
if (params.zeta) { /* only use Xi to solve for Zeta */
247
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
248
psio_read_entry(CC_INFO, "XI Irrep", (char *) &i,sizeof(int));
249
fprintf(outfile,"\tIrrep of Zeta (CC_INFO) = %d\n", i);
250
pL_params[0].irrep = prop_sym = i; /* is this always A1? I forget */
251
pL_params[0].root = prop_root = 0;
252
pL_params[0].ground = 0;
253
pL_params[0].cceom_energy = 0.0;
254
pL_params[0].R0 = 0.0; /* <Zeta0|R0> = 0, since zeta_0 = 0 */
255
sprintf(pL_params[0].L1A_lbl,"ZIA");
256
sprintf(pL_params[0].L1B_lbl,"Zia");
257
sprintf(pL_params[0].L2AA_lbl,"ZIJAB");
258
sprintf(pL_params[0].L2BB_lbl,"Zijab");
259
sprintf(pL_params[0].L2AB_lbl,"ZIjAb");
260
sprintf(pL_params[0].L2RHF_lbl,"2ZIjAb - ZIjbA");
262
else if (params.dertype == 1) { /* analytic gradient, ignore prop_all */
263
if (!cc_excited(params.wfn)) { /* do only lambda for ground state */
265
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
266
pL_params[0].irrep = 0;
267
pL_params[0].root = -1;
268
pL_params[0].ground = 1;
269
pL_params[0].R0 = 1.0;
270
pL_params[0].cceom_energy = 0.0;
271
sprintf(pL_params[0].L1A_lbl,"LIA %d %d",0, -1);
272
sprintf(pL_params[0].L1B_lbl,"Lia %d %d",0, -1);
273
sprintf(pL_params[0].L2AA_lbl,"LIJAB %d %d",0, -1);
274
sprintf(pL_params[0].L2BB_lbl,"Lijab %d %d",0, -1);
275
sprintf(pL_params[0].L2AB_lbl,"LIjAb %d %d",0, -1);
276
sprintf(pL_params[0].L2RHF_lbl,"2LIjAb - LIjbA %d %d",0, -1);
278
else { /* do only one L for excited state */
280
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
281
pL_params[0].irrep = prop_sym;
282
pL_params[0].root = prop_root;
283
pL_params[0].ground = 0;
284
if(!strcmp(params.wfn,"EOM_CC2")) {
285
sprintf(lbl,"EOM CC2 Energy for root %d %d", prop_sym, prop_root);
286
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].cceom_energy),sizeof(double));
287
sprintf(lbl,"EOM CC2 R0 for root %d %d", prop_sym, prop_root);
288
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].R0),sizeof(double));
290
else if(!strcmp(params.wfn,"EOM_CCSD")) {
291
sprintf(lbl,"EOM CCSD Energy for root %d %d", prop_sym, prop_root);
292
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].cceom_energy),sizeof(double));
293
sprintf(lbl,"EOM CCSD R0 for root %d %d", prop_sym, prop_root);
294
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].R0),sizeof(double));
296
else if(!strcmp(params.wfn,"EOM_CC3")) {
297
sprintf(lbl,"EOM CC3 Energy for root %d %d", prop_sym, prop_root);
298
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].cceom_energy),sizeof(double));
299
sprintf(lbl,"EOM CC3 R0 for root %d %d", prop_sym, prop_root);
300
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[0].R0),sizeof(double));
302
sprintf(pL_params[0].L1A_lbl,"LIA %d %d",prop_sym, prop_root);
303
sprintf(pL_params[0].L1B_lbl,"Lia %d %d",prop_sym, prop_root);
304
sprintf(pL_params[0].L2AA_lbl,"LIJAB %d %d",prop_sym, prop_root);
305
sprintf(pL_params[0].L2BB_lbl,"Lijab %d %d",prop_sym, prop_root);
306
sprintf(pL_params[0].L2AB_lbl,"LIjAb %d %d",prop_sym, prop_root);
307
sprintf(pL_params[0].L2RHF_lbl,"2LIjAb - LIjbA %d %d",prop_sym, prop_root);
310
else if (params.dertype == 3) { /* response calculation */
311
if (!cc_excited(params.wfn)) { /* ground state */
313
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
314
pL_params[0].irrep = 0;
315
pL_params[0].root = -1;
316
pL_params[0].ground = 1;
317
pL_params[0].R0 = 1.0;
318
pL_params[0].cceom_energy = 0.0;
319
sprintf(pL_params[0].L1A_lbl,"LIA %d %d",0, -1);
320
sprintf(pL_params[0].L1B_lbl,"Lia %d %d",0, -1);
321
sprintf(pL_params[0].L2AA_lbl,"LIJAB %d %d",0, -1);
322
sprintf(pL_params[0].L2BB_lbl,"Lijab %d %d",0, -1);
323
sprintf(pL_params[0].L2AB_lbl,"LIjAb %d %d",0, -1);
324
sprintf(pL_params[0].L2RHF_lbl,"2LIjAb - LIjbA %d %d",0, -1);
326
else { /* excited state */
327
lambda_and_Ls = 1; /* code is below */
330
else if (params.dertype == 0) {
331
if (!cc_excited(params.wfn)) { /* ground state */
333
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
334
pL_params[0].irrep = 0;
335
pL_params[0].root = -1;
336
pL_params[0].ground = 1;
337
pL_params[0].R0 = 1.0;
338
pL_params[0].cceom_energy = 0.0;
339
sprintf(pL_params[0].L1A_lbl,"LIA %d %d",0, -1);
340
sprintf(pL_params[0].L1B_lbl,"Lia %d %d",0, -1);
341
sprintf(pL_params[0].L2AA_lbl,"LIJAB %d %d",0, -1);
342
sprintf(pL_params[0].L2BB_lbl,"Lijab %d %d",0, -1);
343
sprintf(pL_params[0].L2AB_lbl,"LIjAb %d %d",0, -1);
344
sprintf(pL_params[0].L2RHF_lbl,"2LIjAb - LIjbA %d %d",0, -1);
346
else { /* excited state */
347
lambda_and_Ls = 1; /* code is below */
352
/* do lambda for ground state AND do L(s) for excited states */
354
/* determine number of states to converge */
355
params.nstates = 1; /* for ground state */
357
for (i=0; i<moinfo.nirreps; ++i)
358
params.nstates += states_per_irrep[i]; /* do all L(s) */
361
params.nstates += 1; /* do only one L */
364
pL_params = (struct L_Params *) malloc(params.nstates * sizeof(struct L_Params));
367
pL_params[0].irrep = 0;
368
pL_params[0].root = -1;
369
pL_params[0].ground = 1;
370
pL_params[0].R0 = 1.0;
371
pL_params[0].cceom_energy = 0.0;
372
sprintf(pL_params[0].L1A_lbl,"LIA %d %d",0, -1);
373
sprintf(pL_params[0].L1B_lbl,"Lia %d %d",0, -1);
374
sprintf(pL_params[0].L2AA_lbl,"LIJAB %d %d",0, -1);
375
sprintf(pL_params[0].L2BB_lbl,"Lijab %d %d",0, -1);
376
sprintf(pL_params[0].L2AB_lbl,"LIjAb %d %d",0, -1);
377
sprintf(pL_params[0].L2RHF_lbl,"2LIjAb - LIjbA %d %d",0, -1);
379
if (prop_all) { /* do all L(s) */
381
for (i=0; i<moinfo.nirreps; ++i) { /* look over irrep of L(s) */
382
for (j=0; j < states_per_irrep[i^moinfo.sym]; ++j) {
383
pL_params[k].irrep = i;
384
pL_params[k].root = j;
385
pL_params[k].ground = 0;
387
if(!strcmp(params.wfn,"EOM_CC2")) {
388
sprintf(lbl,"EOM CC2 Energy for root %d %d", i, j);
389
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].cceom_energy),sizeof(double));
390
sprintf(lbl,"EOM CC2 R0 for root %d %d", i, j);
391
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].R0),sizeof(double));
393
else if(!strcmp(params.wfn,"EOM_CCSD")) {
394
sprintf(lbl,"EOM CCSD Energy for root %d %d", i, j);
395
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].cceom_energy),sizeof(double));
396
sprintf(lbl,"EOM CCSD R0 for root %d %d", i, j);
397
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].R0),sizeof(double));
399
else if(!strcmp(params.wfn,"EOM_CC3")) {
400
sprintf(lbl,"EOM CC3 Energy for root %d %d", i, j);
401
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].cceom_energy),sizeof(double));
402
sprintf(lbl,"EOM CC3 R0 for root %d %d", i, j);
403
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[k].R0),sizeof(double));
406
sprintf(pL_params[k].L1A_lbl,"LIA %d %d",i, j);
407
sprintf(pL_params[k].L1B_lbl,"Lia %d %d",i, j);
408
sprintf(pL_params[k].L2AA_lbl,"LIJAB %d %d",i, j);
409
sprintf(pL_params[k].L2BB_lbl,"Lijab %d %d",i, j);
410
sprintf(pL_params[k].L2AB_lbl,"LIjAb %d %d",i, j);
411
sprintf(pL_params[k].L2RHF_lbl,"2LIjAb - LIjbA %d %d",i, j);
416
else { /* use prop_sym and prop_root determined above from input or inferrence */
417
pL_params[1].irrep = prop_sym;
418
pL_params[1].root = prop_root;
419
pL_params[1].ground = 0;
421
if(!strcmp(params.wfn,"EOM_CC2")) {
422
sprintf(lbl,"EOM CC2 Energy for root %d %d", prop_sym, prop_root);
423
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].cceom_energy),sizeof(double));
424
sprintf(lbl,"EOM CC2 R0 for root %d %d", prop_sym, prop_root);
425
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].R0),sizeof(double));
427
else if(!strcmp(params.wfn,"EOM_CCSD")) {
428
sprintf(lbl,"EOM CCSD Energy for root %d %d", prop_sym, prop_root);
429
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].cceom_energy),sizeof(double));
430
sprintf(lbl,"EOM CCSD R0 for root %d %d", prop_sym, prop_root);
431
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].R0),sizeof(double));
433
else if(!strcmp(params.wfn,"EOM_CC3")) {
434
sprintf(lbl,"EOM CC3 Energy for root %d %d", prop_sym, prop_root);
435
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].cceom_energy),sizeof(double));
436
sprintf(lbl,"EOM CC3 R0 for root %d %d", prop_sym, prop_root);
437
psio_read_entry(CC_INFO, lbl, (char *) &(pL_params[1].R0),sizeof(double));
440
sprintf(pL_params[1].L1A_lbl,"LIA %d %d", prop_sym, prop_root);
441
sprintf(pL_params[1].L1B_lbl,"Lia %d %d", prop_sym, prop_root);
442
sprintf(pL_params[1].L2AA_lbl,"LIJAB %d %d", prop_sym, prop_root);
443
sprintf(pL_params[1].L2BB_lbl,"Lijab %d %d", prop_sym, prop_root);
444
sprintf(pL_params[1].L2AB_lbl,"LIjAb %d %d", prop_sym, prop_root);
445
sprintf(pL_params[1].L2RHF_lbl,"2LIjAb - LIjbA %d %d", prop_sym, prop_root);
450
params.maxiter = 50 * params.nstates;
451
errcod = ip_data("MAXITER","%d",&(params.maxiter),0);
453
fprintf(outfile, "\n\tInput parameters:\n");
454
fprintf(outfile, "\t-----------------\n");
455
fprintf(outfile, "\tMaxiter = %4d\n", params.maxiter);
456
fprintf(outfile, "\tConvergence = %3.1e\n", params.convergence);
457
fprintf(outfile, "\tRestart = %s\n", params.restart ? "Yes" : "No");
458
fprintf(outfile, "\tCache Level = %1d\n", params.cachelev);
459
fprintf(outfile, "\tModel III = %s\n", params.sekino ? "Yes" : "No");
460
fprintf(outfile, "\tDIIS = %s\n", params.diis ? "Yes" : "No");
461
fprintf(outfile, "\tAO Basis = %s\n",
462
params.aobasis ? "Yes" : "No");
463
fprintf(outfile, "\tABCD = %s\n", params.abcd);
464
fprintf(outfile, "\tLocal CC = %s\n", params.local ? "Yes" : "No");
466
fprintf(outfile, "\tLocal Cutoff = %3.1e\n", local.cutoff);
467
fprintf(outfile, "\tLocal Method = %s\n", local.method);
468
fprintf(outfile, "\tWeak pairs = %s\n", local.weakp);
469
fprintf(outfile, "\tFilter singles = %s\n", local.filter_singles ? "Yes" : "No");
470
fprintf(outfile, "\tLocal pairs = %s\n", local.pairdef);
471
fprintf(outfile, "\tLocal CPHF cutoff = %3.1e\n", local.cphf_cutoff);
474
fprintf(outfile,"\tParamaters for left-handed eigenvectors:\n");
475
fprintf(outfile,"\t Irr Root Ground-State? EOM energy R0\n");
476
for (i=0; i<params.nstates; ++i) {
477
fprintf(outfile,"\t%3d %3d %5d %10s %18.10lf %14.10lf\n", i+1, pL_params[i].irrep, pL_params[i].root+1,
478
(pL_params[i].ground ? "Yes":"No"), pL_params[i].cceom_energy, pL_params[i].R0);
481
for (i=0; i<params.nstates; ++i) {
482
fprintf(outfile,"\tLabels for eigenvector %d:\n\t%s, %s, %s, %s, %s, %s\n",
483
i+1,pL_params[i].L1A_lbl,pL_params[i].L1B_lbl,pL_params[i].L2AA_lbl,pL_params[i].L2BB_lbl,
484
pL_params[i].L2AB_lbl, pL_params[i].L2RHF_lbl);
491
}} // namespace psi::cclambda