12
** solve_2x2_pep(): Solve a 2x2 pseudo-eigenvalue problem of the form
13
** [ H11 - E H12 - E*S ] [c1]
14
** [ H12 - E*S H22 - E ] [c2] = 0
16
** \param H = matrix to get eigenvalues of
17
** \param S = overlap between states 1 & 2
18
** \param evals = pointer to array to hold 2 eigenvalues
19
** \param evecs = matrix to hold 2 eigenvectors
23
void solve_2x2_pep(double **H, double S, double *evals, double **evecs)
26
double a, b, c, p, q, x ;
27
double norm, tval, tval2;
29
/* put in quadratic form */
31
b = 2.0 * S * H[0][1] - H[0][0] - H[1][1] ;
32
c = H[0][0] * H[1][1] - H[0][1] * H[0][1] ;
34
/* solve the quadratic equation for E0 and E1 */
40
fprintf(stderr, "(solve_2x2_pep): radical less than 0\n") ;
43
else if (fabs(a) < A_MIN) {
44
printf("min a reached\n") ;
45
evals[0] = evals[1] = H[1][1] ;
48
evals[0] = -b / (2.0 * a) ;
49
evals[0] -= tval2 / (2.0 * a) ;
50
evals[1] = -b / (2.0 * a) ;
51
evals[1] += tval2 / (2.0 * a) ;
54
/* Make sure evals[0] < evals[1] */
55
if (evals[1] < evals[0]) {
61
/* Make sure evals[0] < H[1][1] */
62
if (evals[0] > H[1][1]) {
63
printf("Warning: using H11 as eigenvalues\n") ;
64
evals[0] = evals[1] = H[1][1] ;
65
printf("Got evals[0] = H[1][1] = %12.7f\n", evals[0]) ;
68
/* get the eigenvectors */
70
p = H[0][0] - evals[i] ;
71
q = H[0][1] - S * evals[i] ;
75
evecs[i][0] = 1.0 / norm ;
76
evecs[i][1] = x / norm ;
81
p = H[i][0] * evecs[0][0] + H[i][1] * evecs[0][1] ;
82
if (i==0) q = evecs[0][0] + S * evecs[0][1] ;
83
else q = S * evecs[0][0] + evecs[0][1] ;
85
printf("2x2 check %d: LHS = %12.6f RHS = %12.6f\n", i, p, q) ;
96
double **H, **evecs, *evals ;
98
void solve_2x2_pep() ;
100
H = (double **) malloc (2 * sizeof(double *)) ;
101
evecs = (double **) malloc (2 * sizeof(double *)) ;
102
H[0] = (double *) malloc (2 * sizeof(double)) ;
103
H[1] = (double *) malloc (2 * sizeof(double)) ;
104
evecs[0] = (double *) malloc (2 * sizeof(double)) ;
105
evecs[1] = (double *) malloc (2 * sizeof(double)) ;
106
evals = (double *) malloc (2 * sizeof(double)) ;
107
H[0][0] = -83.92663122885 ; H[0][1] = -83.92636151402 ;
108
H[1][0] = -83.92636151402 ; H[1][1] = -83.92663613012 ;
111
solve_2x2_pep(H, S, evals, evecs) ;
112
printf("eval0 = %16.8f\n", evals[0]) ;
113
printf("evec0 = (%12.6f %12.6f)\n", evecs[0][0], evecs[0][1]) ;
114
printf("\neval1 = %16.8f\n", evals[1]) ;
115
printf("evec1 = (%12.6f %12.6f)\n", evecs[1][0], evecs[1][1]) ;