2
root_following: returns index of vector in EOM_Cxxx with maximum overlap with
3
vector "CCSD Cxxx" in CC3_MISC
11
int follow_root(int L, double **alpha, int C_irr) {
12
dpdfile2 CME, Cme, RME, Rme;
13
dpdbuf4 CMNEF, Cmnef, CMnEf, RMNEF, Rmnef, RMnEf;
15
double *CR_overlap, tval;
18
CR_overlap = init_array(L);
20
/* open CCSD vector "R" from CC3_MISC */
21
if (params.eom_ref == 0) {
22
dpd_file2_init(&RME, CC3_MISC, C_irr, 0, 1, "CCSD CME");
23
dpd_buf4_init(&RMnEf, CC3_MISC, C_irr, 0, 5, 0, 5, 0, "CCSD CMnEf");
25
else if (params.eom_ref == 1) {
26
dpd_file2_init(&RME, CC3_MISC, C_irr, 0, 1, "CCSD CME");
27
dpd_file2_init(&Rme, CC3_MISC, C_irr, 0, 1, "CCSD Cme");
28
dpd_buf4_init(&RMNEF, CC3_MISC, C_irr, 2, 7, 2, 7, 0, "CCSD CMNEF");
29
dpd_buf4_init(&Rmnef, CC3_MISC, C_irr, 2, 7, 2, 7, 0, "CCSD Cmnef");
30
dpd_buf4_init(&RMnEf, CC3_MISC, C_irr, 0, 5, 0, 5, 0, "CCSD CMnEf");
32
else if (params.eom_ref == 2) {
33
dpd_file2_init(&RME, CC3_MISC, C_irr, 0, 1, "CCSD CME");
34
dpd_file2_init(&Rme, CC3_MISC, C_irr, 2, 3, "CCSD Cme");
35
dpd_buf4_init(&RMNEF, CC3_MISC, C_irr, 2, 7, 2, 7, 0, "CCSD CMNEF");
36
dpd_buf4_init(&Rmnef, CC3_MISC, C_irr, 12, 17, 12, 17, 0, "CCSD Cmnef");
37
dpd_buf4_init(&RMnEf, CC3_MISC, C_irr, 22, 28, 22, 28, 0, "CCSD CMnEf");
40
/* loop over trial C vectors */
43
/* read C vector from EOM_Cxxx */
44
if (params.eom_ref == 0) {
45
sprintf(lbl, "%s %d", "CME", i);
46
dpd_file2_init(&CME, EOM_CME, C_irr, 0, 1, lbl);
47
sprintf(lbl, "%s %d", "CMnEf", i);
48
dpd_buf4_init(&CMnEf, EOM_CMnEf, C_irr, 0, 5, 0, 5, 0, lbl);
50
else if (params.eom_ref == 1) {
51
sprintf(lbl, "%s %d", "CME", i);
52
dpd_file2_init(&CME, EOM_CME, C_irr, 0, 1, lbl);
53
sprintf(lbl, "%s %d", "Cme", i);
54
dpd_file2_init(&Cme, EOM_Cme, C_irr, 0, 1, lbl);
55
sprintf(lbl, "%s %d", "CMNEF", i);
56
dpd_buf4_init(&CMNEF, EOM_CMNEF, C_irr, 2, 7, 2, 7, 0, lbl);
57
sprintf(lbl, "%s %d", "Cmnef", i);
58
dpd_buf4_init(&Cmnef, EOM_Cmnef, C_irr, 2, 7, 2, 7, 0, lbl);
59
sprintf(lbl, "%s %d", "CMnEf", i);
60
dpd_buf4_init(&CMnEf, EOM_CMnEf, C_irr, 0, 5, 0, 5, 0, lbl);
62
else if (params.eom_ref == 2) {
63
sprintf(lbl, "%s %d", "CME", i);
64
dpd_file2_init(&CME, EOM_CME, C_irr, 0, 1, lbl);
65
sprintf(lbl, "%s %d", "Cme", i);
66
dpd_file2_init(&Cme, EOM_Cme, C_irr, 2, 3, lbl);
67
sprintf(lbl, "%s %d", "CMNEF", i);
68
dpd_buf4_init(&CMNEF, EOM_CMNEF, C_irr, 2, 7, 2, 7, 0, lbl);
69
sprintf(lbl, "%s %d", "Cmnef", i);
70
dpd_buf4_init(&Cmnef, EOM_Cmnef, C_irr, 12, 17, 12, 17, 0, lbl);
71
sprintf(lbl, "%s %d", "CMnEf", i);
72
dpd_buf4_init(&CMnEf, EOM_CMnEf, C_irr, 22, 28, 22, 28, 0, lbl);
75
/* dot C vector with R vector */
77
if (params.eom_ref == 0) {
78
tval = 2.0 * dpd_file2_dot(&CME, &RME);
79
tval += dpd_buf4_dot(&CMnEf, &RMnEf);
81
else if (params.eom_ref == 1) {
82
tval = dpd_file2_dot(&CME, &RME);
83
tval += dpd_file2_dot(&Cme, &Rme);
84
tval += dpd_buf4_dot(&CMNEF, &RMNEF);
85
tval += dpd_buf4_dot(&Cmnef, &Rmnef);
86
tval += dpd_buf4_dot(&CMnEf, &RMnEf);
88
else if (params.eom_ref == 2) {
89
tval = dpd_file2_dot(&CME, &RME);
90
tval += dpd_file2_dot(&Cme, &Rme);
91
tval += dpd_buf4_dot(&CMNEF, &RMNEF);
92
tval += dpd_buf4_dot(&Cmnef, &Rmnef);
93
tval += dpd_buf4_dot(&CMnEf, &RMnEf);
96
/* loop over roots and add in overlap */
98
CR_overlap[j] += alpha[i][j] * tval;
100
if (params.eom_ref == 0) {
101
dpd_file2_close(&CME);
102
dpd_buf4_close(&CMnEf);
105
dpd_file2_close(&CME);
106
dpd_file2_close(&Cme);
107
dpd_buf4_close(&CMNEF);
108
dpd_buf4_close(&Cmnef);
109
dpd_buf4_close(&CMnEf);
113
if (params.eom_ref == 0) {
114
dpd_file2_close(&RME);
115
dpd_buf4_close(&RMnEf);
118
dpd_file2_close(&RME);
119
dpd_file2_close(&Rme);
120
dpd_buf4_close(&RMNEF);
121
dpd_buf4_close(&Rmnef);
122
dpd_buf4_close(&RMnEf);
125
fprintf(outfile,"Overlaps of Rs with EOM CCSD eigenvector:\n");
127
fprintf(outfile,"\t %d %12.6lf\n", i, CR_overlap[i]);
130
/* return index with greatest overlap */
134
if ( fabs(CR_overlap[i]) > tval) {
135
tval = fabs(CR_overlap[i]);
140
fprintf(outfile,"follow_root returning: %d\n", j);