3
\brief Solve a 2x2 pseudo-eigenvalue problem
16
** solve_2x2_pep(): Solve a 2x2 pseudo-eigenvalue problem of the form
17
** [ H11 - E H12 - E*S ] [c1]
18
** [ H12 - E*S H22 - E ] [c2] = 0
20
** \param H = matrix to get eigenvalues of
21
** \param S = overlap between states 1 & 2
22
** \param evals = pointer to array to hold 2 eigenvalues
23
** \param evecs = matrix to hold 2 eigenvectors
28
void solve_2x2_pep(double **H, double S, double *evals, double **evecs)
31
double a, b, c, p, q, x ;
32
double norm, tval, tval2;
34
/* put in quadratic form */
36
b = 2.0 * S * H[0][1] - H[0][0] - H[1][1] ;
37
c = H[0][0] * H[1][1] - H[0][1] * H[0][1] ;
39
/* solve the quadratic equation for E0 and E1 */
45
fprintf(stderr, "(solve_2x2_pep): radical less than 0\n") ;
48
else if (fabs(a) < A_MIN) {
49
printf("min a reached\n") ;
50
evals[0] = evals[1] = H[1][1] ;
53
evals[0] = -b / (2.0 * a) ;
54
evals[0] -= tval2 / (2.0 * a) ;
55
evals[1] = -b / (2.0 * a) ;
56
evals[1] += tval2 / (2.0 * a) ;
59
/* Make sure evals[0] < evals[1] */
60
if (evals[1] < evals[0]) {
66
/* Make sure evals[0] < H[1][1] */
67
if (evals[0] > H[1][1]) {
68
printf("Warning: using H11 as eigenvalues\n") ;
69
evals[0] = evals[1] = H[1][1] ;
70
printf("Got evals[0] = H[1][1] = %12.7f\n", evals[0]) ;
73
/* get the eigenvectors */
75
p = H[0][0] - evals[i] ;
76
q = H[0][1] - S * evals[i] ;
80
evecs[i][0] = 1.0 / norm ;
81
evecs[i][1] = x / norm ;
86
p = H[i][0] * evecs[0][0] + H[i][1] * evecs[0][1] ;
87
if (i==0) q = evecs[0][0] + S * evecs[0][1] ;
88
else q = S * evecs[0][0] + evecs[0][1] ;
90
printf("2x2 check %d: LHS = %12.6f RHS = %12.6f\n", i, p, q) ;
101
double **H, **evecs, *evals ;
103
void solve_2x2_pep() ;
105
H = (double **) malloc (2 * sizeof(double *)) ;
106
evecs = (double **) malloc (2 * sizeof(double *)) ;
107
H[0] = (double *) malloc (2 * sizeof(double)) ;
108
H[1] = (double *) malloc (2 * sizeof(double)) ;
109
evecs[0] = (double *) malloc (2 * sizeof(double)) ;
110
evecs[1] = (double *) malloc (2 * sizeof(double)) ;
111
evals = (double *) malloc (2 * sizeof(double)) ;
112
H[0][0] = -83.92663122885 ; H[0][1] = -83.92636151402 ;
113
H[1][0] = -83.92636151402 ; H[1][1] = -83.92663613012 ;
116
solve_2x2_pep(H, S, evals, evecs) ;
117
printf("eval0 = %16.8f\n", evals[0]) ;
118
printf("evec0 = (%12.6f %12.6f)\n", evecs[0][0], evecs[0][1]) ;
119
printf("\neval1 = %16.8f\n", evals[1]) ;
120
printf("evec1 = (%12.6f %12.6f)\n", evecs[1][0], evecs[1][1]) ;