5
** Ms0 = 1 if lower triangle blocks of C are used to update upper
6
** triangle parts of H0block.
8
void H0block_ols_upd(double E, double E_est, double phase,
9
double **Cn, double **Cc, double **S, double **Hd,
10
double *norm, double *ovrlap, int ac, int bc,
16
double *ccptr, *sptr, *cnptr, *hdptr;
17
double nx = 0.0, ox = 0.0;
24
for (i=0; i<len; i++) {
26
if (fabs(tval) < HD_MIN) tval = HD_MIN ; /* prevent /0 */
28
tval2 = ccptr[i] + tval * (E_est * ccptr[i] - sptr[i]);
31
ox += tval2 * ccptr[i];
35
for (i=0; i<H0block.size; i++) {
36
if (ac != H0block.alplist[i] || bc != H0block.betlist[i]) continue;
37
al = H0block.alpidx[i];
38
bl = H0block.betidx[i];
39
tval = Hd[al][bl] - E;
40
if (fabs(tval) < HD_MIN) tval = HD_MIN ; /* prevent /0 */
43
/* tval2 = c + tval * (E_est * c - S[al][bl]); */
47
tval = c + E_est * H0block.c0bp[i];
48
tval -= H0block.s0bp[i];
50
H0block.c0b[i] = tval; /* this should gather all of c0b. Norm later */
55
/* get upper triangle of H0block */
56
for (i=0; i<H0block.size; i++) {
57
if (ac != H0block.betlist[i] || bc != H0block.alplist[i]) continue;
58
al = H0block.alpidx[i];
59
bl = H0block.betidx[i];
60
H0block.c0b[i] = phase * Cn[bl][al];
68
/* call for Ms=0 cases. If not Ms=0, then call H0block_ols_upd */
69
void H0block_diag_ols_upd(double E, double E_est, double phase,
70
double **Cn, double **Cc, double **S, double **Hd,
71
double *norm, double *ovrlap, int ac, int bc, int len)
76
double nx = 0.0, ox = 0.0;
78
for (i=0; i<len; i++) {
80
if (fabs(tval) < HD_MIN) tval = HD_MIN ; /* prevent /0 */
82
tval2 = Cc[i][i] + tval * (E_est * Cc[i][i] - S[i][i]);
85
ox += tval2 * Cc[i][i];
89
if (fabs(tval) < HD_MIN) tval = HD_MIN ; /* prevent /0 */
91
tval2 = Cc[i][j] + tval * (E_est * Cc[i][j] - S[i][j]);
93
nx += 2.0 * tval2 * tval2;
94
ox += 2.0 * tval2 * Cc[i][j];
99
/* the code below assumes Ms=0 and that h0block members come in pairs
102
for (i=0; i<H0block.size; i++) {
103
if (ac != H0block.alplist[i] || bc != H0block.betlist[i]) continue;
104
al = H0block.alpidx[i];
105
bl = H0block.betidx[i];
109
nx -= 2.0 * tval2 * tval2;
110
ox -= 2.0 * tval2 * c;
111
tval = c + E_est * H0block.c0bp[i];
112
tval -= H0block.s0bp[i];
114
nx += 2.0 * tval * tval;
115
ox += 2.0 * tval * c;
116
H0block.c0b[i] = tval; /* this should gather all of c0b. Norm later */
122
tval = c + E_est * H0block.c0bp[i];
123
tval -= H0block.s0bp[i];
127
H0block.c0b[i] = tval; /* this should gather all of c0b. Norm later */
131
for (i=0; i<H0block.size; i++) {
132
if (ac != H0block.alplist[i] || bc != H0block.betlist[i]) continue;
133
al = H0block.alpidx[i];
134
bl = H0block.betidx[i];
136
H0block.c0b[i] = phase * Cn[bl][al];